From 9f15a209a80eb1e137c1b14c8fa4c8d8f3eb6c78 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Wed, 23 Jan 2013 17:40:35 +0200 Subject: [PATCH 001/715] * added a new 'by_path' function to be used for the UPLOAD_TO callback * change move_files_to_folder so that it causes a storage backend move as well. This is useful when the on storage path depends on the models.foldermodels.Folder the file is uploaded to --- filer/models/tools.py | 11 +++++++++++ filer/utils/generate_filename.py | 20 ++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/filer/models/tools.py b/filer/models/tools.py index b12e25feb..dbf19e174 100644 --- a/filer/models/tools.py +++ b/filer/models/tools.py @@ -1,5 +1,6 @@ #-*- coding: utf-8 -*- from filer.models import Clipboard +from filer import settings as filer_settings def discard_clipboard(clipboard): @@ -33,6 +34,16 @@ def move_files_from_clipboard_to_folder(clipboard, folder): def move_files_to_folder(files, folder): for file_obj in files: + if file_obj.is_public: + upload_to = filer_settings.FILER_PUBLICMEDIA_UPLOAD_TO + else: + upload_to = filer_settings.FILER_PRIVATEMEDIA_UPLOAD_TO + + storage = file_obj.file.storage file_obj.folder = folder + new_location = upload_to(file_obj, file_obj.original_filename) + new_name = storage.save(new_location, file_obj.file.file) + storage.delete(file_obj.file.name) + file_obj.file.name = new_name file_obj.save() return True diff --git a/filer/utils/generate_filename.py b/filer/utils/generate_filename.py index 8d405f26a..27afc92c4 100644 --- a/filer/utils/generate_filename.py +++ b/filer/utils/generate_filename.py @@ -1,4 +1,5 @@ from filer.utils.files import get_valid_filename +from django.core.files.uploadedfile import UploadedFile from django.utils.encoding import force_unicode, smart_str import datetime import os @@ -22,3 +23,22 @@ def __call__(self, instance, filename): if not self.prefix: return upload_to_str return os.path.join(self.prefix, upload_to_str) + + +def _is_in_memory(file_): + return isinstance(file_, UploadedFile) + + +def _construct_logical_folder_path(filer_file): + return os.path.join(*(folder.name for folder in filer_file.logical_path)) + + +def by_path(instance, filename): + if _is_in_memory(instance.file.file): + return os.path.join('clipboard', filename) + else: + filename = filename.strip('/').split('/')[-1] + path = os.path.join( + _construct_logical_folder_path(instance), + filename) + return path From 59c75ddb9e82ae77059aaf0cb3dced8a4e259c63 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Wed, 23 Jan 2013 19:14:03 +0200 Subject: [PATCH 002/715] Added a setting for stating whether UPLOAD_TO callack depends on the folder where the file is ment to be uploaded --- filer/models/tools.py | 34 ++++++++++++++++++++-------------- filer/settings.py | 4 ++++ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/filer/models/tools.py b/filer/models/tools.py index dbf19e174..354420115 100644 --- a/filer/models/tools.py +++ b/filer/models/tools.py @@ -17,13 +17,30 @@ def get_user_clipboard(user): clipboard = Clipboard.objects.get_or_create(user=user)[0] return clipboard +def move_file(file_obj, folder): + file_obj.folder = folder + if file_obj.is_public: + upload_depends_on_folder = \ + filer_settings.FILER_PUBLICMEDIA_UPLOAD_DEPENDS_ON_FOLDER + upload_to = filer_settings.FILER_PUBLICMEDIA_UPLOAD_TO + else: + upload_depends_on_folder = \ + filer_settings.FILER_PRIVATEMEDIA_UPLOAD_DEPENDS_ON_FOLDER + upload_to = filer_settings.FILER_PRIVATEMEDIA_UPLOAD_TO + if upload_depends_on_folder: + storage = file_obj.file.storage + new_location = upload_to(file_obj, file_obj.original_filename) + new_name = storage.save(new_location, file_obj.file.file) + storage.delete(file_obj.file.name) + file_obj.file.name = new_name + file_obj.save() + def move_file_to_clipboard(files, clipboard): count = 0 for file_obj in files: if clipboard.append_file(file_obj): - file_obj.folder = None - file_obj.save() + move_file(file_obj, None) count += 1 return count @@ -34,16 +51,5 @@ def move_files_from_clipboard_to_folder(clipboard, folder): def move_files_to_folder(files, folder): for file_obj in files: - if file_obj.is_public: - upload_to = filer_settings.FILER_PUBLICMEDIA_UPLOAD_TO - else: - upload_to = filer_settings.FILER_PRIVATEMEDIA_UPLOAD_TO - - storage = file_obj.file.storage - file_obj.folder = folder - new_location = upload_to(file_obj, file_obj.original_filename) - new_name = storage.save(new_location, file_obj.file.file) - storage.delete(file_obj.file.name) - file_obj.file.name = new_name - file_obj.save() + move_file(file_obj, folder) return True diff --git a/filer/settings.py b/filer/settings.py index c0597abb5..adaa85181 100644 --- a/filer/settings.py +++ b/filer/settings.py @@ -201,6 +201,8 @@ def update_server_settings(settings, defaults, s, t): # Public media (media accessible without any permission checks) FILER_PUBLICMEDIA_STORAGE = get_storage_class(FILER_STORAGES['public']['main']['ENGINE'])(**FILER_STORAGES['public']['main']['OPTIONS']) FILER_PUBLICMEDIA_UPLOAD_TO = load_object(FILER_STORAGES['public']['main']['UPLOAD_TO']) +FILER_PUBLICMEDIA_UPLOAD_DEPENDS_ON_FOLDER = load_object( + FILER_STORAGES['public']['main']['UPLOAD_DEPENDS_ON_FOLDER']) if 'UPLOAD_TO_PREFIX' in FILER_STORAGES['public']['main']: FILER_PUBLICMEDIA_UPLOAD_TO = load_object('filer.utils.generate_filename.prefixed_factory')(FILER_PUBLICMEDIA_UPLOAD_TO, FILER_STORAGES['public']['main']['UPLOAD_TO_PREFIX']) FILER_PUBLICMEDIA_THUMBNAIL_STORAGE = get_storage_class(FILER_STORAGES['public']['thumbnails']['ENGINE'])(**FILER_STORAGES['public']['thumbnails']['OPTIONS']) @@ -210,6 +212,8 @@ def update_server_settings(settings, defaults, s, t): # Private media (media accessible through permissions checks) FILER_PRIVATEMEDIA_STORAGE = get_storage_class(FILER_STORAGES['private']['main']['ENGINE'])(**FILER_STORAGES['private']['main']['OPTIONS']) FILER_PRIVATEMEDIA_UPLOAD_TO = load_object(FILER_STORAGES['private']['main']['UPLOAD_TO']) +FILER_PRIVATEMEDIA_UPLOAD_DEPENDS_ON_FOLDER = load_object( + FILER_STORAGES['private']['main']['UPLOAD_DEPENDS_ON_FOLDER']) if 'UPLOAD_TO_PREFIX' in FILER_STORAGES['private']['main']: FILER_PRIVATEMEDIA_UPLOAD_TO = load_object('filer.utils.generate_filename.prefixed_factory')(FILER_PRIVATEMEDIA_UPLOAD_TO, FILER_STORAGES['private']['main']['UPLOAD_TO_PREFIX']) FILER_PRIVATEMEDIA_THUMBNAIL_STORAGE = get_storage_class(FILER_STORAGES['private']['thumbnails']['ENGINE'])(**FILER_STORAGES['private']['thumbnails']['OPTIONS']) From 667de129626d939da109ff7a73e4055146ade582 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Thu, 24 Jan 2013 13:49:28 +0200 Subject: [PATCH 003/715] Fixed issue with files moved to clipboard (they were uploaded to filer.models.virtualitems.UnfiledImages.name) --- filer/models/clipboardmodels.py | 1 + filer/utils/generate_filename.py | 10 ++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/filer/models/clipboardmodels.py b/filer/models/clipboardmodels.py index 5bdd735c0..dee54f4ec 100644 --- a/filer/models/clipboardmodels.py +++ b/filer/models/clipboardmodels.py @@ -10,6 +10,7 @@ class Clipboard(models.Model): files = models.ManyToManyField( 'File', verbose_name=_('files'), related_name="in_clipboards", through='ClipboardItem') + folder_name = '_clipboard' def append_file(self, file_obj): try: diff --git a/filer/utils/generate_filename.py b/filer/utils/generate_filename.py index 27afc92c4..aa7d25db3 100644 --- a/filer/utils/generate_filename.py +++ b/filer/utils/generate_filename.py @@ -1,3 +1,4 @@ +import filer.models.clipboardmodels from filer.utils.files import get_valid_filename from django.core.files.uploadedfile import UploadedFile from django.utils.encoding import force_unicode, smart_str @@ -33,9 +34,14 @@ def _construct_logical_folder_path(filer_file): return os.path.join(*(folder.name for folder in filer_file.logical_path)) +def _goes_to_clipboard(instance): + return _is_in_memory(instance.file.file) or instance.folder is None + + def by_path(instance, filename): - if _is_in_memory(instance.file.file): - return os.path.join('clipboard', filename) + if _goes_to_clipboard(instance): + return os.path.join( + filer.models.clipboardmodels.Clipboard.folder_name, filename) else: filename = filename.strip('/').split('/')[-1] path = os.path.join( From ddd21084cdd9b48241ca8d662e59bc0a3c2e465c Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Thu, 24 Jan 2013 14:15:05 +0200 Subject: [PATCH 004/715] Validate that no folder that might overlap with the upload/clipbloard folder might get created. --- filer/models/foldermodels.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/filer/models/foldermodels.py b/filer/models/foldermodels.py index ddedea1e4..b2a5a28ab 100644 --- a/filer/models/foldermodels.py +++ b/filer/models/foldermodels.py @@ -8,6 +8,8 @@ from filer.models import mixins from filer import settings as filer_settings +import filer.models.clipboardmodels + import mptt @@ -107,6 +109,12 @@ class Folder(models.Model, mixins.IconsMixin): objects = FolderManager() + def clean(self): + if self.name == filer.models.clipboardmodels.Clipboard.folder_name: + raise ValidationError( + '%s is reserved for internal use. ' + 'Please choose a different name' % self.name) + @property def file_count(self): if not hasattr(self, '_file_count_cache'): From 42adb135d1869847009e2368ef2bd3fbe03f6bb6 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Fri, 25 Jan 2013 14:41:51 +0200 Subject: [PATCH 005/715] * moved file moving logic to filemodels.File * added unique file name/folder constraint --- filer/models/clipboardmodels.py | 2 +- filer/models/filemodels.py | 39 ++++++++++++++++++++++++++++---- filer/models/foldermodels.py | 10 ++++++-- filer/models/tools.py | 25 ++++---------------- filer/settings.py | 6 ++--- filer/utils/generate_filename.py | 6 +++-- filer/views.py | 12 ++++++++++ 7 files changed, 66 insertions(+), 34 deletions(-) diff --git a/filer/models/clipboardmodels.py b/filer/models/clipboardmodels.py index dee54f4ec..c758fceaf 100644 --- a/filer/models/clipboardmodels.py +++ b/filer/models/clipboardmodels.py @@ -10,7 +10,7 @@ class Clipboard(models.Model): files = models.ManyToManyField( 'File', verbose_name=_('files'), related_name="in_clipboards", through='ClipboardItem') - folder_name = '_clipboard' + folder_name = "_clipboard" def append_file(self, file_obj): try: diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index 8fd6471b6..ba8be1514 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -2,7 +2,9 @@ from django.contrib.auth import models as auth_models from django.core import urlresolvers from django.core.files.base import ContentFile +from django.core.exceptions import ValidationError from django.db import models +from django.db.models import Q from django.utils.translation import ugettext_lazy as _ from filer.fields.multistorage_file import MultiStorageFileField from filer.models import mixins @@ -68,6 +70,26 @@ def matches_file_type(cls, iname, ifile, request): def __init__(self, *args, **kwargs): super(File, self).__init__(*args, **kwargs) self._old_is_public = self.is_public + self._old_name = self.name + self._old_folder = self.folder + + def clean(self): + if not filer_settings.LOGIC_PATH_EQ_ACTUAL: + return + if self.folder: + if self.folder.files_with_names([self.name]): + raise ValidationError( + 'Current folder already contains a file named %s' % \ + self.display_name) + + def _move_file_to_new_location(self): + new_location = self.file.field.upload_to(self, self.display_name) + storage = self.file.storage + src_file_name = self.file.name + src_file = storage.open(src_file_name) + src_file.open() + self.file = storage.save(new_location, ContentFile(src_file.read())) + storage.delete(src_file_name) def _move_file(self): """ @@ -145,6 +167,11 @@ def save(self, *args, **kwargs): if self._old_is_public != self.is_public and self.pk: self._move_file() self._old_is_public = self.is_public + + if filer_settings.LOGIC_PATH_EQ_ACTUAL and \ + (self._old_name != self.name or + self._old_folder != self.folder): + self._move_file_to_new_location() # generate SHA1 hash # TODO: only do this if needed (depending on the storage backend the whole file will be downloaded) try: @@ -200,12 +227,16 @@ def has_generic_permission(self, request, permission_type): else: return False - def __unicode__(self): + @property + def display_name(self): if self.name in ('', None): - text = u"%s" % (self.original_filename,) + display_name = u"%s" % (self.original_filename,) else: - text = u"%s" % (self.name,) - return text + display_name = u"%s" % (self.name,) + return display_name + + def __unicode__(self): + return self.display_name def get_admin_url_path(self): return urlresolvers.reverse( diff --git a/filer/models/foldermodels.py b/filer/models/foldermodels.py index b2a5a28ab..972a91450 100644 --- a/filer/models/foldermodels.py +++ b/filer/models/foldermodels.py @@ -5,10 +5,10 @@ from django.db import models from django.db.models import Q from django.utils.translation import ugettext_lazy as _ -from filer.models import mixins -from filer import settings as filer_settings import filer.models.clipboardmodels +from filer.models import mixins +from filer import settings as filer_settings import mptt @@ -135,6 +135,12 @@ def item_count(self): def files(self): return self.all_files.all() + def files_with_names(self, names): + q = Q(name__in=names) + q |= Q(original_filename__in=names) & (Q(name__isnull=True)|Q(name='')) + return self.all_files.filter(q) + + @property def logical_path(self): """ diff --git a/filer/models/tools.py b/filer/models/tools.py index 354420115..b12e25feb 100644 --- a/filer/models/tools.py +++ b/filer/models/tools.py @@ -1,6 +1,5 @@ #-*- coding: utf-8 -*- from filer.models import Clipboard -from filer import settings as filer_settings def discard_clipboard(clipboard): @@ -17,30 +16,13 @@ def get_user_clipboard(user): clipboard = Clipboard.objects.get_or_create(user=user)[0] return clipboard -def move_file(file_obj, folder): - file_obj.folder = folder - if file_obj.is_public: - upload_depends_on_folder = \ - filer_settings.FILER_PUBLICMEDIA_UPLOAD_DEPENDS_ON_FOLDER - upload_to = filer_settings.FILER_PUBLICMEDIA_UPLOAD_TO - else: - upload_depends_on_folder = \ - filer_settings.FILER_PRIVATEMEDIA_UPLOAD_DEPENDS_ON_FOLDER - upload_to = filer_settings.FILER_PRIVATEMEDIA_UPLOAD_TO - if upload_depends_on_folder: - storage = file_obj.file.storage - new_location = upload_to(file_obj, file_obj.original_filename) - new_name = storage.save(new_location, file_obj.file.file) - storage.delete(file_obj.file.name) - file_obj.file.name = new_name - file_obj.save() - def move_file_to_clipboard(files, clipboard): count = 0 for file_obj in files: if clipboard.append_file(file_obj): - move_file(file_obj, None) + file_obj.folder = None + file_obj.save() count += 1 return count @@ -51,5 +33,6 @@ def move_files_from_clipboard_to_folder(clipboard, folder): def move_files_to_folder(files, folder): for file_obj in files: - move_file(file_obj, folder) + file_obj.folder = folder + file_obj.save() return True diff --git a/filer/settings.py b/filer/settings.py index adaa85181..7fad1e4fc 100644 --- a/filer/settings.py +++ b/filer/settings.py @@ -201,8 +201,6 @@ def update_server_settings(settings, defaults, s, t): # Public media (media accessible without any permission checks) FILER_PUBLICMEDIA_STORAGE = get_storage_class(FILER_STORAGES['public']['main']['ENGINE'])(**FILER_STORAGES['public']['main']['OPTIONS']) FILER_PUBLICMEDIA_UPLOAD_TO = load_object(FILER_STORAGES['public']['main']['UPLOAD_TO']) -FILER_PUBLICMEDIA_UPLOAD_DEPENDS_ON_FOLDER = load_object( - FILER_STORAGES['public']['main']['UPLOAD_DEPENDS_ON_FOLDER']) if 'UPLOAD_TO_PREFIX' in FILER_STORAGES['public']['main']: FILER_PUBLICMEDIA_UPLOAD_TO = load_object('filer.utils.generate_filename.prefixed_factory')(FILER_PUBLICMEDIA_UPLOAD_TO, FILER_STORAGES['public']['main']['UPLOAD_TO_PREFIX']) FILER_PUBLICMEDIA_THUMBNAIL_STORAGE = get_storage_class(FILER_STORAGES['public']['thumbnails']['ENGINE'])(**FILER_STORAGES['public']['thumbnails']['OPTIONS']) @@ -212,11 +210,11 @@ def update_server_settings(settings, defaults, s, t): # Private media (media accessible through permissions checks) FILER_PRIVATEMEDIA_STORAGE = get_storage_class(FILER_STORAGES['private']['main']['ENGINE'])(**FILER_STORAGES['private']['main']['OPTIONS']) FILER_PRIVATEMEDIA_UPLOAD_TO = load_object(FILER_STORAGES['private']['main']['UPLOAD_TO']) -FILER_PRIVATEMEDIA_UPLOAD_DEPENDS_ON_FOLDER = load_object( - FILER_STORAGES['private']['main']['UPLOAD_DEPENDS_ON_FOLDER']) if 'UPLOAD_TO_PREFIX' in FILER_STORAGES['private']['main']: FILER_PRIVATEMEDIA_UPLOAD_TO = load_object('filer.utils.generate_filename.prefixed_factory')(FILER_PRIVATEMEDIA_UPLOAD_TO, FILER_STORAGES['private']['main']['UPLOAD_TO_PREFIX']) FILER_PRIVATEMEDIA_THUMBNAIL_STORAGE = get_storage_class(FILER_STORAGES['private']['thumbnails']['ENGINE'])(**FILER_STORAGES['private']['thumbnails']['OPTIONS']) FILER_PRIVATEMEDIA_THUMBNAIL_OPTIONS = FILER_STORAGES['private']['thumbnails']['THUMBNAIL_OPTIONS'] FILER_PRIVATEMEDIA_SERVER = load_object(FILER_SERVERS['private']['main']['ENGINE'])(**FILER_SERVERS['private']['main']['OPTIONS']) FILER_PRIVATEMEDIA_THUMBNAIL_SERVER = load_object(FILER_SERVERS['private']['thumbnails']['ENGINE'])(**FILER_SERVERS['private']['thumbnails']['OPTIONS']) + +LOGIC_PATH_EQ_ACTUAL = True diff --git a/filer/utils/generate_filename.py b/filer/utils/generate_filename.py index aa7d25db3..82149f7fd 100644 --- a/filer/utils/generate_filename.py +++ b/filer/utils/generate_filename.py @@ -1,9 +1,11 @@ +import datetime +import os + import filer.models.clipboardmodels from filer.utils.files import get_valid_filename + from django.core.files.uploadedfile import UploadedFile from django.utils.encoding import force_unicode, smart_str -import datetime -import os def by_date(instance, filename): diff --git a/filer/views.py b/filer/views.py index e03cdc818..7aa35864a 100755 --- a/filer/views.py +++ b/filer/views.py @@ -1,7 +1,9 @@ #-*- coding: utf-8 -*- from django import forms +from django.db.models import Q from django.contrib.admin import widgets from django.contrib.auth.decorators import login_required +from django.contrib import messages from django.core.exceptions import PermissionDenied from django.http import HttpResponseRedirect, HttpResponse from django.shortcuts import render_to_response @@ -136,6 +138,16 @@ def paste_clipboard_to_folder(request): if request.method == 'POST': folder = Folder.objects.get(id=request.POST.get('folder_id')) clipboard = Clipboard.objects.get(id=request.POST.get('clipboard_id')) + files = clipboard.files.all() + file_names = [f.display_name for f in files] + already_existing = folder.files_with_names(file_names) + if already_existing: + for f in already_existing: + messages.error(request, "File named %s already exists" % f.display_name) + return HttpResponseRedirect('%s%s%s' % ( + request.REQUEST.get('redirect_to', ''), + popup_param(request), + selectfolder_param(request))) if folder.has_add_children_permission(request): tools.move_files_from_clipboard_to_folder(clipboard, folder) tools.discard_clipboard(clipboard) From dc6fb6333ef17ce8881ac7895c60b4f643823c4c Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Tue, 29 Jan 2013 13:00:31 +0200 Subject: [PATCH 006/715] * s/LOGIC_PATH_EQ_ACTUAL/FOLDER_AFFECTS_URL/; it just sounds better * removed unused imports --- filer/models/filemodels.py | 5 ++--- filer/settings.py | 2 +- filer/views.py | 20 ++++++++++---------- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index ba8be1514..7efd997f6 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -4,7 +4,6 @@ from django.core.files.base import ContentFile from django.core.exceptions import ValidationError from django.db import models -from django.db.models import Q from django.utils.translation import ugettext_lazy as _ from filer.fields.multistorage_file import MultiStorageFileField from filer.models import mixins @@ -74,7 +73,7 @@ def __init__(self, *args, **kwargs): self._old_folder = self.folder def clean(self): - if not filer_settings.LOGIC_PATH_EQ_ACTUAL: + if not filer_settings.FOLDER_AFFECTS_URL: return if self.folder: if self.folder.files_with_names([self.name]): @@ -168,7 +167,7 @@ def save(self, *args, **kwargs): self._move_file() self._old_is_public = self.is_public - if filer_settings.LOGIC_PATH_EQ_ACTUAL and \ + if filer_settings.FOLDER_AFFECTS_URL and \ (self._old_name != self.name or self._old_folder != self.folder): self._move_file_to_new_location() diff --git a/filer/settings.py b/filer/settings.py index 7fad1e4fc..bc2390124 100644 --- a/filer/settings.py +++ b/filer/settings.py @@ -217,4 +217,4 @@ def update_server_settings(settings, defaults, s, t): FILER_PRIVATEMEDIA_SERVER = load_object(FILER_SERVERS['private']['main']['ENGINE'])(**FILER_SERVERS['private']['main']['OPTIONS']) FILER_PRIVATEMEDIA_THUMBNAIL_SERVER = load_object(FILER_SERVERS['private']['thumbnails']['ENGINE'])(**FILER_SERVERS['private']['thumbnails']['OPTIONS']) -LOGIC_PATH_EQ_ACTUAL = True +FOLDER_AFFECTS_URL = True diff --git a/filer/views.py b/filer/views.py index 7aa35864a..90769b96b 100755 --- a/filer/views.py +++ b/filer/views.py @@ -1,6 +1,5 @@ #-*- coding: utf-8 -*- from django import forms -from django.db.models import Q from django.contrib.admin import widgets from django.contrib.auth.decorators import login_required from django.contrib import messages @@ -139,15 +138,16 @@ def paste_clipboard_to_folder(request): folder = Folder.objects.get(id=request.POST.get('folder_id')) clipboard = Clipboard.objects.get(id=request.POST.get('clipboard_id')) files = clipboard.files.all() - file_names = [f.display_name for f in files] - already_existing = folder.files_with_names(file_names) - if already_existing: - for f in already_existing: - messages.error(request, "File named %s already exists" % f.display_name) - return HttpResponseRedirect('%s%s%s' % ( - request.REQUEST.get('redirect_to', ''), - popup_param(request), - selectfolder_param(request))) + if filer_settings.FOLDER_AFFECTS_URL: + file_names = [f.display_name for f in files] + already_existing = folder.files_with_names(file_names) + if already_existing: + for f in already_existing: + messages.error(request, "File named %s already exists" % f.display_name) + return HttpResponseRedirect('%s%s%s' % ( + request.REQUEST.get('redirect_to', ''), + popup_param(request), + selectfolder_param(request))) if folder.has_add_children_permission(request): tools.move_files_from_clipboard_to_folder(clipboard, folder) tools.discard_clipboard(clipboard) From 20785c7acc91609d5edf14b8b815fc524d3e876d Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Mon, 4 Feb 2013 12:15:31 +0200 Subject: [PATCH 007/715] Added a 'last line of defence' check that ensures that no duplicate files can exist in the same fodler --- filer/models/filemodels.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index 7efd997f6..a397d41d5 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -82,6 +82,12 @@ def clean(self): self.display_name) def _move_file_to_new_location(self): + if self.folder is not None\ + and self.folder.files_with_names([self.display_name]).exists(): + # last line of defense; duplicate file names should be caught at + # higher levels; however, if higher levels fail, this ensures we + # don't have a missbehaving file hierarchy + raise ValueError('Duplicate file names are not allowed') new_location = self.file.field.upload_to(self, self.display_name) storage = self.file.storage src_file_name = self.file.name From 42be99a7cde140c46e7d56bf0127f14d9f6514f5 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Wed, 6 Feb 2013 15:02:06 +0200 Subject: [PATCH 008/715] Fix various issues regarding the enforcing of file unicity * moved all clipboard unicity relatd validation in models.tools (there's still a certain amount of duplication, but I'll remove that in a future commit) * removed move and copy actions; this would cause serious problems if recursivly moving/copying folders: if during moving/copying an exception is raised (ex due to connection problems with the storage backend, then we end up with an inconsitent folder hierarchy) * removed _move_file_to_new_location and use the already existing _copy_file method * only delete the previous version of the file AFTER the new version of the object has been commited to the db. This ensures that we'll won't end up having filer file objects pointing to non-existent files * remove discarding feature and replace it with delete --- filer/admin/clipboardadmin.py | 5 +++ filer/admin/folderadmin.py | 31 ++++++++++------ filer/models/filemodels.py | 35 ++++++++----------- filer/models/tools.py | 28 ++++++++++++--- .../filer/tools/clipboard/clipboard.html | 5 +-- filer/utils/generate_filename.py | 4 ++- filer/views.py | 12 +------ 7 files changed, 70 insertions(+), 50 deletions(-) diff --git a/filer/admin/clipboardadmin.py b/filer/admin/clipboardadmin.py index cf403c7fd..7d1c3d317 100644 --- a/filer/admin/clipboardadmin.py +++ b/filer/admin/clipboardadmin.py @@ -57,6 +57,11 @@ def ajax_upload(self, request, folder_id=None): # Get clipboad clipboard = Clipboard.objects.get_or_create(user=request.user)[0] + if filer_settings.FOLDER_AFFECTS_URL and\ + clipboard.files.filter(original_filename=filename).exists(): + raise UploadException( + "A file named %s already exists in the clipboard" % \ + filename) # find the file type for filer_class in filer_settings.FILER_FILE_MODELS: diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index e94745896..1248f7615 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -4,6 +4,7 @@ from django.contrib import admin from django.contrib.admin import helpers from django.contrib.admin.util import quote, unquote, capfirst +from django.contrib import messages from django.template.defaultfilters import urlencode from filer.admin.patched.admin_utils import get_deleted_objects from django.core.exceptions import PermissionDenied @@ -32,7 +33,7 @@ check_folder_read_permissions) from filer.models import (Folder, FolderRoot, UnfiledImages, File, tools, ImagesWithMissingData, FolderPermission, Image) -from filer.settings import FILER_STATICMEDIA_PREFIX, FILER_PAGINATE_BY +from filer.settings import FILER_STATICMEDIA_PREFIX, FILER_PAGINATE_BY, FOLDER_AFFECTS_URL from filer.utils.filer_easy_thumbnails import FilerActionThumbnailer from filer.thumbnail_processors import normalize_subject_location from django.conf import settings as django_settings @@ -50,6 +51,16 @@ class Meta: fields = ('name',) +folder_admin_actions = [ + 'move_to_clipboard', 'files_set_public', 'files_set_private', + 'delete_files_or_folders', 'move_files_and_folders', + 'copy_files_and_folders', 'resize_images', 'rename_files'] + +if FOLDER_AFFECTS_URL: + folder_admin_actions.remove('move_files_and_folders') + folder_admin_actions.remove('copy_files_and_folders') + + class FolderAdmin(PrimitivePermissionAwareModelAdmin): list_display = ('name',) exclude = ('parent',) @@ -58,9 +69,7 @@ class FolderAdmin(PrimitivePermissionAwareModelAdmin): search_fields = ['name', 'files__name'] raw_id_fields = ('owner',) save_as = True # see ImageAdmin - actions = ['move_to_clipboard', 'files_set_public', 'files_set_private', - 'delete_files_or_folders', 'move_files_and_folders', - 'copy_files_and_folders', 'resize_images', 'rename_files'] + actions = folder_admin_actions def get_form(self, request, obj=None, **kwargs): """ @@ -307,7 +316,7 @@ def filter_file(qs, terms=[]): if "move-to-clipboard-%d" % (f.id,) in request.POST: clipboard = tools.get_user_clipboard(request.user) if f.has_edit_permission(request): - tools.move_file_to_clipboard([f], clipboard) + tools.move_file_to_clipboard(request, [f], clipboard) return HttpResponseRedirect(request.get_full_path()) else: raise PermissionDenied @@ -485,7 +494,7 @@ def move_to_clipboard(self, request, files_queryset, folders_queryset): files_count = [0] # We define it like that so that we can modify it inside the move_files function def move_files(files): - files_count[0] += tools.move_file_to_clipboard(files, clipboard) + files_count[0] += tools.move_file_to_clipboard(request, files, clipboard) def move_folders(folders): for f in folders: @@ -494,10 +503,10 @@ def move_folders(folders): move_files(files_queryset) move_folders(folders_queryset) - - self.message_user(request, _("Successfully moved %(count)d files to clipboard.") % { - "count": files_count[0], - }) + if files_count[0] > 0: + self.message_user(request, _("Successfully moved %(count)d files to clipboard.") % { + "count": files_count[0], + }) return None @@ -768,7 +777,7 @@ def move_files_and_folders(self, request, files_queryset, folders_queryset): # We count only topmost files and folders here n = files_queryset.count() + folders_queryset.count() if n: - self._move_files_and_folders_impl(files_queryset, folders_queryset, destination) + self._move_files_and_folders_impl(request, files_queryset, folders_queryset, destination) self.message_user(request, _("Successfully moved %(count)d files and/or folders to folder '%(destination)s'.") % { "count": n, "destination": destination, diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index a397d41d5..ef720a354 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -81,21 +81,6 @@ def clean(self): 'Current folder already contains a file named %s' % \ self.display_name) - def _move_file_to_new_location(self): - if self.folder is not None\ - and self.folder.files_with_names([self.display_name]).exists(): - # last line of defense; duplicate file names should be caught at - # higher levels; however, if higher levels fail, this ensures we - # don't have a missbehaving file hierarchy - raise ValueError('Duplicate file names are not allowed') - new_location = self.file.field.upload_to(self, self.display_name) - storage = self.file.storage - src_file_name = self.file.name - src_file = storage.open(src_file_name) - src_file.open() - self.file = storage.save(new_location, ContentFile(src_file.read())) - storage.delete(src_file_name) - def _move_file(self): """ Move the file from src to dst. @@ -173,17 +158,27 @@ def save(self, *args, **kwargs): self._move_file() self._old_is_public = self.is_public - if filer_settings.FOLDER_AFFECTS_URL and \ - (self._old_name != self.name or - self._old_folder != self.folder): - self._move_file_to_new_location() # generate SHA1 hash # TODO: only do this if needed (depending on the storage backend the whole file will be downloaded) try: self.generate_sha1() except Exception, e: pass - super(File, self).save(*args, **kwargs) + + if filer_settings.FOLDER_AFFECTS_URL and \ + (self._old_name != self.name or + self._old_folder != self.folder): + old_location = self.file.name + new_location = self.file.field.upload_to(self, self.display_name) + storage = self.file.storage + saved_as = self._copy_file(new_location) + assert saved_as == new_location + self.file = saved_as + super(File, self).save(*args, **kwargs) + storage.delete(old_location) + else: + super(File, self).save(*args, **kwargs) + save.alters_data = True def delete(self, *args, **kwargs): diff --git a/filer/models/tools.py b/filer/models/tools.py index b12e25feb..063f5e76f 100644 --- a/filer/models/tools.py +++ b/filer/models/tools.py @@ -1,5 +1,8 @@ #-*- coding: utf-8 -*- +from django.contrib import messages + from filer.models import Clipboard +from filer.settings import FOLDER_AFFECTS_URL def discard_clipboard(clipboard): @@ -17,22 +20,37 @@ def get_user_clipboard(user): return clipboard -def move_file_to_clipboard(files, clipboard): +def move_file_to_clipboard(request, files, clipboard): count = 0 + if FOLDER_AFFECTS_URL: + file_names = [f.original_filename for f in files] + already_existing = [ + f.original_filename + for f in clipboard.files.filter(original_filename__in=file_names)] for file_obj in files: + if FOLDER_AFFECTS_URL and file_obj.original_filename in already_existing: + messages.error(request, 'Clipboard already contains a file ' + 'named %s' % file_obj.display_name) + continue if clipboard.append_file(file_obj): - file_obj.folder = None + file_obj .folder = None file_obj.save() count += 1 return count -def move_files_from_clipboard_to_folder(clipboard, folder): - return move_files_to_folder(clipboard.files.all(), folder) +def move_files_from_clipboard_to_folder(request, clipboard, folder): + return move_files_to_folder(request, clipboard.files.all(), folder) -def move_files_to_folder(files, folder): +def move_files_to_folder(request, files, folder): + if FOLDER_AFFECTS_URL: + file_names = [f.display_name for f in files] + already_existing = [f.display_name for f in folder.files_with_names(file_names)] for file_obj in files: + if FOLDER_AFFECTS_URL and file_obj.display_name in already_existing: + messages.error(request, "File named %s already exists" % file_obj.display_name) + continue file_obj.folder = folder file_obj.save() return True diff --git a/filer/templates/admin/filer/tools/clipboard/clipboard.html b/filer/templates/admin/filer/tools/clipboard/clipboard.html index d0a4b0176..ef7373a4a 100644 --- a/filer/templates/admin/filer/tools/clipboard/clipboard.html +++ b/filer/templates/admin/filer/tools/clipboard/clipboard.html @@ -18,19 +18,20 @@ {% if select_folder %}{% endif %} + {% comment %}
{% csrf_token %} {% if is_popup %}{% endif %} {% if select_folder %}{% endif %} -
{% comment %} + {% endcomment %}
{% csrf_token %} {% if is_popup %}{% endif %} -
{% endcomment %} + diff --git a/filer/utils/generate_filename.py b/filer/utils/generate_filename.py index 82149f7fd..1adc84923 100644 --- a/filer/utils/generate_filename.py +++ b/filer/utils/generate_filename.py @@ -43,7 +43,9 @@ def _goes_to_clipboard(instance): def by_path(instance, filename): if _goes_to_clipboard(instance): return os.path.join( - filer.models.clipboardmodels.Clipboard.folder_name, filename) + filer.models.clipboardmodels.Clipboard.folder_name, + instance.owner.username, + filename) else: filename = filename.strip('/').split('/')[-1] path = os.path.join( diff --git a/filer/views.py b/filer/views.py index 90769b96b..768759d67 100755 --- a/filer/views.py +++ b/filer/views.py @@ -138,18 +138,8 @@ def paste_clipboard_to_folder(request): folder = Folder.objects.get(id=request.POST.get('folder_id')) clipboard = Clipboard.objects.get(id=request.POST.get('clipboard_id')) files = clipboard.files.all() - if filer_settings.FOLDER_AFFECTS_URL: - file_names = [f.display_name for f in files] - already_existing = folder.files_with_names(file_names) - if already_existing: - for f in already_existing: - messages.error(request, "File named %s already exists" % f.display_name) - return HttpResponseRedirect('%s%s%s' % ( - request.REQUEST.get('redirect_to', ''), - popup_param(request), - selectfolder_param(request))) if folder.has_add_children_permission(request): - tools.move_files_from_clipboard_to_folder(clipboard, folder) + tools.move_files_from_clipboard_to_folder(request, clipboard, folder) tools.discard_clipboard(clipboard) else: raise PermissionDenied From 43cc9b1d320023e0067d10a545112d120fb7f63c Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Thu, 28 Mar 2013 16:52:12 +0200 Subject: [PATCH 009/715] Fixed broken unit tests. --- filer/admin/folderadmin.py | 2 +- filer/settings.py | 2 +- filer/tests/admin.py | 6 ++++-- filer/tests/tools.py | 9 +++++---- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 1248f7615..eb91a811c 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -777,7 +777,7 @@ def move_files_and_folders(self, request, files_queryset, folders_queryset): # We count only topmost files and folders here n = files_queryset.count() + folders_queryset.count() if n: - self._move_files_and_folders_impl(request, files_queryset, folders_queryset, destination) + self._move_files_and_folders_impl(files_queryset, folders_queryset, destination) self.message_user(request, _("Successfully moved %(count)d files and/or folders to folder '%(destination)s'.") % { "count": n, "destination": destination, diff --git a/filer/settings.py b/filer/settings.py index bc2390124..832da10c2 100644 --- a/filer/settings.py +++ b/filer/settings.py @@ -217,4 +217,4 @@ def update_server_settings(settings, defaults, s, t): FILER_PRIVATEMEDIA_SERVER = load_object(FILER_SERVERS['private']['main']['ENGINE'])(**FILER_SERVERS['private']['main']['OPTIONS']) FILER_PRIVATEMEDIA_THUMBNAIL_SERVER = load_object(FILER_SERVERS['private']['thumbnails']['ENGINE'])(**FILER_SERVERS['private']['thumbnails']['OPTIONS']) -FOLDER_AFFECTS_URL = True +FOLDER_AFFECTS_URL = False diff --git a/filer/tests/admin.py b/filer/tests/admin.py index 8f1d91d9a..aa3a4b9d0 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -4,6 +4,7 @@ from django.core.urlresolvers import reverse import django.core.files from django.contrib.admin import helpers +from django.http import HttpRequest from filer.models.filemodels import File from filer.models.foldermodels import Folder @@ -199,7 +200,8 @@ def test_move_to_clipboard_action(self): self.assertEqual(self.dst_folder.files.count(), 0) clipboard = Clipboard.objects.get(user=self.superuser) self.assertEqual(clipboard.files.count(), 1) - tools.move_files_from_clipboard_to_folder(clipboard, self.src_folder) + request = HttpRequest() + tools.move_files_from_clipboard_to_folder(request, clipboard, self.src_folder) tools.discard_clipboard(clipboard) self.assertEqual(clipboard.files.count(), 0) self.assertEqual(self.src_folder.files.count(), 1) @@ -330,4 +332,4 @@ def test_render_add_view(self): Really stupid and simple test to see if the add Permission view can be rendered """ response = self.client.get(reverse('admin:filer_folderpermission_add')) - self.assertEqual(response.status_code, 200) \ No newline at end of file + self.assertEqual(response.status_code, 200) diff --git a/filer/tests/tools.py b/filer/tests/tools.py index 1bbaa6f4f..088936268 100644 --- a/filer/tests/tools.py +++ b/filer/tests/tools.py @@ -1,5 +1,6 @@ #-*- coding: utf-8 -*- from django.core.files import File as DjangoFile +from django.http import HttpRequest from django.test.testcases import TestCase from filer.models import tools from filer.models.clipboardmodels import Clipboard @@ -50,14 +51,14 @@ def test_move_to_clipboard_works(self): original_filename='file3', file=self.file) files = [file2, file3] - - tools.move_file_to_clipboard(files, self.clipboard) + request = HttpRequest() + tools.move_file_to_clipboard(request, files, self.clipboard) self.assertEqual(len(self.clipboard.files.all()), 3) def test_move_from_clipboard_to_folder_works(self): self.assertEqual(len(self.clipboard.files.all()), 1) - - tools.move_files_from_clipboard_to_folder(self.clipboard, self.folder) + request = HttpRequest() + tools.move_files_from_clipboard_to_folder(request, self.clipboard, self.folder) for file in self.clipboard.files.all(): self.assertEqual(file.folder, self.folder) From a6b74cf811c536b8f5e5a843b80b8a7d312d4d68 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Fri, 29 Mar 2013 13:34:45 +0200 Subject: [PATCH 010/715] Added test for checking that when FOLDER_AFFECTS_URL is set file names in the clipboard are unique Also added a context manager for overriding filer settings in tests. --- filer/test_utils/__init__.py | 1 + filer/test_utils/context_managers.py | 31 ++++++++++++++++++++++++++++ filer/tests/admin.py | 29 +++++++++++++++++++++++++- 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 filer/test_utils/__init__.py create mode 100644 filer/test_utils/context_managers.py diff --git a/filer/test_utils/__init__.py b/filer/test_utils/__init__.py new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/filer/test_utils/__init__.py @@ -0,0 +1 @@ + diff --git a/filer/test_utils/context_managers.py b/filer/test_utils/context_managers.py new file mode 100644 index 000000000..c972d3830 --- /dev/null +++ b/filer/test_utils/context_managers.py @@ -0,0 +1,31 @@ +#-*- coding: utf-8 -*- + + +class SettingsOverride(object): + """ + Overrides Django settings within a context and resets them to their inital + values on exit. + + Example: + + with SettingsOverride(DEBUG=True): + # do something + """ + + def __init__(self, settings_module, **overrides): + self.settings_module = settings_module + self.overrides = overrides + + def __enter__(self): + self.old = {} + for key, value in self.overrides.items(): + self.old[key] = getattr(self.settings_module, key, None) + setattr(self.settings_module, key, value) + + def __exit__(self, type, value, traceback): + for key, value in self.old.items(): + if value is not None: + setattr(self.settings_module, key, value) + else: + delattr(self.settings_module,key) + diff --git a/filer/tests/admin.py b/filer/tests/admin.py index aa3a4b9d0..783c5ed68 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -14,6 +14,10 @@ from filer.models import tools from filer.tests.helpers import (create_superuser, create_folder_structure, create_image) +from filer.test_utils.context_managers import SettingsOverride +from filer.utils.generate_filename import by_path + +import filer.settings as filer_settings class FilerFolderAdminUrlsTests(TestCase): @@ -89,6 +93,29 @@ def test_filer_upload_file(self, extra_headers={}): self.assertEqual(Image.objects.count(), 1) self.assertEqual(Image.objects.all()[0].original_filename, self.image_name) + def test_filer_upload_file_logical_actual_url(self, extra_headers={}): + with SettingsOverride(filer_settings, + FOLDER_AFFECTS_URL=True, + FILER_PUBLICMEDIA_UPLOAD_TO=by_path): + self.assertEqual(Image.objects.count(), 0) + file_obj = django.core.files.File(open(self.filename)) + response = self.client.post( + reverse('admin:filer-ajax_upload'), + {'Filename': self.image_name, 'Filedata': file_obj, 'jsessionid': self.client.session.session_key,}, + **extra_headers + ) + self.assertEqual(Image.objects.count(), 1) + self.assertEqual(Image.objects.all()[0].original_filename, self.image_name) + # upload the same file again. This must fail since the clipboard can't contain + # two files with the same name + response = self.client.post( + reverse('admin:filer-ajax_upload'), + {'Filename': self.image_name, 'Filedata': file_obj, 'jsessionid': self.client.session.session_key,}, + **extra_headers + ) + self.assertEqual(Image.objects.count(), 1) + self.assertIn('error', response.content) + def test_filer_ajax_upload_file(self): self.assertEqual(Image.objects.count(), 0) file_obj = django.core.files.File(open(self.filename)) @@ -102,7 +129,7 @@ def test_filer_ajax_upload_file(self): self.assertEqual(Image.objects.all()[0].original_filename, self.image_name) -class BulkOperationsMixin(object): +class BulkOperationsMixin(object): def setUp(self): self.superuser = create_superuser() self.client.login(username='admin', password='secret') From ee9886f3166feb994e8a776ebc48c2dd7b7cc176 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Fri, 29 Mar 2013 14:14:05 +0200 Subject: [PATCH 011/715] Read FOLDER_AFFECTS_URL from the corresponding project settings --- filer/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filer/settings.py b/filer/settings.py index 832da10c2..a914d6730 100644 --- a/filer/settings.py +++ b/filer/settings.py @@ -217,4 +217,4 @@ def update_server_settings(settings, defaults, s, t): FILER_PRIVATEMEDIA_SERVER = load_object(FILER_SERVERS['private']['main']['ENGINE'])(**FILER_SERVERS['private']['main']['OPTIONS']) FILER_PRIVATEMEDIA_THUMBNAIL_SERVER = load_object(FILER_SERVERS['private']['thumbnails']['ENGINE'])(**FILER_SERVERS['private']['thumbnails']['OPTIONS']) -FOLDER_AFFECTS_URL = False +FOLDER_AFFECTS_URL = getattr(settings, 'FILER_FOLDER_AFFECTS_URL', False) From 3eee45e35f5283506c3cc1880c1371419b0748ae Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Mon, 1 Apr 2013 10:36:00 +0300 Subject: [PATCH 012/715] Validate folder name uniqueness on folder renames on folder moves/copying. --- filer/admin/folderadmin.py | 26 ++++++++++++--- filer/tests/admin.py | 66 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 5 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index eb91a811c..0eb69f772 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -1,7 +1,7 @@ #-*- coding: utf-8 -*- from django import forms from django import template -from django.contrib import admin +from django.core.exceptions import ValidationError from django.contrib.admin import helpers from django.contrib.admin.util import quote, unquote, capfirst from django.contrib import messages @@ -80,8 +80,19 @@ def get_form(self, request, obj=None, **kwargs): if parent_id: return AddFolderPopupForm else: - return super(FolderAdmin, self).get_form( - request, obj=None, **kwargs) + folder_form = super(FolderAdmin, self).get_form( + request, obj=None, **kwargs) + + def folder_form_clean(form_obj): + cleaned_data = form_obj.cleaned_data + if Folder.objects.filter(parent=form_obj.instance.parent, + name=cleaned_data['name']): + raise ValidationError('Folder with this name already exists.') + return cleaned_data + + # attach clean to the default form rather than defining a new form class + folder_form.clean = folder_form_clean + return folder_form def save_form(self, request, form, change): """ @@ -322,7 +333,6 @@ def filter_file(qs, terms=[]): raise PermissionDenied selected = request.POST.getlist(helpers.ACTION_CHECKBOX_NAME) - # Actions with no confirmation if (actions and request.method == 'POST' and 'index' in request.POST and '_save' not in request.POST): @@ -776,7 +786,13 @@ def move_files_and_folders(self, request, files_queryset, folders_queryset): raise PermissionDenied # We count only topmost files and folders here n = files_queryset.count() + folders_queryset.count() - if n: + conflicting_names = [folder.name for folder in Folder.objects.filter( + parent=destination, + name__in=folders_queryset.values('name'))] + if conflicting_names: + messages.error(request, _("Folders with names %s already exist at the selected " + "destination" % ", ".join(conflicting_names))) + elif n: self._move_files_and_folders_impl(files_queryset, folders_queryset, destination) self.message_user(request, _("Successfully moved %(count)d files and/or folders to folder '%(destination)s'.") % { "count": n, diff --git a/filer/tests/admin.py b/filer/tests/admin.py index 783c5ed68..6d2dd8c7d 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -56,6 +56,43 @@ def test_filer_directory_listing_root_get(self): self.assertEqual(response.status_code, 200) self.assertEqual(response.context['folder'].children.count(), 6) + def test_validate_no_duplcate_folders(self): + FOLDER_NAME = "root folder 1" + self.assertEqual(Folder.objects.count(), 0) + response = self.client.post(reverse('admin:filer-directory_listing-make_root_folder'), { + "name":FOLDER_NAME, + "_popup": 1 + }) + self.assertEqual(Folder.objects.count(), 1) + self.assertEqual(Folder.objects.all()[0].name, FOLDER_NAME) + # and create another one + response = self.client.post(reverse('admin:filer-directory_listing-make_root_folder'), + {"name":FOLDER_NAME, "_popup": 1}) + # second folder didn't get created + self.assertEqual(Folder.objects.count(), 1) + self.assertIn('Folder with this name already exists', response.content) + + def test_validate_no_duplcate_folders_on_rename(self): + self.assertEqual(Folder.objects.count(), 0) + response = self.client.post(reverse('admin:filer-directory_listing-make_root_folder'), { + "name": "foo", + "_popup": 1}) + self.assertEqual(Folder.objects.count(), 1) + self.assertEqual(Folder.objects.all()[0].name, "foo") + # and create another one + response = self.client.post(reverse('admin:filer-directory_listing-make_root_folder'), { + "name": "bar", + "_popup": 1}) + self.assertEqual(Folder.objects.count(), 2) + bar = Folder.objects.get(name="bar") + response = self.client.post("/admin/filer/folder/%d/" % bar.pk, { + "name": "foo", + "_popup": 1}) + self.assertIn('Folder with this name already exists', response.content) + # refresh from db and validate that it's name didn't change + bar = Folder.objects.get(pk=bar.pk) + self.assertEqual(bar.name, "bar") + class FilerImageAdminUrlsTests(TestCase): def setUp(self): @@ -211,6 +248,35 @@ def test_move_files_and_folders_action(self): self.assertEqual(self.src_folder.files.count(), 1) self.assertEqual(self.dst_folder.files.count(), 0) + def test_validate_no_duplicate_folders_on_move(self): + """Create the following folder hierarchy: + root + | + |--foo + | |-bar + | + |--bar + + and try to move the owter bar in foo. This has to fail since it would result + in two folders with the same name and parent. + """ + root = Folder.objects.create(name='root', owner=self.superuser) + foo = Folder.objects.create(name='foo', parent=root, owner=self.superuser) + bar = Folder.objects.create(name='bar', parent=root, owner=self.superuser) + foos_bar = Folder.objects.create(name='bar', parent=foo, owner=self.superuser) + url = reverse('admin:filer-directory_listing', kwargs={ + 'folder_id': root.pk, + }) + response = self.client.post(url, { + 'action': 'move_files_and_folders', + 'post': 'yes', + 'destination': foo.pk, + helpers.ACTION_CHECKBOX_NAME: 'folder-%d' % (bar.pk,), + }) + # refresh from db and validate that it hasn't been moved + bar = Folder.objects.get(pk=bar.pk) + self.assertEqual(bar.parent.pk, root.pk) + def test_move_to_clipboard_action(self): # TODO: Test recursive (files and folders tree) move From 1d7ac86f9717a2a206492db4bb74196a9d053ce3 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Mon, 1 Apr 2013 11:39:33 +0300 Subject: [PATCH 013/715] Fix for #304: make 'copy files and/or folders' work when the current folder is the root folder. --- filer/admin/folderadmin.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 0eb69f772..7e74e7b66 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -1009,15 +1009,17 @@ def copy_files_and_folders(self, request, files_queryset, folders_queryset): try: selected_destination_folder = int(request.POST.get('destination', 0)) except ValueError: - selected_destination_folder = 0 - + if current_folder: + selected_destination_folder = current_folder.pk + else: + selected_destination_folder = 0 context = { "title": _("Copy files and/or folders"), "instance": current_folder, "breadcrumbs_action": _("Copy files and/or folders"), "to_copy": to_copy, "destination_folders": folders, - "selected_destination_folder": selected_destination_folder or current_folder.pk, + "selected_destination_folder": selected_destination_folder, "copy_form": form, "files_queryset": files_queryset, "folders_queryset": folders_queryset, From 3315993c6faa2648210f8b5842942bd16f992a7a Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Mon, 1 Apr 2013 13:03:29 +0300 Subject: [PATCH 014/715] Place the unique name constraint on both files and folders. --- filer/models/filemodels.py | 2 +- filer/models/foldermodels.py | 13 ++++++++++--- filer/models/tools.py | 6 ++++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index ef720a354..0aca5ee3b 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -76,7 +76,7 @@ def clean(self): if not filer_settings.FOLDER_AFFECTS_URL: return if self.folder: - if self.folder.files_with_names([self.name]): + if self.folder.files_and_folders_with_names([self.name]): raise ValidationError( 'Current folder already contains a file named %s' % \ self.display_name) diff --git a/filer/models/foldermodels.py b/filer/models/foldermodels.py index 972a91450..7fb198ecd 100644 --- a/filer/models/foldermodels.py +++ b/filer/models/foldermodels.py @@ -1,4 +1,6 @@ #-*- coding: utf-8 -*- +import itertools + from django.contrib.auth import models as auth_models from django.core import urlresolvers from django.core.exceptions import ValidationError @@ -135,11 +137,12 @@ def item_count(self): def files(self): return self.all_files.all() - def files_with_names(self, names): + def files_and_folders_with_names(self, names): q = Q(name__in=names) q |= Q(original_filename__in=names) & (Q(name__isnull=True)|Q(name='')) - return self.all_files.filter(q) - + files_with_names = self.all_files.filter(q) + folders_with_names = self.children.filter(name__in=names) + return itertools.chain(files_with_names, folders_with_names) @property def logical_path(self): @@ -211,6 +214,10 @@ def get_admin_directory_listing_url_path(self): def __unicode__(self): return u"%s" % (self.name,) + @property + def display_name(self): + return self.name + def contains_folder(self, folder_name): try: self.children.get(name=folder_name) diff --git a/filer/models/tools.py b/filer/models/tools.py index 063f5e76f..caaa5f9ed 100644 --- a/filer/models/tools.py +++ b/filer/models/tools.py @@ -46,10 +46,12 @@ def move_files_from_clipboard_to_folder(request, clipboard, folder): def move_files_to_folder(request, files, folder): if FOLDER_AFFECTS_URL: file_names = [f.display_name for f in files] - already_existing = [f.display_name for f in folder.files_with_names(file_names)] + already_existing = [ + f.display_name + for f in folder.files_and_folders_with_names(file_names)] for file_obj in files: if FOLDER_AFFECTS_URL and file_obj.display_name in already_existing: - messages.error(request, "File named %s already exists" % file_obj.display_name) + messages.error(request, "File or folder named %s already exists" % file_obj.display_name) continue file_obj.folder = folder file_obj.save() From f840500f2cae46fd6604c940dcccacf86e39ad5f Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Mon, 1 Apr 2013 14:51:19 +0300 Subject: [PATCH 015/715] Added a test for pasting from clipboard to a folder and checking that duplicate file names are not allowed. --- filer/models/tools.py | 10 +++++----- filer/tests/admin.py | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/filer/models/tools.py b/filer/models/tools.py index caaa5f9ed..ab16d3e71 100644 --- a/filer/models/tools.py +++ b/filer/models/tools.py @@ -2,7 +2,7 @@ from django.contrib import messages from filer.models import Clipboard -from filer.settings import FOLDER_AFFECTS_URL +from filer import settings def discard_clipboard(clipboard): @@ -22,13 +22,13 @@ def get_user_clipboard(user): def move_file_to_clipboard(request, files, clipboard): count = 0 - if FOLDER_AFFECTS_URL: + if settings.FOLDER_AFFECTS_URL: file_names = [f.original_filename for f in files] already_existing = [ f.original_filename for f in clipboard.files.filter(original_filename__in=file_names)] for file_obj in files: - if FOLDER_AFFECTS_URL and file_obj.original_filename in already_existing: + if settings.FOLDER_AFFECTS_URL and file_obj.original_filename in already_existing: messages.error(request, 'Clipboard already contains a file ' 'named %s' % file_obj.display_name) continue @@ -44,13 +44,13 @@ def move_files_from_clipboard_to_folder(request, clipboard, folder): def move_files_to_folder(request, files, folder): - if FOLDER_AFFECTS_URL: + if settings.FOLDER_AFFECTS_URL: file_names = [f.display_name for f in files] already_existing = [ f.display_name for f in folder.files_and_folders_with_names(file_names)] for file_obj in files: - if FOLDER_AFFECTS_URL and file_obj.display_name in already_existing: + if settings.FOLDER_AFFECTS_URL and file_obj.display_name in already_existing: messages.error(request, "File or folder named %s already exists" % file_obj.display_name) continue file_obj.folder = folder diff --git a/filer/tests/admin.py b/filer/tests/admin.py index 6d2dd8c7d..0c9e81677 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -153,6 +153,40 @@ def test_filer_upload_file_logical_actual_url(self, extra_headers={}): self.assertEqual(Image.objects.count(), 1) self.assertIn('error', response.content) + def test_paste_clipboard_to_folder_logical_actual_url(self): + with SettingsOverride(filer_settings, + FOLDER_AFFECTS_URL=True, + FILER_PUBLICMEDIA_UPLOAD_TO=by_path): + first_folder = Folder.objects.create(name='first') + + def upload(): + file_obj = django.core.files.File(open(self.filename)) + response = self.client.post( + reverse('admin:filer-ajax_upload'), + {'Filename': self.image_name, 'Filedata': file_obj, + 'jsessionid': self.client.session.session_key,}) + return Image.objects.all().order_by('-id')[0] + + uploaded_image = upload() + self.assertEqual(uploaded_image.original_filename, self.image_name) + + def paste(uploaded_image): + # current user should have one clipboard created + clipboard = self.superuser.filer_clipboards.all()[0] + response = self.client.post( + reverse('admin:filer-paste_clipboard_to_folder'), + {'folder_id': first_folder.pk, + 'clipboard_id': clipboard.pk}) + return Image.objects.get(pk=uploaded_image.pk) + + pasted_image = paste(uploaded_image) + self.assertEqual(pasted_image.folder.pk, first_folder.pk) + # upload and paste the same image again + second_upload = upload() + second_paste = paste(second_upload) + # second paste failed due to name conflict + self.assertEqual(second_paste.folder, None) + def test_filer_ajax_upload_file(self): self.assertEqual(Image.objects.count(), 0) file_obj = django.core.files.File(open(self.filename)) From d8f5643a9b3d48e245931f0d6285ad29756bb1c4 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Mon, 1 Apr 2013 14:56:10 +0300 Subject: [PATCH 016/715] Moved the SettingsOverride helper class to tests/helpers.py --- filer/test_utils/__init__.py | 1 - filer/test_utils/context_managers.py | 31 ---------------------------- filer/tests/admin.py | 3 +-- filer/tests/helpers.py | 30 +++++++++++++++++++++++++++ 4 files changed, 31 insertions(+), 34 deletions(-) delete mode 100644 filer/test_utils/__init__.py delete mode 100644 filer/test_utils/context_managers.py diff --git a/filer/test_utils/__init__.py b/filer/test_utils/__init__.py deleted file mode 100644 index 8b1378917..000000000 --- a/filer/test_utils/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/filer/test_utils/context_managers.py b/filer/test_utils/context_managers.py deleted file mode 100644 index c972d3830..000000000 --- a/filer/test_utils/context_managers.py +++ /dev/null @@ -1,31 +0,0 @@ -#-*- coding: utf-8 -*- - - -class SettingsOverride(object): - """ - Overrides Django settings within a context and resets them to their inital - values on exit. - - Example: - - with SettingsOverride(DEBUG=True): - # do something - """ - - def __init__(self, settings_module, **overrides): - self.settings_module = settings_module - self.overrides = overrides - - def __enter__(self): - self.old = {} - for key, value in self.overrides.items(): - self.old[key] = getattr(self.settings_module, key, None) - setattr(self.settings_module, key, value) - - def __exit__(self, type, value, traceback): - for key, value in self.old.items(): - if value is not None: - setattr(self.settings_module, key, value) - else: - delattr(self.settings_module,key) - diff --git a/filer/tests/admin.py b/filer/tests/admin.py index 0c9e81677..23164bef8 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -13,8 +13,7 @@ from filer.models.virtualitems import FolderRoot from filer.models import tools from filer.tests.helpers import (create_superuser, create_folder_structure, - create_image) -from filer.test_utils.context_managers import SettingsOverride + create_image, SettingsOverride) from filer.utils.generate_filename import by_path import filer.settings as filer_settings diff --git a/filer/tests/helpers.py b/filer/tests/helpers.py index 1ce73dffe..d29449530 100644 --- a/filer/tests/helpers.py +++ b/filer/tests/helpers.py @@ -5,6 +5,7 @@ from filer.models.foldermodels import Folder from filer.models.clipboardmodels import Clipboard, ClipboardItem + def create_superuser(): superuser = User.objects.create_superuser('admin', 'admin@free.fr', @@ -41,3 +42,32 @@ def create_image(mode='RGB', size=(800, 600)): draw.rectangle((x_bit, y_bit * 2, x_bit * 7, y_bit * 3), 'red') draw.rectangle((x_bit * 2, y_bit, x_bit * 3, y_bit * 8), 'red') return image + + +class SettingsOverride(object): + """ + Overrides Django settings within a context and resets them to their inital + values on exit. + + Example: + + with SettingsOverride(DEBUG=True): + # do something + """ + + def __init__(self, settings_module, **overrides): + self.settings_module = settings_module + self.overrides = overrides + + def __enter__(self): + self.old = {} + for key, value in self.overrides.items(): + self.old[key] = getattr(self.settings_module, key, None) + setattr(self.settings_module, key, value) + + def __exit__(self, type, value, traceback): + for key, value in self.old.items(): + if value is not None: + setattr(self.settings_module, key, value) + else: + delattr(self.settings_module,key) From e352ddda37d78f3e5500ff3eff9da91fc22cd5ef Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Tue, 2 Apr 2013 13:11:12 +0300 Subject: [PATCH 017/715] Make sure the error message on duplicate folders works with unicode characters as well. --- filer/admin/folderadmin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 7e74e7b66..47de0490b 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -790,8 +790,8 @@ def move_files_and_folders(self, request, files_queryset, folders_queryset): parent=destination, name__in=folders_queryset.values('name'))] if conflicting_names: - messages.error(request, _("Folders with names %s already exist at the selected " - "destination" % ", ".join(conflicting_names))) + messages.error(request, _(u"Folders with names %s already exist at the selected " + "destination") % u", ".join(conflicting_names)) elif n: self._move_files_and_folders_impl(files_queryset, folders_queryset, destination) self.message_user(request, _("Successfully moved %(count)d files and/or folders to folder '%(destination)s'.") % { From 7744faffa3fafc30a72e64f1f31b24a5f2e50116 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Tue, 2 Apr 2013 13:56:10 +0300 Subject: [PATCH 018/715] Made all error messages in case of duplicate files/folders cope with unicode characters. --- filer/admin/clipboardadmin.py | 4 ++-- filer/models/clipboardmodels.py | 2 +- filer/models/filemodels.py | 2 +- filer/models/foldermodels.py | 4 ++-- filer/models/tools.py | 7 ++++--- filer/views.py | 1 - 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/filer/admin/clipboardadmin.py b/filer/admin/clipboardadmin.py index 7d1c3d317..7068b1635 100644 --- a/filer/admin/clipboardadmin.py +++ b/filer/admin/clipboardadmin.py @@ -3,6 +3,7 @@ from django.contrib import admin from django.http import HttpResponse from django.utils import simplejson +from django.utils.translation import ugettext as _ from django.views.decorators.csrf import csrf_exempt from filer import settings as filer_settings from filer.models import Clipboard, ClipboardItem @@ -60,8 +61,7 @@ def ajax_upload(self, request, folder_id=None): if filer_settings.FOLDER_AFFECTS_URL and\ clipboard.files.filter(original_filename=filename).exists(): raise UploadException( - "A file named %s already exists in the clipboard" % \ - filename) + _(u"A file named %s already exists in the clipboard") % filename) # find the file type for filer_class in filer_settings.FILER_FILE_MODELS: diff --git a/filer/models/clipboardmodels.py b/filer/models/clipboardmodels.py index c758fceaf..b345d74cf 100644 --- a/filer/models/clipboardmodels.py +++ b/filer/models/clipboardmodels.py @@ -10,7 +10,7 @@ class Clipboard(models.Model): files = models.ManyToManyField( 'File', verbose_name=_('files'), related_name="in_clipboards", through='ClipboardItem') - folder_name = "_clipboard" + folder_name = u"_clipboard" def append_file(self, file_obj): try: diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index 0aca5ee3b..3399a8608 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -78,7 +78,7 @@ def clean(self): if self.folder: if self.folder.files_and_folders_with_names([self.name]): raise ValidationError( - 'Current folder already contains a file named %s' % \ + _(u'Current folder already contains a file named %s') % \ self.display_name) def _move_file(self): diff --git a/filer/models/foldermodels.py b/filer/models/foldermodels.py index 7fb198ecd..e6f7e9669 100644 --- a/filer/models/foldermodels.py +++ b/filer/models/foldermodels.py @@ -114,8 +114,8 @@ class Folder(models.Model, mixins.IconsMixin): def clean(self): if self.name == filer.models.clipboardmodels.Clipboard.folder_name: raise ValidationError( - '%s is reserved for internal use. ' - 'Please choose a different name' % self.name) + _(u'%s is reserved for internal use. ' + 'Please choose a different name') % self.name) @property def file_count(self): diff --git a/filer/models/tools.py b/filer/models/tools.py index ab16d3e71..7d00c2065 100644 --- a/filer/models/tools.py +++ b/filer/models/tools.py @@ -1,5 +1,6 @@ #-*- coding: utf-8 -*- from django.contrib import messages +from django.utils.translation import ugettext as _ from filer.models import Clipboard from filer import settings @@ -29,8 +30,8 @@ def move_file_to_clipboard(request, files, clipboard): for f in clipboard.files.filter(original_filename__in=file_names)] for file_obj in files: if settings.FOLDER_AFFECTS_URL and file_obj.original_filename in already_existing: - messages.error(request, 'Clipboard already contains a file ' - 'named %s' % file_obj.display_name) + messages.error(request, _(u'Clipboard already contains a file ' + 'named %s') % file_obj.display_name) continue if clipboard.append_file(file_obj): file_obj .folder = None @@ -51,7 +52,7 @@ def move_files_to_folder(request, files, folder): for f in folder.files_and_folders_with_names(file_names)] for file_obj in files: if settings.FOLDER_AFFECTS_URL and file_obj.display_name in already_existing: - messages.error(request, "File or folder named %s already exists" % file_obj.display_name) + messages.error(request, _(u"File or folder named %s already exists") % file_obj.display_name) continue file_obj.folder = folder file_obj.save() diff --git a/filer/views.py b/filer/views.py index 768759d67..201b9f3ce 100755 --- a/filer/views.py +++ b/filer/views.py @@ -2,7 +2,6 @@ from django import forms from django.contrib.admin import widgets from django.contrib.auth.decorators import login_required -from django.contrib import messages from django.core.exceptions import PermissionDenied from django.http import HttpResponseRedirect, HttpResponse from django.shortcuts import render_to_response From f3689a33d2021109894cc742464e83ce68b1db64 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Tue, 2 Apr 2013 16:45:45 +0300 Subject: [PATCH 019/715] If a file didn't get pasted from the clipboard, delete it. If the file wouldn't get deleted it would remain in an orphan state: attached to no folder and to no clipboard. --- filer/models/tools.py | 1 + filer/tests/admin.py | 7 ++++--- filer/views.py | 1 - 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/filer/models/tools.py b/filer/models/tools.py index 7d00c2065..d3a054e64 100644 --- a/filer/models/tools.py +++ b/filer/models/tools.py @@ -53,6 +53,7 @@ def move_files_to_folder(request, files, folder): for file_obj in files: if settings.FOLDER_AFFECTS_URL and file_obj.display_name in already_existing: messages.error(request, _(u"File or folder named %s already exists") % file_obj.display_name) + file_obj.delete() continue file_obj.folder = folder file_obj.save() diff --git a/filer/tests/admin.py b/filer/tests/admin.py index 23164bef8..4211c8f22 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -182,9 +182,10 @@ def paste(uploaded_image): self.assertEqual(pasted_image.folder.pk, first_folder.pk) # upload and paste the same image again second_upload = upload() - second_paste = paste(second_upload) - # second paste failed due to name conflict - self.assertEqual(second_paste.folder, None) + # second paste failed due to name conflict, and file in clipboard + # got deleted + with self.assertRaises(File.DoesNotExist): + paste(second_upload) def test_filer_ajax_upload_file(self): self.assertEqual(Image.objects.count(), 0) diff --git a/filer/views.py b/filer/views.py index 201b9f3ce..764f88877 100755 --- a/filer/views.py +++ b/filer/views.py @@ -136,7 +136,6 @@ def paste_clipboard_to_folder(request): if request.method == 'POST': folder = Folder.objects.get(id=request.POST.get('folder_id')) clipboard = Clipboard.objects.get(id=request.POST.get('clipboard_id')) - files = clipboard.files.all() if folder.has_add_children_permission(request): tools.move_files_from_clipboard_to_folder(request, clipboard, folder) tools.discard_clipboard(clipboard) From ed5467630988a759aa2e605e5e53d98c4c34323d Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Tue, 2 Apr 2013 18:36:23 +0300 Subject: [PATCH 020/715] Enforce unique file and folder constraint regradless of whether FOLDER_AFFECTS_URL is true or not --- filer/admin/clipboardadmin.py | 3 +- filer/models/filemodels.py | 11 ++-- filer/models/foldermodels.py | 3 + filer/models/tools.py | 23 ++++---- filer/tests/admin.py | 100 ++++++++++++++++------------------ 5 files changed, 65 insertions(+), 75 deletions(-) diff --git a/filer/admin/clipboardadmin.py b/filer/admin/clipboardadmin.py index 7068b1635..684f40d09 100644 --- a/filer/admin/clipboardadmin.py +++ b/filer/admin/clipboardadmin.py @@ -58,8 +58,7 @@ def ajax_upload(self, request, folder_id=None): # Get clipboad clipboard = Clipboard.objects.get_or_create(user=request.user)[0] - if filer_settings.FOLDER_AFFECTS_URL and\ - clipboard.files.filter(original_filename=filename).exists(): + if clipboard.files.filter(original_filename=filename).exists(): raise UploadException( _(u"A file named %s already exists in the clipboard") % filename) diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index 3399a8608..336046f1a 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -73,13 +73,10 @@ def __init__(self, *args, **kwargs): self._old_folder = self.folder def clean(self): - if not filer_settings.FOLDER_AFFECTS_URL: - return - if self.folder: - if self.folder.files_and_folders_with_names([self.name]): - raise ValidationError( - _(u'Current folder already contains a file named %s') % \ - self.display_name) + if self.folder and self.folder.files_and_folders_with_names([self.name]): + raise ValidationError( + _(u'Current folder already contains a file named %s') % \ + self.display_name) def _move_file(self): """ diff --git a/filer/models/foldermodels.py b/filer/models/foldermodels.py index e6f7e9669..0fe175c14 100644 --- a/filer/models/foldermodels.py +++ b/filer/models/foldermodels.py @@ -138,6 +138,9 @@ def files(self): return self.all_files.all() def files_and_folders_with_names(self, names): + """Returns an iterator yielding the files and folders that are direct + children of this folder and have their names in the given list of names. + """ q = Q(name__in=names) q |= Q(original_filename__in=names) & (Q(name__isnull=True)|Q(name='')) files_with_names = self.all_files.filter(q) diff --git a/filer/models/tools.py b/filer/models/tools.py index d3a054e64..55b4547fa 100644 --- a/filer/models/tools.py +++ b/filer/models/tools.py @@ -3,7 +3,6 @@ from django.utils.translation import ugettext as _ from filer.models import Clipboard -from filer import settings def discard_clipboard(clipboard): @@ -23,13 +22,12 @@ def get_user_clipboard(user): def move_file_to_clipboard(request, files, clipboard): count = 0 - if settings.FOLDER_AFFECTS_URL: - file_names = [f.original_filename for f in files] - already_existing = [ - f.original_filename - for f in clipboard.files.filter(original_filename__in=file_names)] + file_names = [f.original_filename for f in files] + already_existing = [ + f.original_filename + for f in clipboard.files.filter(original_filename__in=file_names)] for file_obj in files: - if settings.FOLDER_AFFECTS_URL and file_obj.original_filename in already_existing: + if file_obj.original_filename in already_existing: messages.error(request, _(u'Clipboard already contains a file ' 'named %s') % file_obj.display_name) continue @@ -45,13 +43,12 @@ def move_files_from_clipboard_to_folder(request, clipboard, folder): def move_files_to_folder(request, files, folder): - if settings.FOLDER_AFFECTS_URL: - file_names = [f.display_name for f in files] - already_existing = [ - f.display_name - for f in folder.files_and_folders_with_names(file_names)] + file_names = [f.display_name for f in files] + already_existing = [ + f.display_name + for f in folder.files_and_folders_with_names(file_names)] for file_obj in files: - if settings.FOLDER_AFFECTS_URL and file_obj.display_name in already_existing: + if file_obj.display_name in already_existing: messages.error(request, _(u"File or folder named %s already exists") % file_obj.display_name) file_obj.delete() continue diff --git a/filer/tests/admin.py b/filer/tests/admin.py index 4211c8f22..231c3f76b 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -13,7 +13,7 @@ from filer.models.virtualitems import FolderRoot from filer.models import tools from filer.tests.helpers import (create_superuser, create_folder_structure, - create_image, SettingsOverride) + create_image) from filer.utils.generate_filename import by_path import filer.settings as filer_settings @@ -130,62 +130,56 @@ def test_filer_upload_file(self, extra_headers={}): self.assertEqual(Image.objects.all()[0].original_filename, self.image_name) def test_filer_upload_file_logical_actual_url(self, extra_headers={}): - with SettingsOverride(filer_settings, - FOLDER_AFFECTS_URL=True, - FILER_PUBLICMEDIA_UPLOAD_TO=by_path): - self.assertEqual(Image.objects.count(), 0) + self.assertEqual(Image.objects.count(), 0) + file_obj = django.core.files.File(open(self.filename)) + response = self.client.post( + reverse('admin:filer-ajax_upload'), + {'Filename': self.image_name, 'Filedata': file_obj, 'jsessionid': self.client.session.session_key,}, + **extra_headers + ) + self.assertEqual(Image.objects.count(), 1) + self.assertEqual(Image.objects.all()[0].original_filename, self.image_name) + # upload the same file again. This must fail since the clipboard can't contain + # two files with the same name + response = self.client.post( + reverse('admin:filer-ajax_upload'), + {'Filename': self.image_name, 'Filedata': file_obj, 'jsessionid': self.client.session.session_key,}, + **extra_headers + ) + self.assertEqual(Image.objects.count(), 1) + self.assertIn('error', response.content) + + def test_paste_clipboard_to_folder_logical_actual_url(self): + first_folder = Folder.objects.create(name='first') + + def upload(): file_obj = django.core.files.File(open(self.filename)) response = self.client.post( reverse('admin:filer-ajax_upload'), - {'Filename': self.image_name, 'Filedata': file_obj, 'jsessionid': self.client.session.session_key,}, - **extra_headers - ) - self.assertEqual(Image.objects.count(), 1) - self.assertEqual(Image.objects.all()[0].original_filename, self.image_name) - # upload the same file again. This must fail since the clipboard can't contain - # two files with the same name - response = self.client.post( - reverse('admin:filer-ajax_upload'), - {'Filename': self.image_name, 'Filedata': file_obj, 'jsessionid': self.client.session.session_key,}, - **extra_headers - ) - self.assertEqual(Image.objects.count(), 1) - self.assertIn('error', response.content) + {'Filename': self.image_name, 'Filedata': file_obj, + 'jsessionid': self.client.session.session_key,}) + return Image.objects.all().order_by('-id')[0] - def test_paste_clipboard_to_folder_logical_actual_url(self): - with SettingsOverride(filer_settings, - FOLDER_AFFECTS_URL=True, - FILER_PUBLICMEDIA_UPLOAD_TO=by_path): - first_folder = Folder.objects.create(name='first') - - def upload(): - file_obj = django.core.files.File(open(self.filename)) - response = self.client.post( - reverse('admin:filer-ajax_upload'), - {'Filename': self.image_name, 'Filedata': file_obj, - 'jsessionid': self.client.session.session_key,}) - return Image.objects.all().order_by('-id')[0] - - uploaded_image = upload() - self.assertEqual(uploaded_image.original_filename, self.image_name) - - def paste(uploaded_image): - # current user should have one clipboard created - clipboard = self.superuser.filer_clipboards.all()[0] - response = self.client.post( - reverse('admin:filer-paste_clipboard_to_folder'), - {'folder_id': first_folder.pk, - 'clipboard_id': clipboard.pk}) - return Image.objects.get(pk=uploaded_image.pk) - - pasted_image = paste(uploaded_image) - self.assertEqual(pasted_image.folder.pk, first_folder.pk) - # upload and paste the same image again - second_upload = upload() - # second paste failed due to name conflict, and file in clipboard - # got deleted - with self.assertRaises(File.DoesNotExist): - paste(second_upload) + uploaded_image = upload() + self.assertEqual(uploaded_image.original_filename, self.image_name) + + def paste(uploaded_image): + # current user should have one clipboard created + clipboard = self.superuser.filer_clipboards.all()[0] + response = self.client.post( + reverse('admin:filer-paste_clipboard_to_folder'), + {'folder_id': first_folder.pk, + 'clipboard_id': clipboard.pk}) + return Image.objects.get(pk=uploaded_image.pk) + + pasted_image = paste(uploaded_image) + self.assertEqual(pasted_image.folder.pk, first_folder.pk) + # upload and paste the same image again + second_upload = upload() + # second paste failed due to name conflict, and file in clipboard + # got deleted + with self.assertRaises(File.DoesNotExist): + paste(second_upload) def test_filer_ajax_upload_file(self): self.assertEqual(Image.objects.count(), 0) From 22e2771d71a77eaf0dbc470d354bc73769252913 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Wed, 3 Apr 2013 13:45:24 +0300 Subject: [PATCH 021/715] Added documentation explaining the FILER_FOLDER_AFFECTS_URL setting --- docs/settings.rst | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/settings.rst b/docs/settings.rst index 4dfd2ab30..5ddee0548 100644 --- a/docs/settings.rst +++ b/docs/settings.rst @@ -134,3 +134,21 @@ Regular users are not allowed to create new folders at the root level, only subfolders of already existing folders, unless this setting is set to ``True``. Defaults to ``False`` + +``FILER_FOLDER_AFFECTS_URL`` +---------------------------- + +Set this to ``True`` when your ``UPLOAD_TO`` function generates a path that depends on the +folder the file belongs to. + +Having this set to ``True`` has certain implications: + +* when renaming a file or moving it in and out of the clipboard the file is renamed/move on the + backend storage as well +* bulk operations such as *Copy selected files and/or folders* or *Move selected files and/or folders* + are disabled. Reasons for disabling them are: + + * they might cause requests to timeout due to the fact that copying/moving a large number of files on the storage backend would take a long time + * in case of failure the database might end up being out of sync with the storage backend + +Defaults to ``False`` From 0e6d79cf721f3aa75163ba42bf1a91be6263951c Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Sun, 7 Apr 2013 22:32:53 +0300 Subject: [PATCH 022/715] Small refactorings. --- filer/models/filemodels.py | 22 ++++++++++++++-------- filer/utils/generate_filename.py | 1 + 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index 336046f1a..96ed09d74 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -165,19 +165,25 @@ def save(self, *args, **kwargs): if filer_settings.FOLDER_AFFECTS_URL and \ (self._old_name != self.name or self._old_folder != self.folder): - old_location = self.file.name - new_location = self.file.field.upload_to(self, self.display_name) - storage = self.file.storage - saved_as = self._copy_file(new_location) - assert saved_as == new_location - self.file = saved_as - super(File, self).save(*args, **kwargs) - storage.delete(old_location) + self.update_location_on_storage(*args, **kwargs) else: super(File, self).save(*args, **kwargs) save.alters_data = True + def update_location_on_storage(self, *args, **kwargs): + old_location = self.file.name + new_location = self.file.field.upload_to(self, self.display_name) + storage = self.file.storage + saved_as = self._copy_file(new_location) + assert saved_as == new_location, '%s %s' % (saved_as, new_location) + self.file = saved_as + # TODO: replace 'delete_on_storage' with a better solution... + delete_on_storage = kwargs.pop('delete_on_storage', True) + super(File, self).save(*args, **kwargs) + if old_location != new_location and delete_on_storage: + storage.delete(old_location) + def delete(self, *args, **kwargs): # Delete the model before the file super(File, self).delete(*args, **kwargs) diff --git a/filer/utils/generate_filename.py b/filer/utils/generate_filename.py index 1adc84923..beef4b6b4 100644 --- a/filer/utils/generate_filename.py +++ b/filer/utils/generate_filename.py @@ -47,6 +47,7 @@ def by_path(instance, filename): instance.owner.username, filename) else: + # TODO: use os.path or urlparse? filename = filename.strip('/').split('/')[-1] path = os.path.join( _construct_logical_folder_path(instance), From 239ba490807e572cf4e7e7af30d0268f8a7aab41 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Sun, 7 Apr 2013 23:25:26 +0300 Subject: [PATCH 023/715] Fixed issue caused by returning an iterator => bool(iterator) is Truee even if the iterator doesn't yield anything which is not compatible with bool(QuerySet) --- filer/models/foldermodels.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filer/models/foldermodels.py b/filer/models/foldermodels.py index 0fe175c14..42ff360e7 100644 --- a/filer/models/foldermodels.py +++ b/filer/models/foldermodels.py @@ -145,7 +145,7 @@ def files_and_folders_with_names(self, names): q |= Q(original_filename__in=names) & (Q(name__isnull=True)|Q(name='')) files_with_names = self.all_files.filter(q) folders_with_names = self.children.filter(name__in=names) - return itertools.chain(files_with_names, folders_with_names) + return list(itertools.chain(files_with_names, folders_with_names)) @property def logical_path(self): From 196169d2c15a3af23f83b830795e868065772a20 Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Wed, 10 Apr 2013 09:25:48 +0300 Subject: [PATCH 024/715] Improve the performance of directory listing. Performance is improved by no loger executing a query for each file and folder. Now a single query is executed for gathering all of a user's permitted ids. The folder_qs and file_qs QuerySets filter on the user's permitted ids => just 3 queries required. --- filer/admin/folderadmin.py | 53 +++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index e94745896..6252294fe 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -231,6 +231,33 @@ def filter_file(qs, terms=[]): Q(owner__first_name__icontains=term) | \ Q(owner__last_name__icontains=term)) return qs + + def get_user_read_permissions(user): + if not user.is_authenticated(): + return None + elif user.is_superuser: + return 'All' + else: + permission_manager = FolderPermission.objects + read_permissions = permission_manager.get_read_id_list(user) + return read_permissions + + def _filter_generic_permission(qs, permissions, entry_type): + if permissions == 'All': + return qs + + if entry_type == 'folder': + qs = qs.filter(id__in=permissions) + elif entry_type == 'file': + qs = qs.filter(folder__id__in=permissions) + return qs + + def filter_folder_permission(qs, permissions): + return _filter_generic_permission(qs, permissions, 'folder') + + def filter_file_permission(qs, permissions): + return _filter_generic_permission(qs, permissions, 'file') + q = request.GET.get('q', None) if q: search_terms = unquote(q).split(" ") @@ -264,24 +291,14 @@ def filter_file(qs, terms=[]): folder_files = [] if folder.is_root: folder_children += folder.virtual_folders - for f in folder_qs: - f.perms = userperms_for_request(f, request) - if hasattr(f, 'has_read_permission'): - if f.has_read_permission(request): - folder_children.append(f) - else: - pass - else: - folder_children.append(f) - for f in file_qs: - f.perms = userperms_for_request(f, request) - if hasattr(f, 'has_read_permission'): - if f.has_read_permission(request): - folder_files.append(f) - else: - pass - else: - folder_files.append(f) + + user = request.user + permissions = get_user_read_permissions(user) + folder_qs = filter_folder_permission(folder_qs, permissions) + file_qs = filter_file_permission(file_qs, permissions) + folder_children += folder_qs + folder_files += file_qs + try: permissions = { 'has_edit_permission': folder.has_edit_permission(request), From d413c6fc2778825a8e3530ca99cf0f42eeccc759 Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Wed, 10 Apr 2013 13:50:46 +0300 Subject: [PATCH 025/715] Fix version --- filer/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filer/__init__.py b/filer/__init__.py index c0325d34b..62c4f055f 100644 --- a/filer/__init__.py +++ b/filer/__init__.py @@ -1,3 +1,3 @@ #-*- coding: utf-8 -*- # version string following pep-0396 and pep-0386 -__version__ = '0.9' # pragma: nocover +__version__ = '0.9pbs' # pragma: nocover From d7eed8a734062934d74d2d9cd5f2873c861911d4 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Wed, 10 Apr 2013 14:49:31 +0300 Subject: [PATCH 026/715] When creating a new folder, also validate that there is no already existing FILE that has that name Rename files_and_folder to entries. --- filer/models/filemodels.py | 2 +- filer/models/foldermodels.py | 2 +- filer/models/tools.py | 2 +- filer/views.py | 5 +++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index 96ed09d74..6c70a40a2 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -73,7 +73,7 @@ def __init__(self, *args, **kwargs): self._old_folder = self.folder def clean(self): - if self.folder and self.folder.files_and_folders_with_names([self.name]): + if self.folder and self.folder.entries_with_names([self.name]): raise ValidationError( _(u'Current folder already contains a file named %s') % \ self.display_name) diff --git a/filer/models/foldermodels.py b/filer/models/foldermodels.py index 42ff360e7..6721833a7 100644 --- a/filer/models/foldermodels.py +++ b/filer/models/foldermodels.py @@ -137,7 +137,7 @@ def item_count(self): def files(self): return self.all_files.all() - def files_and_folders_with_names(self, names): + def entries_with_names(self, names): """Returns an iterator yielding the files and folders that are direct children of this folder and have their names in the given list of names. """ diff --git a/filer/models/tools.py b/filer/models/tools.py index 55b4547fa..f277ef631 100644 --- a/filer/models/tools.py +++ b/filer/models/tools.py @@ -46,7 +46,7 @@ def move_files_to_folder(request, files, folder): file_names = [f.display_name for f in files] already_existing = [ f.display_name - for f in folder.files_and_folders_with_names(file_names)] + for f in folder.entries_with_names(file_names)] for file_obj in files: if file_obj.display_name in already_existing: messages.error(request, _(u"File or folder named %s already exists") % file_obj.display_name) diff --git a/filer/views.py b/filer/views.py index 764f88877..a9609fb6e 100755 --- a/filer/views.py +++ b/filer/views.py @@ -99,8 +99,9 @@ def make_folder(request, folder_id=None): new_folder_form = NewFolderForm(request.POST) if new_folder_form.is_valid(): new_folder = new_folder_form.save(commit=False) - if (folder or FolderRoot()).contains_folder(new_folder.name): - new_folder_form._errors['name'] = new_folder_form.error_class([_('Folder with this name already exists.')]) + if (folder or FolderRoot()).entries_with_names([new_folder.name]): + new_folder_form._errors['name'] = new_folder_form.error_class([_( + 'File or folder with this name already exists.')]) else: new_folder.parent = folder new_folder.owner = request.user From 0aca4224008a5c04c3ad0e020c066fb93b0dd296 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Wed, 10 Apr 2013 15:14:47 +0300 Subject: [PATCH 027/715] Added entries_with_names in FolderRoot --- filer/models/virtualitems.py | 4 ++++ filer/tests/admin.py | 2 +- filer_migrate.log | 46 ++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 filer_migrate.log diff --git a/filer/models/virtualitems.py b/filer/models/virtualitems.py index dc22aaeac..277798307 100644 --- a/filer/models/virtualitems.py +++ b/filer/models/virtualitems.py @@ -91,5 +91,9 @@ def contains_folder(self, folder_name): except Folder.DoesNotExist: return False + def entries_with_names(self, names): + # children of te root folder can only be folders, so we don't have to look for files + return self.children.filter(name__in=names) + def get_admin_directory_listing_url_path(self): return urlresolvers.reverse('admin:filer-directory_listing-root') diff --git a/filer/tests/admin.py b/filer/tests/admin.py index 231c3f76b..62c04db97 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -69,7 +69,7 @@ def test_validate_no_duplcate_folders(self): {"name":FOLDER_NAME, "_popup": 1}) # second folder didn't get created self.assertEqual(Folder.objects.count(), 1) - self.assertIn('Folder with this name already exists', response.content) + self.assertIn('File or folder with this name already exists', response.content) def test_validate_no_duplcate_folders_on_rename(self): self.assertEqual(Folder.objects.count(), 0) diff --git a/filer_migrate.log b/filer_migrate.log new file mode 100644 index 000000000..a96d0e5f4 --- /dev/null +++ b/filer_migrate.log @@ -0,0 +1,46 @@ +Traceback (most recent call last): + File "/home/kux/workspace/envs/hb23/bin/django-admin.py", line 7, in + execfile(__file__) + File "/home/kux/workspace/src/other/django/django/bin/django-admin.py", line 5, in + management.execute_from_command_line() + File "/home/kux/workspace/src/other/django/django/core/management/__init__.py", line 443, in execute_from_command_line + utility.execute() + File "/home/kux/workspace/src/other/django/django/core/management/__init__.py", line 382, in execute + self.fetch_command(subcommand).run_from_argv(self.argv) + File "/home/kux/workspace/src/other/django/django/core/management/base.py", line 196, in run_from_argv + self.execute(*args, **options.__dict__) + File "/home/kux/workspace/src/other/django/django/core/management/base.py", line 232, in execute + output = self.handle(*args, **options) + File "/home/kux/workspace/src/other/django-filer/filer/management/commands/migrate_content.py", line 161, in handle + self._fix_files_with_duplicate_names() + File "/home/kux/workspace/src/other/django-filer/filer/management/commands/migrate_content.py", line 124, in _fix_files_with_duplicate_names + for filer_file in File.objects.all(): + File "/home/kux/workspace/src/other/django/django/db/models/query.py", line 118, in _result_iter + self._fill_cache() + File "/home/kux/workspace/src/other/django/django/db/models/query.py", line 875, in _fill_cache + self._result_cache.append(self._iter.next()) + File "/home/kux/workspace/envs/hb23/local/lib/python2.7/site-packages/polymorphic/query.py", line 237, in iterator + o=base_iter.next() + File "/home/kux/workspace/src/other/django/django/db/models/query.py", line 301, in iterator + obj = model(*row[index_start:aggregate_start]) + File "/home/kux/workspace/src/other/django-filer/filer/models/filemodels.py", line 73, in __init__ + self._old_folder = self.folder + File "/home/kux/workspace/src/other/django/django/db/models/fields/related.py", line 350, in __get__ + rel_obj = qs.get(**params) + File "/home/kux/workspace/src/other/django/django/db/models/query.py", line 361, in get + num = len(clone) + File "/home/kux/workspace/src/other/django/django/db/models/query.py", line 85, in __len__ + self._result_cache = list(self.iterator()) + File "/home/kux/workspace/src/other/django/django/db/models/query.py", line 291, in iterator + for row in compiler.results_iter(): + File "/home/kux/workspace/src/other/django/django/db/models/sql/compiler.py", line 763, in results_iter + for rows in self.execute_sql(MULTI): + File "/home/kux/workspace/src/other/django/django/db/models/sql/compiler.py", line 817, in execute_sql + cursor = self.connection.cursor() + File "/home/kux/workspace/src/other/django/django/db/backends/__init__.py", line 306, in cursor + cursor = self.make_debug_cursor(self._cursor()) + File "/home/kux/workspace/src/other/django/django/db/backends/mysql/base.py", line 363, in _cursor + if not self._valid_connection(): + File "/home/kux/workspace/src/other/django/django/db/backends/mysql/base.py", line 354, in _valid_connection + self.connection.ping() +KeyboardInterrupt From 6774e21be20951758ec221850713ffb62d16105f Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Wed, 10 Apr 2013 16:02:44 +0300 Subject: [PATCH 028/715] Removed accidentaly added file. --- filer_migrate.log | 46 ---------------------------------------------- 1 file changed, 46 deletions(-) delete mode 100644 filer_migrate.log diff --git a/filer_migrate.log b/filer_migrate.log deleted file mode 100644 index a96d0e5f4..000000000 --- a/filer_migrate.log +++ /dev/null @@ -1,46 +0,0 @@ -Traceback (most recent call last): - File "/home/kux/workspace/envs/hb23/bin/django-admin.py", line 7, in - execfile(__file__) - File "/home/kux/workspace/src/other/django/django/bin/django-admin.py", line 5, in - management.execute_from_command_line() - File "/home/kux/workspace/src/other/django/django/core/management/__init__.py", line 443, in execute_from_command_line - utility.execute() - File "/home/kux/workspace/src/other/django/django/core/management/__init__.py", line 382, in execute - self.fetch_command(subcommand).run_from_argv(self.argv) - File "/home/kux/workspace/src/other/django/django/core/management/base.py", line 196, in run_from_argv - self.execute(*args, **options.__dict__) - File "/home/kux/workspace/src/other/django/django/core/management/base.py", line 232, in execute - output = self.handle(*args, **options) - File "/home/kux/workspace/src/other/django-filer/filer/management/commands/migrate_content.py", line 161, in handle - self._fix_files_with_duplicate_names() - File "/home/kux/workspace/src/other/django-filer/filer/management/commands/migrate_content.py", line 124, in _fix_files_with_duplicate_names - for filer_file in File.objects.all(): - File "/home/kux/workspace/src/other/django/django/db/models/query.py", line 118, in _result_iter - self._fill_cache() - File "/home/kux/workspace/src/other/django/django/db/models/query.py", line 875, in _fill_cache - self._result_cache.append(self._iter.next()) - File "/home/kux/workspace/envs/hb23/local/lib/python2.7/site-packages/polymorphic/query.py", line 237, in iterator - o=base_iter.next() - File "/home/kux/workspace/src/other/django/django/db/models/query.py", line 301, in iterator - obj = model(*row[index_start:aggregate_start]) - File "/home/kux/workspace/src/other/django-filer/filer/models/filemodels.py", line 73, in __init__ - self._old_folder = self.folder - File "/home/kux/workspace/src/other/django/django/db/models/fields/related.py", line 350, in __get__ - rel_obj = qs.get(**params) - File "/home/kux/workspace/src/other/django/django/db/models/query.py", line 361, in get - num = len(clone) - File "/home/kux/workspace/src/other/django/django/db/models/query.py", line 85, in __len__ - self._result_cache = list(self.iterator()) - File "/home/kux/workspace/src/other/django/django/db/models/query.py", line 291, in iterator - for row in compiler.results_iter(): - File "/home/kux/workspace/src/other/django/django/db/models/sql/compiler.py", line 763, in results_iter - for rows in self.execute_sql(MULTI): - File "/home/kux/workspace/src/other/django/django/db/models/sql/compiler.py", line 817, in execute_sql - cursor = self.connection.cursor() - File "/home/kux/workspace/src/other/django/django/db/backends/__init__.py", line 306, in cursor - cursor = self.make_debug_cursor(self._cursor()) - File "/home/kux/workspace/src/other/django/django/db/backends/mysql/base.py", line 363, in _cursor - if not self._valid_connection(): - File "/home/kux/workspace/src/other/django/django/db/backends/mysql/base.py", line 354, in _valid_connection - self.connection.ping() -KeyboardInterrupt From c9acb6ed24a28c08b29839dd5f95b2b5d64b0fb9 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Wed, 10 Apr 2013 16:15:08 +0300 Subject: [PATCH 029/715] Removed the pbs suffix from the version. This will be done on master_pbs. --- filer/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filer/__init__.py b/filer/__init__.py index 62c4f055f..c0325d34b 100644 --- a/filer/__init__.py +++ b/filer/__init__.py @@ -1,3 +1,3 @@ #-*- coding: utf-8 -*- # version string following pep-0396 and pep-0386 -__version__ = '0.9pbs' # pragma: nocover +__version__ = '0.9' # pragma: nocover From ffe38b31a386c7d1eed1e72891eab84ee9599c76 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Wed, 10 Apr 2013 16:27:05 +0300 Subject: [PATCH 030/715] Switched to pbs versioning scheme. --- filer/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filer/__init__.py b/filer/__init__.py index c0325d34b..67276dc47 100644 --- a/filer/__init__.py +++ b/filer/__init__.py @@ -1,3 +1,3 @@ #-*- coding: utf-8 -*- # version string following pep-0396 and pep-0386 -__version__ = '0.9' # pragma: nocover +__version__ = '0.9pbs.1' # pragma: nocover From c65c8a7de78d6aa9403c047ca9e2a78497be413a Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Wed, 10 Apr 2013 18:22:43 +0300 Subject: [PATCH 031/715] Added s3upload --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 324851ba9..3f8bb51bd 100644 --- a/setup.py +++ b/setup.py @@ -46,4 +46,5 @@ def read(fname): 'django-setuptest>=0.1.1', 'argparse', # apparently needed by django-setuptest on python 2.6 ), + setup_requires=['s3sourceuploader',], ) From 25b61481f070314fe3133391e84b50d6daa84d15 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Wed, 10 Apr 2013 20:22:11 +0300 Subject: [PATCH 032/715] Checking for delete_on_storage is no longer required. --- filer/models/filemodels.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index 6c70a40a2..b41189df6 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -178,10 +178,8 @@ def update_location_on_storage(self, *args, **kwargs): saved_as = self._copy_file(new_location) assert saved_as == new_location, '%s %s' % (saved_as, new_location) self.file = saved_as - # TODO: replace 'delete_on_storage' with a better solution... - delete_on_storage = kwargs.pop('delete_on_storage', True) super(File, self).save(*args, **kwargs) - if old_location != new_location and delete_on_storage: + if old_location != new_location: storage.delete(old_location) def delete(self, *args, **kwargs): From 161b40229e4183c63e2f860b4070dcd89c016515 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Fri, 12 Apr 2013 03:15:38 +0300 Subject: [PATCH 033/715] Remove thumbnails when updating a file's location. Make sure that the file is deleted from the old location only if the file save succeeds. --- filer/models/filemodels.py | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index b41189df6..0147d2d51 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -13,6 +13,8 @@ import hashlib import os +from django.db import transaction + class FileManager(PolymorphicManager): def find_all_duplicates(self): @@ -171,16 +173,32 @@ def save(self, *args, **kwargs): save.alters_data = True + def _delete_thumbnails(self): + source = self.file.get_source_cache() + self.file.delete_thumbnails() + source.delete() + + @transaction.commit_manually def update_location_on_storage(self, *args, **kwargs): old_location = self.file.name - new_location = self.file.field.upload_to(self, self.display_name) - storage = self.file.storage - saved_as = self._copy_file(new_location) - assert saved_as == new_location, '%s %s' % (saved_as, new_location) - self.file = saved_as - super(File, self).save(*args, **kwargs) - if old_location != new_location: - storage.delete(old_location) + try: + # thumbnails might get physically deleted evenif the transaction fails + # though luck... they can be regenerated anyway... + self._delete_thumbnails() + new_location = self.file.field.upload_to(self, self.display_name) + storage = self.file.storage + saved_as = self._copy_file(new_location) + assert saved_as == new_location, '%s %s' % (saved_as, new_location) + self.file = saved_as + super(File, self).save(*args, **kwargs) + except Exception: + transaction.rollback() + raise + else: + transaction.commit() + # only delete the file on the old_location if all went OK + if old_location != new_location: + storage.delete(old_location) def delete(self, *args, **kwargs): # Delete the model before the file From b73861d3f94c3aeff9c185a304d12361e76f60e9 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Tue, 16 Apr 2013 14:01:54 +0300 Subject: [PATCH 034/715] Fixed a couple of clipboard related validation issues * unique filename constraints within the clipboard was relying on original_filename rather than the display_name * fix filer.utils.generate_filename.by_path when used for uploading new versions of an already existing file. --- filer/admin/clipboardadmin.py | 2 +- filer/models/filemodels.py | 24 ++++++++++++++++-------- filer/models/tools.py | 8 ++++---- filer/utils/generate_filename.py | 10 ++++------ 4 files changed, 25 insertions(+), 19 deletions(-) diff --git a/filer/admin/clipboardadmin.py b/filer/admin/clipboardadmin.py index 684f40d09..79216d4c7 100644 --- a/filer/admin/clipboardadmin.py +++ b/filer/admin/clipboardadmin.py @@ -58,7 +58,7 @@ def ajax_upload(self, request, folder_id=None): # Get clipboad clipboard = Clipboard.objects.get_or_create(user=request.user)[0] - if clipboard.files.filter(original_filename=filename).exists(): + if any(f for f in clipboard.files.all() if f.display_name == filename): raise UploadException( _(u"A file named %s already exists in the clipboard") % filename) diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index 0147d2d51..4dd77f142 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -75,10 +75,12 @@ def __init__(self, *args, **kwargs): self._old_folder = self.folder def clean(self): - if self.folder and self.folder.entries_with_names([self.name]): - raise ValidationError( - _(u'Current folder already contains a file named %s') % \ - self.display_name) + if self.folder: + entries = self.folder.entries_with_names([self.display_name]) + if entries and any(entry.pk != self.pk for entry in entries): + raise ValidationError( + _(u'Current folder already contains a file named %s') % \ + self.display_name) def _move_file(self): """ @@ -163,9 +165,8 @@ def save(self, *args, **kwargs): self.generate_sha1() except Exception, e: pass - if filer_settings.FOLDER_AFFECTS_URL and \ - (self._old_name != self.name or + (self._is_name_chnaged() or self._old_folder != self.folder): self.update_location_on_storage(*args, **kwargs) else: @@ -173,10 +174,17 @@ def save(self, *args, **kwargs): save.alters_data = True + def _is_name_chnaged(self): + if self._old_name in ('', None): + return self.name not in ('', None) + else: + return self._old_name != self.name + def _delete_thumbnails(self): source = self.file.get_source_cache() - self.file.delete_thumbnails() - source.delete() + if source: + self.file.delete_thumbnails() + source.delete() @transaction.commit_manually def update_location_on_storage(self, *args, **kwargs): diff --git a/filer/models/tools.py b/filer/models/tools.py index f277ef631..0a3a6b2e2 100644 --- a/filer/models/tools.py +++ b/filer/models/tools.py @@ -22,12 +22,12 @@ def get_user_clipboard(user): def move_file_to_clipboard(request, files, clipboard): count = 0 - file_names = [f.original_filename for f in files] + file_names = [f.display_name for f in files] already_existing = [ - f.original_filename - for f in clipboard.files.filter(original_filename__in=file_names)] + f.display_name + for f in clipboard.files.all() if f.display_name in file_names] for file_obj in files: - if file_obj.original_filename in already_existing: + if file_obj.display_name in already_existing: messages.error(request, _(u'Clipboard already contains a file ' 'named %s') % file_obj.display_name) continue diff --git a/filer/utils/generate_filename.py b/filer/utils/generate_filename.py index beef4b6b4..dbbcc718f 100644 --- a/filer/utils/generate_filename.py +++ b/filer/utils/generate_filename.py @@ -37,7 +37,8 @@ def _construct_logical_folder_path(filer_file): def _goes_to_clipboard(instance): - return _is_in_memory(instance.file.file) or instance.folder is None + return instance.folder is None or ( + _is_in_memory(instance.file.file) and instance.pk is None) def by_path(instance, filename): @@ -47,9 +48,6 @@ def by_path(instance, filename): instance.owner.username, filename) else: - # TODO: use os.path or urlparse? - filename = filename.strip('/').split('/')[-1] - path = os.path.join( + return os.path.join( _construct_logical_folder_path(instance), - filename) - return path + instance.display_name) From 755202d52ffc444c50862747436cdadc30ade2c2 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Tue, 16 Apr 2013 14:11:36 +0300 Subject: [PATCH 035/715] s/display_name/actual_name/ as it just sounds better --- filer/admin/clipboardadmin.py | 2 +- filer/models/filemodels.py | 21 +++++++++++++-------- filer/models/foldermodels.py | 2 +- filer/models/tools.py | 18 +++++++++--------- filer/utils/generate_filename.py | 2 +- 5 files changed, 25 insertions(+), 20 deletions(-) diff --git a/filer/admin/clipboardadmin.py b/filer/admin/clipboardadmin.py index 79216d4c7..2229aee83 100644 --- a/filer/admin/clipboardadmin.py +++ b/filer/admin/clipboardadmin.py @@ -58,7 +58,7 @@ def ajax_upload(self, request, folder_id=None): # Get clipboad clipboard = Clipboard.objects.get_or_create(user=request.user)[0] - if any(f for f in clipboard.files.all() if f.display_name == filename): + if any(f for f in clipboard.files.all() if f.actual_name == filename): raise UploadException( _(u"A file named %s already exists in the clipboard") % filename) diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index 4dd77f142..a030e3bf6 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -76,11 +76,11 @@ def __init__(self, *args, **kwargs): def clean(self): if self.folder: - entries = self.folder.entries_with_names([self.display_name]) + entries = self.folder.entries_with_names([self.actual_name]) if entries and any(entry.pk != self.pk for entry in entries): raise ValidationError( _(u'Current folder already contains a file named %s') % \ - self.display_name) + self.actual_name) def _move_file(self): """ @@ -193,7 +193,7 @@ def update_location_on_storage(self, *args, **kwargs): # thumbnails might get physically deleted evenif the transaction fails # though luck... they can be regenerated anyway... self._delete_thumbnails() - new_location = self.file.field.upload_to(self, self.display_name) + new_location = self.file.field.upload_to(self, self.actual_name) storage = self.file.storage saved_as = self._copy_file(new_location) assert saved_as == new_location, '%s %s' % (saved_as, new_location) @@ -255,15 +255,20 @@ def has_generic_permission(self, request, permission_type): return False @property - def display_name(self): + def actual_name(self): + """The name displayed to the user. + Uses self.name if set, otherwise it falls back on self.original_filename. + + This property is used for enforcing unique filenames within the same fodler. + """ if self.name in ('', None): - display_name = u"%s" % (self.original_filename,) + actual_name = u"%s" % (self.original_filename,) else: - display_name = u"%s" % (self.name,) - return display_name + actual_name = u"%s" % (self.name,) + return actual_name def __unicode__(self): - return self.display_name + return self.actual_name def get_admin_url_path(self): return urlresolvers.reverse( diff --git a/filer/models/foldermodels.py b/filer/models/foldermodels.py index 6721833a7..470e29bce 100644 --- a/filer/models/foldermodels.py +++ b/filer/models/foldermodels.py @@ -218,7 +218,7 @@ def __unicode__(self): return u"%s" % (self.name,) @property - def display_name(self): + def actual_name(self): return self.name def contains_folder(self, folder_name): diff --git a/filer/models/tools.py b/filer/models/tools.py index 0a3a6b2e2..aba9becb8 100644 --- a/filer/models/tools.py +++ b/filer/models/tools.py @@ -22,14 +22,14 @@ def get_user_clipboard(user): def move_file_to_clipboard(request, files, clipboard): count = 0 - file_names = [f.display_name for f in files] + file_names = [f.actual_name for f in files] already_existing = [ - f.display_name - for f in clipboard.files.all() if f.display_name in file_names] + f.actual_name + for f in clipboard.files.all() if f.actual_name in file_names] for file_obj in files: - if file_obj.display_name in already_existing: + if file_obj.actual_name in already_existing: messages.error(request, _(u'Clipboard already contains a file ' - 'named %s') % file_obj.display_name) + 'named %s') % file_obj.actual_name) continue if clipboard.append_file(file_obj): file_obj .folder = None @@ -43,13 +43,13 @@ def move_files_from_clipboard_to_folder(request, clipboard, folder): def move_files_to_folder(request, files, folder): - file_names = [f.display_name for f in files] + file_names = [f.actual_name for f in files] already_existing = [ - f.display_name + f.actual_name for f in folder.entries_with_names(file_names)] for file_obj in files: - if file_obj.display_name in already_existing: - messages.error(request, _(u"File or folder named %s already exists") % file_obj.display_name) + if file_obj.actual_name in already_existing: + messages.error(request, _(u"File or folder named %s already exists") % file_obj.actual_name) file_obj.delete() continue file_obj.folder = folder diff --git a/filer/utils/generate_filename.py b/filer/utils/generate_filename.py index dbbcc718f..c5c3a2e9a 100644 --- a/filer/utils/generate_filename.py +++ b/filer/utils/generate_filename.py @@ -50,4 +50,4 @@ def by_path(instance, filename): else: return os.path.join( _construct_logical_folder_path(instance), - instance.display_name) + instance.actual_name) From c0f7dc045d88b34dfa94bd46ab4f6984538a897e Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Wed, 17 Apr 2013 11:29:22 +0300 Subject: [PATCH 036/715] Removed unused imports in tests. --- filer/tests/admin.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/filer/tests/admin.py b/filer/tests/admin.py index 62c04db97..681873e1b 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -14,9 +14,6 @@ from filer.models import tools from filer.tests.helpers import (create_superuser, create_folder_structure, create_image) -from filer.utils.generate_filename import by_path - -import filer.settings as filer_settings class FilerFolderAdminUrlsTests(TestCase): From 1409f3c3bf8c0314c2e3ced6e09534242d8a599c Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Thu, 18 Apr 2013 16:54:00 +0300 Subject: [PATCH 037/715] Fix issue with users not seeing their folders --- filer/admin/folderadmin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 6252294fe..ee0a96665 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -247,9 +247,9 @@ def _filter_generic_permission(qs, permissions, entry_type): return qs if entry_type == 'folder': - qs = qs.filter(id__in=permissions) + qs = qs.filter(Q(id__in=permissions)|Q(owner=request.user)) elif entry_type == 'file': - qs = qs.filter(folder__id__in=permissions) + qs = qs.filter(Q(folder__id__in=permissions)|Q(owner=request.user)) return qs def filter_folder_permission(qs, permissions): From f9604677645cef1a232a32c990e37335f0c5b55f Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Thu, 18 Apr 2013 16:57:28 +0300 Subject: [PATCH 038/715] Bump version. --- filer/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filer/__init__.py b/filer/__init__.py index 67276dc47..7d461b742 100644 --- a/filer/__init__.py +++ b/filer/__init__.py @@ -1,3 +1,3 @@ #-*- coding: utf-8 -*- # version string following pep-0396 and pep-0386 -__version__ = '0.9pbs.1' # pragma: nocover +__version__ = '0.9pbs.2' # pragma: nocover From b9fa9aae1852f018e0dec95a817b7949f56304aa Mon Sep 17 00:00:00 2001 From: Bogdan Hodorog Date: Tue, 23 Apr 2013 11:15:34 +0300 Subject: [PATCH 039/715] Bump version as instructed by bamboo --- filer/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filer/__init__.py b/filer/__init__.py index 7d461b742..be02dda45 100644 --- a/filer/__init__.py +++ b/filer/__init__.py @@ -1,3 +1,3 @@ #-*- coding: utf-8 -*- # version string following pep-0396 and pep-0386 -__version__ = '0.9pbs.2' # pragma: nocover +__version__ = '0.9pbs.3' # pragma: nocover From ae9dec6e2d1e8dec8cb166c55dd4fe301deea24b Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Tue, 23 Apr 2013 14:27:23 +0300 Subject: [PATCH 040/715] Added support for returning urls that point to either the origin or the cdn depending on whether the cdn is up to date or not. --- docs/settings.rst | 15 +++++++++++++++ filer/fields/multistorage_file.py | 9 +++++++-- filer/settings.py | 2 ++ filer/utils/cdn.py | 24 ++++++++++++++++++++++++ 4 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 filer/utils/cdn.py diff --git a/docs/settings.rst b/docs/settings.rst index 5ddee0548..8f0270b8c 100644 --- a/docs/settings.rst +++ b/docs/settings.rst @@ -152,3 +152,18 @@ Having this set to ``True`` has certain implications: * in case of failure the database might end up being out of sync with the storage backend Defaults to ``False`` + + +``FILER_CDN_DOMAIN`` and ``FILER_CDN_INVALIDATION_TIME`` +-------------------------------------------------------- + +This settings and ``CDN_INVALIDATION_TIME`` are only useful if using a cdn and if when uploading a newer version of a file object the physical file gets overwritten on the storage backend. + +When the above condition is True: +* make sure you're storage backend returns urls that always point to the origin (NOT to the cdn) +* make ``FILER_CDN_DOMAIN`` point to the cdn distribution's domain +* set ``FILER_CDN_INVALIDATION_TIME`` to the time it takes the cdn to clear it's cache + +When a file object gets updated to a newer version, setting the above will result in: +* if the file's url is requested BEFORE the CDN got updated, the origin's domain will be used +* if the file's url is requested AFTER the CDN got updated, the cdn's domain will be used diff --git a/filer/fields/multistorage_file.py b/filer/fields/multistorage_file.py index 8fd2d6bc9..633ceedd6 100644 --- a/filer/fields/multistorage_file.py +++ b/filer/fields/multistorage_file.py @@ -1,10 +1,10 @@ #-*- coding: utf-8 -*- -from django.core.files.base import File -from django.core.files.storage import Storage from easy_thumbnails import fields as easy_thumbnails_fields, \ files as easy_thumbnails_files + from filer import settings as filer_settings from filer.utils.filer_easy_thumbnails import ThumbnailerNameMixin +from filer.utils.cdn import get_file_url_from_cdn STORAGES = { @@ -83,6 +83,11 @@ def _thumbnail_base_dir(self): else: return self.thumbnail_options['private'].get('base_dir', '') + def _get_url(self): + url = super(MultiStorageFieldFile, self)._get_url() + return get_file_url_from_cdn(self.instance, url) + url = property(_get_url) + def save(self, name, content, save=True): content.seek(0) # Ensure we upload the whole file super(MultiStorageFieldFile, self).save(name, content, save) diff --git a/filer/settings.py b/filer/settings.py index a914d6730..cb7c47411 100644 --- a/filer/settings.py +++ b/filer/settings.py @@ -218,3 +218,5 @@ def update_server_settings(settings, defaults, s, t): FILER_PRIVATEMEDIA_THUMBNAIL_SERVER = load_object(FILER_SERVERS['private']['thumbnails']['ENGINE'])(**FILER_SERVERS['private']['thumbnails']['OPTIONS']) FOLDER_AFFECTS_URL = getattr(settings, 'FILER_FOLDER_AFFECTS_URL', False) +CDN_DOMAIN = getattr(settings, 'FILER_CDN_DOMAIN', None) +CDN_INVALIDATION_TIME = getattr(settings, 'FILER_CDN_INVALIDATION_TIME', 0) diff --git a/filer/utils/cdn.py b/filer/utils/cdn.py new file mode 100644 index 000000000..618336fbb --- /dev/null +++ b/filer/utils/cdn.py @@ -0,0 +1,24 @@ +import datetime +import urlparse + +from django.utils import timezone + +from filer import settings as filer_settings + + +def get_file_url_from_cdn(file_obj, url): + """If the CDN version of the file is up to date, return it from there""" + cdn_domain = getattr(filer_settings, 'CDN_DOMAIN', None) + if cdn_domain is None: + return url + + invalidated_at = file_obj.modified_at + datetime.timedelta( + seconds=filer_settings.CDN_INVALIDATION_TIME) + now = timezone.make_aware(datetime.datetime.now(), timezone.get_default_timezone()) + if invalidated_at < now: + scheme, netloc, path, params, query, fragment = urlparse.urlparse(url) + return urlparse.urlunparse( + (scheme, cdn_domain, path, params, query, fragment)) + else: + return url + From f36ec3e3f8b67fe5564f5ddabfb5494493da7db0 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Thu, 25 Apr 2013 15:53:37 +0300 Subject: [PATCH 041/715] Bump version to 0.9pbs.4 --- filer/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filer/__init__.py b/filer/__init__.py index be02dda45..be98ff344 100644 --- a/filer/__init__.py +++ b/filer/__init__.py @@ -1,3 +1,3 @@ #-*- coding: utf-8 -*- # version string following pep-0396 and pep-0386 -__version__ = '0.9pbs.3' # pragma: nocover +__version__ = '0.9pbs.4' # pragma: nocover From 34d9dd8960700c59ecc01bfaeb70009642a05efd Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Fri, 26 Apr 2013 11:13:48 +0300 Subject: [PATCH 042/715] LUN-367: Added filer models for Archive file type. --- filer/admin/__init__.py | 4 +- filer/admin/archiveadmin.py | 23 +++ filer/migrations/0013_auto__add_archive.py | 134 ++++++++++++++++++ filer/models/__init__.py | 1 + filer/models/archivemodels.py | 19 +++ filer/models/filemodels.py | 1 + filer/settings.py | 1 + filer/static/filer/icons/archive_128x128.png | Bin 0 -> 18050 bytes filer/static/filer/icons/archive_16x16.png | Bin 0 -> 698 bytes filer/static/filer/icons/archive_32x32.png | Bin 0 -> 2235 bytes filer/static/filer/icons/archive_48x48.png | Bin 0 -> 4063 bytes .../admin/filer/folder/directory_table.html | 2 +- 12 files changed, 183 insertions(+), 2 deletions(-) create mode 100644 filer/admin/archiveadmin.py create mode 100644 filer/migrations/0013_auto__add_archive.py create mode 100644 filer/models/archivemodels.py create mode 100644 filer/static/filer/icons/archive_128x128.png create mode 100644 filer/static/filer/icons/archive_16x16.png create mode 100644 filer/static/filer/icons/archive_32x32.png create mode 100644 filer/static/filer/icons/archive_48x48.png diff --git a/filer/admin/__init__.py b/filer/admin/__init__.py index 32b7da334..bf0bfaccb 100644 --- a/filer/admin/__init__.py +++ b/filer/admin/__init__.py @@ -5,7 +5,8 @@ from filer.admin.folderadmin import FolderAdmin from filer.admin.imageadmin import ImageAdmin from filer.admin.permissionadmin import PermissionAdmin -from filer.models import FolderPermission, Folder, File, Clipboard, Image +from filer.admin.archiveadmin import ArchiveAdmin +from filer.models import FolderPermission, Folder, File, Clipboard, Image, Archive admin.site.register(Folder, FolderAdmin) @@ -13,3 +14,4 @@ admin.site.register(Clipboard, ClipboardAdmin) admin.site.register(Image, ImageAdmin) admin.site.register(FolderPermission, PermissionAdmin) +admin.site.register(Archive, ArchiveAdmin) diff --git a/filer/admin/archiveadmin.py b/filer/admin/archiveadmin.py new file mode 100644 index 000000000..ce6dd1367 --- /dev/null +++ b/filer/admin/archiveadmin.py @@ -0,0 +1,23 @@ +from django import forms +from django.contrib import admin +from filer.admin.fileadmin import FileAdmin +from filer.models import Archive + +class ArchiveAdminForm(forms.ModelForm): + + class Meta: + model = Archive + + class Media: + css = { + # 'all': (settings.MEDIA_URL + 'filer/css/focal_point.css',) + } + js = ( + # filer_settings.FILER_STATICMEDIA_PREFIX + 'js/raphael.js', + # filer_settings.FILER_STATICMEDIA_PREFIX + 'js/focal_point.js', + ) + + +class ArchiveAdmin(FileAdmin): + form = ArchiveAdminForm + diff --git a/filer/migrations/0013_auto__add_archive.py b/filer/migrations/0013_auto__add_archive.py new file mode 100644 index 000000000..fe586678f --- /dev/null +++ b/filer/migrations/0013_auto__add_archive.py @@ -0,0 +1,134 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'Archive' + db.create_table('filer_archive', ( + ('file_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['filer.File'], unique=True, primary_key=True)), + )) + db.send_create_signal('filer', ['Archive']) + + + def backwards(self, orm): + # Deleting model 'Archive' + db.delete_table('filer_archive') + + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'filer.archive': { + 'Meta': {'object_name': 'Archive', '_ormbases': ['filer.File']}, + 'file_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['filer.File']", 'unique': 'True', 'primary_key': 'True'}) + }, + 'filer.clipboard': { + 'Meta': {'object_name': 'Clipboard'}, + 'files': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'in_clipboards'", 'symmetrical': 'False', 'through': "orm['filer.ClipboardItem']", 'to': "orm['filer.File']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'filer_clipboards'", 'to': "orm['auth.User']"}) + }, + 'filer.clipboarditem': { + 'Meta': {'object_name': 'ClipboardItem'}, + 'clipboard': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.Clipboard']"}), + 'file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.File']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + 'filer.file': { + 'Meta': {'object_name': 'File'}, + '_file_size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'folder': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'all_files'", 'null': 'True', 'to': "orm['filer.Folder']"}), + 'has_all_mandatory_data': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'original_filename': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'owned_files'", 'null': 'True', 'to': "orm['auth.User']"}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'polymorphic_filer.file_set'", 'null': 'True', 'to': "orm['contenttypes.ContentType']"}), + 'sha1': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40', 'blank': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.folder': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('parent', 'name'),)", 'object_name': 'Folder'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'filer_owned_folders'", 'null': 'True', 'to': "orm['auth.User']"}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['filer.Folder']"}), + 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.folderpermission': { + 'Meta': {'object_name': 'FolderPermission'}, + 'can_add_children': ('django.db.models.fields.SmallIntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), + 'can_edit': ('django.db.models.fields.SmallIntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), + 'can_read': ('django.db.models.fields.SmallIntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), + 'everybody': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'folder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.Folder']", 'null': 'True', 'blank': 'True'}), + 'group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'filer_folder_permissions'", 'null': 'True', 'to': "orm['auth.Group']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'filer_folder_permissions'", 'null': 'True', 'to': "orm['auth.User']"}) + }, + 'filer.image': { + 'Meta': {'object_name': 'Image', '_ormbases': ['filer.File']}, + '_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'default_alt_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'default_caption': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'file_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['filer.File']", 'unique': 'True', 'primary_key': 'True'}), + 'must_always_publish_author_credit': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'must_always_publish_copyright': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'subject_location': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '64', 'null': 'True', 'blank': 'True'}) + } + } + + complete_apps = ['filer'] \ No newline at end of file diff --git a/filer/models/__init__.py b/filer/models/__init__.py index 66a6550d1..bb474f760 100644 --- a/filer/models/__init__.py +++ b/filer/models/__init__.py @@ -4,3 +4,4 @@ from filer.models.foldermodels import * from filer.models.imagemodels import * from filer.models.virtualitems import * +from filer.models.archivemodels import * diff --git a/filer/models/archivemodels.py b/filer/models/archivemodels.py new file mode 100644 index 000000000..62e066cba --- /dev/null +++ b/filer/models/archivemodels.py @@ -0,0 +1,19 @@ +from filer.models.filemodels import File +from filer import settings as filer_settings +from django.utils.translation import ugettext_lazy as _ +import os.path + +class Archive(File): + file_type = 'Archive' + _icon = 'archive' + _filename_extensions = ['.zip', '.tar', '.gz', '.bz2'] + + @classmethod + def matches_file_type(cls, iname, ifile, request): + extension = os.path.splitext(iname)[-1].lower() + return extension in Archive._filename_extensions + + class Meta: + app_label = 'filer' + verbose_name = _('archive') + verbose_name_plural = _('archives') diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index a030e3bf6..544a41cf5 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -348,3 +348,4 @@ class Meta: app_label = 'filer' verbose_name = _('file') verbose_name_plural = _('files') + diff --git a/filer/settings.py b/filer/settings.py index a914d6730..efe18a041 100644 --- a/filer/settings.py +++ b/filer/settings.py @@ -35,6 +35,7 @@ FILER_FILE_MODELS = getattr(settings, 'FILER_FILE_MODELS', ( 'filer.models.imagemodels.Image', + 'filer.models.archivemodels.Archive', 'filer.models.filemodels.File', ) ) diff --git a/filer/static/filer/icons/archive_128x128.png b/filer/static/filer/icons/archive_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..0c39770ab4f93e0ef6ba2d077a0bfa6ab8d69ee2 GIT binary patch literal 18050 zcmWh!cOX^oAAZlh*B$1yH&K8ziA%$bi;T=`OA2LYTq7AJl~vX?iV6|g z;~HgTToE#Vet(>E{yXP=Kks>;^E{vDIS_}s{;5*`z`#=( z*#1%{4R$h{*nD=f)M+nnt2Cx}?7Q}BSFZS9@&C3g<3B4KeE6!(I5u--b^FzJlk9*S zyy?Y9MU%ESrDeXp{7uhX9&gwL!~N;Lah+cK-d*r7Zh`YwLuhdR`zI^?7M;$c_k z+xuVBxR!MT_ks=l^S({>(Rj}xd8&i8gzNG9dodv=kZ1nPuqwrjhab)OXU_}LBU|RT zXW#6rFCSsAhi!ko^5Dwe<2^p5yB^u6hp+D~g|8rIoAgh(q=~f|G7GC=U$SovS-+X3 zhJTeXmV0&!#rLNEuEdiIJ_k*OD3#Uy)mu|n->>t_XnwQjHTynw6Ng;qH@CLF@a*ME zJkg}7*U#@iN0lbYb;a-lh8SO5OAINy_Y$3+N|KmM?CmD)K+}vx5uQ`zb{tW zAr!>8v?T;Xor*MXrm61l#Bx_2q$RnuOg-$FwH!}dcv@3bJ)4P-J~h)pU%Ig-)tuZu z%VWfYd^j>M_&|R~bnDO|adl#Q|23d2DY?CcwNO(CIHEs}x;C@@??RoF7!1&Vj|H@T zVFO$S8(KAhi5XGBR^@51%}k8(Y`k_tdQ49^TgG0_8&$=VUn; z50tQsjF=<}oN72-X|bk&MZnO;J4H}NWpGSB#_DmX`JhgOUTzsZ@|&;6{#14&EX(gV zLeoYmMwPw&Y4eW!`2G1D+RkjEUVqIBVSexxv73`Uzo9{3Nzs$;Kz&}vuH!L{*2dBn z_1VAW!Q20K{AQIiG(r*3;5~G=I39!e_Z=Z!J1v(ExCKbj316g{6M@e3Df%l zGj(|Q%@Uo(OL!gDWzBpB3%b4Yvmfo|nSS7vY2No9)ehe0r2Tpq7HNO5bPao_@W|ce zb z5e~Llt%m0juvq8>t64)&*SCYN(<%FjfKsMZF3cRO%YuaI5I|+r^5uU<127nm<=u<< z7fo<$Rf^+K zls>mKl+q`REu4_7CY_!6=cG3rc%Et*@MPyf*iREbHvDIP{P2Z~sxz*=n+?1FEaPgO znFPla!!JobB&>BDk){p~{qJGR4whe{Lqg}04atASueCkl&MjE0ux}O$-CC+A7SzEU zQCn?|*B;+#?LP+&1r=|n?O(yg`GZ&&P}_|fQl1vaO1bAhOZ$b*3cs5u$u`w~^NlnQ z+VrRv5dOvgtc}vm&s@HZh!8;+(BQh=*9+~@!i;Abw$Oh^TCXnGmwl>!x*>3|pU30V z@kE!Qa}6~z6*&D=oLJx<^6Fo>;A-lbYyDEnW zt)qU~>BnDtVr{y%*3c@X&yn?dp?h1jdF>EmK97Ji3(Sf7`IB6>@5y#>pZUK(WBLXrBCEL zadD1R9~V+$Iz_E`bnNW4%9k`mmDM`y{yujzdF^UDJ9d4;dCvZD_nN9I0hS@GWqAC4 zqBIVX5ZUvm3k)v~C;hj%pRhLI2g5xg_J>nAK&`Y&t` zcE~;da%yjJ00!_ZoT zmIoT!>y}pRJ<&BcGB8qVPEYDEObUV9?t&x?Zy0HJ(s+%~yG9 zzVtPI^?+Ge6>;F`L^T{r5Cg<%Vt9V-r5C1xEU9baw%b}~GUnuW5=k?UA%GU zAnfK-j1})Kun;dn#ws5kDnCR>NK7&?9R1<13!6D#^yS*KbHt-cq24AFw=Yb=DhsEi z2!JQ47s5qH@{v6zK1?dxkNr~mb1A%CkHIRNvc=4Hp_ca1%}pbhXQbL^z90c2{QHvX zb|RVBOpJqr8`@PzSCcva zK=sYL8qQm9iQyNfRz%%(8JonBTR$23Y}g%F1GP2B-^ zG_vH`)58BWt8@I@VfXUYuQc(auclbEqnxWAV&y+#DDlx^JluRk;?4a-yl_g{k8-ov zcdh3TBpi2B!rmSN1P?B#e19DHx^GSCd;fbv9hIU;4+gmaQV*QJC?=o%eOGG zo4~5kY`IW?~Xn4>3@Ly+53N5JQR zxrLoSQDLwg7TV?)UfNHA|HG^<+JS-IkMC2N_kW735<-sh^))e7aShcSWVBP)AZyqM> ziJjDGXShK8yq0uLG;?r)`skT*md@r8eEi68OBkD~<+sUV=}o%l1q9Jwlzr<_JoIMS z1X$S|?|G~MDd$_2*)_^I4;-%rr(|Bj2CvCKM1*2jVF&&_F()q-6W5}>vTh~JbJztg zid#MPmlrsr3Y(ApstO$a$e2W(GsBe*dY(0T%3!VqWr-fYR}%I&73)CNKPzJ#VI=nE zNX@tFn*dP0J8}ydDZ+X%TOsTM@=U=5pfMw!#{<4n#c&ib70_nxa~@zt(c11INwU(v z@fRUd%T!PJm}j#fv!FV2SY|V8*79|e`%w}mS(L4s`Ig9oXL?VIO{md}vXm^-bc#HZ z#31^Uc$C^!WrTA9NRq)L{uj8=llvhi2QOxTP(-cP!=-|#6^s}MJ1#8Gi)0KVymK); z3fNJ>E8TCHF)Y6C3zM3RrZo%%`3{7g0s`88#&GaH96?HzQ@3HTnajsWMLF!vw-k*@ ztQ*_;DeHgz?*XD|cgfgl+*Pc~dRHPu_yVCVPlLsfMKH!|gp+v0sh7#0(c1tJ_?yV= z%Ux4d&!2r)40s;d2*@6nOaMk$A;JjxnQ5+8;vE?Nkf}&w1a$ivbnZLLHmZEgv(Ovdxk=V{bWM7G5_NxwYs$Yz#J8BknYw;W7e5A~lVw0?^PvLRyxv{iYe^a)m zx&@^UWev1c;Fw%3uAjGa{+xA%6(P}(XbB^Ku)$mRrf(xCPSVr;@2q

l!>b zRvm!3Xt>b_IkwTNQWPkv%mzgC_vcKCV1X6SjJpoUWpvUR8z~U#BLX7ToSwklZwcT8 zstQR~8?mjme~zpUpK}Big}!dp4+u8(eH+UnECD(#eHt$CV1lRL{h+;ma@zR|Ft_$* z%jyXoJrOQ@wI))??NDb#XMbhX_qWbSrsIbPo{fLGf`8l-6VMLkkoeV3os^D|dy-iR zVpP-x9^g0bbbp8A-~BE%A_qkUWx>wxeCIT7XXnDcR0ZlCJ-kD}AsMv7uozH2d`XhD z*hvU{On8x0{Zw)MMNl0Xd|?G;+*n%6Lq;IX|jABcR>_I+6s=e6XAa zl%KWoVfC$lJ&2<9<&rr9PV^LpW0EB)*L%;szVr)JWdSy*0=U|jn zby_EU=A!bKl$NNI?G3a*GKN=<(+OPBoGlHce+G zmQ)@(10F5ZtL$VYM{w2h|qBND~( zM19^E)x7i3CZIO%&0oJ25kDkU$rDPP@HMx)iqy6y0=1QFlMb0OZSeNGZ&co(G}%`y zT;ZURir9cvc&0?v%L*@?2rq$bYFx!tq>Aw=;n&!~;2XyQNs}B#o8L0*6gsmzARMoQ zV{VoC$BQJTBa`}@f@3V#JUbWd=b6EE(V|~qDr8$QHM&#)^tZ@{ykVZyVkH@@sN=IU zNwn+DHAd8UnITGktx#mCiW!b=XVO8~xUmkU=qN#L+@6Zu_KDGPXko2udIRvcZD)bC zwRP_YU$>72NA>l|?zm`B?Q$`Xza4{||(%V1!@L5VP5A@Z1g zy_*-Uo6ilR-ui5vq2{D8CunWbanm>~bRtx4rPc59`0jd#a7%r4Pvld>$1Nt^Ci##6 z=R}I87-qhJNfZ&J^Kx4 zC)1CK1yUN;wA>t&p@n10Z$A*BLOAcu`Ew6hyQDb#U0VZu#xkg^V$$wQvYE z-#0JYswpzu0N3~)f6Y<^6I}L^J^Pjb!TTb7HM=(t714fQ905jaJ?%9?(T;n0Xzi|< z8inixf4^(?$;AVgPoxT2CU)NnHHJtgb zOq2!^?>m)N1{7oGZD5p=8Ceb3wFV5s>}sXc=jnJky_=D)Ht*(#nw#%5dL z{R!~#$w8F=<2BhOh@{{x0T3n~4UYqNuA;|`FKlxBt%$()AY!ufzB6I-9fY0}?feY2*QcV-whye80YJ`VE|w)!2-=?kz!i4|&Qg_Dcm1*&jjb##9$ zOIzbVk-89D;bLf9f_!Pd2Zwcn%(jlDnD6RUxvR{*Y-&?$JpV4BFdP!3#C_F7x;S$= zp}5gnr&=Li1Z7mI2!a*h#H4<~M%O_e&x2KK%316jBjbA|2%S{t1KF(Mpoo>Rn!Y)# zqMjv_C?@;g53T@@Yp|u7y9^R={A7dnbun6FAh+&6?yy+N)w=kob0I+-hruo?=shN@ zF2z>+uYq_>KiHN7#=JupMZ;B@n4IW*SHFMU4H6U0`p(29)x~jY>NCr&BV6iY`6Q`~ z?$%QJ9lHK5YDNi)0v{&*apD2xgB53QE6JUQxtNj@hmgDbHaMx&1OL01+?x$HEwOrT z%>h#%e5FyODUV?i2v{k9#R$Age#B&wzB|?hOpS428iFpJv1wjw+AAq)c=G-->#q?U z#z&{;r{Jsu#`SPb%QwCgi=@8j%sA94r_roeL_Rrfr)1cQKFe3#q zor`oGM)3B48>CEv9gw6pe%S6309PyQ#9d+V21ybc#m++Wx`c~%9}6857h`E@JK8=s z+;sKI+?CS>Bmj}#MPk8sWNfCK{ZSylMy)8)8cllZxMR|z%%e!ewLb#;zaGBoy)$K7 zhH5`)C!C>4ec#8lpmMds787=Ik(tww7ks$WGItp)40f|AauIbh`WWZ(ss;<-#I*@omInx$Kmx?BNu-2`dUcKBmJ+uX!(;C2@dq`kIv_=3aIYl>ZLOI^ZQZj?z|=`j%kO7>H3 z|6C54{q(2^D!K7;0CX`0yB(Sag!*ssQvu^ zO}|;c0XbS6i$J)>y#{u%#IsPtDe!=1g%#*V(VZ3S%H2jCk@>VfWEUmE~vy_}W{S6EZ% z5zmzGo?yaFm^E0ap4(jcSI+}ZQJjA;lN)#{RJZca!#r=Wk}TBi^10-#%&hFLGFNBb zNc?!}^Q-;YWM+bpINq`X+|2%IH!W+O`{D}B27A(_=^Ij!!zv?xBnI~TG;J>p*Zerps z1&wg`@yg@@KODBwLm5WRp{sWoE%qi|UEu|$ZF=3?_;i^YB1x%C%?IxM$D9fAh+idU zwA!sry-$WVbKa!nExJDLV9`p5@`j!0v}Qw`%`lY#gcXA99n($4%0;OoQK$xS*hvVfckxxG!m8$gw}Fx^c0HD-PIWEM11jGK17Pj_X>()OgH9~N#`j2Joud!G?h zFRbLmM=H~HjVj)lKidzuC}XOM1N-K5Bw|}HVsmAv)~5AZNXXxb%-{a3x-Gjo`bh)Y zj}CcQ5aRkcbg-fvYO5OuxMZyLmBRCZEc*PlB#j8NAlKl#P}lZv7;reRNw;=eD8=G+ z(`)PcG&ueu^568q#~_E@5AOuPPbczP@%(8vRZ%S-Lf==~z`+nJW`C@#pVqk}gFSO5 zfAh}({H`k4{Shsk@a5eu;y)%5ZfWRso?*7IfCqWlDO`6&aJhsjX{=@IpOTyrbCUj^ zFt-f}4!*XoFL_}ZmsN0W03Cl>j$Q2+-M%irxfl8eoOD*NQzF!LdCI9s0jleJfz?0H z9zb&VoArYce85oNhYO#cMD-7)$T9am2E?Bu-_EcFd~HA^XzfV&vUGT#Z4k08NVUjv zKI?17Fa!JRD^_VDWy!=b|iP+^0df&Oo{Pj zHcY}p_hWT#5%4Tm=Kytw88C2#-5mXa*D040bN-8A?q#uQi~!_Qu!S!EI??FGYRb}& z@(Xv_!7)IC9pdNEj3z#)my2A$BeY}%&RnmF8vV;h8TeMCH~49r>^aqBZe@l3`a3bY z!(gCT3qGt)GuyNA0*qbZZU%mv1Hc26*pY0gBIQ9j`2;0yszkUci;fB1(*r|U92fT@ z6~S~WrG~-1Z>VGP1>IudZgJ_ANU)dxh z!hAh=EF3$A`Vm_?Oe|f9u2ujka5%vyR^H13#QvD&hb=#X9HTcgUIM{%Om>2^m9O+ zS4@X0Y7v3v`Nx4X&n$JY`7MnFl9?DZjrw#Gre!SwdLvv&e=gAohpf)Mm5|`Z!jf15 z%SLXz0<$tyGR0@t9JPITp2`2fDM4L8o!+0Zl;s-ZT~z9_!Lwrt1{eiY(fG&iqv=sa zi$W`|zsz1k#HU&>tj)(hvUd<T(mj+TB}jg;T4@Uq6*Cc~nIJHZfU(T!5{SrG)_MZ@LZR z5w4z94!+8=s0lN~1y&ZhG9>J9&Bu$bw*_$I+ybf>KuUU)2h~ZMx#i(kQw8?kEQpM# zFz%|pK%IZy8#Yx=+@A2iB!9uS`SDjHoJd|O6o+sin zMzD~WUa+KCSr$%JWc^b=xel(gpT7PHm|qrC1V=(oDAwi7K0wjaM1q>H^+L)iIh8Zq zfQhfg;?C@QY0lWv-%G7?G1=@`jJpqiGUa3&ALVxB^^=VecL5`>cdpVGmpr|XZV}sT zWvQH(uQV9;P?AOQfV`XN$oURIa*6NQL=fhBr!(P{?DzIr`!0mgEPhh=i4r+6o~nZI zMIrj12`C=s{GdlWn>K*3`2DsqoCCv5fg<<_Jz1i(8Ak;EB8(E*X!`wq0n3s7*HaF` zIXRmLyg^IwxvGev*Dno!>%*p`TYu>h_u^uRpGjO-6LHo_;ebc&UJ2^+CD)xx2?06m zMKGi9-mE`XFnxT?N_a(~+aS&wP@ve+fPqS57`0s1#Gd3&*AYh;KE*mD%<~+g$j`J~ zVy~;l2jYhL2%n!k&*h_jtu~x~{xMn?o`Ro>P`S$%@KT!cp_W>jH`RWD8X-#iy`Do2 zXz@38sI|GmOi?%RgU)fe~$qsw9+H`$ock*JeQszh>~| zD${@Kra|_3taO2!N zW6L8gJB$G1MlkS(ngfU_X7?3ezTl>QISO({o~KNb!SA|{54oP=N^w_$*(GDT^uTG= z9*AT|x&O24qdLP2Q*OQ5RZT+AvaD2EF6RTvd`DJGkx=#mE5_X$o=LjE2)H-hx|~ox z^6a4Zu7I**T?Is&DsqHn10(SO!v@?dWYR|*7r4x}@J$0~J$nS?Ub4yM@-li|qIjqo zAkF~iQ;nzCsUIN$i53jwdXw|?38`BEUFLyPPyfeHKh252ze_`qPTuuXus>p)oA-~% z4MDYvb0-u}b(~0YvO7ZO9y&9nh({)sd>uFVbeHN3xscw3@L7g|#rGEhqp*A{n*ev9 zi81Nsy=O{r;13m!KfEB;UW66SoPJaI=@uKvd#0}(>|TUA5DTskQvJqOCV@9uTPmjT z^N>UR=qLZlY{}ZzC1q)sNr2;b+2lO!OE3a2-5Ei@^Q*-{j!4CqiHwI4v>8R&Py@H` zb!REHFG)WMt=mjKSLqcdk8cUhI9tq`ury+>02xudGci2!-gD=iLGNJBmF83b;9nVl zv=feBPXv1TGNF%Q9zkTLG?Ez3Vn}9AA$Ry<>=k4Gtj8Ke_adTRI+L#r(N39=F6}(_ zmppg*KBYB!DgZ{9{&mS1E^re#!-WqWIc(1rFsxj!a%NRZ7f|j(QsOzK2{dX;Z^aFD zDVbNKaP1?6->Xsd(+`zZL34M0ci-n^Acu$()@0fx?YQGQs)!7 zB1Oz#=#~v0sOo?uj}tJ$$d-cK%|RKSu`M23zdq;hS5-$4@A&K3I`zg)a`QGH zFl2qau%hnYyY>8Q`q?wR0)w8T%)+lW+KSdS2}bE^Tkj$-z{PO2Ix-2o3ZIf0E$NEs z)k4l1NuPYp2D%P!ULjURgdg|y5GYAzD|?c1 zQcc+LYQ9U1L0hZO--oVNd%caS}TU}L)df$rfrOd2~EnX3Mk@M|cR+~lcZJ6@=) zh%ogtfyEIqzZOPRE$1PVD0qhsjZRWxW`S#3MHb_=a0DCQ0}F zqdpRl`veCd(jy4aXUNO6+fydwaiD6*?PI!<3C`0>mynkMmNlV+*3x(HWu7V?Ez{_1`wP$x4TUq>2M@H|bkUiRBBV2E zFjMD$dSA%Er{`L*$ftM#wkF%4$zYV0l`(3Y7Ukt?~ zz9h%-)}_6&u{_&(f^<~|&wWn~YZV%Liirw=Q>cso0sT_*=niOyz1s_K=ePd+n80cC z9wSfte@qn7a1m)PLZ@MeIz*Q6u>`Fr1BO1tat*%;QGa>8_HmDn9UEO~YxT6sx2{-) z@ZF@f>lhP$l_;dI>v0y9x$@S(v(Eh=m>wxJmIV=y;zkI*T09p}*-#lN?^h^K-v}im(Wy009uK)3m)S-i9c;Fe@{<$lD@l%Fo zRI3Zv!{3=By#*5B zPdjAJZ^q+qeN53?v>zZ~KjFb?NDAIu>R5=q4{zUGd7O6=GXJ>X-zZ%u%)J@y^exLo zA^2q(ZoQt>PtQ;IaV!7p#vWrldQ{Pqk=s5%%Q$TPb_w<%Ecpk^@)!e>nGdZnwS!7A zd`fINKkI-`Ok4Ib=6~-Tx$Y%DE7QcIn_Q{9bmI;#dgWTP-reU_ zTGnT#mnB7?`icu62|G0{9}qBq;BUg)@-)mGhLaK!FZ83|_&2~>E*67pl%Pu9DH0F! zbLJtm#XPFK-*0eMZ|S)R&l~02KSsOdoO%R`564=Vv>TWY5BKkV;%~a?uk^{?8X+;| zEvo1?ipUK*q+1wlRL|D-L+EFWm7MjpO;VgW)C$>Cjbh1#ZCM_CD3jDA(2)WiO(%O1V5p& zEbgn;#IFs#mQ{3{j2O55(cEFJsw%w`!5~YRVmZ1FDt+iY*cNQfPUTZ?WgEhzXD#9# zEpbwhv$`b0uh}Zg9~bQ*gpct^cBZrV`;OlfpfT*Yv5$Q52mY?WFc?&okTv9QAG4F^ zXO5>zf#uG&)0vy>!J(h6jC}8R;;h}J$C~Z6m$nnTMUpyFQq!LBKVayQUl?i@{tLDL zPFkPRf1)i*7+C1*EpoY}4i!DozDV@0=bPuo_GtwTVAb5izW=8v9*v}~I0T$hb#(#k zbq1fvXp+iQ$k?2Y#+E&WDi2sOjPwAJq6$jZfeF>shQ|^V1Qy!UeLM`=a~OI1 z9040J@K%R`ub(RSP+MF1m{d$Ib(;NDfP~k^;Hx4C4LT+D|DbO2>mgaf{Z_`_^ESVN zX&5w|2}tJxo=mt4`N7zf+iXw#9;(7XKd_KjF!Bas;nz&+P8=6$HmBD3^XeI9%Cgok znC@ATxeaNt-n(COM)Av)qyiY_F(kFe0W$W>)5u;2ozrat%j{WJ+wZ`S$cjEdbet{W)7#)4!NKzBb=;r2FV0_W6+*+CZhlDj{~ zUO+ks5&xD(PY?HD#|r>sh=hexQjbyX_gaGs{rxx3KD~%tx5c;r0$R<^g9P*tqbmZK zPv!vZ^?M}M3Ro>6&cAK)S+kQGI10uC9s{HJwT+Rsv*L_tk|O01(vF?bDJiM*i-Z=aSG+lJ=E||} zHReeKy_=rerD0`gT@W{e6;^t**%wWHl#F9D#i*^RdR!#J6oGeZO)fG+HxG83Qr3D@0l$3m5ds5PMz{> zQVs8T4MYCLVwNwR^O~fUwa=3v6#+7tub#uBD;iHc1pynr?iY;8G;xmKTI3WU5hTed z?l=>Ppn<5>P@MC6{d z0mbt)SJ3k4dj_H0W+?QaH;)>Br@`UIQ{}~S z6XHr)Ej3MAM)aC2Cji-HlWxyc0LA6ENn`x5cyPBn?GPVqVWA{< z&L{8d=Ko%FT_7h0u8Oc62Y@@vaCy%BvUE-(!C(k3+7M^21}i}YG%Po7G7XzN4U2u1 zmVGAQiSg+0_ut--Ki|mL?`mJR5g%W^zWht`%{~6{y2X&X`!nK~X*xFSwx$p{t`hYfU=P_Ep0!JFcj_2mTwel8MRU_2l+;0McD6zQ5>o=)-S$`j#G8JyCj z&Uyvj*`8oV{~eB|zGAfu$4{&Y9N6ibH);e|P?IB${~Yn{-PuKvLzI2iU*_(UOcfjI z{kX^9uISY{?5k$&IjLk5(biCeB<3F4)@i$j`aGzkdG_kRp8rG{Ks&?(ZsCmdVUdpU zlPs^BWR3wN6Cw%SA-!aW@b|$Y(m?9e!n+wjK)DC^SbW>twP8uU2jO$G*bXjT$p3Hy zigJ0i$N*7ktN}?7F8Iem?`g&qn`+qEZoj1m@-j3h70!lP!(;PL$CB z-Y-{po6A;}(k*7OYS<@l_0YFr>sO%EPUy*5Zqkntk-EcCMi}*D=Ie}o-8v*yo|MFi z!fR1|G|qKNczEDS4nW9~A2+T+l{6dh_lW>KG}c7Dl~ih95xMYlTc-^aU*+WN0hNbi zjl_)#79%);T}lxu9cW6Y{P?!Y%98fqwT&ZJqY<}(@`@sMkje-a=ucqU%byzvG6EI5 zy|&|r|427+HFl>xK!=0loMk1Wg&l6;`>|VqUAqE_Fo6bxruo|^J1&5IuPrsH_nTTJ z!tLaEX3|Q~R!et~7U_3~y)mFMFjGr+F9n;P3BZa@A|u9pjZp~f-J4HSQgp|JU&UG8 zubTrpGr*y49W`{ED(ZJ?FltX7t;$DI9^^Y9BaFCMQ01S=_nI27h%XOUM2Ilq#zm(z zmwwPe#QkCU0Oua$u=1vipUUiLC$d;;dQPP7XFba_D*Xo9_xCS3t-=h_DTIfoKl;WK z^;kKPRAds#+=Rr2A`9ur3!zW2#o6Jr)63WYG{}wLyCDJ5zA#8^-?(2Ptk;}uKJ3~Q z_Zj`W&kJ~jzX(jn6ESK^JhqZ+)h2L?SAhGf@^G)G<$qw@*Oe>QD8vVw%RGE@A92<^ zX!`RU;PP`wV6BWAvgL9g(p7g6xtF)0FX)&5vMOQeFgK%?L3y)5NgS-6d!AUcBp|s7_%vwWW1u?bgIDO3kx+OygUI;eb4>k+1p5^ zLvXO4SMtFwQ6Z^UdA z5dRzQ6E&QcwOgX_zlPuQvlz%#cz>nSt{%X!D3T-)>+ejJX>JIClB(;VYfi0t!$;9m-z zm9W4$!t7{7Xj`JVkLOYzviOnYZ8i{=cPNmI zKMNH|G9|)^?0A+Wv=kp$mV0HokdV^)!wqTx`7hnBku&H!?%!O~PJr+KeYaBid_>6u zn5*sZjN3V}+Mc~52geJFbDIlJ2caj8tGn~J&d3!7aeEMS0Z;;$jyO|O3#2###+u|{ z)WKs$oVoZdYm?ksJLnl+m2*)oBm(O(Vt1`Dfy_1-_!tll+(|Gu31 zIBT^NG5*};;53hqo!LUhQ1XZH{z7L#m>)!$Tt?!rM7;KX)@1ey-RfQWr$i27#5Pna z>Hl21ble_n);vlmhKN;8@<+lD=?!odUYl2l;(T*bfO3=nveUo|?mBgWm!1^<=)^R2 zuYFa4n^{z2FZrJX=X8{umsGWkVZssj1Rct{5r{h7$E+GA6 z1R8<@h0CrBdw_E3o7Ua$Ps@hGv|j46G8McP9bp8lXHkkL;cYc1j0zuzLXlOV(yZ(b z&M1e0dU`By;q9M>8z(gjaJoF=r440i-LF|>`^|u)T#qpCLwVBK zU!#^XxR#4!SdfuYKRb9blMZl+iRt@@Zl=n!knDgg{R6ASM{kN_`nA)Td!t`^m`S@c z@$S}Cf!^8-kI{<%EP_80-Txp-Lp4==c-A{#Rv!CYhIGWIt=KyUv`3HP$J=(R_?z_*FydF28Cu<-Ki& z^~d&`bWX2Q8(vnm6 z#yXUeUAlE!`g4QMrNx;f&%wX-&#Tl)QVhcU{LWYi330F_ZZ1Y#gblHS8m!6c8d5t zPyWB|2$GY1Kq%~HK^_it^2d$6ch1IVzA`|-p}m&AN z!Yf3(JaNXmvEK|B@iSBKxa@+gS}CpgB&~4y$KmBUvoTwyrxfu8RhjD1+R&DJ!=e8g z2nZ4yoG+|7N{mc=w2!!SRG4{SZ_9o^aN_N$^u^Z=0cN)~wi?{8e3>t{mel0~Q}-|T zdTQ#KKVvdJQsu1CiR|pHSr7Z?$36#*9=mmd;7;`f6iXXeGivc+axB5i{rg`4$ptq0 ze$qxMg1=c%KO39KHleZoP>86FZFiuZ;j9X9F|mq7W+K+ zcx^Y`M{2}RIff>SCPhOCd{AU8E*=mepA(c6qaQ1>A{9*dW0?E5{9G>YoNnPuuf8&t zk-^#Qq=Gb0ot|KAw<@z<%JYQLR@u)D;D1_95ld$l^b@UG==N?ORDW^Q{iRxJ3Wj9W zB+*#>NF_E(Lj~_9yR}bjQ!nMUIYJU$f=q*Ju2Z`J_|H z6o@BR;DyMzx*Yv}(J(?jNWu;i>&)NE9XQU)s6y!facz)_^?Mwb>IkiFP;PS_?-0Bx zNncVVev;(-%a{vgVW~TV)}d_~1HeVh^*ej6mwV2)?XkZ;;j7;u_jRU{Zj4si&#>b~ zl!hg6DiRe57VZ@&e85n&fCriL8L3b2docs)M!Z;(X6n5<5S)Zheo!lcMcP-`e)&>0 zh8$c>_`8|O9e4XJlXm|*m-uhpzQ_Oemq>1I?wbq%SEFr0TP2YyuaG}UoO1x0HEi_( zaJz?g7B1CIRa3zBXETius&WFVeWOH@$OL;%zvpk7slM;M-@9eJsnrKc{$vS17~IFy z|5Z%*>(5DW)x1B|TK@Rx!=V-}TRzD&z*o-I5k~p5N!H9tVO}6`baD<#QNG`1lG2mj?sENmFjVZAZ;7 z(&Ie;6F-8>j5lXaipLXwW^Q3)%VvoQjY)MXwl?t*9G}I0rFg>1hMBg_Zz$2;dR8ukECU15)R`B~1avdkzwsm-5YMEXUh0e&;-##_$( zr{wnU0KmYLOD1hY_t2vcw{O+D^)DC~xPiGUb%+xPLSu@Imh^9}E*P>c3V?WS4j+Sb zjP?v&(a<58R6wBvK`rv|8dU~3Ms12w?yOSQQrdT#C5};cJgi^#Xvh-_{-;T0~o_ zxE|BI<*+sdUaTEP^cC>xg7p5i_ex3QrV%@Y*Y{ z&MS|WS28t(_3UvI+jOuS%G|;vJ0@9CQGvCZW;HJK-v)p$5{dX~*RIXXkw1c1U?+oJ z6eCOoS!_L)z8X`)bV303oyjA8;bxLQcl*S zD$5KgBuPD!q}zArJilE8oEMBMS-Gmahzm$EhKme4N zm&eYYJ)1OD8(7Vy#vA}m0D^$|puRvb5MU}Rz|>oijn5#nb3s2oPtF7!;Q@AX0d`LK z3bW5)Q0?dc{^j4YyIZAo@dW9bQ*PEL*y;~7_`9+Grlqm@yw`h5!Hn literal 0 HcmV?d00001 diff --git a/filer/static/filer/icons/archive_16x16.png b/filer/static/filer/icons/archive_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..b831ecbf0a8ce7f2aa0ecf3e83111c45b4ca5b34 GIT binary patch literal 698 zcmV;r0!96aP)@ma<}1)6gFtumY-%9f#d+hn)bK1TYOcJ3A2!2ARQ3 zs{~cmplK=wh6b&G3YQzAXael)2&RF{N#9;pysRwa(UXW3aOl86h$$j7$iMcI8Ay@@uh+{A#v2Rh{3bxb zv(XVNpme{)b~o>!=w=kfF+WpYSXjVpNi$wt%%!o)0AsJltbjd*#Sm$C!7f0$Jp*sn zd(_w0BM=DS@^~7C&u2na5>UuuB06CO>~!X{Aep_aCyu6^k8r!)kYyRZsdUI^HbA2g zna>!Tj#&XY*<0B&@;uMd=)2;@P?wA&b>(PjYh@wQs92*c%zgQ61#EU~q99SR*=-!& zMx(f}R1W_-8P2>s2GCccJpX;(3P@X@Mlt5t?luCvo18-6`6ry*myO&V+o2le^vp53XP;rUjw>kUZlDfaQ0knO?pPg-EZ-~zwH0oMu!7S gi;HzPuD9R$4MMt5AfRc;FaQ7m07*qoM6N<$f+$WpJ^%m! literal 0 HcmV?d00001 diff --git a/filer/static/filer/icons/archive_32x32.png b/filer/static/filer/icons/archive_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..e967d6f7aea58e513227db7b9e75d887a4a8e1ad GIT binary patch literal 2235 zcmV;s2t@aZP)9>$+LbMFl)PLs>cmwX9UL{(cU?dh>e)k=K@l~9tV4aH)8Z6eg!UB^+46;ex^ zb!xZ8s#es&N^sG9V2eZ%!lLZ4A|x4+NFs4R_y4}{+z-Z@WX?=ZX6E_L^ZeiU{f`b$ zZDr-<0|EmBr@7#I#p!VNlq5+n>2%V)yLZs+*8`hZE$zdubGcktyLK&VYHBcg^k{6| zx)qNi-n<^&aSdVNk^BOkB-vzHZlq^bw6?bH91{O}<AJTb{^4%*=F?;mO~ z7(h2er_=Gh=EgN79qEkRu=7YyPe);4A-`wKmMxz9e@@89*RhxJ#;~_JAlsczC+rS8 zY&Lu2qepFjjEn96#WMj8TMozf3=cmX7!VNP=jR7Wk|D{G0HB}i)m0dM>;=59Y(-vP z9!g3|kei!}88c=eB_##hw{OQMwXY&S>O7Lhj3;p?i3eLCcB&=ru5(A)P^|><` zSNh^}Be*<#J=TU+VC=+HF97XM7XuJcPz?8DqGP&i04`NmH=2XY0S3K62uofE7(`X& zDU3fJ$Rqe{^=GVJG!ZPL2y%md!oQcszm8^NW-Jgf{T!_qGSG(@zU< z;bN5%6dY{QlQ1hnnK{8m0*it6)5l9NO+i@liu2KJBB0#ux>R6;{SO?rbKtPr^avNwwIV-{pwhdku577dY zl$9zG5#c75KZ`)`5f_Dc?BD^+y)odq5mXIZgWo>hMF81q1j2d_z+JFIX}phNZ@i@i zupB+2L`FuMWP=PNb3t~G1_5xi_y88%dYMNsc<^8Z1qEp%xIGZF+P=kH0uaS#<8>fF zXf3c=p(yt;{MU(EfTF|2N>pSNO+ zu3W*6fHZvAv<>sKmIwe6cBsY2&TUp3lm`lalQ=>Pu&;PO0YsaO1Yj^2Jw?bM*gRnQ z=UyypcoU;;{DnJ1^}^rWVzKZ#Xm4-Fcil6Pru-cXmn?~FFTf$#WJD|D!To!%qB#LE#dA?!Ue4{$&dx@Dem)i~Sb&iuN1|%@ zI!voAz@nVxPdMN{w-P|TQjc-(j?n__+Ou1Uj*1e)(03w|B@S@-z&@;Oc^iEW{SKw2 zrC7dvIaaP*iDk={Vb!Wt9H3(4mzesW&yk&z&DQ}@2j01W)j$K)z=Sd5v;aH4->LM9 zjyB2qCnqA|fR0bShb$$uXkEjRqCLDF+q`)*GBY!glaqs_q$I=*9Rahy4XKkSt4)Y# zM0g#r-AVur^+=g8Nei%b=RdduZ2bEf#FFeTKw232n^aa*VE3*<+`e6d@#B-x*!X}K zY*|?u9~DD~P>~LN8GV1%*9+kEy133QBfF>t210*xfVz5o zl=guZVAEFxN=#I=i3u|RCd%qS$3RpFUx0YaYj|&l3qNep;mn9i4}gP1ICw+KvUhnp zA}6eND>+b)k3Y!N0&MtlBNbsU9)W>5z9xC*8!>06K?@12AW-4g$DWhuN7kwE*ike$D}yfYHy$g=95(&%@^7o$<)WZz_ z&YeZ(lK3cLzmn?2{{;Z2@SHOjzyaVH5exE(Se%UI|vC1-jFdheW3<`ZFw8l-=g_CBJjlkhz}I{ zLXw~gQzWVz&)S@-m=Jb)#6|XYJZyQ$YM?D=VOAI4`!tVRotJxwR=+q_bnXj$KeOC# z>J31B5RVHyI@eR~v4dW3xIx+Xep=51Knsx6ty{M))RcCo9lQrxpCdzU!>{!# zo}&hz3I{=q?3<7fAPHN@0{HaJ3_g#Hijak*lV0oHd#kIux;qxbpVOS8sw>^UzTf@s zcklh((!o7m6_u4;O{R!3?d^^fhr`iZr_)8zeZ3%riFp3y)-8yC-~kYHIyhfhIaDwh zz;18F_W~4eFXlDIju{Jug@t^b_0&_aIzPXHu7Aew#>K_ql?b8;PE$mL1J`UbnM{{l zE?0%U-CjOo=x~RYeY#)!!>Q6!#+aDce6!j7LReVX1A4t41VI1zjJ?z5pCMaoido7r)bDv1EmZhl9arK#vCjpfi5< zf4}_}PM4j6<+c@&S@IMdJaB;5Sg~RS96Ef6uh*|z4~SS^-3VzZckfV`;wGCect`20aRT$UmP86%ZrROLzpp)0Z>Q~ z0Q!c&3`k$Se*HR}K6Mh7$E<*q&3%CYcZ%%<2?+_Xef#zhHkK|~3Wbjrz#Bil0TZ5h z9D4We69fQ_ClDS2;sKWjK{#Drdt2L+2;$g10ep4xhUPb_$TQ>t~z-%^wE!qZaUtP;oL5>}?q;N?rMGATI9pkOU~crkp8=zTpiKp&Mfz`mC>fX9{UYGeQb#O2?Y244GN9gH127WxkuK(0rRiy;h< znB5dc4m95FBvEfl>XrDCCV(q7HKHxX2AImgXfU$Tp&{fyE?&66BF^u;=Dswr_WM_1 z%$PCo*x<)};UkGx?R^d-JUg9EWX_4Ac2_6$Ozf`-psv17jEas1%*kNz0U$$V5b8`s zU#>cT9!?_zYaU#CUmEzg@7BWTF{5DU&|z#Or&2cBZ@kEv$O|r~i$f0qKvJ(HohE?V zt94>D3Ya{p4j~DI5W+;oxpT-sDXdL+l{K(&(?(urYf%yW?!_1RC!T$FVTcCu|GpYV zj~)#pGDaxjA~E1kqjcYcLUy?v(2fjvF(dU(ya#}q`dS8HiZCGqnE&;HVz|PB3c#5& zXBfb153gel?Afyibm&gC^f8l~u2VXyA`u zFNfj7hrtsQpOi!#)Ivzcdr$)&G`<}i2*Qi2r6s3m1GsScqR3Sky%=sp00uo9tS24d zL7HGe`#>B&ejLgXz<>07i#1SGw3Tdzty{NhYT)-*{{X`fKvvdMY^W4M9*G5o0SN%M z5e!^JaXp%nrVRl5APk`>Y$MDN5g}D#2B4S1N6`BPP4AB!J&FvJ!iL1RLo`5aP?#M$ zd>As((<1)bmV!doz_R*fFl5M3czV(#f9!ju{zt07(pdsv$1rMVYx||9YXhjPsze4b zgd!s$0z-&05g99YqkPC9@Y{zEAAvLFW$1MqoX?u-1jLEzTm?3vTB zDP=QjAa~w8j{CD%A1KD@wWV-Nhz4G){v8Z@Y!FPFHq8$J4W=sW_Jt02qZo2_yB%;} zz;+DkKTsP$*_kqCz#3_V2y7?FXgzyg?~8wxpb^ae{red}LE0A90C`x40QT+Muc?9O zFa8z=4jc&C)3cSdDSKWHA&CJ5&}xTPM;jOf0}LK;4*<9m6RilqVzv6(2}1w~VnFW$ zK&f=!m;2z{*>c#DUKFB%IdkW*2CiPa1}S}#ISuYdV5EUXRg1Whn=x|+d)?!avyT)? z9zOG~3|feRwpO-f=%69m0FIwL!CA;+#Sk(@Vnb(;43>qgcwYig@gXmgb_TWfA)rkZXVs#NC#=oQVv21B@CmQX9abqeny%FjZqprPNYOo|i$$ zy%D_!`26#|P=gF??e{KgV8)E;*bC{XtJT!NqN?Yh7jEiva&r~0dp!Ouqz<7b1ki?I z6c!c+V=_i*12}NxpcsjvV?_WKvxOPZ`2;M7k6!LdF@!$H=Iu)LW%#dw?*(WeDJeiHd;L04R+%-9-QxLgC23gfZi_0etagi5P(ZNXXVm zi2*?$Bx0S^RuG8Y*z?rZR73Hw?a=rCZorU#ya~&fzl;VKLUwjGuelpR5}-9}*1+|z zud@c`l+A@6J$k_W1q(tdv7`a7QU{uwo1hiLkJz0!Zh|&|Jtcd^2vY>u2!O@vtHgpz zy#8GoUGLhp3+igC;lDFJ;qTAs#>?U3RXR~Agc_Tgn1Qf}aL61#Q5(RnJ-bDdIh+}YvP1>Ugw!3Wys`PR z}TNerON^9_V3>xcJAB>$EQo9oe8I&gF%nP!@T)-2wv}{!>((u(sHlLZhDJPB!mwdOdE}^m^-W2Es;cua zaL@q!Re@7zdcSo38_$H)Lgv=O%{uUhke%z&v`JI70Th4okw{*Twjl!uf{KUiaX|wp~&3}9V zcnU$234c+e(P9H;Aqt^Lvl+6dJfjWZ{f~-8gHaE(vA3ZPhz*@;N9LbM1kOtRBX=F9 zy=Hj%L=6^*^OkR}K~1GOP7b}p>5vu9`nD0+XJNCk_!Nn3P`9{~8gulEnP^vaAhkb$Pg zCV1`SHAtF_n;WkizWSg5K6^eZ#Ou;D&ZCSJrOmyl8Z&x%GTqSBz#6b1fVtCWYXd0U zRwN1r0b&pUF~H+Rd5oeOY5|K`$AY9q1RnrG(}aa*{n7t{b3JDQxZ0uH`43>n;)#;y z0es_h=}C-iumm9VnnZl35dokEEZ7;$n>AM(K*76(BDI+|)Ig`07%pTwRon|fp`%Qz z1^;6wV&L_Ie}k&7a{$~9=u-0@e7bBL8|-@?7Ni5e(e!t(3V@p#xPxgF0az@MH)ozU zfOobQh%~;S@aYs28vsB(Qj{NX$U|OG&cGtxu<|bDA$q(?ljziyRCOQu{@i*KpViH-`Oa-QFv5^ zJIBRKb%2eN9&RY1BO5M`D3C(1~gxa z;R+W41_y(1I2|b92He!QfYoX}+bK47{G9Ar?V135ENpanU4Ni{++wEjikZdie`4t~ zUw&E{D1cvmd4mj<&R*&46%~fK0=ry1jibY8Ft*3qV#Y4W$*Txnv%_DV^2}7@h*2Zo z#~;b1*y9#L^|+NEcxx=8elG_7O$H%@SBH<90SX^_VG?PHvRa?R*x%WatsMfuy{Fz{ zwFo(RIWIiYqsJ0lx~B&#qTFD41IFK8Wxnq>qJtmuu_o^={EuyQ(%eL@2m4L1Cqb{c_6@4QFeNX3eu`XyW zoi7~Zd!qWju4BJ>eV_1R0=bJIzSbM`_4v)d;@z8eyB+s6&8~lnfq$jf{{uPx3&(sc RrjGys002ovPDHLkV1l7FiroMJ literal 0 HcmV?d00001 diff --git a/filer/templates/admin/filer/folder/directory_table.html b/filer/templates/admin/filer/folder/directory_table.html index 6a7d82679..5738c2de5 100644 --- a/filer/templates/admin/filer/folder/directory_table.html +++ b/filer/templates/admin/filer/folder/directory_table.html @@ -32,7 +32,7 @@ {% endwith %}{% endif %} - {% if item.file_type == 'File' or item.file_type == 'Image' %}{% with item as file %} + {% if item.file_type == 'File' or item.file_type == 'Image' or item.file_type == 'Archive' %}{% with item as file %} {% if is_popup and not select_folder %} {% else %}{% if action_form and not is_popup %}{% endif %}{% endif %} From 3ab301ea83f43dbdd7197c82b2303db414ae0b71 Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Fri, 26 Apr 2013 19:47:46 +0300 Subject: [PATCH 043/715] LUN-367: Added view for models. --- filer/admin/archiveadmin.py | 17 ++++++++++++++++- filer/models/archivemodels.py | 3 +++ .../admin/filer/folder/directory_table.html | 5 +++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/filer/admin/archiveadmin.py b/filer/admin/archiveadmin.py index ce6dd1367..2d10bc4de 100644 --- a/filer/admin/archiveadmin.py +++ b/filer/admin/archiveadmin.py @@ -2,9 +2,13 @@ from django.contrib import admin from filer.admin.fileadmin import FileAdmin from filer.models import Archive +from django.conf.urls.defaults import patterns, url +from django.http import HttpResponse +from zipfile import ZipFile -class ArchiveAdminForm(forms.ModelForm): +class ArchiveAdminForm(forms.ModelForm): + class Meta: model = Archive @@ -20,4 +24,15 @@ class Media: class ArchiveAdmin(FileAdmin): form = ArchiveAdminForm + + def get_urls(self): + urls = super(ArchiveAdmin, self).get_urls() + archive_urls = patterns('', + url(r'^(?P\d+)/extract/$', self.admin_site.admin_view(self.extract), + name='filer_file_extract'), + ) + return archive_urls + urls + + def extract(self, request, file_id): + return HttpResponse() diff --git a/filer/models/archivemodels.py b/filer/models/archivemodels.py index 62e066cba..7134625ff 100644 --- a/filer/models/archivemodels.py +++ b/filer/models/archivemodels.py @@ -13,6 +13,9 @@ def matches_file_type(cls, iname, ifile, request): extension = os.path.splitext(iname)[-1].lower() return extension in Archive._filename_extensions + def extract(self): + pass + class Meta: app_label = 'filer' verbose_name = _('archive') diff --git a/filer/templates/admin/filer/folder/directory_table.html b/filer/templates/admin/filer/folder/directory_table.html index 5738c2de5..e61b016d9 100644 --- a/filer/templates/admin/filer/folder/directory_table.html +++ b/filer/templates/admin/filer/folder/directory_table.html @@ -41,6 +41,11 @@ {% trans "Delete" %} {% trans "Change" %} + {% if item.file_type == 'Archive' %} + + {% trans "Extract" %} + + {% endif %}

{{ file.label }} ({{ file.size|filesize:"auto1000long" }}{% ifequal file.file_type "Image" %}, {{ file.width }}x{{ file.height }} px{% endifequal %})
{% trans "Owner" %}: {{ file.owner|default:"n/a" }}
{% if enable_permissions %}
{% trans "Permissions" %}: {% if file.is_public %}{% trans "disabled" %}{% else %}{% trans "enabled" %}{% endif %}
{% endif %} From 98c708b013d03a90884d9a28d8006e74d1a3a108 Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Mon, 29 Apr 2013 20:51:33 +0300 Subject: [PATCH 044/715] LUN-367: Can now extract small zip files. There seems to be some memory leak in the code. Too many files are open. --- filer/admin/archiveadmin.py | 7 +++--- filer/models/archivemodels.py | 44 ++++++++++++++++++++++++++++++++--- 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/filer/admin/archiveadmin.py b/filer/admin/archiveadmin.py index 2d10bc4de..5c8273701 100644 --- a/filer/admin/archiveadmin.py +++ b/filer/admin/archiveadmin.py @@ -3,7 +3,7 @@ from filer.admin.fileadmin import FileAdmin from filer.models import Archive from django.conf.urls.defaults import patterns, url -from django.http import HttpResponse +from django.http import HttpResponseRedirect from zipfile import ZipFile @@ -34,5 +34,6 @@ def get_urls(self): return archive_urls + urls def extract(self, request, file_id): - return HttpResponse() - + archive = Archive.objects.get(id=file_id) + archive.extract() + # return HttpResponse('') diff --git a/filer/models/archivemodels.py b/filer/models/archivemodels.py index 7134625ff..f0ff774be 100644 --- a/filer/models/archivemodels.py +++ b/filer/models/archivemodels.py @@ -1,7 +1,10 @@ -from filer.models.filemodels import File +from filer.models.filemodels import File, Folder from filer import settings as filer_settings from django.utils.translation import ugettext_lazy as _ +from django.core.files.base import ContentFile import os.path +import zipfile +import StringIO class Archive(File): file_type = 'Archive' @@ -14,9 +17,44 @@ def matches_file_type(cls, iname, ifile, request): return extension in Archive._filename_extensions def extract(self): - pass + self.file.seek(0) + data = self.file.read() # XXX this blows if the archive is huge. + dummy_file = StringIO.StringIO(data) + self.extract_zip(dummy_file) + + def extract_zip(self, file_info): + zippy = zipfile.ZipFile(file_info) + entries = zippy.infolist() + for entry in entries: + fields = entry.filename.split('/') + dir_parents_of_entry = fields[:-1] + filename = fields[-1] + parent_dir = self.folder + for directory_name in dir_parents_of_entry: + current_dir, _ = Folder.objects.get_or_create( + name=directory_name, + parent=parent_dir, + owner=self.owner, + ) + parent_dir = current_dir + if filename is not '': + zippy_file = zippy.open(entry.filename) + data = zippy_file.read() + zippy_file.close() + file_data = ContentFile(data) + file_data.name = filename + file_object, _ = File.objects.get_or_create( + original_filename=filename, + folder=parent_dir, + owner=self.owner, + file=file_data, + ) + file_object.save() + file_data.close() + zippy.close() + class Meta: - app_label = 'filer' + app_label = 'filer' verbose_name = _('archive') verbose_name_plural = _('archives') From 164c89e6faad328183169f809a1e443bce00a2d2 Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Tue, 30 Apr 2013 19:14:55 +0300 Subject: [PATCH 045/715] LUN-367: Moved extract to dropdown menu. Restructured code a bit. --- filer/admin/folderadmin.py | 13 ++++- filer/models/archivemodels.py | 49 ++++++++++--------- .../admin/filer/folder/directory_table.html | 4 +- 3 files changed, 38 insertions(+), 28 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 66ef24d07..5b3ac6180 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -32,7 +32,8 @@ check_files_read_permissions, check_folder_read_permissions) from filer.models import (Folder, FolderRoot, UnfiledImages, File, tools, - ImagesWithMissingData, FolderPermission, Image) + ImagesWithMissingData, FolderPermission, Image, + Archive) from filer.settings import FILER_STATICMEDIA_PREFIX, FILER_PAGINATE_BY, FOLDER_AFFECTS_URL from filer.utils.filer_easy_thumbnails import FilerActionThumbnailer from filer.thumbnail_processors import normalize_subject_location @@ -54,7 +55,8 @@ class Meta: folder_admin_actions = [ 'move_to_clipboard', 'files_set_public', 'files_set_private', 'delete_files_or_folders', 'move_files_and_folders', - 'copy_files_and_folders', 'resize_images', 'rename_files'] + 'copy_files_and_folders', 'resize_images', 'rename_files', + 'extract_files'] if FOLDER_AFFECTS_URL: folder_admin_actions.remove('move_files_and_folders') @@ -923,6 +925,13 @@ def rename_files(self, request, files_queryset, folders_queryset): rename_files.short_description = ugettext_lazy("Rename files") + def extract_files(self, request, files_queryset, folder_queryset): + for f in files_queryset: + if isinstance(f, Archive): + f.extract() + + extract_files.short_description = ugettext_lazy("Extract archives") + def _generate_new_filename(self, filename, suffix): basename, extension = os.path.splitext(filename) return basename + suffix + extension diff --git a/filer/models/archivemodels.py b/filer/models/archivemodels.py index f0ff774be..70c0b46be 100644 --- a/filer/models/archivemodels.py +++ b/filer/models/archivemodels.py @@ -26,32 +26,33 @@ def extract_zip(self, file_info): zippy = zipfile.ZipFile(file_info) entries = zippy.infolist() for entry in entries: - fields = entry.filename.split('/') - dir_parents_of_entry = fields[:-1] - filename = fields[-1] + dir_parents_of_entry = entry.filename.split('/')[:-1] + filename = os.path.basename(entry.filename) parent_dir = self.folder for directory_name in dir_parents_of_entry: - current_dir, _ = Folder.objects.get_or_create( - name=directory_name, - parent=parent_dir, - owner=self.owner, - ) - parent_dir = current_dir - if filename is not '': - zippy_file = zippy.open(entry.filename) - data = zippy_file.read() - zippy_file.close() - file_data = ContentFile(data) - file_data.name = filename - file_object, _ = File.objects.get_or_create( - original_filename=filename, - folder=parent_dir, - owner=self.owner, - file=file_data, - ) - file_object.save() - file_data.close() - zippy.close() + parent_dir = self._create_folder(directory_name, parent_dir) + if filename: + data = zippy.read(entry) + self._create_file(filename, parent_dir, data) + + def _create_folder(self, name, parent): + current_dir, _ = Folder.objects.get_or_create( + name=name, + parent=parent, + owner=self.owner, + ) + return current_dir + + def _create_file(self, basename, folder, data): + file_data = ContentFile(data) + file_data.name = basename + file_object = File.objects.create( + original_filename=basename, + folder=folder, + owner=self.owner, + file=file_data, + ) + file_data.close() class Meta: diff --git a/filer/templates/admin/filer/folder/directory_table.html b/filer/templates/admin/filer/folder/directory_table.html index e61b016d9..f2d6174ea 100644 --- a/filer/templates/admin/filer/folder/directory_table.html +++ b/filer/templates/admin/filer/folder/directory_table.html @@ -42,9 +42,9 @@ {% trans "Delete" %} {% trans "Change" %} {% if item.file_type == 'Archive' %} - + + Archive link End --> {% endif %}
{{ file.label }} ({{ file.size|filesize:"auto1000long" }}{% ifequal file.file_type "Image" %}, {{ file.width }}x{{ file.height }} px{% endifequal %})
{% trans "Owner" %}: {{ file.owner|default:"n/a" }}
From 1b7d7ffd4a551a1daa7464bc7c50053e0182176c Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Thu, 2 May 2013 15:29:25 +0300 Subject: [PATCH 046/715] LUN-367: Make pep8 corrections. --- filer/admin/__init__.py | 3 ++- filer/admin/archiveadmin.py | 19 +++---------- filer/admin/folderadmin.py | 2 +- filer/models/archivemodels.py | 27 ++++++++++++------- filer/models/filemodels.py | 1 - .../admin/filer/folder/directory_table.html | 7 +---- 6 files changed, 25 insertions(+), 34 deletions(-) diff --git a/filer/admin/__init__.py b/filer/admin/__init__.py index bf0bfaccb..80c3ba6ed 100644 --- a/filer/admin/__init__.py +++ b/filer/admin/__init__.py @@ -6,7 +6,8 @@ from filer.admin.imageadmin import ImageAdmin from filer.admin.permissionadmin import PermissionAdmin from filer.admin.archiveadmin import ArchiveAdmin -from filer.models import FolderPermission, Folder, File, Clipboard, Image, Archive +from filer.models import (FolderPermission, Folder, File, Clipboard, Image, + Archive) admin.site.register(Folder, FolderAdmin) diff --git a/filer/admin/archiveadmin.py b/filer/admin/archiveadmin.py index 5c8273701..82b0bc605 100644 --- a/filer/admin/archiveadmin.py +++ b/filer/admin/archiveadmin.py @@ -3,37 +3,24 @@ from filer.admin.fileadmin import FileAdmin from filer.models import Archive from django.conf.urls.defaults import patterns, url -from django.http import HttpResponseRedirect -from zipfile import ZipFile class ArchiveAdminForm(forms.ModelForm): - + class Meta: model = Archive class Media: css = { - # 'all': (settings.MEDIA_URL + 'filer/css/focal_point.css',) } js = ( - # filer_settings.FILER_STATICMEDIA_PREFIX + 'js/raphael.js', - # filer_settings.FILER_STATICMEDIA_PREFIX + 'js/focal_point.js', ) class ArchiveAdmin(FileAdmin): form = ArchiveAdminForm - + def get_urls(self): urls = super(ArchiveAdmin, self).get_urls() - archive_urls = patterns('', - url(r'^(?P\d+)/extract/$', self.admin_site.admin_view(self.extract), - name='filer_file_extract'), - ) + archive_urls = patterns('',) return archive_urls + urls - - def extract(self, request, file_id): - archive = Archive.objects.get(id=file_id) - archive.extract() - # return HttpResponse('') diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 5b3ac6180..65557929f 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -930,7 +930,7 @@ def extract_files(self, request, files_queryset, folder_queryset): if isinstance(f, Archive): f.extract() - extract_files.short_description = ugettext_lazy("Extract archives") + extract_files.short_description = ugettext_lazy("Extract selected zip files") def _generate_new_filename(self, filename, suffix): basename, extension = os.path.splitext(filename) diff --git a/filer/models/archivemodels.py b/filer/models/archivemodels.py index 70c0b46be..112fdca79 100644 --- a/filer/models/archivemodels.py +++ b/filer/models/archivemodels.py @@ -2,23 +2,27 @@ from filer import settings as filer_settings from django.utils.translation import ugettext_lazy as _ from django.core.files.base import ContentFile +from filer.settings import FILER_IS_PUBLIC_DEFAULT + import os.path import zipfile import StringIO + class Archive(File): file_type = 'Archive' _icon = 'archive' - _filename_extensions = ['.zip', '.tar', '.gz', '.bz2'] + _filename_extensions = ['.zip', ] @classmethod def matches_file_type(cls, iname, ifile, request): + getext = lambda x: os.path.splitext(x)[-1].lower() extension = os.path.splitext(iname)[-1].lower() return extension in Archive._filename_extensions def extract(self): self.file.seek(0) - data = self.file.read() # XXX this blows if the archive is huge. + data = self.file.read() # XXX this blows if the archive is huge. dummy_file = StringIO.StringIO(data) self.extract_zip(dummy_file) @@ -26,15 +30,20 @@ def extract_zip(self, file_info): zippy = zipfile.ZipFile(file_info) entries = zippy.infolist() for entry in entries: - dir_parents_of_entry = entry.filename.split('/')[:-1] + parent_dir = self._create_parent_folders(entry) filename = os.path.basename(entry.filename) - parent_dir = self.folder - for directory_name in dir_parents_of_entry: - parent_dir = self._create_folder(directory_name, parent_dir) if filename: data = zippy.read(entry) self._create_file(filename, parent_dir, data) + def _create_parent_folders(self, entry): + dir_parents_of_entry = entry.filename.split(os.sep)[:-1] + filename = os.path.basename(entry.filename) + parent_dir = self.folder + for directory_name in dir_parents_of_entry: + parent_dir = self._create_folder(directory_name, parent_dir) + return parent_dir + def _create_folder(self, name, parent): current_dir, _ = Folder.objects.get_or_create( name=name, @@ -46,15 +55,15 @@ def _create_folder(self, name, parent): def _create_file(self, basename, folder, data): file_data = ContentFile(data) file_data.name = basename - file_object = File.objects.create( - original_filename=basename, + file_object, _ = File.objects.get_or_create( + original_filename=file_data.name, folder=folder, owner=self.owner, file=file_data, + is_public=FILER_IS_PUBLIC_DEFAULT, ) file_data.close() - class Meta: app_label = 'filer' verbose_name = _('archive') diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index 544a41cf5..a030e3bf6 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -348,4 +348,3 @@ class Meta: app_label = 'filer' verbose_name = _('file') verbose_name_plural = _('files') - diff --git a/filer/templates/admin/filer/folder/directory_table.html b/filer/templates/admin/filer/folder/directory_table.html index f2d6174ea..d62d86b4c 100644 --- a/filer/templates/admin/filer/folder/directory_table.html +++ b/filer/templates/admin/filer/folder/directory_table.html @@ -36,16 +36,11 @@ {% if is_popup and not select_folder %} {% else %}{% if action_form and not is_popup %}{% endif %}{% endif %} - {{ file.default_alt_text }} + {{ file.default_alt_text }} {% trans "Delete" %} {% trans "Change" %} - {% if item.file_type == 'Archive' %} - - {% endif %}
{{ file.label }} ({{ file.size|filesize:"auto1000long" }}{% ifequal file.file_type "Image" %}, {{ file.width }}x{{ file.height }} px{% endifequal %})
{% trans "Owner" %}: {{ file.owner|default:"n/a" }}
{% if enable_permissions %}
{% trans "Permissions" %}: {% if file.is_public %}{% trans "disabled" %}{% else %}{% trans "enabled" %}{% endif %}
{% endif %} From 02f4e16931cdffd7717624fb212710d7658c8e05 Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Thu, 2 May 2013 18:02:48 +0300 Subject: [PATCH 047/715] LUN-367: Add tests for zip extract --- filer/tests/models.py | 72 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/filer/tests/models.py b/filer/tests/models.py index 5e73c7a96..8c62e87d2 100644 --- a/filer/tests/models.py +++ b/filer/tests/models.py @@ -1,12 +1,16 @@ #-*- coding: utf-8 -*- import os +import zipfile +import tempfile from django.forms.models import modelform_factory from django.test import TestCase from django.core.files import File as DjangoFile +from django.core.files.base import ContentFile from filer.models.foldermodels import Folder from filer.models.imagemodels import Image from filer.models.filemodels import File +from filer.models.archivemodels import Archive from filer.models.clipboardmodels import Clipboard from filer.tests.helpers import (create_superuser, create_folder_structure, create_image, create_clipboard_item) @@ -176,3 +180,71 @@ def test_deleting_file_does_not_delete_file_from_filesystem_if_other_references_ # file should still be here self.assertTrue(storage.exists(name)) + +class ArchiveTest(TestCase): + + def setUp(self): + entries = [] + + def create_and_register_file(parent, data): + fd, path = tempfile.mkstemp(dir=parent) + os.write(fd, data) + os.close(fd) + entries.extend([path]) + return path + + def create_and_register_directory(parent): + new_dir = tempfile.mkdtemp(dir=parent) + entries.extend([new_dir]) + return new_dir + + def create_zipfile(): + zippy = zipfile.ZipFile('test.zip', 'w') + for entry in entries: + zippy.write(entry) + zippy.close() + local_zipfile = open('test.zip', 'r') + dummy_file = ContentFile(local_zipfile.read()) + local_zipfile.close() + File.objects.create( + original_filename='test.zip', + file=dummy_file, + ) + + root = create_and_register_directory(None) + subdir1 = create_and_register_directory(root) + subdir2 = create_and_register_directory(root) + subdir3 = create_and_register_directory(root) + subdir11 = create_and_register_directory(subdir1) + subdir12 = create_and_register_directory(subdir1) + subdir21 = create_and_register_directory(subdir2) + subdir31 = create_and_register_directory(subdir3) + leaf1 = create_and_register_file(root, 'first leaf') + leaf2 = create_and_register_file(subdir11, 'second leaf') + leaf3 = create_and_register_file(subdir11, 'third leaf') + leaf4 = create_and_register_file(subdir11, 'fourth leaf') + leaf5 = create_and_register_file(subdir12, 'fifth leaf') + leaf6 = create_and_register_file(subdir2, 'sixth leaf') + leaf7 = create_and_register_file(subdir2, 'seventh leaf') + leaf8 = create_and_register_file(subdir3, 'eight leaf') + create_zipfile() + self.entries = entries + + def test_extract_zip(self): + zippy = Archive.objects.get() + zippy.extract() + for entry in self.entries: + filer_file = File.objects.get(path=entry) + self.assertIsNotNone(filer_file) + self.assertEqual(filer_file.path, entry) + + def tearDown(self): + os.remove('test.zip') + top = self.entries[0] + for root, dirs, files in os.walk(top, topdown=False): + for name in files: + os.remove(os.path.join(root, name)) + for name in dirs: + os.rmdir(os.path.join(root, name)) + Archive.objects.get().delete() + From da1e1dcf632e07400ca6f9e2b550ec25e43f19b7 Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Tue, 7 May 2013 12:06:53 +0300 Subject: [PATCH 048/715] LUN-367: Add logical path tests. --- filer/models/archivemodels.py | 6 +- .../admin/filer/folder/directory_table.html | 2 +- filer/tests/models.py | 136 ++++++++++-------- 3 files changed, 76 insertions(+), 68 deletions(-) diff --git a/filer/models/archivemodels.py b/filer/models/archivemodels.py index 112fdca79..a15b212da 100644 --- a/filer/models/archivemodels.py +++ b/filer/models/archivemodels.py @@ -16,15 +16,11 @@ class Archive(File): @classmethod def matches_file_type(cls, iname, ifile, request): - getext = lambda x: os.path.splitext(x)[-1].lower() extension = os.path.splitext(iname)[-1].lower() return extension in Archive._filename_extensions def extract(self): - self.file.seek(0) - data = self.file.read() # XXX this blows if the archive is huge. - dummy_file = StringIO.StringIO(data) - self.extract_zip(dummy_file) + self.extract_zip(self.file) def extract_zip(self, file_info): zippy = zipfile.ZipFile(file_info) diff --git a/filer/templates/admin/filer/folder/directory_table.html b/filer/templates/admin/filer/folder/directory_table.html index d62d86b4c..5738c2de5 100644 --- a/filer/templates/admin/filer/folder/directory_table.html +++ b/filer/templates/admin/filer/folder/directory_table.html @@ -36,7 +36,7 @@ {% if is_popup and not select_folder %} {% else %}{% if action_form and not is_popup %}{% endif %}{% endif %} - {{ file.default_alt_text }} + {{ file.default_alt_text }} {% trans "Delete" %} diff --git a/filer/tests/models.py b/filer/tests/models.py index 8c62e87d2..9c774a382 100644 --- a/filer/tests/models.py +++ b/filer/tests/models.py @@ -3,6 +3,7 @@ import zipfile import tempfile from django.forms.models import modelform_factory +from django.db.models import Q from django.test import TestCase from django.core.files import File as DjangoFile from django.core.files.base import ContentFile @@ -182,69 +183,80 @@ def test_deleting_file_does_not_delete_file_from_filesystem_if_other_references_ class ArchiveTest(TestCase): - + def setUp(self): - entries = [] - - def create_and_register_file(parent, data): - fd, path = tempfile.mkstemp(dir=parent) - os.write(fd, data) - os.close(fd) - entries.extend([path]) - return path - - def create_and_register_directory(parent): - new_dir = tempfile.mkdtemp(dir=parent) - entries.extend([new_dir]) - return new_dir - - def create_zipfile(): - zippy = zipfile.ZipFile('test.zip', 'w') - for entry in entries: - zippy.write(entry) - zippy.close() - local_zipfile = open('test.zip', 'r') - dummy_file = ContentFile(local_zipfile.read()) - local_zipfile.close() - File.objects.create( - original_filename='test.zip', - file=dummy_file, - ) - - root = create_and_register_directory(None) - subdir1 = create_and_register_directory(root) - subdir2 = create_and_register_directory(root) - subdir3 = create_and_register_directory(root) - subdir11 = create_and_register_directory(subdir1) - subdir12 = create_and_register_directory(subdir1) - subdir21 = create_and_register_directory(subdir2) - subdir31 = create_and_register_directory(subdir3) - leaf1 = create_and_register_file(root, 'first leaf') - leaf2 = create_and_register_file(subdir11, 'second leaf') - leaf3 = create_and_register_file(subdir11, 'third leaf') - leaf4 = create_and_register_file(subdir11, 'fourth leaf') - leaf5 = create_and_register_file(subdir12, 'fifth leaf') - leaf6 = create_and_register_file(subdir2, 'sixth leaf') - leaf7 = create_and_register_file(subdir2, 'seventh leaf') - leaf8 = create_and_register_file(subdir3, 'eight leaf') - create_zipfile() - self.entries = entries - - def test_extract_zip(self): - zippy = Archive.objects.get() - zippy.extract() + self.entries = [] + self.zipname = 'test.zip' + root = self.create_and_register_directory(None) + subdir1 = self.create_and_register_directory(root) + subdir2 = self.create_and_register_directory(root) + subdir3 = self.create_and_register_directory(root) + subdir11 = self.create_and_register_directory(subdir1) + subdir12 = self.create_and_register_directory(subdir1) + subdir21 = self.create_and_register_directory(subdir2) + subdir31 = self.create_and_register_directory(subdir3) + leaf1 = self.create_and_register_file(root, 'first leaf') + leaf2 = self.create_and_register_file(subdir11, 'second leaf') + leaf3 = self.create_and_register_file(subdir11, 'third leaf') + leaf4 = self.create_and_register_file(subdir11, 'fourth leaf') + leaf5 = self.create_and_register_file(subdir12, 'fifth leaf') + leaf6 = self.create_and_register_file(subdir2, 'sixth leaf') + leaf7 = self.create_and_register_file(subdir2, 'seventh leaf') + leaf8 = self.create_and_register_file(subdir3, 'eight leaf') + self.create_zipfile() + filer_zipfile = Archive.objects.get() + filer_zipfile.extract() + + def test_entries_count(self): + files = File.objects.filter(~Q(original_filename=self.zipname)) + folders = Folder.objects.filter(~Q(name='tmp')) + filer_entries = list(files) + list(folders) + actual = len(filer_entries) + expected = len(self.entries) + self.assertEqual(actual, expected) + + def test_entries_path(self): + files = File.objects.all() + folders = Folder.objects.all() for entry in self.entries: - filer_file = File.objects.get(path=entry) - self.assertIsNotNone(filer_file) - self.assertEqual(filer_file.path, entry) - + basename = os.path.basename(entry) + file_match = files.filter(original_filename=basename) + folder_match = folders.filter(name=basename) + filer_matches = file_match or folder_match + self.assertNotEqual(0, len(filer_matches)) + filer_entry = filer_matches[0] + fields = map(lambda x: x.name, filer_entry.logical_path) + fields += [filer_entry.name or filer_entry.original_filename] + filer_path = os.sep + os.sep.join(fields) + self.assertEqual(filer_path, entry) + def tearDown(self): os.remove('test.zip') - top = self.entries[0] - for root, dirs, files in os.walk(top, topdown=False): - for name in files: - os.remove(os.path.join(root, name)) - for name in dirs: - os.rmdir(os.path.join(root, name)) - Archive.objects.get().delete() - + for entry in reversed(self.entries): + if os.path.isdir(entry): + os.rmdir(entry) + elif os.path.isfile(entry): + os.remove(entry) + + def create_and_register_file(self, parent, data): + fd, path = tempfile.mkstemp(dir=parent) + os.write(fd, data) + os.close(fd) + self.entries.extend([path]) + return path + + def create_and_register_directory(self, parent): + new_dir = tempfile.mkdtemp(dir=parent) + self.entries.extend([new_dir]) + return new_dir + + def create_zipfile(self): + zippy = zipfile.ZipFile(self.zipname, 'w') + for entry in self.entries: + zippy.write(entry) + zippy.close() + file_obj = DjangoFile(open(self.zipname), name=self.zipname) + filer_zipfile = Archive.objects.create( + original_filename=self.zipname, + file=file_obj, + ) From 30e3f06edcfe7b728c340591fd4e649984f3393f Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Mon, 13 May 2013 13:48:28 +0300 Subject: [PATCH 049/715] LUN-367: Code Review; Remove Media class from ArchiveAdmin. --- filer/admin/archiveadmin.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/filer/admin/archiveadmin.py b/filer/admin/archiveadmin.py index 82b0bc605..ff7c1ebb7 100644 --- a/filer/admin/archiveadmin.py +++ b/filer/admin/archiveadmin.py @@ -10,12 +10,6 @@ class ArchiveAdminForm(forms.ModelForm): class Meta: model = Archive - class Media: - css = { - } - js = ( - ) - class ArchiveAdmin(FileAdmin): form = ArchiveAdminForm From 1dd90bd973ced45071d7d6a40d5753d3d6cec143 Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Mon, 13 May 2013 15:33:20 +0300 Subject: [PATCH 050/715] LUN-367: Code Review; Close remaining zip file. --- filer/models/archivemodels.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/filer/models/archivemodels.py b/filer/models/archivemodels.py index a15b212da..773edcf88 100644 --- a/filer/models/archivemodels.py +++ b/filer/models/archivemodels.py @@ -31,6 +31,8 @@ def extract_zip(self, file_info): if filename: data = zippy.read(entry) self._create_file(filename, parent_dir, data) + zippy.close() + file_info.close() def _create_parent_folders(self, entry): dir_parents_of_entry = entry.filename.split(os.sep)[:-1] From bffba9c16838d5cb72dd18e0a0c99bbd3252f67c Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Tue, 14 May 2013 19:23:53 +0300 Subject: [PATCH 051/715] LUN-367: Code Review; Validate for duplicates. --- filer/admin/folderadmin.py | 25 +++++++++-- filer/models/archivemodels.py | 79 +++++++++++++++++++++++++++++++---- 2 files changed, 92 insertions(+), 12 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 65557929f..334c443c7 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -20,6 +20,7 @@ from django.utils.safestring import mark_safe from django.utils.translation import ugettext as _ from django.utils.translation import ungettext, ugettext_lazy +from django.utils import simplejson from filer import settings from filer.admin.forms import (CopyFilesAndFoldersForm, ResizeImagesForm, RenameFilesForm) @@ -926,9 +927,27 @@ def rename_files(self, request, files_queryset, folders_queryset): rename_files.short_description = ugettext_lazy("Rename files") def extract_files(self, request, files_queryset, folder_queryset): - for f in files_queryset: - if isinstance(f, Archive): - f.extract() + error_format = "Files/Folders from {archive} with names:" + error_format += "{names} already exist." + success_format = "Successfully extracted archive {}." + try: + for f in files_queryset: + if isinstance(f, Archive): + duplicates = f.validate() + if duplicates: + names = u", ".join(duplicates) + archive = f.actual_name + message = error_format.format( + archive=archive, + names=names, + ) + raise Exception(message) + else: + f.extract() + message = success_format.format(f.actual_name) + self.message_user(request, _(message)) + except Exception, e: + messages.error(request, _(e.message)) extract_files.short_description = ugettext_lazy("Extract selected zip files") diff --git a/filer/models/archivemodels.py b/filer/models/archivemodels.py index 773edcf88..a3deaae68 100644 --- a/filer/models/archivemodels.py +++ b/filer/models/archivemodels.py @@ -1,29 +1,83 @@ +""" +Archiving support for filer. +""" from filer.models.filemodels import File, Folder -from filer import settings as filer_settings from django.utils.translation import ugettext_lazy as _ from django.core.files.base import ContentFile from filer.settings import FILER_IS_PUBLIC_DEFAULT import os.path import zipfile -import StringIO + + +def folder_entries(folder): + """Returns the subentries of 'folder' in the slashed form.""" + subdirs = folder.get_descendants() + subdir_files = [x.files for x in subdirs] + subdir_files += [folder.files] + flatten = lambda superlist, files: list(superlist) + list(files) + super_files = reduce(flatten, subdir_files) + file_paths = map(get_logical_path, super_files) + dir_paths = map(get_logical_path, subdirs) + paths = file_paths + dir_paths + return paths + + +def get_logical_path(entry): + """Returns the slashed logical path form.""" + parents = [x.name for x in entry.logical_path] + is_a_dir = lambda: entry.file_type == 'Folder' + path = os.sep.join([''] + parents + [entry.actual_name]) + if is_a_dir(): + path += os.sep + return path class Archive(File): + """ + Django model for manipulating archive files. + With extract, it creates the file structure from within a archive file. + Current supported archive file types: zip. + """ file_type = 'Archive' _icon = 'archive' _filename_extensions = ['.zip', ] @classmethod def matches_file_type(cls, iname, ifile, request): + """Checks if the file has an archive type extension.""" extension = os.path.splitext(iname)[-1].lower() return extension in Archive._filename_extensions def extract(self): - self.extract_zip(self.file) + """Extracts the archive files' contents.""" + self._extract_zip(self.file) + + def validate(self): + """ + Verifies that the files or folders about to be written don't already + exist. + Returns any duplicated files/folders. + """ + return self._validate_zip(self.file) + + def _validate_zip(self, filer_file): + """Validates zip files.""" + zippy = zipfile.ZipFile(filer_file) + cwd = self.logical_folder + cwd_path = get_logical_path(cwd) + zip_paths = [cwd_path + x for x in zippy.namelist()] + filer_paths = folder_entries(cwd) + intersection = [x for x in filer_paths if x in zip_paths] + return intersection - def extract_zip(self, file_info): - zippy = zipfile.ZipFile(file_info) + def _extract_zip(self, filer_file): + """ + Creates the file and folder hierarchy from the contents of the zip + file. It first creates the parent folder of the selected file if it + does not already exist, similair to mkdir -p. + """ + zippy = zipfile.ZipFile(filer_file) entries = zippy.infolist() for entry in entries: parent_dir = self._create_parent_folders(entry) @@ -32,18 +86,22 @@ def extract_zip(self, file_info): data = zippy.read(entry) self._create_file(filename, parent_dir, data) zippy.close() - file_info.close() + filer_file.close() def _create_parent_folders(self, entry): + """Creates the folder parents for a given entry.""" dir_parents_of_entry = entry.filename.split(os.sep)[:-1] - filename = os.path.basename(entry.filename) parent_dir = self.folder for directory_name in dir_parents_of_entry: parent_dir = self._create_folder(directory_name, parent_dir) return parent_dir def _create_folder(self, name, parent): - current_dir, _ = Folder.objects.get_or_create( + """ + Helper wrapper of creating a file in a filer folder. + If there already is a folder with the given name, it returnes that. + """ + current_dir, created = Folder.objects.get_or_create( name=name, parent=parent, owner=self.owner, @@ -51,9 +109,10 @@ def _create_folder(self, name, parent): return current_dir def _create_file(self, basename, folder, data): + """Helper wrapper of creating a filer file.""" file_data = ContentFile(data) file_data.name = basename - file_object, _ = File.objects.get_or_create( + file_object, created = File.objects.get_or_create( original_filename=file_data.name, folder=folder, owner=self.owner, @@ -61,8 +120,10 @@ def _create_file(self, basename, folder, data): is_public=FILER_IS_PUBLIC_DEFAULT, ) file_data.close() + return file_object class Meta: + """Meta information for filer file model.""" app_label = 'filer' verbose_name = _('archive') verbose_name_plural = _('archives') From ac925358999d7a84a6d2675cad4ae09d99b9e4ff Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Mon, 20 May 2013 13:09:58 +0300 Subject: [PATCH 052/715] LUN 367: Code Review; Restructured code --- filer/admin/folderadmin.py | 44 ++++++++++++++----------- filer/models/archivemodels.py | 62 +++++++++++++++++------------------ filer/models/filemodels.py | 12 ++++++- filer/models/foldermodels.py | 10 ++++++ 4 files changed, 75 insertions(+), 53 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 334c443c7..4c456d8d2 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -927,27 +927,31 @@ def rename_files(self, request, files_queryset, folders_queryset): rename_files.short_description = ugettext_lazy("Rename files") def extract_files(self, request, files_queryset, folder_queryset): - error_format = "Files/Folders from {archive} with names:" - error_format += "{names} already exist." success_format = "Successfully extracted archive {}." - try: - for f in files_queryset: - if isinstance(f, Archive): - duplicates = f.validate() - if duplicates: - names = u", ".join(duplicates) - archive = f.actual_name - message = error_format.format( - archive=archive, - names=names, - ) - raise Exception(message) - else: - f.extract() - message = success_format.format(f.actual_name) - self.message_user(request, _(message)) - except Exception, e: - messages.error(request, _(e.message)) + for f in files_queryset: + if isinstance(f, Archive): + not_valid = not f.validate() + if not_valid: + error_format = "{} is not a valid zip file" + message = error_format.format(f.actual_name) + messages.error(request, _(message)) + break + collisions = f.collisions() + if collisions: + error_format = "Files/Folders from {archive} with names:" + error_format += "{names} already exist." + names = u", ".join(collisions) + archive = f.actual_name + message = error_format.format( + archive=archive, + names=names, + ) + messages.error(request, _(message)) + break + else: + f.extract() + message = success_format.format(f.actual_name) + self.message_user(request, _(message)) extract_files.short_description = ugettext_lazy("Extract selected zip files") diff --git a/filer/models/archivemodels.py b/filer/models/archivemodels.py index a3deaae68..19683c871 100644 --- a/filer/models/archivemodels.py +++ b/filer/models/archivemodels.py @@ -10,29 +10,6 @@ import zipfile -def folder_entries(folder): - """Returns the subentries of 'folder' in the slashed form.""" - subdirs = folder.get_descendants() - subdir_files = [x.files for x in subdirs] - subdir_files += [folder.files] - flatten = lambda superlist, files: list(superlist) + list(files) - super_files = reduce(flatten, subdir_files) - file_paths = map(get_logical_path, super_files) - dir_paths = map(get_logical_path, subdirs) - paths = file_paths + dir_paths - return paths - - -def get_logical_path(entry): - """Returns the slashed logical path form.""" - parents = [x.name for x in entry.logical_path] - is_a_dir = lambda: entry.file_type == 'Folder' - path = os.sep.join([''] + parents + [entry.actual_name]) - if is_a_dir(): - path += os.sep - return path - - class Archive(File): """ Django model for manipulating archive files. @@ -51,7 +28,11 @@ def matches_file_type(cls, iname, ifile, request): def extract(self): """Extracts the archive files' contents.""" - self._extract_zip(self.file) + try: + self.file.open() + self._extract_zip(self.file) + finally: + self.file.close() def validate(self): """ @@ -59,16 +40,36 @@ def validate(self): exist. Returns any duplicated files/folders. """ - return self._validate_zip(self.file) + is_valid = False + try: + self.file.open() + is_valid = self._validate_zip(self.file) + finally: + self.file.close() + return is_valid + + def collisions(self): + in_both = [] + try: + self.file.open() + in_both = self._collisions_zip(self.file) + finally: + self.file.close() + return in_both def _validate_zip(self, filer_file): """Validates zip files.""" + is_valid = zipfile.is_zipfile(filer_file) + return is_valid + + def _collisions_zip(self, filer_file): zippy = zipfile.ZipFile(filer_file) cwd = self.logical_folder - cwd_path = get_logical_path(cwd) - zip_paths = [cwd_path + x for x in zippy.namelist()] - filer_paths = folder_entries(cwd) - intersection = [x for x in filer_paths if x in zip_paths] + cwd_path = cwd.pretty_logical_path + u'/' + no_end_slash = lambda x: x[:-1] if x.endswith('/') else x + zip_paths = [cwd_path + no_end_slash(x) for x in zippy.namelist()] + filer_paths = cwd.pretty_path_entries() + intersection = [x for x in zip_paths if x in set(filer_paths)] return intersection def _extract_zip(self, filer_file): @@ -85,8 +86,6 @@ def _extract_zip(self, filer_file): if filename: data = zippy.read(entry) self._create_file(filename, parent_dir, data) - zippy.close() - filer_file.close() def _create_parent_folders(self, entry): """Creates the folder parents for a given entry.""" @@ -119,7 +118,6 @@ def _create_file(self, basename, folder, data): file=file_data, is_public=FILER_IS_PUBLIC_DEFAULT, ) - file_data.close() return file_object class Meta: diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index a030e3bf6..a952aca2b 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -171,7 +171,7 @@ def save(self, *args, **kwargs): self.update_location_on_storage(*args, **kwargs) else: super(File, self).save(*args, **kwargs) - + save.alters_data = True def _is_name_chnaged(self): @@ -267,6 +267,16 @@ def actual_name(self): actual_name = u"%s" % (self.name,) return actual_name + @property + def pretty_logical_path(self): + its_dir = self.logical_folder + if hasattr(its_dir, 'pretty_logical_path'): + directory_path = its_dir.pretty_logical_path + else: + directory_path = u'/' + full_path = u'{}/{}'.format(directory_path, self.actual_name) + return full_path + def __unicode__(self): return self.actual_name diff --git a/filer/models/foldermodels.py b/filer/models/foldermodels.py index 470e29bce..ed58e4228 100644 --- a/filer/models/foldermodels.py +++ b/filer/models/foldermodels.py @@ -147,6 +147,16 @@ def entries_with_names(self, names): folders_with_names = self.children.filter(name__in=names) return list(itertools.chain(files_with_names, folders_with_names)) + def pretty_path_entries(self): + """Returns a list of all the descendant's entries logical path""" + subdirs = self.get_descendants(include_self=True) + subdir_files = [x.files for x in subdirs] + super_files = list(itertools.chain.from_iterable(subdir_files)) + file_paths = [x.pretty_logical_path for x in super_files] + dir_paths = [x.pretty_logical_path for x in subdirs] + paths = file_paths + dir_paths + return paths + @property def logical_path(self): """ From a3722c71cabc4c7dab5b112aa86bb88e29e41597 Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Mon, 20 May 2013 19:15:57 +0300 Subject: [PATCH 053/715] LUN-367: Code Review; Restructured Code Part 2. --- filer/admin/folderadmin.py | 54 +++++++++++++++++++---------------- filer/models/archivemodels.py | 27 ++++++++++-------- 2 files changed, 45 insertions(+), 36 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 4c456d8d2..8ad4ce163 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -20,7 +20,6 @@ from django.utils.safestring import mark_safe from django.utils.translation import ugettext as _ from django.utils.translation import ungettext, ugettext_lazy -from django.utils import simplejson from filer import settings from filer.admin.forms import (CopyFilesAndFoldersForm, ResizeImagesForm, RenameFilesForm) @@ -928,30 +927,37 @@ def rename_files(self, request, files_queryset, folders_queryset): def extract_files(self, request, files_queryset, folder_queryset): success_format = "Successfully extracted archive {}." + + def is_valid_archive(filer_file): + is_valid = filer_file.is_valid() + if not is_valid: + error_format = "{} is not a valid zip file" + message = error_format.format(filer_file.actual_name) + messages.error(request, _(message)) + return is_valid + + def has_collisions(filer_file): + collisions = filer_file.collisions() + if collisions: + error_format = "Files/Folders from {archive} with names:" + error_format += "{names} already exist." + names = u", ".join(collisions) + archive = filer_file.actual_name + message = error_format.format( + archive=archive, + names=names, + ) + messages.error(request, _(message)) + return len(collisions) > 0 + for f in files_queryset: - if isinstance(f, Archive): - not_valid = not f.validate() - if not_valid: - error_format = "{} is not a valid zip file" - message = error_format.format(f.actual_name) - messages.error(request, _(message)) - break - collisions = f.collisions() - if collisions: - error_format = "Files/Folders from {archive} with names:" - error_format += "{names} already exist." - names = u", ".join(collisions) - archive = f.actual_name - message = error_format.format( - archive=archive, - names=names, - ) - messages.error(request, _(message)) - break - else: - f.extract() - message = success_format.format(f.actual_name) - self.message_user(request, _(message)) + if not isinstance(f, Archive) or \ + not is_valid_archive(f) or \ + has_collisions(f): + continue + f.extract() + message = success_format.format(f.actual_name) + self.message_user(request, _(message)) extract_files.short_description = ugettext_lazy("Extract selected zip files") diff --git a/filer/models/archivemodels.py b/filer/models/archivemodels.py index 19683c871..3636b1b14 100644 --- a/filer/models/archivemodels.py +++ b/filer/models/archivemodels.py @@ -28,48 +28,51 @@ def matches_file_type(cls, iname, ifile, request): def extract(self): """Extracts the archive files' contents.""" + self.file.open() try: - self.file.open() self._extract_zip(self.file) finally: self.file.close() - def validate(self): - """ - Verifies that the files or folders about to be written don't already - exist. - Returns any duplicated files/folders. - """ + def is_valid(self): + """Checks if the file is a proper archive.""" is_valid = False + self.file.open() try: - self.file.open() - is_valid = self._validate_zip(self.file) + is_valid = self._is_valid_zip(self.file) finally: self.file.close() return is_valid def collisions(self): + """ + Verifies that the files or folders about to be written don't already + exist. + Returns any duplicated files/folders. + """ in_both = [] + self.file.open() try: - self.file.open() in_both = self._collisions_zip(self.file) finally: self.file.close() return in_both - def _validate_zip(self, filer_file): + def _is_valid_zip(self, filer_file): """Validates zip files.""" is_valid = zipfile.is_zipfile(filer_file) return is_valid def _collisions_zip(self, filer_file): + """Checks collisions for zip files.""" zippy = zipfile.ZipFile(filer_file) cwd = self.logical_folder cwd_path = cwd.pretty_logical_path + u'/' no_end_slash = lambda x: x[:-1] if x.endswith('/') else x zip_paths = [cwd_path + no_end_slash(x) for x in zippy.namelist()] filer_paths = cwd.pretty_path_entries() - intersection = [x for x in zip_paths if x in set(filer_paths)] + file_set = set(filer_paths) + intersection = [x for x in zip_paths if x in file_set] return intersection def _extract_zip(self, filer_file): From ecc0f744e0def7590d04ac775685493974fe4e11 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Tue, 21 May 2013 13:14:43 +0300 Subject: [PATCH 054/715] Monkey patch s3boto storage to properly quote file names. This is a temporary solution until: * django-storages issue #172 is fixed (http://code.larlet.fr/django-storages/issue/172/storageurl-should-quote-file-names-before#comment-4149177) OR * pull req #70 is merged (http://code.larlet.fr/django-storages/issue/172/storageurl-should-quote-file-names-before#comment-4149177) --- filer/storage.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/filer/storage.py b/filer/storage.py index dfb4e6bcb..2abfe33e6 100755 --- a/filer/storage.py +++ b/filer/storage.py @@ -1,5 +1,6 @@ #-*- coding: utf-8 -*- from django.core.files.storage import FileSystemStorage +from django.utils.encoding import filepath_to_uri class PublicFileSystemStorage(FileSystemStorage): @@ -19,3 +20,23 @@ class PrivateFileSystemStorage(FileSystemStorage): See ``filer.settings`` for the defaults for ``location`` and ``base_url``. """ is_secure = True + + +try: + from storages.backends.s3boto import S3BotoStorage + + + class PatchedS3BotoStorage(S3BotoStorage): + + def url(self, name): + name = filepath_to_uri(self._normalize_name(self._clean_name(name))) + if self.custom_domain: + return "%s://%s/%s" % ('https' if self.secure_urls else 'http', + self.custom_domain, name) + return self.connection.generate_url(self.querystring_expire, + method='GET', bucket=self.bucket.name, key=self._encode_name(name), + query_auth=self.querystring_auth, force_http=not self.secure_urls) + + +except ImportError: + pass From 1620f31e36a86c5a90d925ebb56c4bf25dd45161 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Fri, 24 May 2013 14:29:40 +0300 Subject: [PATCH 055/715] Provide a copy method in the patched S3 boto storage. This results in better performance on file renames or clipboard pasting by avoiding downloading and uploading under a separate name. --- filer/models/filemodels.py | 16 +++++++++++----- filer/storage.py | 27 +++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index a030e3bf6..fd4f726bf 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -125,11 +125,15 @@ def _copy_file(self, destination, overwrite=False): src_file_name = self.file.name storage = self.file.storages['public' if self.is_public else 'private'] - # This is needed because most of the remote File Storage backend do not - # open the file. - src_file = storage.open(src_file_name) - src_file.open() - return storage.save(destination, ContentFile(src_file.read())) + if hasattr(storage, 'copy'): + storage.copy(src_file_name, destination) + return destination + else: + # This is needed because most of the remote File Storage backend do not + # open the file. + src_file = storage.open(src_file_name) + src_file.open() + return storage.save(destination, ContentFile(src_file.read())) def generate_sha1(self): sha = hashlib.sha1() @@ -201,6 +205,8 @@ def update_location_on_storage(self, *args, **kwargs): super(File, self).save(*args, **kwargs) except Exception: transaction.rollback() + # delete the file from new_location if the db update failed + storage.delete(new_location) raise else: transaction.commit() diff --git a/filer/storage.py b/filer/storage.py index dfb4e6bcb..20368bbed 100755 --- a/filer/storage.py +++ b/filer/storage.py @@ -1,5 +1,6 @@ #-*- coding: utf-8 -*- from django.core.files.storage import FileSystemStorage +from django.utils.encoding import filepath_to_uri class PublicFileSystemStorage(FileSystemStorage): @@ -19,3 +20,29 @@ class PrivateFileSystemStorage(FileSystemStorage): See ``filer.settings`` for the defaults for ``location`` and ``base_url``. """ is_secure = True + + +try: + from storages.backends.s3boto import S3BotoStorage + + + class PatchedS3BotoStorage(S3BotoStorage): + + def url(self, name): + name = filepath_to_uri(self._normalize_name(self._clean_name(name))) + if self.custom_domain: + return "%s://%s/%s" % ('https' if self.secure_urls else 'http', + self.custom_domain, name) + return self.connection.generate_url(self.querystring_expire, + method='GET', bucket=self.bucket.name, key=self._encode_name(name), + query_auth=self.querystring_auth, force_http=not self.secure_urls) + + def copy(self, src_name, dst_name): + src_path = self._normalize_name(self._clean_name(src_name)) + dst_path = self._normalize_name(self._clean_name(dst_name)) + self.bucket.copy_key(dst_path, self.bucket.name, src_path) + + +except ImportError: + pass + From 7ccc53cddbb6462ca57c020b31393be56b4d65a9 Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Fri, 24 May 2013 15:19:13 +0300 Subject: [PATCH 056/715] LUN-732: Zip decode unicode filenames. --- filer/models/archivemodels.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/filer/models/archivemodels.py b/filer/models/archivemodels.py index 3636b1b14..e8db7e9ed 100644 --- a/filer/models/archivemodels.py +++ b/filer/models/archivemodels.py @@ -9,6 +9,8 @@ import os.path import zipfile +decode_str = lambda x: x.decode('utf8') + class Archive(File): """ @@ -69,7 +71,8 @@ def _collisions_zip(self, filer_file): cwd = self.logical_folder cwd_path = cwd.pretty_logical_path + u'/' no_end_slash = lambda x: x[:-1] if x.endswith('/') else x - zip_paths = [cwd_path + no_end_slash(x) for x in zippy.namelist()] + zip_paths = [cwd_path + decode_str(no_end_slash(x)) + for x in zippy.namelist()] filer_paths = cwd.pretty_path_entries() file_set = set(filer_paths) intersection = [x for x in zip_paths if x in file_set] @@ -84,15 +87,16 @@ def _extract_zip(self, filer_file): zippy = zipfile.ZipFile(filer_file) entries = zippy.infolist() for entry in entries: - parent_dir = self._create_parent_folders(entry) - filename = os.path.basename(entry.filename) + full_path = decode_str(entry.filename) + filename = os.path.basename(full_path) + parent_dir = self._create_parent_folders(full_path) if filename: data = zippy.read(entry) self._create_file(filename, parent_dir, data) - def _create_parent_folders(self, entry): + def _create_parent_folders(self, filename): """Creates the folder parents for a given entry.""" - dir_parents_of_entry = entry.filename.split(os.sep)[:-1] + dir_parents_of_entry = filename.split(os.sep)[:-1] parent_dir = self.folder for directory_name in dir_parents_of_entry: parent_dir = self._create_folder(directory_name, parent_dir) From 465a4c871a8382e709f3603bc28a754cf7292d26 Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Fri, 24 May 2013 15:25:19 +0300 Subject: [PATCH 057/715] LUN-732: Switch to unicode error messages. --- filer/admin/folderadmin.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 8ad4ce163..c9baa1e95 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -931,7 +931,7 @@ def extract_files(self, request, files_queryset, folder_queryset): def is_valid_archive(filer_file): is_valid = filer_file.is_valid() if not is_valid: - error_format = "{} is not a valid zip file" + error_format = u"{} is not a valid zip file" message = error_format.format(filer_file.actual_name) messages.error(request, _(message)) return is_valid @@ -939,8 +939,8 @@ def is_valid_archive(filer_file): def has_collisions(filer_file): collisions = filer_file.collisions() if collisions: - error_format = "Files/Folders from {archive} with names:" - error_format += "{names} already exist." + error_format = u"Files/Folders from {archive} with names:" + error_format += u"{names} already exist." names = u", ".join(collisions) archive = filer_file.actual_name message = error_format.format( From 7f86bc3b1aad7c1b62f2e33e6bf01a7d7c233b3f Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Fri, 24 May 2013 16:44:46 +0300 Subject: [PATCH 058/715] Fix NameError that happens if _delete_thumbnails fails while updating a files location. Also provide a long explanation why update_location_on_storage overrides the default transaction management offered by django's change_view. --- filer/models/filemodels.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index fd4f726bf..a9676f925 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -190,14 +190,22 @@ def _delete_thumbnails(self): self.file.delete_thumbnails() source.delete() + # The manual transaction management here breaks the transaction management + # from django.contrib.admin.options.ModelAdmin.change_view + # This isn't a big problem because the only CRUD operation done afterwards + # is an insertion in django_admin_log. If this method rollbacks the transaction + # then we will have an entry in the admin log describing an action + # that didn't actually finish succesfull. + # This 'hack' can be removed once django adds support for on_commit and + # on_rollback hooks (see: https://code.djangoproject.com/ticket/14051) @transaction.commit_manually def update_location_on_storage(self, *args, **kwargs): old_location = self.file.name + # thumbnails might get physically deleted evenif the transaction fails + # though luck... they get re-created anyway... + self._delete_thumbnails() + new_location = self.file.field.upload_to(self, self.actual_name) try: - # thumbnails might get physically deleted evenif the transaction fails - # though luck... they can be regenerated anyway... - self._delete_thumbnails() - new_location = self.file.field.upload_to(self, self.actual_name) storage = self.file.storage saved_as = self._copy_file(new_location) assert saved_as == new_location, '%s %s' % (saved_as, new_location) From 0e464aa955c96b3de71604e38667b046b813bafc Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Fri, 24 May 2013 16:58:32 +0300 Subject: [PATCH 059/715] LUN-732: Zip unicode support code review; 1. Replace '/' with os.sep 2. Remove decode lambda 3. Can extract unfilled archives. --- filer/models/archivemodels.py | 23 ++++++++++++++--------- filer/models/filemodels.py | 9 +++++---- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/filer/models/archivemodels.py b/filer/models/archivemodels.py index e8db7e9ed..433fc13ff 100644 --- a/filer/models/archivemodels.py +++ b/filer/models/archivemodels.py @@ -9,8 +9,6 @@ import os.path import zipfile -decode_str = lambda x: x.decode('utf8') - class Archive(File): """ @@ -69,11 +67,18 @@ def _collisions_zip(self, filer_file): """Checks collisions for zip files.""" zippy = zipfile.ZipFile(filer_file) cwd = self.logical_folder - cwd_path = cwd.pretty_logical_path + u'/' - no_end_slash = lambda x: x[:-1] if x.endswith('/') else x - zip_paths = [cwd_path + decode_str(no_end_slash(x)) + if cwd.is_root: + cwd_path = os.sep + orphan_files = [x.pretty_logical_path + for x in File.objects.filter(folder=None)] + orphan_folders = [x.pretty_logical_path + for x in Folder.objects.filter(parent=None)] + filer_paths = orphan_files + orphan_folders + else: + cwd_path = cwd.pretty_logical_path + os.sep + filer_paths = cwd.pretty_path_entries() + zip_paths = [cwd_path + x.rstrip(os.sep).decode('utf8') for x in zippy.namelist()] - filer_paths = cwd.pretty_path_entries() file_set = set(filer_paths) intersection = [x for x in zip_paths if x in file_set] return intersection @@ -87,16 +92,16 @@ def _extract_zip(self, filer_file): zippy = zipfile.ZipFile(filer_file) entries = zippy.infolist() for entry in entries: - full_path = decode_str(entry.filename) + full_path = entry.filename.decode('utf8') filename = os.path.basename(full_path) parent_dir = self._create_parent_folders(full_path) if filename: data = zippy.read(entry) self._create_file(filename, parent_dir, data) - def _create_parent_folders(self, filename): + def _create_parent_folders(self, full_path): """Creates the folder parents for a given entry.""" - dir_parents_of_entry = filename.split(os.sep)[:-1] + dir_parents_of_entry = full_path.split(os.sep)[:-1] parent_dir = self.folder for directory_name in dir_parents_of_entry: parent_dir = self._create_folder(directory_name, parent_dir) diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index a952aca2b..d43b1e694 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -195,6 +195,7 @@ def update_location_on_storage(self, *args, **kwargs): self._delete_thumbnails() new_location = self.file.field.upload_to(self, self.actual_name) storage = self.file.storage + import ipdb; ipdb.set_trace() saved_as = self._copy_file(new_location) assert saved_as == new_location, '%s %s' % (saved_as, new_location) self.file = saved_as @@ -270,11 +271,11 @@ def actual_name(self): @property def pretty_logical_path(self): its_dir = self.logical_folder - if hasattr(its_dir, 'pretty_logical_path'): - directory_path = its_dir.pretty_logical_path + if its_dir.is_root: + directory_path = u'' else: - directory_path = u'/' - full_path = u'{}/{}'.format(directory_path, self.actual_name) + directory_path = its_dir.pretty_logical_path + full_path = u'{}{}{}'.format(directory_path, os.sep, self.actual_name) return full_path def __unicode__(self): From 369cde8bd26ef54c9212a03263e8642290ae675e Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Fri, 24 May 2013 17:03:32 +0300 Subject: [PATCH 060/715] Remove ipdb import. --- filer/models/filemodels.py | 1 - 1 file changed, 1 deletion(-) diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index d43b1e694..22ba52f96 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -195,7 +195,6 @@ def update_location_on_storage(self, *args, **kwargs): self._delete_thumbnails() new_location = self.file.field.upload_to(self, self.actual_name) storage = self.file.storage - import ipdb; ipdb.set_trace() saved_as = self._copy_file(new_location) assert saved_as == new_location, '%s %s' % (saved_as, new_location) self.file = saved_as From 713ec605093a35c02318f2bb2e16110e6a48ff70 Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Fri, 24 May 2013 19:04:45 +0300 Subject: [PATCH 061/715] LUN-733: Create filer-file properly using their subtype. --- filer/models/archivemodels.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/filer/models/archivemodels.py b/filer/models/archivemodels.py index 433fc13ff..f26a7e015 100644 --- a/filer/models/archivemodels.py +++ b/filer/models/archivemodels.py @@ -4,7 +4,9 @@ from filer.models.filemodels import File, Folder from django.utils.translation import ugettext_lazy as _ from django.core.files.base import ContentFile -from filer.settings import FILER_IS_PUBLIC_DEFAULT +from filer.settings import FILER_IS_PUBLIC_DEFAULT, FILER_FILE_MODELS +from filer.utils.loader import load_object + import os.path import zipfile @@ -123,7 +125,11 @@ def _create_file(self, basename, folder, data): """Helper wrapper of creating a filer file.""" file_data = ContentFile(data) file_data.name = basename - file_object, created = File.objects.get_or_create( + for filer_class in FILER_FILE_MODELS: + FileSubClass = load_object(filer_class) + if FileSubClass.matches_file_type(basename, None, None): + break + file_object, created = FileSubClass.objects.get_or_create( original_filename=file_data.name, folder=folder, owner=self.owner, From 9da673c6ee86f992a2c13a09dd546346995ca247 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Fri, 24 May 2013 19:21:40 +0300 Subject: [PATCH 062/715] atomic folder rename --- filer/models/filemodels.py | 52 +++++++++++++++++++++--------------- filer/models/foldermodels.py | 34 +++++++++++++++++++++++ 2 files changed, 65 insertions(+), 21 deletions(-) diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index a9676f925..0cf2704fe 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -4,6 +4,7 @@ from django.core.files.base import ContentFile from django.core.exceptions import ValidationError from django.db import models +from django.db import transaction from django.utils.translation import ugettext_lazy as _ from filer.fields.multistorage_file import MultiStorageFileField from filer.models import mixins @@ -13,7 +14,6 @@ import hashlib import os -from django.db import transaction class FileManager(PolymorphicManager): @@ -73,6 +73,7 @@ def __init__(self, *args, **kwargs): self._old_is_public = self.is_public self._old_name = self.name self._old_folder = self.folder + self._force_commit = False def clean(self): if self.folder: @@ -172,6 +173,7 @@ def save(self, *args, **kwargs): if filer_settings.FOLDER_AFFECTS_URL and \ (self._is_name_chnaged() or self._old_folder != self.folder): + self._force_commit = True self.update_location_on_storage(*args, **kwargs) else: super(File, self).save(*args, **kwargs) @@ -190,37 +192,45 @@ def _delete_thumbnails(self): self.file.delete_thumbnails() source.delete() - # The manual transaction management here breaks the transaction management - # from django.contrib.admin.options.ModelAdmin.change_view - # This isn't a big problem because the only CRUD operation done afterwards - # is an insertion in django_admin_log. If this method rollbacks the transaction - # then we will have an entry in the admin log describing an action - # that didn't actually finish succesfull. - # This 'hack' can be removed once django adds support for on_commit and - # on_rollback hooks (see: https://code.djangoproject.com/ticket/14051) - @transaction.commit_manually def update_location_on_storage(self, *args, **kwargs): old_location = self.file.name # thumbnails might get physically deleted evenif the transaction fails # though luck... they get re-created anyway... self._delete_thumbnails() new_location = self.file.field.upload_to(self, self.actual_name) - try: - storage = self.file.storage + storage = self.file.storage + + def copy_and_save(): saved_as = self._copy_file(new_location) assert saved_as == new_location, '%s %s' % (saved_as, new_location) self.file = saved_as super(File, self).save(*args, **kwargs) - except Exception: - transaction.rollback() - # delete the file from new_location if the db update failed - storage.delete(new_location) - raise + + if self._force_commit: + with transaction.commit_manually(): + # The manual transaction management here breaks the transaction management + # from django.contrib.admin.options.ModelAdmin.change_view + # This isn't a big problem because the only CRUD operation done afterwards + # is an insertion in django_admin_log. If this method rollbacks the transaction + # then we will have an entry in the admin log describing an action + # that didn't actually finish succesfull. + # This 'hack' can be removed once django adds support for on_commit and + # on_rollback hooks (see: https://code.djangoproject.com/ticket/14051) + try: + copy_and_save() + except Exception: + transaction.rollback() + # delete the file from new_location if the db update failed + storage.delete(new_location) + raise + else: + transaction.commit() + # only delete the file on the old_location if all went OK + if old_location != new_location: + storage.delete(old_location) else: - transaction.commit() - # only delete the file on the old_location if all went OK - if old_location != new_location: - storage.delete(old_location) + copy_and_save() + return new_location def delete(self, *args, **kwargs): # Delete the model before the file diff --git a/filer/models/foldermodels.py b/filer/models/foldermodels.py index 470e29bce..8950acb3d 100644 --- a/filer/models/foldermodels.py +++ b/filer/models/foldermodels.py @@ -5,6 +5,7 @@ from django.core import urlresolvers from django.core.exceptions import ValidationError from django.db import models +from django.db import transaction from django.db.models import Q from django.utils.translation import ugettext_lazy as _ @@ -117,6 +118,38 @@ def clean(self): _(u'%s is reserved for internal use. ' 'Please choose a different name') % self.name) + def save(self, *args, **kwargs): + if not filer_settings.FOLDER_AFFECTS_URL: + return super(Folder, self).save(*args, **kwargs) + + with transaction.commit_manually(): + storages = [] + old_locations = [] + new_locations = [] + + def delete_from_locations(locations, storages): + for location, storage in zip(locations, storages): + storage.delete(location) + + try: + super(Folder, self).save(*args, **kwargs) + all_files = [] + for folder in self.get_descendants(include_self=True): + all_files += folder.files + for f in all_files: + storages.append(f.file.storage) + old_locations.append(f.file.name) + new_locations.append(f.update_location_on_storage()) + except: + try: + transaction.rollback() + finally: + delete_from_locations(new_locations, storages) + raise + else: + transaction.commit() + delete_from_locations(old_locations, storages) + @property def file_count(self): if not hasattr(self, '_file_count_cache'): @@ -321,3 +354,4 @@ class Meta: verbose_name = _('folder permission') verbose_name_plural = _('folder permissions') app_label = 'filer' + From 516706534a68293b5da1f48263b775d2eac0dcc0 Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Mon, 27 May 2013 09:44:11 +0300 Subject: [PATCH 063/715] LUN-733: Refactor file subtype matching. --- filer/admin/clipboardadmin.py | 21 ++++++++------------- filer/models/archivemodels.py | 7 +++---- filer/utils/files.py | 16 +++++++++++++++- 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/filer/admin/clipboardadmin.py b/filer/admin/clipboardadmin.py index 2229aee83..97ba50a76 100644 --- a/filer/admin/clipboardadmin.py +++ b/filer/admin/clipboardadmin.py @@ -7,8 +7,9 @@ from django.views.decorators.csrf import csrf_exempt from filer import settings as filer_settings from filer.models import Clipboard, ClipboardItem -from filer.utils.files import handle_upload, UploadException -from filer.utils.loader import load_object +from filer.utils.files import ( + handle_upload, UploadException, matching_file_subtypes +) # ModelAdmins @@ -61,17 +62,11 @@ def ajax_upload(self, request, folder_id=None): if any(f for f in clipboard.files.all() if f.actual_name == filename): raise UploadException( _(u"A file named %s already exists in the clipboard") % filename) - - # find the file type - for filer_class in filer_settings.FILER_FILE_MODELS: - FileSubClass = load_object(filer_class) - #TODO: What if there are more than one that qualify? - if FileSubClass.matches_file_type(filename, upload, request): - FileForm = modelform_factory( - model = FileSubClass, - fields = ('original_filename', 'owner', 'file') - ) - break + matched_file_types = matching_file_subtypes(filename, upload, request) + FileForm = modelform_factory( + model=matched_file_types[0], + fields=('original_filename', 'owner', 'file') + ) uploadform = FileForm({'original_filename': filename, 'owner': request.user.pk}, {'file': upload}) diff --git a/filer/models/archivemodels.py b/filer/models/archivemodels.py index f26a7e015..cff58adbf 100644 --- a/filer/models/archivemodels.py +++ b/filer/models/archivemodels.py @@ -6,6 +6,7 @@ from django.core.files.base import ContentFile from filer.settings import FILER_IS_PUBLIC_DEFAULT, FILER_FILE_MODELS from filer.utils.loader import load_object +from filer.utils.files import matching_file_subtypes import os.path @@ -125,10 +126,8 @@ def _create_file(self, basename, folder, data): """Helper wrapper of creating a filer file.""" file_data = ContentFile(data) file_data.name = basename - for filer_class in FILER_FILE_MODELS: - FileSubClass = load_object(filer_class) - if FileSubClass.matches_file_type(basename, None, None): - break + matched_file_types = matching_file_subtypes(basename, None, None) + FileSubClass = matched_file_types[0] file_object, created = FileSubClass.objects.get_or_create( original_filename=file_data.name, folder=folder, diff --git a/filer/utils/files.py b/filer/utils/files.py index df1a739c2..5b8432c99 100644 --- a/filer/utils/files.py +++ b/filer/utils/files.py @@ -3,7 +3,8 @@ from django.utils.text import get_valid_filename as get_valid_filename_django from django.template.defaultfilters import slugify from django.core.files.uploadedfile import SimpleUploadedFile - +from filer.settings import FILER_FILE_MODELS +from filer.utils.loader import load_object class UploadException(Exception): pass @@ -52,3 +53,16 @@ def get_valid_filename(s): return u"%s.%s" % (filename, ext) else: return u"%s" % (filename,) + + +def matching_file_subtypes(filename, file_pointer, request): + """ + Returns a list of valid subtypes for a given file. + """ + types = map(load_object, FILER_FILE_MODELS) + + def _match_subtype(subtype): + is_match = subtype.matches_file_type(filename, file_pointer, request) + return is_match + type_matches = filter(_match_subtype, types) + return type_matches From 820ede14331787d546b48603e066f73fa5a67c10 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Mon, 27 May 2013 12:03:41 +0300 Subject: [PATCH 064/715] Added test for folder renaming and renamed two existing tests to more appropriate names. --- filer/tests/admin.py | 4 ++-- filer/tests/models.py | 19 ++++++++++++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/filer/tests/admin.py b/filer/tests/admin.py index 681873e1b..72ad576ab 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -126,7 +126,7 @@ def test_filer_upload_file(self, extra_headers={}): self.assertEqual(Image.objects.count(), 1) self.assertEqual(Image.objects.all()[0].original_filename, self.image_name) - def test_filer_upload_file_logical_actual_url(self, extra_headers={}): + def test_file_upload_no_duplicate_files(self, extra_headers={}): self.assertEqual(Image.objects.count(), 0) file_obj = django.core.files.File(open(self.filename)) response = self.client.post( @@ -146,7 +146,7 @@ def test_filer_upload_file_logical_actual_url(self, extra_headers={}): self.assertEqual(Image.objects.count(), 1) self.assertIn('error', response.content) - def test_paste_clipboard_to_folder_logical_actual_url(self): + def test_paste_from_clipboard_no_duplicate_files(self): first_folder = Folder.objects.create(name='first') def upload(): diff --git a/filer/tests/models.py b/filer/tests/models.py index 5e73c7a96..6cf51b7e3 100644 --- a/filer/tests/models.py +++ b/filer/tests/models.py @@ -9,8 +9,9 @@ from filer.models.filemodels import File from filer.models.clipboardmodels import Clipboard from filer.tests.helpers import (create_superuser, create_folder_structure, - create_image, create_clipboard_item) + create_image, create_clipboard_item, SettingsOverride) from filer import settings as filer_settings +from filer.utils.generate_filename import by_path @@ -112,6 +113,22 @@ def test_file_move_location(self): image.save() self.assertTrue(image.file.path.startswith(filer_settings.FILER_PUBLICMEDIA_STORAGE.location)) + def test_folder_rename_updates_file_urls(self): + with SettingsOverride(filer_settings, + FILER_PUBLICMEDIA_UPLOAD_TO=by_path, + FOLDER_AFFECTS_URL=True): + folder = Folder(name='foo') + folder.save() + file_obj = DjangoFile(open(self.filename)) + afile = File(name='testfile', folder=folder, file=file_obj) + afile.save() + self.assertIn('foo/testfile', afile.url) + folder.name = 'bar' + folder.save() + # refetch from db + afile = File.objects.get(pk=afile.pk) + self.assertIn('bar/testfile', afile.url) + def test_file_change_upload_to_destination(self): """ Test that the file is actualy move from the private to the public From 0e130d7c18a435b38b07fbd2ea1016a1be7a915a Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Mon, 27 May 2013 12:47:24 +0300 Subject: [PATCH 065/715] Added back bulk move and copy operations. These should work with the new overriden folder save --- filer/admin/folderadmin.py | 15 ++++----------- filer/models/foldermodels.py | 2 ++ 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 66ef24d07..99444e208 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -51,16 +51,6 @@ class Meta: fields = ('name',) -folder_admin_actions = [ - 'move_to_clipboard', 'files_set_public', 'files_set_private', - 'delete_files_or_folders', 'move_files_and_folders', - 'copy_files_and_folders', 'resize_images', 'rename_files'] - -if FOLDER_AFFECTS_URL: - folder_admin_actions.remove('move_files_and_folders') - folder_admin_actions.remove('copy_files_and_folders') - - class FolderAdmin(PrimitivePermissionAwareModelAdmin): list_display = ('name',) exclude = ('parent',) @@ -69,7 +59,10 @@ class FolderAdmin(PrimitivePermissionAwareModelAdmin): search_fields = ['name', 'files__name'] raw_id_fields = ('owner',) save_as = True # see ImageAdmin - actions = folder_admin_actions + actions = [ + 'move_to_clipboard', 'files_set_public', 'files_set_private', + 'delete_files_or_folders', 'move_files_and_folders', + 'copy_files_and_folders', 'resize_images', 'rename_files'] def get_form(self, request, obj=None, **kwargs): """ diff --git a/filer/models/foldermodels.py b/filer/models/foldermodels.py index 8950acb3d..6d96a187f 100644 --- a/filer/models/foldermodels.py +++ b/filer/models/foldermodels.py @@ -123,6 +123,8 @@ def save(self, *args, **kwargs): return super(Folder, self).save(*args, **kwargs) with transaction.commit_manually(): + # The manual transaction management here breaks the transaction management + # from django.contrib.admin.options.ModelAdmin.change_view storages = [] old_locations = [] new_locations = [] From f961d1f97d5375dfbbedf099c3aad72b9478bc96 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Mon, 27 May 2013 15:30:33 +0300 Subject: [PATCH 066/715] Improved performance by reducing the number of thumbnails that get generated. --- filer/settings.py | 4 +--- filer/templates/admin/filer/folder/directory_table.html | 6 +++--- filer/templates/admin/filer/image/change_form.html | 7 ------- filer/templates/admin/filer/widgets/admin_file.html | 2 +- 4 files changed, 5 insertions(+), 14 deletions(-) diff --git a/filer/settings.py b/filer/settings.py index cb7c47411..765f732d6 100644 --- a/filer/settings.py +++ b/filer/settings.py @@ -26,9 +26,7 @@ if not FILER_STATICMEDIA_PREFIX: FILER_STATICMEDIA_PREFIX = (getattr(settings, 'STATIC_URL', None) or settings.MEDIA_URL) + 'filer/' -FILER_ADMIN_ICON_SIZES = getattr(settings,"FILER_ADMIN_ICON_SIZES",( - '16', '32', '48', '64', - )) +FILER_ADMIN_ICON_SIZES = getattr(settings,"FILER_ADMIN_ICON_SIZES",('32',)) # This is an ordered iterable that describes a list of # classes that I should check for when adding files diff --git a/filer/templates/admin/filer/folder/directory_table.html b/filer/templates/admin/filer/folder/directory_table.html index 6a7d82679..a5929fafd 100644 --- a/filer/templates/admin/filer/folder/directory_table.html +++ b/filer/templates/admin/filer/folder/directory_table.html @@ -20,7 +20,7 @@ {% if select_folder and item.file_type == 'Folder' %} {% else %}{% if action_form and item.pk and not is_popup %}{% endif %}{% endif %} - {% trans + {% trans {% if item.file_type == 'Folder' %} @@ -34,9 +34,9 @@ {% endwith %}{% endif %} {% if item.file_type == 'File' or item.file_type == 'Image' %}{% with item as file %} - {% if is_popup and not select_folder %} {% else %}{% if action_form and not is_popup %}{% endif %}{% endif %} + {% if is_popup and not select_folder %} {% else %}{% if action_form and not is_popup %}{% endif %}{% endif %} - {{ file.default_alt_text }} + {{ file.default_alt_text }} {% trans "Delete" %} diff --git a/filer/templates/admin/filer/image/change_form.html b/filer/templates/admin/filer/image/change_form.html index 6b38faf04..7e93063f8 100644 --- a/filer/templates/admin/filer/image/change_form.html +++ b/filer/templates/admin/filer/image/change_form.html @@ -13,12 +13,5 @@ {% endblock %} {% block file_sidebar %} - {{ block.super }} {% endblock %} \ No newline at end of file diff --git a/filer/templates/admin/filer/widgets/admin_file.html b/filer/templates/admin/filer/widgets/admin_file.html index 88c099d87..4da75a330 100644 --- a/filer/templates/admin/filer/widgets/admin_file.html +++ b/filer/templates/admin/filer/widgets/admin_file.html @@ -1,7 +1,7 @@ {% load i18n filer_admin_tags %}{% spaceless %} {% if object %} {% if object.icons.32 %} - {{ object.label }} + {{ object.label }}  {{ object.label }} {% else %} {% trans 'file missing' %} From 32c4eb3594ee957f90541830883736e971fb7123 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Mon, 27 May 2013 15:55:17 +0300 Subject: [PATCH 067/715] Remove code duplication from thumbnail and icon generation. --- filer/models/imagemodels.py | 41 +++++++++++++++---------------------- 1 file changed, 16 insertions(+), 25 deletions(-) diff --git a/filer/models/imagemodels.py b/filer/models/imagemodels.py index 528b15119..b19c284dc 100644 --- a/filer/models/imagemodels.py +++ b/filer/models/imagemodels.py @@ -148,32 +148,9 @@ def width(self): def height(self): return self._height or 0 - @property - def icons(self): - _icons = {} - for size in filer_settings.FILER_ADMIN_ICON_SIZES: - try: - thumbnail_options = { - 'size': (int(size), int(size)), - 'crop': True, - 'upscale': True, - 'subject_location': self.subject_location} - thumb = self.file.get_thumbnail(thumbnail_options) - _icons[size] = thumb.url - except Exception, e: - # catch exception and manage it. We can re-raise it for debugging - # purposes and/or just logging it, provided user configured - # proper logging configuration - if filer_settings.FILER_ENABLE_LOGGING: - logger.error('Error while generating icons: %s',e) - if filer_settings.FILER_DEBUG: - raise e - return _icons - - @property - def thumbnails(self): + def _generate_thumbnails(self, required_thumbnails): _thumbnails = {} - for name, opts in Image.DEFAULT_THUMBNAILS.items(): + for name, opts in required_thumbnails.iteritems(): try: opts.update({'subject_location': self.subject_location}) thumb = self.file.get_thumbnail(opts) @@ -188,6 +165,20 @@ def thumbnails(self): raise e return _thumbnails + @property + def icons(self): + required_thumbnails = dict( + (size, {'size': (int(size), int(size)), + 'crop': True, + 'upscale': True, + 'subject_location': self.subject_location}) + for size in filer_settings.FILER_ADMIN_ICON_SIZES) + return self._generate_thumbnails(required_thumbnails) + + @property + def thumbnails(self): + return self._generate_thumbnails(Image.DEFAULT_THUMBNAILS) + @property def easy_thumbnails_thumbnailer(self): tn = FilerThumbnailer( From f222fde1df626f3d7f8622b196d268f99e8cc032 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Mon, 27 May 2013 16:55:17 +0300 Subject: [PATCH 068/715] Update documentation and remove unused import --- docs/settings.rst | 11 ++--------- filer/admin/folderadmin.py | 2 +- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/docs/settings.rst b/docs/settings.rst index 8f0270b8c..5722c5eb7 100644 --- a/docs/settings.rst +++ b/docs/settings.rst @@ -141,15 +141,8 @@ Defaults to ``False`` Set this to ``True`` when your ``UPLOAD_TO`` function generates a path that depends on the folder the file belongs to. -Having this set to ``True`` has certain implications: - -* when renaming a file or moving it in and out of the clipboard the file is renamed/move on the - backend storage as well -* bulk operations such as *Copy selected files and/or folders* or *Move selected files and/or folders* - are disabled. Reasons for disabling them are: - - * they might cause requests to timeout due to the fact that copying/moving a large number of files on the storage backend would take a long time - * in case of failure the database might end up being out of sync with the storage backend +When renaming a file or moving it in and out of the clipboard the file is renamed/move on the +backend storage as well Defaults to ``False`` diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 99444e208..2b6f52759 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -33,7 +33,7 @@ check_folder_read_permissions) from filer.models import (Folder, FolderRoot, UnfiledImages, File, tools, ImagesWithMissingData, FolderPermission, Image) -from filer.settings import FILER_STATICMEDIA_PREFIX, FILER_PAGINATE_BY, FOLDER_AFFECTS_URL +from filer.settings import FILER_STATICMEDIA_PREFIX, FILER_PAGINATE_BY from filer.utils.filer_easy_thumbnails import FilerActionThumbnailer from filer.thumbnail_processors import normalize_subject_location from django.conf import settings as django_settings From 8ae9da1cf93d45cadcfd3c3857542ce9cabdff64 Mon Sep 17 00:00:00 2001 From: Bogdan Hodorog Date: Tue, 28 May 2013 16:33:20 +0300 Subject: [PATCH 069/715] Bump version as instructed by bamboo --- filer/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filer/__init__.py b/filer/__init__.py index be98ff344..b538d3a9c 100644 --- a/filer/__init__.py +++ b/filer/__init__.py @@ -1,3 +1,3 @@ #-*- coding: utf-8 -*- # version string following pep-0396 and pep-0386 -__version__ = '0.9pbs.4' # pragma: nocover +__version__ = '0.9pbs.5' # pragma: nocover From 5e349b08472ab478ca1d2c23c3511dbbfe0341fe Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Thu, 30 May 2013 15:33:54 +0300 Subject: [PATCH 070/715] Proper transaction handling in case of failure or in case of renaming a folder to the same name. --- filer/models/filemodels.py | 9 ++++++--- filer/models/foldermodels.py | 9 ++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index 0cf2704fe..35c5b061e 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -219,9 +219,12 @@ def copy_and_save(): try: copy_and_save() except Exception: - transaction.rollback() - # delete the file from new_location if the db update failed - storage.delete(new_location) + try: + transaction.rollback() + finally: + # delete the file from new_location if the db update failed + if old_location != new_location: + storage.delete(new_location) raise else: transaction.commit() diff --git a/filer/models/foldermodels.py b/filer/models/foldermodels.py index 6d96a187f..e8c71354b 100644 --- a/filer/models/foldermodels.py +++ b/filer/models/foldermodels.py @@ -139,9 +139,12 @@ def delete_from_locations(locations, storages): for folder in self.get_descendants(include_self=True): all_files += folder.files for f in all_files: - storages.append(f.file.storage) - old_locations.append(f.file.name) - new_locations.append(f.update_location_on_storage()) + old_location = f.file.name + new_location = f.update_location_on_storage() + if old_location != new_location: + storages.append(f.file.storage) + old_locations.append(old_location) + new_locations.append(new_location) except: try: transaction.rollback() From cba1581f009fff7ed839873924f0536cd33a6556 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Thu, 30 May 2013 16:21:21 +0300 Subject: [PATCH 071/715] Fix issue of not being able to change the owner of a folder without changing it's name as well. --- filer/admin/folderadmin.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 2b6f52759..cfb72499f 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -78,8 +78,13 @@ def get_form(self, request, obj=None, **kwargs): def folder_form_clean(form_obj): cleaned_data = form_obj.cleaned_data - if Folder.objects.filter(parent=form_obj.instance.parent, - name=cleaned_data['name']): + folders_with_same_name = Folder.objects.filter( + parent=form_obj.instance.parent, + name=cleaned_data['name']) + if form_obj.instance.pk: + folders_with_same_name = folders_with_same_name.exclude( + pk=form_obj.instance.pk) + if folders_with_same_name: raise ValidationError('Folder with this name already exists.') return cleaned_data From 84b602c536448900139ae663a9b6e174c6d28905 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Thu, 30 May 2013 16:35:01 +0300 Subject: [PATCH 072/715] Small performance improvement when checking for duplicate folders. --- filer/admin/folderadmin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index cfb72499f..7ad4668dc 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -84,7 +84,7 @@ def folder_form_clean(form_obj): if form_obj.instance.pk: folders_with_same_name = folders_with_same_name.exclude( pk=form_obj.instance.pk) - if folders_with_same_name: + if folders_with_same_name.exists(): raise ValidationError('Folder with this name already exists.') return cleaned_data From 1109ca1b755322baac978dae4204bbcbc0a5af66 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Fri, 31 May 2013 17:21:14 +0300 Subject: [PATCH 073/715] LUN-751 Fix corner cases of unquoted urls * implement a filepath_to_url function that also quotes simpe quotes (inspired from filepath_to_uri) * apply quoting before cleaning and normalizing the name. Otherwise files ending with question marks don't work --- filer/storage.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/filer/storage.py b/filer/storage.py index 230fd9146..915f32f81 100755 --- a/filer/storage.py +++ b/filer/storage.py @@ -1,6 +1,8 @@ #-*- coding: utf-8 -*- +import urllib + from django.core.files.storage import FileSystemStorage -from django.utils.encoding import filepath_to_uri +from django.utils.encoding import smart_str class PublicFileSystemStorage(FileSystemStorage): @@ -22,13 +24,19 @@ class PrivateFileSystemStorage(FileSystemStorage): is_secure = True +def filepath_to_url(path): + if path is None: + return path + return urllib.quote(smart_str(path).replace("\\", "/"), safe="/~!*()") + + try: from storages.backends.s3boto import S3BotoStorage class PatchedS3BotoStorage(S3BotoStorage): def url(self, name): - name = filepath_to_uri(self._normalize_name(self._clean_name(name))) + name = self._normalize_name(self._clean_name(filepath_to_url(name))) if self.custom_domain: return "%s://%s/%s" % ('https' if self.secure_urls else 'http', self.custom_domain, name) From 3a29ebf2269163e5fcbc5ba13327b9a80ff9d0f8 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Fri, 31 May 2013 17:24:35 +0300 Subject: [PATCH 074/715] LUN-752 Preserve acls when performing file copy. --- filer/storage.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/filer/storage.py b/filer/storage.py index 915f32f81..16971cad7 100755 --- a/filer/storage.py +++ b/filer/storage.py @@ -47,7 +47,8 @@ def url(self, name): def copy(self, src_name, dst_name): src_path = self._normalize_name(self._clean_name(src_name)) dst_path = self._normalize_name(self._clean_name(dst_name)) - self.bucket.copy_key(dst_path, self.bucket.name, src_path) + self.bucket.copy_key( + dst_path, self.bucket.name, src_path, preserve_acl=True) except ImportError: From 7d7f16f2d651447aed8dd383c9d5c364eb0efa82 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Mon, 3 Jun 2013 02:17:29 +0300 Subject: [PATCH 075/715] Apply filepath_to_url after normalise and clean and only if using a custom domain. This makes url consistent with the filename generated by s3boto._save --- filer/storage.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/filer/storage.py b/filer/storage.py index 16971cad7..1dea71dcc 100755 --- a/filer/storage.py +++ b/filer/storage.py @@ -36,11 +36,12 @@ def filepath_to_url(path): class PatchedS3BotoStorage(S3BotoStorage): def url(self, name): - name = self._normalize_name(self._clean_name(filepath_to_url(name))) if self.custom_domain: + name = filepath_to_url(self._normalize_name(self._clean_name(name))) return "%s://%s/%s" % ('https' if self.secure_urls else 'http', self.custom_domain, name) - return self.connection.generate_url(self.querystring_expire, + return self.connection.generate_url( + self.querystring_expire, method='GET', bucket=self.bucket.name, key=self._encode_name(name), query_auth=self.querystring_auth, force_http=not self.secure_urls) From b6eda110af0a02d0b131cafb8a60782dd15f241b Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Wed, 5 Jun 2013 11:04:42 +0300 Subject: [PATCH 076/715] LUN-753 Quote folder paths when using them in folder listing popups --- filer/models/foldermodels.py | 5 +++++ filer/templates/admin/filer/folder/directory_listing.html | 2 +- filer/templates/admin/filer/folder/directory_table.html | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/filer/models/foldermodels.py b/filer/models/foldermodels.py index 1b6a6ef82..85e989f1e 100644 --- a/filer/models/foldermodels.py +++ b/filer/models/foldermodels.py @@ -1,5 +1,6 @@ #-*- coding: utf-8 -*- import itertools +import urllib from django.contrib.auth import models as auth_models from django.core import urlresolvers @@ -211,6 +212,10 @@ def logical_path(self): def pretty_logical_path(self): return u"/%s" % u"/".join([f.name for f in self.logical_path+[self]]) + @property + def quoted_logical_path(self): + return u"/%s" % u"/".join([urllib.quote(f.name) for f in self.logical_path+[self]]) + def has_edit_permission(self, request): return self.has_generic_permission(request, 'edit') diff --git a/filer/templates/admin/filer/folder/directory_listing.html b/filer/templates/admin/filer/folder/directory_listing.html index 0de1a3e74..2187f77cf 100644 --- a/filer/templates/admin/filer/folder/directory_listing.html +++ b/filer/templates/admin/filer/folder/directory_listing.html @@ -76,7 +76,7 @@

{% if folder.parent %}({% blocktrans count folder.children_count as counter %}1 folder{% plural %}{{ counter }} folders{% endblocktrans %}, {% blocktrans count folder.file_count as counter %}1 file{% plural %}{{ counter }} files{% endblocktrans %}) {% if is_popup %} - {% if select_folder and folder.file_type == 'Folder' %} {% endif %} + {% if select_folder and folder.file_type == 'Folder' %} {% endif %} {% else %}{% trans "Change" %}{% endif %}

diff --git a/filer/templates/admin/filer/folder/directory_table.html b/filer/templates/admin/filer/folder/directory_table.html index 461368e92..a501e6839 100644 --- a/filer/templates/admin/filer/folder/directory_table.html +++ b/filer/templates/admin/filer/folder/directory_table.html @@ -18,7 +18,7 @@ {% for item in paginated_items.object_list %} {% if item.file_type == 'Folder' or item.file_type == 'DummyFolder' %}{% with item as subfolder%} - {% if select_folder and item.file_type == 'Folder' %} {% else %}{% if action_form and item.pk and not is_popup %}{% endif %}{% endif %} + {% if select_folder and item.file_type == 'Folder' %} {% else %}{% if action_form and item.pk and not is_popup %}{% endif %}{% endif %} {% trans From 1a8fcc3846ca3f827e36f4c99e063a2fe0b82f61 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Wed, 5 Jun 2013 18:43:27 +0300 Subject: [PATCH 077/715] Replace urllib.quote with django.utils.http.urlencode as the later also works for unicode chars --- filer/admin/folderadmin.py | 4 ++-- filer/models/foldermodels.py | 4 ++-- filer/tests/models.py | 11 +++++++++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 8ce6e1718..4c861753d 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -5,7 +5,7 @@ from django.contrib.admin import helpers from django.contrib.admin.util import quote, unquote, capfirst from django.contrib import messages -from django.template.defaultfilters import urlencode +from django.utils.http import urlquote from filer.admin.patched.admin_utils import get_deleted_objects from django.core.exceptions import PermissionDenied from django.core.paginator import Paginator, InvalidPage, EmptyPage @@ -400,7 +400,7 @@ def filter_file_permission(qs, permissions): 'current_url': request.path, 'title': u'Directory listing for %s' % folder.name, 'search_string': ' '.join(search_terms), - 'q': urlencode(q), + 'q': urlquote(q), 'show_result_count': show_result_count, 'limit_search_to_folder': limit_search_to_folder, 'is_popup': popup_status(request), diff --git a/filer/models/foldermodels.py b/filer/models/foldermodels.py index 85e989f1e..23f55eece 100644 --- a/filer/models/foldermodels.py +++ b/filer/models/foldermodels.py @@ -1,6 +1,5 @@ #-*- coding: utf-8 -*- import itertools -import urllib from django.contrib.auth import models as auth_models from django.core import urlresolvers @@ -8,6 +7,7 @@ from django.db import models from django.db import transaction from django.db.models import Q +from django.utils.http import urlquote from django.utils.translation import ugettext_lazy as _ import filer.models.clipboardmodels @@ -214,7 +214,7 @@ def pretty_logical_path(self): @property def quoted_logical_path(self): - return u"/%s" % u"/".join([urllib.quote(f.name) for f in self.logical_path+[self]]) + return urlquote(self.pretty_logical_path) def has_edit_permission(self, request): return self.has_generic_permission(request, 'edit') diff --git a/filer/tests/models.py b/filer/tests/models.py index e627b4719..c504fe923 100644 --- a/filer/tests/models.py +++ b/filer/tests/models.py @@ -280,3 +280,14 @@ def create_zipfile(self): original_filename=self.zipname, file=file_obj, ) + + def test_folder_quoted_logical_path(self): + root_folder = Folder.objects.create(name=u"Foo's Bar", parent=None) + child = Folder.objects.create(name=u'Bar"s Foo', parent=root_folder) + self.assertEqual(child.quoted_logical_path, u'/Foo%27s%20Bar/Bar%22s%20Foo') + + def test_folder_quoted_logical_path_with_unicode(self): + root_folder = Folder.objects.create(name=u"Foo's Bar", parent=None) + child = Folder.objects.create(name=u'Bar"s 日本 Foo', parent=root_folder) + self.assertEqual(child.quoted_logical_path, + u'/Foo%27s%20Bar/Bar%22s%20%E6%97%A5%E6%9C%AC%20Foo') From b8004f13328a2cd5d73add8faf81cec1961f2067 Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Thu, 6 Jun 2013 18:09:39 +0300 Subject: [PATCH 078/715] archive: files overwrite capability when extracting a zip file * new flag to bypass owner filtering for files --- filer/models/archivemodels.py | 63 +++++++++++++++++++++++------------ 1 file changed, 41 insertions(+), 22 deletions(-) diff --git a/filer/models/archivemodels.py b/filer/models/archivemodels.py index cff58adbf..a1d1506fe 100644 --- a/filer/models/archivemodels.py +++ b/filer/models/archivemodels.py @@ -4,11 +4,11 @@ from filer.models.filemodels import File, Folder from django.utils.translation import ugettext_lazy as _ from django.core.files.base import ContentFile +from django.db.models import Q from filer.settings import FILER_IS_PUBLIC_DEFAULT, FILER_FILE_MODELS from filer.utils.loader import load_object from filer.utils.files import matching_file_subtypes - import os.path import zipfile @@ -29,11 +29,11 @@ def matches_file_type(cls, iname, ifile, request): extension = os.path.splitext(iname)[-1].lower() return extension in Archive._filename_extensions - def extract(self): + def extract(self, bypass_owner=False): """Extracts the archive files' contents.""" self.file.open() try: - self._extract_zip(self.file) + self._extract_zip(self.file, bypass_owner) finally: self.file.close() @@ -86,7 +86,7 @@ def _collisions_zip(self, filer_file): intersection = [x for x in zip_paths if x in file_set] return intersection - def _extract_zip(self, filer_file): + def _extract_zip(self, filer_file, bypass_owner=False): """ Creates the file and folder hierarchy from the contents of the zip file. It first creates the parent folder of the selected file if it @@ -97,44 +97,63 @@ def _extract_zip(self, filer_file): for entry in entries: full_path = entry.filename.decode('utf8') filename = os.path.basename(full_path) - parent_dir = self._create_parent_folders(full_path) + parent_dir = self._create_parent_folders(full_path, bypass_owner) if filename: data = zippy.read(entry) - self._create_file(filename, parent_dir, data) + self._create_file(filename, parent_dir, data, bypass_owner) - def _create_parent_folders(self, full_path): + def _create_parent_folders(self, full_path, bypass_owner=False): """Creates the folder parents for a given entry.""" dir_parents_of_entry = full_path.split(os.sep)[:-1] parent_dir = self.folder for directory_name in dir_parents_of_entry: - parent_dir = self._create_folder(directory_name, parent_dir) + parent_dir = self._create_folder( + directory_name, parent_dir, bypass_owner) return parent_dir - def _create_folder(self, name, parent): + def _create_folder(self, name, parent, bypass_owner=False): """ Helper wrapper of creating a file in a filer folder. If there already is a folder with the given name, it returnes that. """ - current_dir, created = Folder.objects.get_or_create( - name=name, - parent=parent, - owner=self.owner, - ) + attrs = dict(name=name, parent=parent) + if bypass_owner is False: + attrs['owner'] = self.owner + current_dir, created = Folder.objects.get_or_create(**attrs) return current_dir - def _create_file(self, basename, folder, data): + def _create_file(self, basename, folder, data, bypass_owner=False): """Helper wrapper of creating a filer file.""" file_data = ContentFile(data) file_data.name = basename matched_file_types = matching_file_subtypes(basename, None, None) FileSubClass = matched_file_types[0] - file_object, created = FileSubClass.objects.get_or_create( - original_filename=file_data.name, - folder=folder, - owner=self.owner, - file=file_data, - is_public=FILER_IS_PUBLIC_DEFAULT, - ) + file_manager = FileSubClass.objects + + name_query = (Q(original_filename=basename) & ( + Q(name__isnull=True) | Q(name__exact=''))) | Q(name=basename) + + search_query = Q(folder=folder) & name_query + + if bypass_owner is False: + search_query &= Q(owner=self.owner) + + existing = file_manager.filter(search_query) + file_object = None + if existing: + file_object = existing[0] + file_object.name = None + file_object.original_filename = basename + file_object.file = file_data + file_object.save() + else: + file_object = file_manager.create( + original_filename=basename, + folder=folder, + owner=self.owner, + file=file_data, + is_public=FILER_IS_PUBLIC_DEFAULT, + ) return file_object class Meta: From a5f3b1c6a9987ea3b361638b18c919779c5273c5 Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Thu, 6 Jun 2013 19:01:07 +0300 Subject: [PATCH 079/715] added owner for new folders --- filer/models/archivemodels.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/filer/models/archivemodels.py b/filer/models/archivemodels.py index a1d1506fe..78f132290 100644 --- a/filer/models/archivemodels.py +++ b/filer/models/archivemodels.py @@ -119,8 +119,13 @@ def _create_folder(self, name, parent, bypass_owner=False): attrs = dict(name=name, parent=parent) if bypass_owner is False: attrs['owner'] = self.owner - current_dir, created = Folder.objects.get_or_create(**attrs) - return current_dir + + existing = Folder.objects.filter(**attrs) + if existing: + return existing[0] + # make sure owner is set + attrs['owner'] = self.owner + return Folder.objects.create(**attrs) def _create_file(self, basename, folder, data, bypass_owner=False): """Helper wrapper of creating a filer file.""" From dc0da280162af13070e4a2107fbc496ae6f30a89 Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Fri, 7 Jun 2013 11:53:21 +0300 Subject: [PATCH 080/715] fixed based on code review --- filer/models/archivemodels.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/filer/models/archivemodels.py b/filer/models/archivemodels.py index 78f132290..605880840 100644 --- a/filer/models/archivemodels.py +++ b/filer/models/archivemodels.py @@ -5,8 +5,7 @@ from django.utils.translation import ugettext_lazy as _ from django.core.files.base import ContentFile from django.db.models import Q -from filer.settings import FILER_IS_PUBLIC_DEFAULT, FILER_FILE_MODELS -from filer.utils.loader import load_object +from filer.settings import FILER_IS_PUBLIC_DEFAULT from filer.utils.files import matching_file_subtypes import os.path @@ -31,9 +30,10 @@ def matches_file_type(cls, iname, ifile, request): def extract(self, bypass_owner=False): """Extracts the archive files' contents.""" + self.bypass_owner = bypass_owner self.file.open() try: - self._extract_zip(self.file, bypass_owner) + self._extract_zip(self.file) finally: self.file.close() @@ -86,7 +86,7 @@ def _collisions_zip(self, filer_file): intersection = [x for x in zip_paths if x in file_set] return intersection - def _extract_zip(self, filer_file, bypass_owner=False): + def _extract_zip(self, filer_file): """ Creates the file and folder hierarchy from the contents of the zip file. It first creates the parent folder of the selected file if it @@ -97,27 +97,27 @@ def _extract_zip(self, filer_file, bypass_owner=False): for entry in entries: full_path = entry.filename.decode('utf8') filename = os.path.basename(full_path) - parent_dir = self._create_parent_folders(full_path, bypass_owner) + parent_dir = self._create_parent_folders(full_path) if filename: data = zippy.read(entry) - self._create_file(filename, parent_dir, data, bypass_owner) + self._create_file(filename, parent_dir, data) - def _create_parent_folders(self, full_path, bypass_owner=False): + def _create_parent_folders(self, full_path): """Creates the folder parents for a given entry.""" dir_parents_of_entry = full_path.split(os.sep)[:-1] parent_dir = self.folder for directory_name in dir_parents_of_entry: parent_dir = self._create_folder( - directory_name, parent_dir, bypass_owner) + directory_name, parent_dir) return parent_dir - def _create_folder(self, name, parent, bypass_owner=False): + def _create_folder(self, name, parent): """ Helper wrapper of creating a file in a filer folder. If there already is a folder with the given name, it returnes that. """ attrs = dict(name=name, parent=parent) - if bypass_owner is False: + if getattr(self, 'bypass_owner', False) is False: attrs['owner'] = self.owner existing = Folder.objects.filter(**attrs) @@ -127,7 +127,7 @@ def _create_folder(self, name, parent, bypass_owner=False): attrs['owner'] = self.owner return Folder.objects.create(**attrs) - def _create_file(self, basename, folder, data, bypass_owner=False): + def _create_file(self, basename, folder, data): """Helper wrapper of creating a filer file.""" file_data = ContentFile(data) file_data.name = basename @@ -140,7 +140,7 @@ def _create_file(self, basename, folder, data, bypass_owner=False): search_query = Q(folder=folder) & name_query - if bypass_owner is False: + if getattr(self, 'bypass_owner', False) is False: search_query &= Q(owner=self.owner) existing = file_manager.filter(search_query) From 3ecbc5dc1328af73fdf849915062f5db096db5f3 Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Fri, 7 Jun 2013 11:57:01 +0300 Subject: [PATCH 081/715] changed variable name for actual name query --- filer/models/archivemodels.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/filer/models/archivemodels.py b/filer/models/archivemodels.py index 605880840..b7cf69405 100644 --- a/filer/models/archivemodels.py +++ b/filer/models/archivemodels.py @@ -135,10 +135,10 @@ def _create_file(self, basename, folder, data): FileSubClass = matched_file_types[0] file_manager = FileSubClass.objects - name_query = (Q(original_filename=basename) & ( + actual_name_query = (Q(original_filename=basename) & ( Q(name__isnull=True) | Q(name__exact=''))) | Q(name=basename) - search_query = Q(folder=folder) & name_query + search_query = Q(folder=folder) & actual_name_query if getattr(self, 'bypass_owner', False) is False: search_query &= Q(owner=self.owner) From d4048695f3d67c226b273361a7cf86ebd6d9ea81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20Szeredi?= Date: Fri, 7 Jun 2013 16:10:51 +0300 Subject: [PATCH 082/715] Bump version because of Bamboo. --- filer/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filer/__init__.py b/filer/__init__.py index b538d3a9c..84f29a66e 100644 --- a/filer/__init__.py +++ b/filer/__init__.py @@ -1,3 +1,3 @@ #-*- coding: utf-8 -*- # version string following pep-0396 and pep-0386 -__version__ = '0.9pbs.5' # pragma: nocover +__version__ = '0.9pbs.6' # pragma: nocover From 30e141655136a733d3a200e88205e98979fbde14 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Tue, 11 Jun 2013 13:42:40 +0300 Subject: [PATCH 083/715] LUN-779 Add ico files in the list of recongnized image extensions --- filer/models/imagemodels.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filer/models/imagemodels.py b/filer/models/imagemodels.py index b19c284dc..7855d8bf5 100644 --- a/filer/models/imagemodels.py +++ b/filer/models/imagemodels.py @@ -58,7 +58,7 @@ def matches_file_type(cls, iname, ifile, request): # doing for me was obscuring errors... # --Dave Butler iext = os.path.splitext(iname)[1].lower() - return iext in ['.jpg', '.jpeg', '.png', '.gif'] + return iext in ['.jpg', '.jpeg', '.png', '.gif', '.ico'] def save(self, *args, **kwargs): if self.date_taken is None: From eb91388f57a35aafa8d05eb1c63ac34810e8f815 Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Fri, 21 Jun 2013 15:16:17 +0300 Subject: [PATCH 084/715] LUN-786: Add index for filer_file file field. --- filer/migrations/0014_add_index_File_file.py | 131 +++++++++++++++++++ filer/models/filemodels.py | 2 +- 2 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 filer/migrations/0014_add_index_File_file.py diff --git a/filer/migrations/0014_add_index_File_file.py b/filer/migrations/0014_add_index_File_file.py new file mode 100644 index 000000000..8ccdfd5ff --- /dev/null +++ b/filer/migrations/0014_add_index_File_file.py @@ -0,0 +1,131 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding index on 'File', fields ['file'] + db.create_index('filer_file', ['file']) + + + def backwards(self, orm): + # Removing index on 'File', fields ['file'] + db.delete_index('filer_file', ['file']) + + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'filer.archive': { + 'Meta': {'object_name': 'Archive', '_ormbases': ['filer.File']}, + 'file_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['filer.File']", 'unique': 'True', 'primary_key': 'True'}) + }, + 'filer.clipboard': { + 'Meta': {'object_name': 'Clipboard'}, + 'files': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'in_clipboards'", 'symmetrical': 'False', 'through': "orm['filer.ClipboardItem']", 'to': "orm['filer.File']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'filer_clipboards'", 'to': "orm['auth.User']"}) + }, + 'filer.clipboarditem': { + 'Meta': {'object_name': 'ClipboardItem'}, + 'clipboard': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.Clipboard']"}), + 'file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.File']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + 'filer.file': { + 'Meta': {'object_name': 'File'}, + '_file_size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'folder': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'all_files'", 'null': 'True', 'to': "orm['filer.Folder']"}), + 'has_all_mandatory_data': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'original_filename': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'owned_files'", 'null': 'True', 'to': "orm['auth.User']"}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'polymorphic_filer.file_set'", 'null': 'True', 'to': "orm['contenttypes.ContentType']"}), + 'sha1': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40', 'blank': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.folder': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('parent', 'name'),)", 'object_name': 'Folder'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'filer_owned_folders'", 'null': 'True', 'to': "orm['auth.User']"}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['filer.Folder']"}), + 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.folderpermission': { + 'Meta': {'object_name': 'FolderPermission'}, + 'can_add_children': ('django.db.models.fields.SmallIntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), + 'can_edit': ('django.db.models.fields.SmallIntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), + 'can_read': ('django.db.models.fields.SmallIntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), + 'everybody': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'folder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.Folder']", 'null': 'True', 'blank': 'True'}), + 'group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'filer_folder_permissions'", 'null': 'True', 'to': "orm['auth.Group']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'filer_folder_permissions'", 'null': 'True', 'to': "orm['auth.User']"}) + }, + 'filer.image': { + 'Meta': {'object_name': 'Image', '_ormbases': ['filer.File']}, + '_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'default_alt_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'default_caption': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'file_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['filer.File']", 'unique': 'True', 'primary_key': 'True'}), + 'must_always_publish_author_credit': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'must_always_publish_copyright': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'subject_location': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '64', 'null': 'True', 'blank': 'True'}) + } + } + + complete_apps = ['filer'] \ No newline at end of file diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index 6637059e4..9b76ded5f 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -35,7 +35,7 @@ class File(PolymorphicModel, mixins.IconsMixin): _icon = "file" folder = models.ForeignKey(Folder, verbose_name=_('folder'), related_name='all_files', null=True, blank=True) - file = MultiStorageFileField(_('file'), null=True, blank=True, max_length=255) + file = MultiStorageFileField(_('file'), null=True, blank=True, db_index=True, max_length=255) _file_size = models.IntegerField(_('file size'), null=True, blank=True) sha1 = models.CharField(_('sha1'), max_length=40, blank=True, default='') From 8fb5fa15ae8833374494c5d9be9fd9ee53d61bda Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Fri, 21 Jun 2013 18:04:01 +0300 Subject: [PATCH 085/715] LUN-791 -- Thumbnails can also be served from the CDN if they're older than the CDN invalidation time --- filer/fields/multistorage_file.py | 19 +++++++++++++++++++ filer/models/imagemodels.py | 7 +------ filer/utils/cdn.py | 1 - 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/filer/fields/multistorage_file.py b/filer/fields/multistorage_file.py index 633ceedd6..3afd54830 100644 --- a/filer/fields/multistorage_file.py +++ b/filer/fields/multistorage_file.py @@ -33,6 +33,21 @@ def generate_filename_multistorage(instance, filename): return upload_to +class CdnAwareThumbnailFile(easy_thumbnails_files.ThumbnailFile): + + def __init__(self, thumbnail_file, filer_file): + self._thumbnail_file = thumbnail_file + self._filer_file = filer_file + + def __getattr__(self, attr_name): + return getattr(self._thumbnail_file, attr_name) + + def _get_url(self): + url = super(CdnAwareThumbnailFile, self).url + return get_file_url_from_cdn(self._filer_file, url) + url = property(_get_url) + + class MultiStorageFieldFile(ThumbnailerNameMixin, easy_thumbnails_files.ThumbnailerFieldFile): def __init__(self, instance, field, name): @@ -92,6 +107,10 @@ def save(self, name, content, save=True): content.seek(0) # Ensure we upload the whole file super(MultiStorageFieldFile, self).save(name, content, save) + def get_thumbnail(self, opts, save=True, generate=None): + thumbnail = super(MultiStorageFieldFile, self).get_thumbnail(opts, save, generate) + return CdnAwareThumbnailFile(thumbnail, self.instance) + class MultiStorageFileField(easy_thumbnails_fields.ThumbnailerField): attr_class = MultiStorageFieldFile diff --git a/filer/models/imagemodels.py b/filer/models/imagemodels.py index 7855d8bf5..67b027758 100644 --- a/filer/models/imagemodels.py +++ b/filer/models/imagemodels.py @@ -181,12 +181,7 @@ def thumbnails(self): @property def easy_thumbnails_thumbnailer(self): - tn = FilerThumbnailer( - file=self.file.file, name=self.file.name, - source_storage=self.file.source_storage, - thumbnail_storage=self.file.thumbnail_storage, - thumbnail_basedir=self.file.thumbnail_basedir) - return tn + return self.file class Meta: app_label = 'filer' diff --git a/filer/utils/cdn.py b/filer/utils/cdn.py index 618336fbb..e257a9d3f 100644 --- a/filer/utils/cdn.py +++ b/filer/utils/cdn.py @@ -21,4 +21,3 @@ def get_file_url_from_cdn(file_obj, url): (scheme, cdn_domain, path, params, query, fragment)) else: return url - From cc7f3d3b311643218caa345ce66025760cc81a62 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Tue, 25 Jun 2013 14:15:59 +0300 Subject: [PATCH 086/715] LUN-791 -- Serve thumbnails from the cdn (various improvements) * a more elegant implementation for the CdnAwareThumbnailFile decorator * filer.utils.cdn.get_file_url_from_cdn can now cope with file objects that don't have timezone aware datetime fields * add an unit test --- filer/fields/multistorage_file.py | 10 +++++----- filer/tests/models.py | 17 ++++++++++++++++- filer/utils/cdn.py | 2 ++ 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/filer/fields/multistorage_file.py b/filer/fields/multistorage_file.py index 3afd54830..848fe88f2 100644 --- a/filer/fields/multistorage_file.py +++ b/filer/fields/multistorage_file.py @@ -33,7 +33,7 @@ def generate_filename_multistorage(instance, filename): return upload_to -class CdnAwareThumbnailFile(easy_thumbnails_files.ThumbnailFile): +class CdnAwareThumbnailFile(object): def __init__(self, thumbnail_file, filer_file): self._thumbnail_file = thumbnail_file @@ -42,10 +42,10 @@ def __init__(self, thumbnail_file, filer_file): def __getattr__(self, attr_name): return getattr(self._thumbnail_file, attr_name) - def _get_url(self): - url = super(CdnAwareThumbnailFile, self).url - return get_file_url_from_cdn(self._filer_file, url) - url = property(_get_url) + @property + def url(self): + return get_file_url_from_cdn(self._filer_file, self._thumbnail_file.url) + class MultiStorageFieldFile(ThumbnailerNameMixin, diff --git a/filer/tests/models.py b/filer/tests/models.py index c504fe923..d84639f3c 100644 --- a/filer/tests/models.py +++ b/filer/tests/models.py @@ -1,7 +1,9 @@ #-*- coding: utf-8 -*- import os -import zipfile import tempfile +import urlparse +import zipfile + from django.forms.models import modelform_factory from django.db.models import Q from django.test import TestCase @@ -198,6 +200,19 @@ def test_deleting_file_does_not_delete_file_from_filesystem_if_other_references_ # file should still be here self.assertTrue(storage.exists(name)) + def test_cdn_urls(self): + cdn_domain = 'cdn.foobar.com' + with SettingsOverride(filer_settings, + CDN_DOMAIN=cdn_domain, + USE_TZ=True, + CDN_INVALIDATION_TIME=0): + image = self.create_filer_image() + _, netloc, _, _, _, _ = urlparse.urlparse(image.url) + self.assertEqual(netloc, cdn_domain) + for url in image.thumbnails.values(): + _, netloc, _, _, _, _ = urlparse.urlparse(url) + self.assertEqual(netloc, cdn_domain) + class ArchiveTest(TestCase): diff --git a/filer/utils/cdn.py b/filer/utils/cdn.py index e257a9d3f..b86163d7b 100644 --- a/filer/utils/cdn.py +++ b/filer/utils/cdn.py @@ -14,6 +14,8 @@ def get_file_url_from_cdn(file_obj, url): invalidated_at = file_obj.modified_at + datetime.timedelta( seconds=filer_settings.CDN_INVALIDATION_TIME) + if timezone.is_naive(invalidated_at): + invalidated_at = timezone.make_aware(invalidated_at, timezone.get_default_timezone()) now = timezone.make_aware(datetime.datetime.now(), timezone.get_default_timezone()) if invalidated_at < now: scheme, netloc, path, params, query, fragment = urlparse.urlparse(url) From 80d90ddc99c3ee83ba25ae2bce9159f16d1be9f5 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Tue, 25 Jun 2013 14:20:27 +0300 Subject: [PATCH 087/715] LUN-791 -- Rename get_file_url_from_cdn to the more suggestive name get_cdn_url --- filer/fields/multistorage_file.py | 6 +++--- filer/utils/cdn.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/filer/fields/multistorage_file.py b/filer/fields/multistorage_file.py index 848fe88f2..cab8e445b 100644 --- a/filer/fields/multistorage_file.py +++ b/filer/fields/multistorage_file.py @@ -4,7 +4,7 @@ from filer import settings as filer_settings from filer.utils.filer_easy_thumbnails import ThumbnailerNameMixin -from filer.utils.cdn import get_file_url_from_cdn +from filer.utils.cdn import get_cdn_url STORAGES = { @@ -44,7 +44,7 @@ def __getattr__(self, attr_name): @property def url(self): - return get_file_url_from_cdn(self._filer_file, self._thumbnail_file.url) + return get_cdn_url(self._filer_file, self._thumbnail_file.url) @@ -100,7 +100,7 @@ def _thumbnail_base_dir(self): def _get_url(self): url = super(MultiStorageFieldFile, self)._get_url() - return get_file_url_from_cdn(self.instance, url) + return get_cdn_url(self.instance, url) url = property(_get_url) def save(self, name, content, save=True): diff --git a/filer/utils/cdn.py b/filer/utils/cdn.py index b86163d7b..b966fadfd 100644 --- a/filer/utils/cdn.py +++ b/filer/utils/cdn.py @@ -6,7 +6,7 @@ from filer import settings as filer_settings -def get_file_url_from_cdn(file_obj, url): +def get_cdn_url(file_obj, url): """If the CDN version of the file is up to date, return it from there""" cdn_domain = getattr(filer_settings, 'CDN_DOMAIN', None) if cdn_domain is None: From c0549d58fa6ae5582fbc7de0aea4b09175b1d347 Mon Sep 17 00:00:00 2001 From: Alex Cucu Date: Tue, 25 Jun 2013 14:29:10 +0300 Subject: [PATCH 088/715] Removed extra blank line (PEP-8) --- filer/fields/multistorage_file.py | 1 - 1 file changed, 1 deletion(-) diff --git a/filer/fields/multistorage_file.py b/filer/fields/multistorage_file.py index cab8e445b..f463aa795 100644 --- a/filer/fields/multistorage_file.py +++ b/filer/fields/multistorage_file.py @@ -47,7 +47,6 @@ def url(self): return get_cdn_url(self._filer_file, self._thumbnail_file.url) - class MultiStorageFieldFile(ThumbnailerNameMixin, easy_thumbnails_files.ThumbnailerFieldFile): def __init__(self, instance, field, name): From c6ce9d8c18e486e740272cccefdff460a64ffc34 Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Wed, 26 Jun 2013 12:32:41 +0300 Subject: [PATCH 089/715] Bumped version for bamboo. --- filer/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filer/__init__.py b/filer/__init__.py index 84f29a66e..45b46af01 100644 --- a/filer/__init__.py +++ b/filer/__init__.py @@ -1,3 +1,3 @@ #-*- coding: utf-8 -*- # version string following pep-0396 and pep-0386 -__version__ = '0.9pbs.6' # pragma: nocover +__version__ = '0.9pbs.7' # pragma: nocover From 9e188100901e82289ab2a0e2f7c0a280f0acdd0d Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Thu, 29 Aug 2013 18:46:31 +0300 Subject: [PATCH 090/715] LUN-967: Filter PermissionAdmin for folder onwer. --- filer/admin/permissionadmin.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/filer/admin/permissionadmin.py b/filer/admin/permissionadmin.py index ce4101a81..d2416163e 100644 --- a/filer/admin/permissionadmin.py +++ b/filer/admin/permissionadmin.py @@ -35,3 +35,11 @@ def get_model_perms(self, request): 'change': enable_permissions, 'delete': enable_permissions, } + + def queryset(self, request): + qs = super(PermissionAdmin, self).queryset(request) + if request.user.is_superuser: + return qs + # Only the owner of the directory is able to view/modify permissions + filtered_qs = qs.filter(folder__owner=request.user) + return filtered_qs From 04cff402746a1f11b492afbe472deb33f14f9e90 Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Fri, 30 Aug 2013 13:33:45 +0300 Subject: [PATCH 091/715] LUN-967: Add tests for folder permission admin acl. --- filer/admin/permissionadmin.py | 2 +- filer/tests/admin.py | 65 +++++++++++++++++++++++++++++++--- 2 files changed, 61 insertions(+), 6 deletions(-) diff --git a/filer/admin/permissionadmin.py b/filer/admin/permissionadmin.py index d2416163e..04e4ca3cb 100644 --- a/filer/admin/permissionadmin.py +++ b/filer/admin/permissionadmin.py @@ -40,6 +40,6 @@ def queryset(self, request): qs = super(PermissionAdmin, self).queryset(request) if request.user.is_superuser: return qs - # Only the owner of the directory is able to view/modify permissions + # Only the owner of the directory is able to view/modify permissions in the admin filtered_qs = qs.filter(folder__owner=request.user) return filtered_qs diff --git a/filer/tests/admin.py b/filer/tests/admin.py index 72ad576ab..195cf067a 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -1,13 +1,13 @@ #-*- coding: utf-8 -*- import os -from django.test import TestCase +from django.test import TestCase, RequestFactory from django.core.urlresolvers import reverse import django.core.files -from django.contrib.admin import helpers +from django.contrib.admin import helpers, site +from django.contrib.auth.models import User, Group from django.http import HttpRequest - from filer.models.filemodels import File -from filer.models.foldermodels import Folder +from filer.models.foldermodels import Folder, FolderPermission from filer.models.imagemodels import Image from filer.models.clipboardmodels import Clipboard from filer.models.virtualitems import FolderRoot @@ -20,6 +20,7 @@ class FilerFolderAdminUrlsTests(TestCase): def setUp(self): self.superuser = create_superuser() self.client.login(username='admin', password='secret') + def tearDown(self): self.client.logout() def test_filer_app_index_get(self): @@ -281,7 +282,7 @@ def test_validate_no_duplicate_folders_on_move(self): | |-bar | |--bar - + and try to move the owter bar in foo. This has to fail since it would result in two folders with the same name and parent. """ @@ -441,6 +442,34 @@ class PermissionAdminTest(TestCase): def setUp(self): self.superuser = create_superuser() self.client.login(username='admin', password='secret') + self.group1 = Group.objects.create(name='group1') + self.group2 = Group.objects.create(name='group2') + self.user1 = User.objects.create(username='alice', password='secret') + self.user2 = User.objects.create(username='bob', password='secret') + self.user3 = User.objects.create(username='chuck', password='secret') + self.group1.user_set.add(self.user1) + self.group1.user_set.add(self.user2) + self.group2.user_set.add(self.user3) + self.factory = RequestFactory() + self.folder1 = Folder.objects.create(name='group1_folder', owner=self.user1) + self.folder2 = Folder.objects.create(name='group2_folder', owner=self.user3) + self.folder_permission1 = FolderPermission.objects.create( + folder=self.folder1, + type=FolderPermission.CHILDREN, + user=self.user1, + can_edit=FolderPermission.ALLOW, + can_read=FolderPermission.ALLOW, + can_add_children=FolderPermission.ALLOW, + ) + self.folder_permission2 = FolderPermission.objects.create( + folder=self.folder2, + type=FolderPermission.CHILDREN, + user=self.user3, + can_edit=FolderPermission.ALLOW, + can_read=FolderPermission.ALLOW, + can_add_children=FolderPermission.ALLOW, + ) + def tearDown(self): self.client.logout() @@ -451,3 +480,29 @@ def test_render_add_view(self): """ response = self.client.get(reverse('admin:filer_folderpermission_add')) self.assertEqual(response.status_code, 200) + + def test_acl_users_see_only_their_folder_permissions(self): + """ + Test the access control for displaying the changelist of the folder permissions. + Users should only have access to their own permissions. + """ + folder_permissions_url = reverse('admin:filer_folderpermission_changelist') + folder_permission_admin = site._registry[FolderPermission] + request = self.factory.get(folder_permissions_url) + request.user = self.user1 + qs = folder_permission_admin.queryset(request) + self.assertIn(self.folder_permission1, qs) + self.assertNotIn(self.folder_permission2, qs) + + def test_acl_supoerusers_see_all_folder_permissions(self): + """ + Test the access control for displaying the changelist of the folder permissions. + SuperUsers should have access to their all folder permissions. + """ + folder_permissions_url = reverse('admin:filer_folderpermission_changelist') + folder_permission_admin = site._registry[FolderPermission] + request = self.factory.get(folder_permissions_url) + request.user = self.superuser + permissions_qs = folder_permission_admin.queryset(request) + self.assertIn(self.folder_permission1, permissions_qs) + self.assertIn(self.folder_permission2, permissions_qs) From eb25eceff4277f38ecdf92184a2050bd3741bdd6 Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Fri, 30 Aug 2013 15:46:02 +0300 Subject: [PATCH 092/715] LUN-967: Fix function signatures for failing tests. --- filer/utils/filer_easy_thumbnails.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/filer/utils/filer_easy_thumbnails.py b/filer/utils/filer_easy_thumbnails.py index 29a16630b..d1f688d98 100644 --- a/filer/utils/filer_easy_thumbnails.py +++ b/filer/utils/filer_easy_thumbnails.py @@ -23,7 +23,8 @@ class ThumbnailerNameMixin(object): thumbnail_subdir = '' thumbnail_prefix = '' - def get_thumbnail_name(self, thumbnail_options, transparent=False): + def get_thumbnail_name(self, thumbnail_options, transparent=False, + high_resolution=False): """ A version of ``Thumbnailer.get_thumbnail_name`` that produces a reproducible thumbnail name that can be converted back to the original @@ -63,7 +64,8 @@ class ActionThumbnailerMixin(object): thumbnail_subdir = '' thumbnail_prefix = '' - def get_thumbnail_name(self, thumbnail_options, transparent=False): + def get_thumbnail_name(self, thumbnail_options, transparent=False, + high_resolution=False): """ A version of ``Thumbnailer.get_thumbnail_name`` that returns the original filename to resize. From 9bdecc66e64e6b70e7d2a0bf60d1915bdf259053 Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Fri, 30 Aug 2013 16:12:48 +0300 Subject: [PATCH 093/715] Revert "LUN-967: Fix function signatures for failing tests." This reverts commit eb25eceff4277f38ecdf92184a2050bd3741bdd6. --- filer/utils/filer_easy_thumbnails.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/filer/utils/filer_easy_thumbnails.py b/filer/utils/filer_easy_thumbnails.py index d1f688d98..29a16630b 100644 --- a/filer/utils/filer_easy_thumbnails.py +++ b/filer/utils/filer_easy_thumbnails.py @@ -23,8 +23,7 @@ class ThumbnailerNameMixin(object): thumbnail_subdir = '' thumbnail_prefix = '' - def get_thumbnail_name(self, thumbnail_options, transparent=False, - high_resolution=False): + def get_thumbnail_name(self, thumbnail_options, transparent=False): """ A version of ``Thumbnailer.get_thumbnail_name`` that produces a reproducible thumbnail name that can be converted back to the original @@ -64,8 +63,7 @@ class ActionThumbnailerMixin(object): thumbnail_subdir = '' thumbnail_prefix = '' - def get_thumbnail_name(self, thumbnail_options, transparent=False, - high_resolution=False): + def get_thumbnail_name(self, thumbnail_options, transparent=False): """ A version of ``Thumbnailer.get_thumbnail_name`` that returns the original filename to resize. From d45b46ede56ce68c79f292802c1a141b7a61d91f Mon Sep 17 00:00:00 2001 From: Jacob Rief Date: Tue, 19 Feb 2013 12:50:55 +0100 Subject: [PATCH 094/715] Add Retina support to filer when using easy thumbnails --- filer/static/filer/js/retina.js | 3 +++ filer/templates/admin/filer/folder/directory_listing.html | 1 + filer/utils/filer_easy_thumbnails.py | 5 ++++- 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 filer/static/filer/js/retina.js diff --git a/filer/static/filer/js/retina.js b/filer/static/filer/js/retina.js new file mode 100644 index 000000000..a92614296 --- /dev/null +++ b/filer/static/filer/js/retina.js @@ -0,0 +1,3 @@ +// retina.js, a high-resolution image swapper (http://retinajs.com), v0.0.2 + +(function(){function t(e){this.path=e;var t=this.path.split("."),n=t.slice(0,t.length-1).join("."),r=t[t.length-1];this.at_2x_path=n+"@2x."+r}function n(e){this.el=e,this.path=new t(this.el.getAttribute("src"));var n=this;this.path.check_2x_variant(function(e){e&&n.swap()})}var e=typeof exports=="undefined"?window:exports;e.RetinaImagePath=t,t.confirmed_paths=[],t.prototype.is_external=function(){return!!this.path.match(/^https?\:/i)&&!this.path.match("//"+document.domain)},t.prototype.check_2x_variant=function(e){var n,r=this;if(this.is_external())return e(!1);if(this.at_2x_path in t.confirmed_paths)return e(!0);n=new XMLHttpRequest,n.open("HEAD",this.at_2x_path),n.onreadystatechange=function(){return n.readyState!=4?e(!1):n.status>=200&&n.status<=399?(t.confirmed_paths.push(r.at_2x_path),e(!0)):e(!1)},n.send()},e.RetinaImage=n,n.prototype.swap=function(e){function n(){t.el.complete?(t.el.setAttribute("width",t.el.offsetWidth),t.el.setAttribute("height",t.el.offsetHeight),t.el.setAttribute("src",e)):setTimeout(n,5)}typeof e=="undefined"&&(e=this.path.at_2x_path);var t=this;n()},e.devicePixelRatio>1&&(window.onload=function(){var e=document.getElementsByTagName("img"),t=[],r,i;for(r=0;r + {% if action_form %}{% if actions_on_top or actions_on_bottom %} diff --git a/filer/utils/filer_easy_thumbnails.py b/filer/utils/filer_easy_thumbnails.py index 29a16630b..56fdde5a2 100644 --- a/filer/utils/filer_easy_thumbnails.py +++ b/filer/utils/filer_easy_thumbnails.py @@ -23,7 +23,8 @@ class ThumbnailerNameMixin(object): thumbnail_subdir = '' thumbnail_prefix = '' - def get_thumbnail_name(self, thumbnail_options, transparent=False): + def get_thumbnail_name(self, thumbnail_options, transparent=False, + high_resolution=False): """ A version of ``Thumbnailer.get_thumbnail_name`` that produces a reproducible thumbnail name that can be converted back to the original @@ -53,6 +54,8 @@ def get_thumbnail_name(self, thumbnail_options, transparent=False): #make sure our magic delimiter is not used in all_opts all_opts = all_opts.replace('__', '_') + if high_resolution: + all_opts += '@2x' filename = u'%s__%s.%s' % (source_filename, all_opts, extension) return os.path.join(basedir, path, subdir, filename) From 46845aaf1725a34721fae3701dbde23640e80b14 Mon Sep 17 00:00:00 2001 From: Jacob Rief Date: Wed, 20 Feb 2013 14:12:45 +0100 Subject: [PATCH 095/715] Changed function signature get_thumbnail_name to be compatible with easy_thumbnails supporting hires images --- filer/utils/filer_easy_thumbnails.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/filer/utils/filer_easy_thumbnails.py b/filer/utils/filer_easy_thumbnails.py index 56fdde5a2..39c600ef1 100644 --- a/filer/utils/filer_easy_thumbnails.py +++ b/filer/utils/filer_easy_thumbnails.py @@ -66,7 +66,8 @@ class ActionThumbnailerMixin(object): thumbnail_subdir = '' thumbnail_prefix = '' - def get_thumbnail_name(self, thumbnail_options, transparent=False): + def get_thumbnail_name(self, thumbnail_options, transparent=False, + high_resolution=False): """ A version of ``Thumbnailer.get_thumbnail_name`` that returns the original filename to resize. From e2a6effa39437f31525fb2f36387486e4c097a77 Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Mon, 2 Sep 2013 17:16:01 +0300 Subject: [PATCH 096/715] LUN-967: Add admin view tests. --- filer/tests/admin.py | 189 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 155 insertions(+), 34 deletions(-) diff --git a/filer/tests/admin.py b/filer/tests/admin.py index 195cf067a..3eef75340 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -4,7 +4,7 @@ from django.core.urlresolvers import reverse import django.core.files from django.contrib.admin import helpers, site -from django.contrib.auth.models import User, Group +from django.contrib.auth.models import User, Group, Permission from django.http import HttpRequest from filer.models.filemodels import File from filer.models.foldermodels import Folder, FolderPermission @@ -438,71 +438,192 @@ def test_resize_images_action(self): self.assertEqual(self.image_obj.height, 42) +def create_staffuser(user): + user = User.objects.create_user( + username=user, + password='secret', + ) + user.is_staff = True + user.is_active = True + user.save() + return user + + +def create_folder_for_user(foldername, user): + folder = Folder.objects.create( + name=foldername, + owner=user, + ) + return folder + + +def create_folderpermission_for_user(folder, user): + folder_permission = FolderPermission.objects.create( + folder=folder, + type=FolderPermission.CHILDREN, + user=user, + can_edit=FolderPermission.ALLOW, + can_read=FolderPermission.ALLOW, + can_add_children=FolderPermission.ALLOW, + ) + return folder_permission + + +def grant_all_folderpermissions_for_group(group): + permission_set = Permission.objects.filter( + codename__endswith='folderpermission', + ) + for permission in permission_set: + group.permissions.add(permission) + + +def get_response_changelist_qs(response): + return response.context['cl'].query_set + +FOLDER_PERMISSIONS_URL = reverse( + 'admin:filer_folderpermission_changelist' +) + + class PermissionAdminTest(TestCase): def setUp(self): self.superuser = create_superuser() - self.client.login(username='admin', password='secret') self.group1 = Group.objects.create(name='group1') self.group2 = Group.objects.create(name='group2') - self.user1 = User.objects.create(username='alice', password='secret') - self.user2 = User.objects.create(username='bob', password='secret') - self.user3 = User.objects.create(username='chuck', password='secret') + self.user1 = create_staffuser('Alice') + self.user2 = create_staffuser('Bob') + self.user3 = create_staffuser('Chuck') self.group1.user_set.add(self.user1) self.group1.user_set.add(self.user2) self.group2.user_set.add(self.user3) + grant_all_folderpermissions_for_group(self.group1) + grant_all_folderpermissions_for_group(self.group2) + # self.group2.permission_set.add() self.factory = RequestFactory() - self.folder1 = Folder.objects.create(name='group1_folder', owner=self.user1) - self.folder2 = Folder.objects.create(name='group2_folder', owner=self.user3) - self.folder_permission1 = FolderPermission.objects.create( - folder=self.folder1, - type=FolderPermission.CHILDREN, - user=self.user1, - can_edit=FolderPermission.ALLOW, - can_read=FolderPermission.ALLOW, - can_add_children=FolderPermission.ALLOW, + self.folder1 = create_folder_for_user('folder1', self.user1) + self.folder3 = create_folder_for_user('folder3', self.user1) + self.folder2 = create_folder_for_user('folder2', self.user3) + self.folder_permission1 = create_folderpermission_for_user( + self.folder1, self.user1 + ) + self.folder_permission3 = create_folderpermission_for_user( + self.folder3, self.user1 ) - self.folder_permission2 = FolderPermission.objects.create( - folder=self.folder2, - type=FolderPermission.CHILDREN, - user=self.user3, - can_edit=FolderPermission.ALLOW, - can_read=FolderPermission.ALLOW, - can_add_children=FolderPermission.ALLOW, + self.folder_permission2 = create_folderpermission_for_user( + self.folder2, self.user3 ) - def tearDown(self): self.client.logout() def test_render_add_view(self): """ - Really stupid and simple test to see if the add Permission view can be rendered + Really stupid and simple test to see if the add Permission view can + be rendered. """ response = self.client.get(reverse('admin:filer_folderpermission_add')) self.assertEqual(response.status_code, 200) - def test_acl_users_see_only_their_folder_permissions(self): + def test_query_user1_see_only_their_folder_permissions(self): """ - Test the access control for displaying the changelist of the folder permissions. + Test the access control for displaying the changelist of the folder + permissions. Users should only have access to their own permissions. """ - folder_permissions_url = reverse('admin:filer_folderpermission_changelist') folder_permission_admin = site._registry[FolderPermission] - request = self.factory.get(folder_permissions_url) + request = self.factory.get(FOLDER_PERMISSIONS_URL) request.user = self.user1 qs = folder_permission_admin.queryset(request) self.assertIn(self.folder_permission1, qs) + self.assertIn(self.folder_permission3, qs) self.assertNotIn(self.folder_permission2, qs) - def test_acl_supoerusers_see_all_folder_permissions(self): + def test_query_user2_see_only_their_folder_permissions(self): + """ + Test the access control for displaying the changelist of the folder + permissions. + Users should only have access to their own permissions. + """ + folder_permission_admin = site._registry[FolderPermission] + request = self.factory.get(FOLDER_PERMISSIONS_URL) + request.user = self.user2 + qs = folder_permission_admin.queryset(request) + self.assertNotIn(self.folder_permission1, qs) + self.assertNotIn(self.folder_permission2, qs) + self.assertNotIn(self.folder_permission3, qs) + + def test_query_user3_see_only_their_folder_permissions(self): + """ + Test the access control for displaying the changelist of the folder + permissions. + Users should only have access to their own permissions. """ - Test the access control for displaying the changelist of the folder permissions. + folder_permission_admin = site._registry[FolderPermission] + request = self.factory.get(FOLDER_PERMISSIONS_URL) + request.user = self.user3 + qs = folder_permission_admin.queryset(request) + self.assertIn(self.folder_permission2, qs) + self.assertNotIn(self.folder_permission1, qs) + self.assertNotIn(self.folder_permission3, qs) + + def test_query_superusers_see_all_folder_permissions(self): + """ + Test the access control for displaying the changelist of the folder + permissions. SuperUsers should have access to their all folder permissions. """ - folder_permissions_url = reverse('admin:filer_folderpermission_changelist') folder_permission_admin = site._registry[FolderPermission] - request = self.factory.get(folder_permissions_url) + request = self.factory.get(FOLDER_PERMISSIONS_URL) request.user = self.superuser - permissions_qs = folder_permission_admin.queryset(request) - self.assertIn(self.folder_permission1, permissions_qs) - self.assertIn(self.folder_permission2, permissions_qs) + qs = folder_permission_admin.queryset(request) + self.assertIn(self.folder_permission1, qs) + self.assertIn(self.folder_permission2, qs) + self.assertIn(self.folder_permission3, qs) + + def test_adminview_user1_see_only_their_folder_permissions(self): + """ + Tests the non-superuser sees his 2 folders permission sin admin views. + """ + self.client.login(username=self.user1, password='secret') + response = self.client.get(FOLDER_PERMISSIONS_URL) + self.assertTrue(200, response.status_code) + qs = get_response_changelist_qs(response) + self.assertIn(self.folder_permission1, qs) + self.assertIn(self.folder_permission3, qs) + self.assertNotIn(self.folder_permission2, qs) + + def test_adminview_user2_see_only_their_folder_permissions(self): + """ + Tests the non-superuser sees his 0 folders permission sin admin views. + """ + self.client.login(username=self.user2, password='secret') + response = self.client.get(FOLDER_PERMISSIONS_URL) + self.assertTrue(200, response.status_code) + qs = get_response_changelist_qs(response) + self.assertNotIn(self.folder_permission1, qs) + self.assertNotIn(self.folder_permission2, qs) + self.assertNotIn(self.folder_permission3, qs) + + def test_adminview_user3_see_only_their_folder_permissions(self): + """ + Tests the non-superuser sees his 1 folders permission sin admin views. + """ + self.client.login(username=self.user3, password='secret') + response = self.client.get(FOLDER_PERMISSIONS_URL) + self.assertTrue(200, response.status_code) + qs = get_response_changelist_qs(response) + self.assertIn(self.folder_permission2, qs) + self.assertNotIn(self.folder_permission3, qs) + self.assertNotIn(self.folder_permission1, qs) + + def test_adminview_superusers_see_all_folder_permissions(self): + """ + Tests the superuser admin views sees all 3 folders permissions. + """ + self.client.login(username=self.superuser, password='secret') + response = self.client.get(FOLDER_PERMISSIONS_URL) + self.assertTrue(200, response.status_code) + qs = get_response_changelist_qs(response) + self.assertIn(self.folder_permission1, qs) + self.assertIn(self.folder_permission2, qs) + self.assertIn(self.folder_permission3, qs) From 55cbd0bf48897f945b60bed0b34db0f07d5ce506 Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Mon, 2 Sep 2013 18:06:23 +0300 Subject: [PATCH 097/715] LUN-967: Tidy up admin view tests. --- filer/tests/admin.py | 130 +++++++++++++++++------------------------ filer/tests/helpers.py | 43 +++++++++++++- 2 files changed, 94 insertions(+), 79 deletions(-) diff --git a/filer/tests/admin.py b/filer/tests/admin.py index 3eef75340..0de300b91 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -4,7 +4,7 @@ from django.core.urlresolvers import reverse import django.core.files from django.contrib.admin import helpers, site -from django.contrib.auth.models import User, Group, Permission +from django.contrib.auth.models import User, Group from django.http import HttpRequest from filer.models.filemodels import File from filer.models.foldermodels import Folder, FolderPermission @@ -12,8 +12,15 @@ from filer.models.clipboardmodels import Clipboard from filer.models.virtualitems import FolderRoot from filer.models import tools -from filer.tests.helpers import (create_superuser, create_folder_structure, - create_image) +from filer.tests.helpers import ( + create_superuser, + create_folder_structure, + create_image, + create_staffuser, + create_folder_for_user, + create_folderpermission_for_user, + grant_all_folderpermissions_for_group, +) class FilerFolderAdminUrlsTests(TestCase): @@ -436,50 +443,6 @@ def test_resize_images_action(self): self.image_obj = Image.objects.get(id=self.image_obj.id) self.assertEqual(self.image_obj.width, 42) self.assertEqual(self.image_obj.height, 42) - - -def create_staffuser(user): - user = User.objects.create_user( - username=user, - password='secret', - ) - user.is_staff = True - user.is_active = True - user.save() - return user - - -def create_folder_for_user(foldername, user): - folder = Folder.objects.create( - name=foldername, - owner=user, - ) - return folder - - -def create_folderpermission_for_user(folder, user): - folder_permission = FolderPermission.objects.create( - folder=folder, - type=FolderPermission.CHILDREN, - user=user, - can_edit=FolderPermission.ALLOW, - can_read=FolderPermission.ALLOW, - can_add_children=FolderPermission.ALLOW, - ) - return folder_permission - - -def grant_all_folderpermissions_for_group(group): - permission_set = Permission.objects.filter( - codename__endswith='folderpermission', - ) - for permission in permission_set: - group.permissions.add(permission) - - -def get_response_changelist_qs(response): - return response.context['cl'].query_set - FOLDER_PERMISSIONS_URL = reverse( 'admin:filer_folderpermission_changelist' ) @@ -498,7 +461,6 @@ def setUp(self): self.group2.user_set.add(self.user3) grant_all_folderpermissions_for_group(self.group1) grant_all_folderpermissions_for_group(self.group2) - # self.group2.permission_set.add() self.factory = RequestFactory() self.folder1 = create_folder_for_user('folder1', self.user1) self.folder3 = create_folder_for_user('folder3', self.user1) @@ -512,7 +474,44 @@ def setUp(self): self.folder_permission2 = create_folderpermission_for_user( self.folder2, self.user3 ) - + all_folderpermissions = [ + self.folder_permission1, + self.folder_permission2, + self.folder_permission3, + ] + self.rules = { + self.user1 : { + 'folderpermissions': [ + self.folder_permission1, + self.folder_permission3, + ] + }, + self.user2 : { + 'folderpermissions': [], + }, + self.user3 : { + 'folderpermissions': [ + self.folder_permission2, + ] + }, + self.superuser: { + 'folderpermissions': all_folderpermissions, + } + } + + def assert_user_response(self, user, response): + self.assertTrue(200, response.status_code) + qs = response.context['cl'].query_set + self.assert_user_folder_permission_qs(user, qs) + + def assert_user_folder_permission_qs(self, user, qs): + self.assertItemsEqual(qs, self.rules[user]['folderpermissions']) + + def assert_user_adminview(self, user): + self.client.login(username=user, password='secret') + response = self.client.get(FOLDER_PERMISSIONS_URL) + self.assert_user_response(user, response) + def tearDown(self): self.client.logout() @@ -584,46 +583,23 @@ def test_adminview_user1_see_only_their_folder_permissions(self): """ Tests the non-superuser sees his 2 folders permission sin admin views. """ - self.client.login(username=self.user1, password='secret') - response = self.client.get(FOLDER_PERMISSIONS_URL) - self.assertTrue(200, response.status_code) - qs = get_response_changelist_qs(response) - self.assertIn(self.folder_permission1, qs) - self.assertIn(self.folder_permission3, qs) - self.assertNotIn(self.folder_permission2, qs) + self.assert_user_adminview(self.user1) def test_adminview_user2_see_only_their_folder_permissions(self): """ Tests the non-superuser sees his 0 folders permission sin admin views. """ - self.client.login(username=self.user2, password='secret') - response = self.client.get(FOLDER_PERMISSIONS_URL) - self.assertTrue(200, response.status_code) - qs = get_response_changelist_qs(response) - self.assertNotIn(self.folder_permission1, qs) - self.assertNotIn(self.folder_permission2, qs) - self.assertNotIn(self.folder_permission3, qs) + self.assert_user_adminview(self.user2) def test_adminview_user3_see_only_their_folder_permissions(self): """ Tests the non-superuser sees his 1 folders permission sin admin views. """ - self.client.login(username=self.user3, password='secret') - response = self.client.get(FOLDER_PERMISSIONS_URL) - self.assertTrue(200, response.status_code) - qs = get_response_changelist_qs(response) - self.assertIn(self.folder_permission2, qs) - self.assertNotIn(self.folder_permission3, qs) - self.assertNotIn(self.folder_permission1, qs) + self.assert_user_adminview(self.user3) + def test_adminview_superusers_see_all_folder_permissions(self): """ Tests the superuser admin views sees all 3 folders permissions. """ - self.client.login(username=self.superuser, password='secret') - response = self.client.get(FOLDER_PERMISSIONS_URL) - self.assertTrue(200, response.status_code) - qs = get_response_changelist_qs(response) - self.assertIn(self.folder_permission1, qs) - self.assertIn(self.folder_permission2, qs) - self.assertIn(self.folder_permission3, qs) + self.assert_user_adminview(self.superuser) diff --git a/filer/tests/helpers.py b/filer/tests/helpers.py index d29449530..9a42aa0cf 100644 --- a/filer/tests/helpers.py +++ b/filer/tests/helpers.py @@ -1,8 +1,8 @@ #-*- coding: utf-8 -*- from PIL import Image, ImageChops, ImageDraw -from django.contrib.auth.models import User -from filer.models.foldermodels import Folder +from django.contrib.auth.models import User, Permission +from filer.models.foldermodels import Folder, FolderPermission from filer.models.clipboardmodels import Clipboard, ClipboardItem @@ -71,3 +71,42 @@ def __exit__(self, type, value, traceback): setattr(self.settings_module, key, value) else: delattr(self.settings_module,key) + + +def create_staffuser(user): + user = User.objects.create_user( + username=user, + password='secret', + ) + user.is_staff = True + user.is_active = True + user.save() + return user + + +def create_folder_for_user(foldername, user): + folder = Folder.objects.create( + name=foldername, + owner=user, + ) + return folder + + +def create_folderpermission_for_user(folder, user): + folder_permission = FolderPermission.objects.create( + folder=folder, + type=FolderPermission.CHILDREN, + user=user, + can_edit=FolderPermission.ALLOW, + can_read=FolderPermission.ALLOW, + can_add_children=FolderPermission.ALLOW, + ) + return folder_permission + + +def grant_all_folderpermissions_for_group(group): + permission_set = Permission.objects.filter( + codename__endswith='folderpermission', + ) + for permission in permission_set: + group.permissions.add(permission) From f5fb8f256bcc3641b09dee90c1e03719a611b50d Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Mon, 2 Sep 2013 18:27:29 +0300 Subject: [PATCH 098/715] LUN-967: Tiny up remaining permission admin tests. --- filer/tests/admin.py | 124 +++++++++++-------------------------------- 1 file changed, 30 insertions(+), 94 deletions(-) diff --git a/filer/tests/admin.py b/filer/tests/admin.py index 0de300b91..b16ab8519 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -443,9 +443,6 @@ def test_resize_images_action(self): self.image_obj = Image.objects.get(id=self.image_obj.id) self.assertEqual(self.image_obj.width, 42) self.assertEqual(self.image_obj.height, 42) -FOLDER_PERMISSIONS_URL = reverse( - 'admin:filer_folderpermission_changelist' -) class PermissionAdminTest(TestCase): @@ -479,39 +476,51 @@ def setUp(self): self.folder_permission2, self.folder_permission3, ] - self.rules = { - self.user1 : { + self.users = { + self.user1: { 'folderpermissions': [ self.folder_permission1, self.folder_permission3, ] - }, - self.user2 : { + }, + self.user2: { 'folderpermissions': [], - }, - self.user3 : { + }, + self.user3: { 'folderpermissions': [ self.folder_permission2, ] - }, + }, self.superuser: { 'folderpermissions': all_folderpermissions, - } + } } def assert_user_response(self, user, response): self.assertTrue(200, response.status_code) qs = response.context['cl'].query_set self.assert_user_folder_permission_qs(user, qs) - + def assert_user_folder_permission_qs(self, user, qs): - self.assertItemsEqual(qs, self.rules[user]['folderpermissions']) + self.assertItemsEqual(qs, self.users[user]['folderpermissions']) def assert_user_adminview(self, user): self.client.login(username=user, password='secret') - response = self.client.get(FOLDER_PERMISSIONS_URL) + response = self.client.get( + reverse('admin:filer_folderpermission_changelist') + ) self.assert_user_response(user, response) - + self.client.logout() + + def assert_user_query(self, user): + folder_permission_admin = site._registry[FolderPermission] + request = self.factory.get( + reverse('admin:filer_folderpermission_changelist') + ) + request.user = user + qs = folder_permission_admin.queryset(request) + self.assert_user_folder_permission_qs(user, qs) + def tearDown(self): self.client.logout() @@ -523,83 +532,10 @@ def test_render_add_view(self): response = self.client.get(reverse('admin:filer_folderpermission_add')) self.assertEqual(response.status_code, 200) - def test_query_user1_see_only_their_folder_permissions(self): - """ - Test the access control for displaying the changelist of the folder - permissions. - Users should only have access to their own permissions. - """ - folder_permission_admin = site._registry[FolderPermission] - request = self.factory.get(FOLDER_PERMISSIONS_URL) - request.user = self.user1 - qs = folder_permission_admin.queryset(request) - self.assertIn(self.folder_permission1, qs) - self.assertIn(self.folder_permission3, qs) - self.assertNotIn(self.folder_permission2, qs) - - def test_query_user2_see_only_their_folder_permissions(self): - """ - Test the access control for displaying the changelist of the folder - permissions. - Users should only have access to their own permissions. - """ - folder_permission_admin = site._registry[FolderPermission] - request = self.factory.get(FOLDER_PERMISSIONS_URL) - request.user = self.user2 - qs = folder_permission_admin.queryset(request) - self.assertNotIn(self.folder_permission1, qs) - self.assertNotIn(self.folder_permission2, qs) - self.assertNotIn(self.folder_permission3, qs) + def test_admin_queries(self): + for user in self.users.keys(): + self.assert_user_query(user) - def test_query_user3_see_only_their_folder_permissions(self): - """ - Test the access control for displaying the changelist of the folder - permissions. - Users should only have access to their own permissions. - """ - folder_permission_admin = site._registry[FolderPermission] - request = self.factory.get(FOLDER_PERMISSIONS_URL) - request.user = self.user3 - qs = folder_permission_admin.queryset(request) - self.assertIn(self.folder_permission2, qs) - self.assertNotIn(self.folder_permission1, qs) - self.assertNotIn(self.folder_permission3, qs) - - def test_query_superusers_see_all_folder_permissions(self): - """ - Test the access control for displaying the changelist of the folder - permissions. - SuperUsers should have access to their all folder permissions. - """ - folder_permission_admin = site._registry[FolderPermission] - request = self.factory.get(FOLDER_PERMISSIONS_URL) - request.user = self.superuser - qs = folder_permission_admin.queryset(request) - self.assertIn(self.folder_permission1, qs) - self.assertIn(self.folder_permission2, qs) - self.assertIn(self.folder_permission3, qs) - - def test_adminview_user1_see_only_their_folder_permissions(self): - """ - Tests the non-superuser sees his 2 folders permission sin admin views. - """ - self.assert_user_adminview(self.user1) - - def test_adminview_user2_see_only_their_folder_permissions(self): - """ - Tests the non-superuser sees his 0 folders permission sin admin views. - """ - self.assert_user_adminview(self.user2) - - def test_adminview_user3_see_only_their_folder_permissions(self): - """ - Tests the non-superuser sees his 1 folders permission sin admin views. - """ - self.assert_user_adminview(self.user3) - - - def test_adminview_superusers_see_all_folder_permissions(self): - """ - Tests the superuser admin views sees all 3 folders permissions. - """ - self.assert_user_adminview(self.superuser) + def test_admin_view(self): + for user in self.users.keys(): + self.assert_user_adminview(user) From 867ad2550d9787a4830c2336255aa7dfd2f1cb1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20Szeredi?= Date: Mon, 2 Sep 2013 18:48:23 +0300 Subject: [PATCH 099/715] LUN-967: Fix typo assertTrue --> assertEqual --- filer/tests/admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filer/tests/admin.py b/filer/tests/admin.py index b16ab8519..be772aa3c 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -497,7 +497,7 @@ def setUp(self): } def assert_user_response(self, user, response): - self.assertTrue(200, response.status_code) + self.assertEqual(200, response.status_code) qs = response.context['cl'].query_set self.assert_user_folder_permission_qs(user, qs) From 0ea3e79fb746403470044a1a33714b1deddc831a Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Tue, 3 Sep 2013 10:52:24 +0300 Subject: [PATCH 100/715] Bumped version for bamboo. --- filer/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filer/__init__.py b/filer/__init__.py index 45b46af01..1af3239d2 100644 --- a/filer/__init__.py +++ b/filer/__init__.py @@ -1,3 +1,3 @@ #-*- coding: utf-8 -*- # version string following pep-0396 and pep-0386 -__version__ = '0.9pbs.7' # pragma: nocover +__version__ = '0.9pbs.8' # pragma: nocover From 0ac0d65e2f877f62fc1cc288c508e4a7e33f7a7f Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Wed, 4 Sep 2013 13:57:27 +0300 Subject: [PATCH 101/715] Custom requirements: Hide 'subject location' and 'sha1' sections. --- filer/admin/fileadmin.py | 6 ++++-- filer/admin/imageadmin.py | 9 +++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/filer/admin/fileadmin.py b/filer/admin/fileadmin.py index f0756d1fe..a894ddcea 100644 --- a/filer/admin/fileadmin.py +++ b/filer/admin/fileadmin.py @@ -39,7 +39,9 @@ def build_fieldsets(cls, extra_main_fields=(), extra_advanced_fields=(), extra_f 'fields': ('name', 'owner', 'description',) + extra_main_fields, }), (_('Advanced'), { - 'fields': ('file', 'sha1',) + extra_advanced_fields, + # due to custom requirements: sha1 field should be hidden + # 'fields': ('file', 'sha1',) + extra_advanced_fields, + 'fields': ('file', ) + extra_advanced_fields, 'classes': ('collapse',), }), ) + extra_fieldsets @@ -132,4 +134,4 @@ def get_model_perms(self, request): 'delete': False, } -FileAdmin.fieldsets = FileAdmin.build_fieldsets() \ No newline at end of file +FileAdmin.fieldsets = FileAdmin.build_fieldsets() diff --git a/filer/admin/imageadmin.py b/filer/admin/imageadmin.py index 2ed622273..18d636269 100644 --- a/filer/admin/imageadmin.py +++ b/filer/admin/imageadmin.py @@ -43,9 +43,10 @@ class ImageAdmin(FileAdmin): ImageAdmin.fieldsets = ImageAdmin.build_fieldsets( extra_main_fields=('default_alt_text', 'default_caption',), extra_fieldsets=( - ('Subject Location', { - 'fields': ('subject_location',), - 'classes': ('collapse',), - }), + # due to custom requirements:Subject Location section should be hidden + # ('Subject Location', { + # 'fields': ('subject_location',), + # 'classes': ('collapse',), + # }), ) ) From b32297c5c55b62e13c5a4008cc416c3aeeadfb7c Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Wed, 4 Sep 2013 14:10:08 +0300 Subject: [PATCH 102/715] Custom requirement: disable 'resize_images', 'rename_files' actions from the folder admin view. --- filer/admin/folderadmin.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 4c861753d..f88570450 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -63,7 +63,9 @@ class FolderAdmin(PrimitivePermissionAwareModelAdmin): actions = [ 'move_to_clipboard', 'files_set_public', 'files_set_private', 'delete_files_or_folders', 'move_files_and_folders', - 'copy_files_and_folders', 'resize_images', 'rename_files', + 'copy_files_and_folders', + # custom requirements: hide 'resize_images' and 'rename_files' actions + # 'resize_images', 'rename_files', 'extract_files'] def get_form(self, request, obj=None, **kwargs): From face35f3ac391fe2871444f7752c07649a442ee8 Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Wed, 4 Sep 2013 15:13:46 +0300 Subject: [PATCH 103/715] Restored preview functionality in the image change form. --- filer/static/filer/css/admin_style.css | 8 ++++---- filer/templates/admin/filer/image/change_form.html | 9 ++++++++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/filer/static/filer/css/admin_style.css b/filer/static/filer/css/admin_style.css index de80101b1..63b3f400d 100644 --- a/filer/static/filer/css/admin_style.css +++ b/filer/static/filer/css/admin_style.css @@ -1,7 +1,7 @@ /* focal point */ -#image_container { position: relative; } -#image_container img, #image_container svg { margin: 0px; position: absolute; top: 0; left: 0;} +#image_container { position: relative; } +#image_container img, #image_container svg { margin: 0px; top: 0; left: 0;} /* the directory listing */ @@ -10,7 +10,7 @@ table thead th.thumbHeader { } #fileUploadFakeLink { position: relative; - + } #fileInputUploaderContainer { position: absolute; @@ -27,7 +27,7 @@ table thead th.thumbHeader { height: 32px; background-image: url(../img/loading_animation.gif); background-repeat:no-repeat; - + } .clipboard tr td.thumbnail { width: 40px; diff --git a/filer/templates/admin/filer/image/change_form.html b/filer/templates/admin/filer/image/change_form.html index 7e93063f8..89919fbf7 100644 --- a/filer/templates/admin/filer/image/change_form.html +++ b/filer/templates/admin/filer/image/change_form.html @@ -13,5 +13,12 @@ {% endblock %} {% block file_sidebar %} + {{ block.super }} -{% endblock %} \ No newline at end of file +{% endblock %} From 9a93b5598c11d33947403248c5a755aa757b82bc Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Wed, 4 Sep 2013 15:57:19 +0300 Subject: [PATCH 104/715] added en-translation for field 'Owner' to be 'Uploaded by' --- filer/locale/en/LC_MESSAGES/django.mo | Bin 382 -> 458 bytes filer/locale/en/LC_MESSAGES/django.po | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/filer/locale/en/LC_MESSAGES/django.mo b/filer/locale/en/LC_MESSAGES/django.mo index 24afa08d8282036030afe06534efabf7f44d3942..11a1682b6234eda7558e71b08dc2e644d7167e7e 100644 GIT binary patch delta 161 zcmeyzbc(tDo)F7a1|VPtVi_Pd0b*7l_5orLNC09GKM_i&18EmV28LW9%?-qxfNT)G z4@d(M*c>3mzyu;dz`r~%wTK}fOa>I?XQd{W=z6B;hNTu2XXfW^^fqRc2rbCTPfSTo MQAny}C`Doe0EbZ=pa1{> delta 65 wcmX@b{Ex}vo)F7a1|VPrVi_P-0b*t#)&XJ=umEBgprj>`2C0F8jX7?N00Qp@8UO$Q diff --git a/filer/locale/en/LC_MESSAGES/django.po b/filer/locale/en/LC_MESSAGES/django.po index 8a0616881..449ccce4c 100644 --- a/filer/locale/en/LC_MESSAGES/django.po +++ b/filer/locale/en/LC_MESSAGES/django.po @@ -265,7 +265,7 @@ msgstr "" #: models/filemodels.py:50 msgid "owner" -msgstr "" +msgstr "uploaded by" #: models/filemodels.py:52 models/foldermodels.py:105 msgid "uploaded at" @@ -693,7 +693,7 @@ msgstr "" #: templates/admin/filer/folder/directory_table.html:30 #: templates/admin/filer/folder/directory_table.html:45 msgid "Owner" -msgstr "" +msgstr "Uploaded by" #: templates/admin/filer/folder/directory_table.html:37 msgid "Select this file" From 5e05e996906750f4f2315e18587e4207ff6a7f60 Mon Sep 17 00:00:00 2001 From: Alex Pirjol Date: Thu, 5 Sep 2013 11:47:30 +0300 Subject: [PATCH 105/715] LUN-1014 : Fix 'Full size preview link' --- filer/static/filer/css/admin_style.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/filer/static/filer/css/admin_style.css b/filer/static/filer/css/admin_style.css index 63b3f400d..29f8976c9 100644 --- a/filer/static/filer/css/admin_style.css +++ b/filer/static/filer/css/admin_style.css @@ -2,6 +2,10 @@ /* focal point */ #image_container { position: relative; } #image_container img, #image_container svg { margin: 0px; top: 0; left: 0;} +#image_container #paper { + position: absolute; + top: 0; +} /* the directory listing */ From 1ccc361d98e0c1485f96e7cca48db1fe7061ee88 Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Fri, 6 Sep 2013 17:37:23 +0300 Subject: [PATCH 106/715] LUN-1006: hid 'Permissions disabled' section in the admin --- filer/admin/fileadmin.py | 13 +++++++------ filer/admin/folderadmin.py | 4 +++- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/filer/admin/fileadmin.py b/filer/admin/fileadmin.py index a894ddcea..19ba3df39 100644 --- a/filer/admin/fileadmin.py +++ b/filer/admin/fileadmin.py @@ -45,12 +45,13 @@ def build_fieldsets(cls, extra_main_fields=(), extra_advanced_fields=(), extra_f 'classes': ('collapse',), }), ) + extra_fieldsets - if settings.FILER_ENABLE_PERMISSIONS: - fieldsets = fieldsets + ( - (None, { - 'fields': ('is_public',) - }), - ) + # custom requirement: hide 'Permissions disabled' section + # if settings.FILER_ENABLE_PERMISSIONS: + # fieldsets = fieldsets + ( + # (None, { + # 'fields': ('is_public',) + # }), + # ) return fieldsets diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index f88570450..a63c96873 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -61,7 +61,9 @@ class FolderAdmin(PrimitivePermissionAwareModelAdmin): raw_id_fields = ('owner',) save_as = True # see ImageAdmin actions = [ - 'move_to_clipboard', 'files_set_public', 'files_set_private', + 'move_to_clipboard', + # custom requirements: hide 'set public/private' actions + # 'files_set_public', 'files_set_private', 'delete_files_or_folders', 'move_files_and_folders', 'copy_files_and_folders', # custom requirements: hide 'resize_images' and 'rename_files' actions From e76e4be2f76e5981ab5cd19b06962ec5bf66017d Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Mon, 9 Sep 2013 18:10:42 +0300 Subject: [PATCH 107/715] LUN-1033: added folder type field. --- .../0015_add_field_Folder_folder_type.py | 134 ++++++++++++++++++ filer/models/foldermodels.py | 11 ++ 2 files changed, 145 insertions(+) create mode 100644 filer/migrations/0015_add_field_Folder_folder_type.py diff --git a/filer/migrations/0015_add_field_Folder_folder_type.py b/filer/migrations/0015_add_field_Folder_folder_type.py new file mode 100644 index 000000000..2350e0b78 --- /dev/null +++ b/filer/migrations/0015_add_field_Folder_folder_type.py @@ -0,0 +1,134 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'Folder.folder_type' + db.add_column('filer_folder', 'folder_type', + self.gf('django.db.models.fields.IntegerField')(default=0), + keep_default=True) + + + def backwards(self, orm): + # Deleting field 'Folder.folder_type' + db.delete_column('filer_folder', 'folder_type') + + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'filer.archive': { + 'Meta': {'object_name': 'Archive', '_ormbases': ['filer.File']}, + 'file_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['filer.File']", 'unique': 'True', 'primary_key': 'True'}) + }, + 'filer.clipboard': { + 'Meta': {'object_name': 'Clipboard'}, + 'files': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'in_clipboards'", 'symmetrical': 'False', 'through': "orm['filer.ClipboardItem']", 'to': "orm['filer.File']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'filer_clipboards'", 'to': "orm['auth.User']"}) + }, + 'filer.clipboarditem': { + 'Meta': {'object_name': 'ClipboardItem'}, + 'clipboard': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.Clipboard']"}), + 'file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.File']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + 'filer.file': { + 'Meta': {'object_name': 'File'}, + '_file_size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'file': ('django.db.models.fields.files.FileField', [], {'db_index': 'True', 'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'folder': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'all_files'", 'null': 'True', 'to': "orm['filer.Folder']"}), + 'has_all_mandatory_data': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'original_filename': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'owned_files'", 'null': 'True', 'to': "orm['auth.User']"}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'polymorphic_filer.file_set'", 'null': 'True', 'to': "orm['contenttypes.ContentType']"}), + 'sha1': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40', 'blank': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.folder': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('parent', 'name'),)", 'object_name': 'Folder'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'folder_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'filer_owned_folders'", 'null': 'True', 'to': "orm['auth.User']"}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['filer.Folder']"}), + 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.folderpermission': { + 'Meta': {'object_name': 'FolderPermission'}, + 'can_add_children': ('django.db.models.fields.SmallIntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), + 'can_edit': ('django.db.models.fields.SmallIntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), + 'can_read': ('django.db.models.fields.SmallIntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), + 'everybody': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'folder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.Folder']", 'null': 'True', 'blank': 'True'}), + 'group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'filer_folder_permissions'", 'null': 'True', 'to': "orm['auth.Group']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'filer_folder_permissions'", 'null': 'True', 'to': "orm['auth.User']"}) + }, + 'filer.image': { + 'Meta': {'object_name': 'Image', '_ormbases': ['filer.File']}, + '_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'default_alt_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'default_caption': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'file_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['filer.File']", 'unique': 'True', 'primary_key': 'True'}), + 'must_always_publish_author_credit': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'must_always_publish_copyright': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'subject_location': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '64', 'null': 'True', 'blank': 'True'}) + } + } + + complete_apps = ['filer'] diff --git a/filer/models/foldermodels.py b/filer/models/foldermodels.py index 23f55eece..4a9c13669 100644 --- a/filer/models/foldermodels.py +++ b/filer/models/foldermodels.py @@ -98,6 +98,14 @@ class Folder(models.Model, mixins.IconsMixin): can_have_subfolders = True _icon = 'plainfolder' + SITE_FOLDER = 0 + CORE_FOLDER = 1 + + FOLDER_TYPES = { + SITE_FOLDER: 'Site Folder', + CORE_FOLDER: 'Core Folder', + } + parent = models.ForeignKey('self', verbose_name=('parent'), null=True, blank=True, related_name='children') name = models.CharField(_('name'), max_length=255) @@ -111,6 +119,9 @@ class Folder(models.Model, mixins.IconsMixin): created_at = models.DateTimeField(_('created at'), auto_now_add=True) modified_at = models.DateTimeField(_('modified at'),auto_now=True) + folder_type = models.IntegerField(choices=FOLDER_TYPES.items(), + default=SITE_FOLDER) + objects = FolderManager() def clean(self): From eb13c07d441a7cb14c264aeb0a293ca81674d8f1 Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Tue, 10 Sep 2013 12:11:44 +0300 Subject: [PATCH 108/715] Added site field for folder. --- filer/admin/folderadmin.py | 62 +++++--- .../0016_auto__add_field_folder_site.py | 141 ++++++++++++++++++ filer/models/foldermodels.py | 6 +- .../admin/filer/folder/directory_table.html | 2 + 4 files changed, 192 insertions(+), 19 deletions(-) create mode 100644 filer/migrations/0016_auto__add_field_folder_site.py diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index f88570450..a5083c97f 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -52,13 +52,48 @@ class Meta: fields = ('name',) +class FolderFormWrapper(object): + + def __init__(self, form_obj): + self.form = form_obj + self.add_validation() + + def get_form(self): + return self.form + + def add_validation(self): + def clean_site(form_obj): + cleaned_site = form_obj.cleaned_data['site'] + if (form_obj.instance.folder_type == Folder.SITE_FOLDER and + not cleaned_site): + raise ValidationError('Folder is a Site folder. ' + 'Site is required.') + if (form_obj.instance.folder_type == Folder.CORE_FOLDER and + cleaned_site): + raise ValidationError('Folder is a Core folder. ' + 'Site must be empty.') + return cleaned_site + + def clean(form_obj): + cleaned_data = form_obj.cleaned_data + folders_with_same_name = Folder.objects.filter( + parent=form_obj.instance.parent, + name=cleaned_data['name']) + if form_obj.instance.pk: + folders_with_same_name = folders_with_same_name.exclude( + pk=form_obj.instance.pk) + if folders_with_same_name.exists(): + raise ValidationError('Folder with this name already exists.') + return cleaned_data + + self.form.clean = clean + self.form.clean_site = clean_site + class FolderAdmin(PrimitivePermissionAwareModelAdmin): list_display = ('name',) - exclude = ('parent',) list_per_page = 20 list_filter = ('owner',) search_fields = ['name', 'files__name'] - raw_id_fields = ('owner',) save_as = True # see ImageAdmin actions = [ 'move_to_clipboard', 'files_set_public', 'files_set_private', @@ -68,6 +103,11 @@ class FolderAdmin(PrimitivePermissionAwareModelAdmin): # 'resize_images', 'rename_files', 'extract_files'] + # form fields + exclude = ('parent',) + raw_id_fields = ('owner', 'site', ) + readonly_fields = ('folder_type', ) + def get_form(self, request, obj=None, **kwargs): """ Returns a Form class for use in the admin add view. This is used by @@ -79,22 +119,8 @@ def get_form(self, request, obj=None, **kwargs): else: folder_form = super(FolderAdmin, self).get_form( request, obj=None, **kwargs) - - def folder_form_clean(form_obj): - cleaned_data = form_obj.cleaned_data - folders_with_same_name = Folder.objects.filter( - parent=form_obj.instance.parent, - name=cleaned_data['name']) - if form_obj.instance.pk: - folders_with_same_name = folders_with_same_name.exclude( - pk=form_obj.instance.pk) - if folders_with_same_name.exists(): - raise ValidationError('Folder with this name already exists.') - return cleaned_data - - # attach clean to the default form rather than defining a new form class - folder_form.clean = folder_form_clean - return folder_form + # it will get ugly if building form from scratch + return FolderFormWrapper(folder_form).get_form() def save_form(self, request, form, change): """ diff --git a/filer/migrations/0016_auto__add_field_folder_site.py b/filer/migrations/0016_auto__add_field_folder_site.py new file mode 100644 index 000000000..c67e81b97 --- /dev/null +++ b/filer/migrations/0016_auto__add_field_folder_site.py @@ -0,0 +1,141 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'Folder.site' + db.add_column('filer_folder', 'site', + self.gf('django.db.models.fields.related.ForeignKey')(to=orm['sites.Site'], null=True, blank=True), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'Folder.site' + db.delete_column('filer_folder', 'site_id') + + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'filer.archive': { + 'Meta': {'object_name': 'Archive', '_ormbases': ['filer.File']}, + 'file_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['filer.File']", 'unique': 'True', 'primary_key': 'True'}) + }, + 'filer.clipboard': { + 'Meta': {'object_name': 'Clipboard'}, + 'files': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'in_clipboards'", 'symmetrical': 'False', 'through': "orm['filer.ClipboardItem']", 'to': "orm['filer.File']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'filer_clipboards'", 'to': "orm['auth.User']"}) + }, + 'filer.clipboarditem': { + 'Meta': {'object_name': 'ClipboardItem'}, + 'clipboard': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.Clipboard']"}), + 'file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.File']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + 'filer.file': { + 'Meta': {'object_name': 'File'}, + '_file_size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'file': ('django.db.models.fields.files.FileField', [], {'db_index': 'True', 'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'folder': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'all_files'", 'null': 'True', 'to': "orm['filer.Folder']"}), + 'has_all_mandatory_data': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'original_filename': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'owned_files'", 'null': 'True', 'to': "orm['auth.User']"}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'polymorphic_filer.file_set'", 'null': 'True', 'to': "orm['contenttypes.ContentType']"}), + 'sha1': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40', 'blank': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.folder': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('parent', 'name'),)", 'object_name': 'Folder'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'folder_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'filer_owned_folders'", 'null': 'True', 'to': "orm['auth.User']"}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['filer.Folder']"}), + 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'site': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['sites.Site']", 'null': 'True', 'blank': 'True'}), + 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.folderpermission': { + 'Meta': {'object_name': 'FolderPermission'}, + 'can_add_children': ('django.db.models.fields.SmallIntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), + 'can_edit': ('django.db.models.fields.SmallIntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), + 'can_read': ('django.db.models.fields.SmallIntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), + 'everybody': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'folder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.Folder']", 'null': 'True', 'blank': 'True'}), + 'group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'filer_folder_permissions'", 'null': 'True', 'to': "orm['auth.Group']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'filer_folder_permissions'", 'null': 'True', 'to': "orm['auth.User']"}) + }, + 'filer.image': { + 'Meta': {'object_name': 'Image', '_ormbases': ['filer.File']}, + '_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'default_alt_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'default_caption': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'file_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['filer.File']", 'unique': 'True', 'primary_key': 'True'}), + 'must_always_publish_author_credit': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'must_always_publish_copyright': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'subject_location': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '64', 'null': 'True', 'blank': 'True'}) + }, + 'sites.site': { + 'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"}, + 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + } + } + + complete_apps = ['filer'] \ No newline at end of file diff --git a/filer/models/foldermodels.py b/filer/models/foldermodels.py index 4a9c13669..08dc020b4 100644 --- a/filer/models/foldermodels.py +++ b/filer/models/foldermodels.py @@ -1,6 +1,6 @@ #-*- coding: utf-8 -*- import itertools - +from django.contrib.sites.models import Site from django.contrib.auth import models as auth_models from django.core import urlresolvers from django.core.exceptions import ValidationError @@ -122,6 +122,10 @@ class Folder(models.Model, mixins.IconsMixin): folder_type = models.IntegerField(choices=FOLDER_TYPES.items(), default=SITE_FOLDER) + site = models.ForeignKey(Site, null=True, blank=True, + help_text=_("Select the site which will use " + "this folder.")) + objects = FolderManager() def clean(self): diff --git a/filer/templates/admin/filer/folder/directory_table.html b/filer/templates/admin/filer/folder/directory_table.html index a501e6839..47d78273a 100644 --- a/filer/templates/admin/filer/folder/directory_table.html +++ b/filer/templates/admin/filer/folder/directory_table.html @@ -27,6 +27,8 @@ {% trans "Change" %} {% endif %}
{{ subfolder.name }}{% if not subfolder.is_root %} ({% blocktrans count subfolder.children_count as counter %}1 folder{% plural %}{{ counter }} folders{% endblocktrans %}, {% blocktrans count subfolder.file_count as counter %}1 file{% plural %}{{ counter }} files{% endblocktrans %}){% endif %}
+ {{ item.get_folder_type_display }}{% if item.site %}: {{item.site}}{%endif%} +
{% trans "Owner" %}: {{ subfolder.owner|default:"n/a" }}
From b744ec1f89a510dc927ac21564bec3f879b76c0b Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Wed, 11 Sep 2013 16:08:46 +0300 Subject: [PATCH 109/715] * merged all add folder forms into one. * moved folder duplication form validation in model validation * added restrictions for site folders * some pep8 & pylint * removed the make_folder view and added new one that uses django's add view * site for site folders can be changed only on root folders * the site for root site folders are set(on save) for all subfolders --- filer/admin/folderadmin.py | 599 +++++++++++++++++++++-------------- filer/admin/permissions.py | 14 +- filer/models/foldermodels.py | 68 +++- filer/tests/admin.py | 69 ++-- filer/views.py | 60 +--- test_settings.py | 3 +- 6 files changed, 486 insertions(+), 327 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index a5083c97f..094f74a1e 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -1,7 +1,5 @@ #-*- coding: utf-8 -*- -from django import forms from django import template -from django.core.exceptions import ValidationError from django.contrib.admin import helpers from django.contrib.admin.util import quote, unquote, capfirst from django.contrib import messages @@ -15,6 +13,7 @@ from django.http import HttpResponseRedirect, Http404, HttpResponse from django.shortcuts import render_to_response from django.template import RequestContext +from django.template.response import TemplateResponse from django.utils.encoding import force_unicode from django.utils.html import escape from django.utils.safestring import mark_safe @@ -26,11 +25,11 @@ from filer.admin.permissions import PrimitivePermissionAwareModelAdmin from filer.views import (popup_status, popup_param, selectfolder_status, selectfolder_param) -from filer.admin.tools import (userperms_for_request, - check_folder_edit_permissions, - check_files_edit_permissions, - check_files_read_permissions, - check_folder_read_permissions) +from filer.admin.tools import (userperms_for_request, + check_folder_edit_permissions, + check_files_edit_permissions, + check_files_read_permissions, + check_folder_read_permissions) from filer.models import (Folder, FolderRoot, UnfiledImages, File, tools, ImagesWithMissingData, FolderPermission, Image, Archive) @@ -38,57 +37,11 @@ from filer.utils.filer_easy_thumbnails import FilerActionThumbnailer from filer.thumbnail_processors import normalize_subject_location from django.conf import settings as django_settings -import urllib import os import itertools import inspect -class AddFolderPopupForm(forms.ModelForm): - folder = forms.HiddenInput() - - class Meta: - model = Folder - fields = ('name',) - - -class FolderFormWrapper(object): - - def __init__(self, form_obj): - self.form = form_obj - self.add_validation() - - def get_form(self): - return self.form - - def add_validation(self): - def clean_site(form_obj): - cleaned_site = form_obj.cleaned_data['site'] - if (form_obj.instance.folder_type == Folder.SITE_FOLDER and - not cleaned_site): - raise ValidationError('Folder is a Site folder. ' - 'Site is required.') - if (form_obj.instance.folder_type == Folder.CORE_FOLDER and - cleaned_site): - raise ValidationError('Folder is a Core folder. ' - 'Site must be empty.') - return cleaned_site - - def clean(form_obj): - cleaned_data = form_obj.cleaned_data - folders_with_same_name = Folder.objects.filter( - parent=form_obj.instance.parent, - name=cleaned_data['name']) - if form_obj.instance.pk: - folders_with_same_name = folders_with_same_name.exclude( - pk=form_obj.instance.pk) - if folders_with_same_name.exists(): - raise ValidationError('Folder with this name already exists.') - return cleaned_data - - self.form.clean = clean - self.form.clean_site = clean_site - class FolderAdmin(PrimitivePermissionAwareModelAdmin): list_display = ('name',) list_per_page = 20 @@ -104,35 +57,42 @@ class FolderAdmin(PrimitivePermissionAwareModelAdmin): 'extract_files'] # form fields - exclude = ('parent',) + exclude = ('parent', 'owner', 'folder_type') raw_id_fields = ('owner', 'site', ) - readonly_fields = ('folder_type', ) def get_form(self, request, obj=None, **kwargs): """ Returns a Form class for use in the admin add view. This is used by add_view and change_view. """ - parent_id = request.REQUEST.get('parent_id', None) - if parent_id: - return AddFolderPopupForm + + folder_form = super(FolderAdmin, self).get_form( + request, obj=obj, **kwargs) + # check if site field should be visible in the form or not + is_core_folder = False + if obj and obj.pk: + # change view + parent_id = obj.parent_id + is_core_folder = obj.folder_type == Folder.CORE_FOLDER else: - folder_form = super(FolderAdmin, self).get_form( - request, obj=None, **kwargs) - # it will get ugly if building form from scratch - return FolderFormWrapper(folder_form).get_form() + # add view + parent_id = request.REQUEST.get('parent_id', None) or None - def save_form(self, request, form, change): - """ - Given a ModelForm return an unsaved instance. ``change`` is True if - the object is being changed, and False if it's being added. - """ - r = form.save(commit=False) - parent_id = request.REQUEST.get('parent_id', None) - if parent_id: - parent = Folder.objects.get(id=parent_id) - r.parent = parent - return r + # shouldn't show site field if has parent or is core folder + pop_site_field = parent_id or is_core_folder + folder_form.base_fields.pop('site', None) if pop_site_field else '' + + def clean(form_instance): + # make sure owner and parent are passed to the model clean method + current_folder = form_instance.instance + if not current_folder.owner: + current_folder.owner = request.user + if parent_id: + current_folder.parent = Folder.objects.get(id=parent_id) + return form_instance.cleaned_data + + folder_form.clean = clean + return folder_form def response_change(self, request, obj): """ @@ -140,7 +100,8 @@ def response_change(self, request, obj): instead of the default change_list_view """ r = super(FolderAdmin, self).response_change(request, obj) - ## Code borrowed from django ModelAdmin to determine changelist on the fly + ## Code borrowed from django ModelAdmin to determine changelist + ## on the fly if r['Location']: # it was a successful save if (r['Location'] in ['../'] or @@ -150,8 +111,8 @@ def response_change(self, request, obj): kwargs={'folder_id': obj.parent.id}) else: url = reverse('admin:filer-directory_listing-root') - url = "%s%s%s" % (url,popup_param(request), - selectfolder_param(request,"&")) + url = "%s%s%s" % (url, popup_param(request), + selectfolder_param(request, "&")) return HttpResponseRedirect(url) else: # this means it probably was a save_and_continue_editing @@ -162,7 +123,7 @@ def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None): extra_context = {'show_delete': True, 'is_popup': popup_status(request), - 'select_folder': selectfolder_status(request),} + 'select_folder': selectfolder_status(request), } context.update(extra_context) return super(FolderAdmin, self).render_change_form( request=request, context=context, add=False, @@ -194,13 +155,13 @@ def delete_view(self, request, object_id, extra_context=None): kwargs={'folder_id': parent_folder.id}) else: url = reverse('admin:filer-directory_listing-root') - url = "%s%s%s" % (url,popup_param(request), - selectfolder_param(request,"&")) + url = "%s%s%s" % (url, popup_param(request), + selectfolder_param(request, "&")) return HttpResponseRedirect(url) return r def icon_img(self, xs): - return mark_safe(('') % FILER_STATICMEDIA_PREFIX) icon_img.allow_tags = True @@ -218,10 +179,10 @@ def get_urls(self): name='filer-directory_listing'), url(r'^(?P\d+)/make_folder/$', - self.admin_site.admin_view(views.make_folder), + self.admin_site.admin_view(self.make_folder), name='filer-directory_listing-make_folder'), url(r'^make_folder/$', - self.admin_site.admin_view(views.make_folder), + self.admin_site.admin_view(self.make_folder), name='filer-directory_listing-make_root_folder'), url(r'^images_with_missing_data/$', self.admin_site.admin_view(self.directory_listing), @@ -235,6 +196,36 @@ def get_urls(self): url_patterns.extend(urls) return url_patterns + def make_folder(self, request, folder_id=None, *args, **kwargs): + if not folder_id: + folder_id = request.REQUEST.get('parent_id', None) + if folder_id: + folder = Folder.objects.get(id=folder_id) + else: + folder = None + + if request.user.is_superuser: + pass + elif folder is None: + # regular users may not add root folders unless configured + # otherwise + if not filer_settings.FILER_ALLOW_REGULAR_USERS_TO_ADD_ROOT_FOLDERS: + raise PermissionDenied + elif not folder.has_add_children_permission(request): + # the user does not have the permission to add subfolders + raise PermissionDenied + + response = self.add_view(request, *args, **kwargs) + # this check should be enough since only save button appears + if (request.method == 'POST' and "_popup" in request.POST and + response.status_code == 200 and + not isinstance(response, TemplateResponse) and + not isinstance(response, HttpResponseRedirect)): + return HttpResponse('') + return response + # custom views def directory_listing(self, request, folder_id=None, viewtype=None): clipboard = tools.get_user_clipboard(request.user) @@ -242,7 +233,7 @@ def directory_listing(self, request, folder_id=None, viewtype=None): folder = ImagesWithMissingData() elif viewtype == 'unfiled_images': folder = UnfiledImages() - elif folder_id == None: + elif folder_id is None: folder = FolderRoot() else: try: @@ -264,19 +255,19 @@ def directory_listing(self, request, folder_id=None, viewtype=None): # search def filter_folder(qs, terms=[]): for term in terms: - qs = qs.filter(Q(name__icontains=term) | \ - Q(owner__username__icontains=term) | \ - Q(owner__first_name__icontains=term) | \ + qs = qs.filter(Q(name__icontains=term) | + Q(owner__username__icontains=term) | + Q(owner__first_name__icontains=term) | Q(owner__last_name__icontains=term)) return qs def filter_file(qs, terms=[]): for term in terms: - qs = qs.filter(Q(name__icontains=term) | \ - Q(description__icontains=term) | \ - Q(original_filename__icontains=term) | \ - Q(owner__username__icontains=term) | \ - Q(owner__first_name__icontains=term) | \ + qs = qs.filter(Q(name__icontains=term) | + Q(description__icontains=term) | + Q(original_filename__icontains=term) | + Q(owner__username__icontains=term) | + Q(owner__first_name__icontains=term) | Q(owner__last_name__icontains=term)) return qs @@ -295,9 +286,10 @@ def _filter_generic_permission(qs, permissions, entry_type): return qs if entry_type == 'folder': - qs = qs.filter(Q(id__in=permissions)|Q(owner=request.user)) + qs = qs.filter(Q(id__in=permissions) | Q(owner=request.user)) elif entry_type == 'file': - qs = qs.filter(Q(folder__id__in=permissions)|Q(owner=request.user)) + qs = qs.filter(Q(folder__id__in=permissions) | + Q(owner=request.user)) return qs def filter_folder_permission(qs, permissions): @@ -351,7 +343,7 @@ def filter_file_permission(qs, permissions): permissions = { 'has_edit_permission': folder.has_edit_permission(request), 'has_read_permission': folder.has_read_permission(request), - 'has_add_children_permission': \ + 'has_add_children_permission': folder.has_add_children_permission(request), } except: @@ -382,7 +374,9 @@ def filter_file_permission(qs, permissions): if (actions and request.method == 'POST' and 'index' in request.POST and '_save' not in request.POST): if selected: - response = self.response_action(request, files_queryset=file_qs, folders_queryset=folder_qs) + response = self.response_action(request, + files_queryset=file_qs, + folders_queryset=folder_qs) if response: return response else: @@ -395,14 +389,17 @@ def filter_file_permission(qs, permissions): helpers.ACTION_CHECKBOX_NAME in request.POST and 'index' not in request.POST and '_save' not in request.POST): if selected: - response = self.response_action(request, files_queryset=file_qs, folders_queryset=folder_qs) + response = self.response_action(request, + files_queryset=file_qs, + folders_queryset=folder_qs) if response: return response # Build the action form and populate it with available actions. if actions: action_form = self.action_form(auto_id=None) - action_form.fields['action'].choices = self.get_action_choices(request) + action_form.fields['action'].choices = \ + self.get_action_choices(request) else: action_form = None @@ -439,8 +436,10 @@ def filter_file_permission(qs, permissions): 'actions_on_top': self.actions_on_top, 'actions_on_bottom': self.actions_on_bottom, 'actions_selection_counter': self.actions_selection_counter, - 'selection_note': _('0 of %(cnt)s selected') % {'cnt': len(paginated_items.object_list)}, - 'selection_note_all': selection_note_all % {'total_count': paginator.count}, + 'selection_note': _('0 of %(cnt)s selected') % { + 'cnt': len(paginated_items.object_list)}, + 'selection_note_all': selection_note_all % { + 'total_count': paginator.count}, 'media': self.media, 'enable_permissions': settings.FILER_ENABLE_PERMISSIONS }, context_instance=RequestContext(request)) @@ -488,7 +487,8 @@ def response_action(self, request, files_queryset, folders_queryset): # the action explicitly on all objects. selected = request.POST.getlist(helpers.ACTION_CHECKBOX_NAME) if not selected and not select_across: - # Reminder that something needs to be selected or nothing will happen + # Reminder that something needs to be selected or + # nothing will happen msg = _("Items must be selected in order to perform " "actions on them. No items have been changed.") self.message_user(request, msg) @@ -506,7 +506,8 @@ def response_action(self, request, files_queryset, folders_queryset): # Perform the action only on the selected objects files_queryset = files_queryset.filter(pk__in=selected_files) - folders_queryset = folders_queryset.filter(pk__in=selected_folders) + folders_queryset = folders_queryset.filter( + pk__in=selected_folders) response = func(self, request, files_queryset, folders_queryset) @@ -530,7 +531,8 @@ def get_actions(self, request): def move_to_clipboard(self, request, files_queryset, folders_queryset): """ - Action which moves the selected files and files in selected folders to clipboard. + Action which moves the selected files and files in selected folders + to clipboard. """ if not self.has_change_permission(request): @@ -544,12 +546,16 @@ def move_to_clipboard(self, request, files_queryset, folders_queryset): check_files_edit_permissions(request, files_queryset) check_folder_edit_permissions(request, folders_queryset) - # TODO: Display a confirmation page if moving more than X files to clipboard? + # TODO: Display a confirmation page if moving more than X files + # to clipboard? - files_count = [0] # We define it like that so that we can modify it inside the move_files function + # We define it like that so that we can modify it inside the + # move_files function + files_count = [0] def move_files(files): - files_count[0] += tools.move_file_to_clipboard(request, files, clipboard) + files_count[0] += tools.move_file_to_clipboard( + request, files, clipboard) def move_folders(folders): for f in folders: @@ -559,17 +565,21 @@ def move_folders(folders): move_files(files_queryset) move_folders(folders_queryset) if files_count[0] > 0: - self.message_user(request, _("Successfully moved %(count)d files to clipboard.") % { - "count": files_count[0], - }) + self.message_user(request, + _("Successfully moved %(count)d files to clipboard.") % { + "count": files_count[0], }) return None - move_to_clipboard.short_description = ugettext_lazy("Move selected files to clipboard") + move_to_clipboard.short_description = ugettext_lazy( + "Move selected files to clipboard") - def files_set_public_or_private(self, request, set_public, files_queryset, folders_queryset): + def files_set_public_or_private(self, request, set_public, + files_queryset, folders_queryset): """ - Action which enables or disables permissions for selected files and files in selected folders to clipboard (set them private or public). + Action which enables or disables permissions for selected + files and files in selected folders to clipboard + (set them private or public). """ if not self.has_change_permission(request): @@ -581,7 +591,9 @@ def files_set_public_or_private(self, request, set_public, files_queryset, folde check_files_edit_permissions(request, files_queryset) check_folder_edit_permissions(request, folders_queryset) - files_count = [0] # We define it like that so that we can modify it inside the set_files function + # We define it like that so that we can modify it inside the + # set_files function + files_count = [0] def set_files(files): for f in files: @@ -599,35 +611,42 @@ def set_folders(folders): set_folders(folders_queryset) if set_public: - self.message_user(request, _("Successfully disabled permissions for %(count)d files.") % { - "count": files_count[0], - }) + self.message_user(request, + _("Successfully disabled permissions for %(count)d files.") % { + "count": files_count[0], }) else: - self.message_user(request, _("Successfully enabled permissions for %(count)d files.") % { - "count": files_count[0], - }) + self.message_user(request, + _("Successfully enabled permissions for %(count)d files.") % { + "count": files_count[0], }) return None def files_set_private(self, request, files_queryset, folders_queryset): - return self.files_set_public_or_private(request, False, files_queryset, folders_queryset) + return self.files_set_public_or_private( + request, False, files_queryset, folders_queryset) - files_set_private.short_description = ugettext_lazy("Enable permissions for selected files") + files_set_private.short_description = ugettext_lazy( + "Enable permissions for selected files") def files_set_public(self, request, files_queryset, folders_queryset): - return self.files_set_public_or_private(request, True, files_queryset, folders_queryset) + return self.files_set_public_or_private( + request, True, files_queryset, folders_queryset) - files_set_public.short_description = ugettext_lazy("Disable permissions for selected files") + files_set_public.short_description = ugettext_lazy( + "Disable permissions for selected files") - def delete_files_or_folders(self, request, files_queryset, folders_queryset): + def delete_files_or_folders(self, request, + files_queryset, folders_queryset): """ Action which deletes the selected files and/or folders. This action first displays a confirmation page whichs shows all the - deleteable files and/or folders, or, if the user has no permission on one of the related - childs (foreignkeys), a "permission denied" message. + deleteable files and/or folders, or, if the user has no permission + on one of the related childs (foreignkeys), a "permission denied" + message. - Next, it delets all selected files and/or folders and redirects back to the folder. + Next, it delets all selected files and/or folders and redirects back + to the folder. """ opts = self.model._meta app_label = opts.app_label @@ -636,24 +655,36 @@ def delete_files_or_folders(self, request, files_queryset, folders_queryset): if not self.has_delete_permission(request): raise PermissionDenied - current_folder = self._get_current_action_folder(request, files_queryset, folders_queryset) + current_folder = self._get_current_action_folder( + request, files_queryset, folders_queryset) all_protected = [] - # Populate deletable_objects, a data structure of all related objects that - # will also be deleted. + # Populate deletable_objects, a data structure of all related + # objects that will also be deleted. # Hopefully this also checks for necessary permissions. # TODO: Check if permissions are really verified - (args, varargs, keywords, defaults) = inspect.getargspec(get_deleted_objects) + (args, varargs, keywords, defaults) = \ + inspect.getargspec(get_deleted_objects) if 'levels_to_root' in args: # Django 1.2 - deletable_files, perms_needed_files = get_deleted_objects(files_queryset, files_queryset.model._meta, request.user, self.admin_site, levels_to_root=2) - deletable_folders, perms_needed_folders = get_deleted_objects(folders_queryset, folders_queryset.model._meta, request.user, self.admin_site, levels_to_root=2) + deletable_files, perms_needed_files = get_deleted_objects( + files_queryset, files_queryset.model._meta, request.user, + self.admin_site, levels_to_root=2) + deletable_folders, perms_needed_folders = get_deleted_objects( + folders_queryset, folders_queryset.model._meta, request.user, + self.admin_site, levels_to_root=2) else: # Django 1.3 using = router.db_for_write(self.model) - deletable_files, perms_needed_files, protected_files = get_deleted_objects(files_queryset, files_queryset.model._meta, request.user, self.admin_site, using) - deletable_folders, perms_needed_folders, protected_folders = get_deleted_objects(folders_queryset, folders_queryset.model._meta, request.user, self.admin_site, using) + deletable_files, perms_needed_files, protected_files = \ + get_deleted_objects( + files_queryset, files_queryset.model._meta, + request.user, self.admin_site, using) + deletable_folders, perms_needed_folders, protected_folders = \ + get_deleted_objects( + folders_queryset, folders_queryset.model._meta, + request.user, self.admin_site, using) all_protected.extend(protected_files) all_protected.extend(protected_folders) @@ -661,7 +692,8 @@ def delete_files_or_folders(self, request, files_queryset, folders_queryset): all_perms_needed = perms_needed_files.union(perms_needed_folders) # The user has already confirmed the deletion. - # Do the deletion and return a None to display the change list view again. + # Do the deletion and return a None to display the change list + # view again. if request.POST.get('post'): if all_perms_needed: raise PermissionDenied @@ -672,12 +704,15 @@ def delete_files_or_folders(self, request, files_queryset, folders_queryset): self.log_deletion(request, f, force_unicode(f)) f.delete() # delete all files in all selected folders and their children - # This would happen automatically by ways of the delete cascade, but then the individual .delete() - # methods won't be called and the files won't be deleted from the filesystem. + # This would happen automatically by ways of the delete + # cascade, but then the individual .delete() methods + # won't be called and the files won't be deleted + # from the filesystem. folder_ids = set() for folder in folders_queryset: folder_ids.add(folder.id) - folder_ids.update(folder.get_descendants().values_list('id', flat=True)) + folder_ids.update(folder.get_descendants().values_list( + 'id', flat=True)) for f in File.objects.filter(folder__in=folder_ids): self.log_deletion(request, f, force_unicode(f)) f.delete() @@ -685,9 +720,9 @@ def delete_files_or_folders(self, request, files_queryset, folders_queryset): for f in folders_queryset: self.log_deletion(request, f, force_unicode(f)) f.delete() - self.message_user(request, _("Successfully deleted %(count)d files and/or folders.") % { - "count": n, - }) + self.message_user(request, + _("Successfully deleted %(count)d files " + "and/or folders.") % {"count": n, }) # Return None to display the change list page again. return None @@ -718,7 +753,8 @@ def delete_files_or_folders(self, request, files_queryset, folders_queryset): "admin/filer/delete_selected_files_confirmation.html" ], context, context_instance=template.RequestContext(request)) - delete_files_or_folders.short_description = ugettext_lazy("Delete selected files and/or folders") + delete_files_or_folders.short_description = ugettext_lazy( + "Delete selected files and/or folders") # Copied from django.contrib.admin.util def _format_callback(self, obj, user, admin_site, perms_needed): @@ -763,7 +799,8 @@ def _check_move_perms(self, request, files_queryset, folders_queryset): return True return False - def _get_current_action_folder(self, request, files_queryset, folders_queryset): + def _get_current_action_folder(self, request, + files_queryset, folders_queryset): if files_queryset: return files_queryset[0].folder elif folders_queryset: @@ -773,36 +810,57 @@ def _get_current_action_folder(self, request, files_queryset, folders_queryset): def _list_folders_to_copy_or_move(self, request, folders): for fo in folders: - yield self._format_callback(fo, request.user, self.admin_site, set()) - children = list(self._list_folders_to_copy_or_move(request, fo.children.all())) - children.extend([self._format_callback(f, request.user, self.admin_site, set()) for f in sorted(fo.files)]) + yield self._format_callback( + fo, request.user, self.admin_site, set()) + children = list(self._list_folders_to_copy_or_move( + request, fo.children.all())) + children.extend([self._format_callback( + f, request.user, self.admin_site, set()) + for f in sorted(fo.files)]) if children: yield children - def _list_all_to_copy_or_move(self, request, files_queryset, folders_queryset): - to_copy_or_move = list(self._list_folders_to_copy_or_move(request, folders_queryset)) - to_copy_or_move.extend([self._format_callback(f, request.user, self.admin_site, set()) for f in sorted(files_queryset)]) + def _list_all_to_copy_or_move(self, request, + files_queryset, folders_queryset): + to_copy_or_move = list(self._list_folders_to_copy_or_move( + request, folders_queryset)) + to_copy_or_move.extend([self._format_callback( + f, request.user, self.admin_site, set()) + for f in sorted(files_queryset)]) return to_copy_or_move - def _list_all_destination_folders_recursive(self, request, folders_queryset, current_folder, folders, allow_self, level): + def _list_all_destination_folders_recursive(self, request, + folders_queryset, + current_folder, folders, + allow_self, level): for fo in folders: if not allow_self and fo in folders_queryset: - # We do not allow moving to selected folders or their descendants + # We do not allow moving to selected folders or their + # descendants continue if not fo.has_read_permission(request): continue # We do not allow copying/moving back to the folder itself - enabled = (allow_self or fo != current_folder) and fo.has_add_children_permission(request) - yield (fo, (mark_safe(("  " * level) + force_unicode(fo)), enabled)) - for c in self._list_all_destination_folders_recursive(request, folders_queryset, current_folder, fo.children.all(), allow_self, level + 1): + enabled = ((allow_self or fo != current_folder) and + fo.has_add_children_permission(request)) + yield (fo, (mark_safe(("  " * level) + + force_unicode(fo)), + enabled)) + for c in self._list_all_destination_folders_recursive( + request, folders_queryset, current_folder, + fo.children.all(), allow_self, level + 1): yield c - def _list_all_destination_folders(self, request, folders_queryset, current_folder, allow_self): - return list(self._list_all_destination_folders_recursive(request, folders_queryset, current_folder, FolderRoot().children, allow_self, 0)) + def _list_all_destination_folders(self, request, folders_queryset, + current_folder, allow_self): + return list(self._list_all_destination_folders_recursive( + request, folders_queryset, current_folder, FolderRoot().children, + allow_self, 0)) - def _move_files_and_folders_impl(self, files_queryset, folders_queryset, destination): + def _move_files_and_folders_impl(self, files_queryset, folders_queryset, + destination): for f in files_queryset: f.folder = destination f.save() @@ -810,39 +868,51 @@ def _move_files_and_folders_impl(self, files_queryset, folders_queryset, destina f.move_to(destination, 'last-child') f.save() - def move_files_and_folders(self, request, files_queryset, folders_queryset): + def move_files_and_folders(self, request, + files_queryset, folders_queryset): opts = self.model._meta app_label = opts.app_label - current_folder = self._get_current_action_folder(request, files_queryset, folders_queryset) - perms_needed = self._check_move_perms(request, files_queryset, folders_queryset) - to_move = self._list_all_to_copy_or_move(request, files_queryset, folders_queryset) - folders = self._list_all_destination_folders(request, folders_queryset, current_folder, False) + current_folder = self._get_current_action_folder( + request, files_queryset, folders_queryset) + perms_needed = self._check_move_perms( + request, files_queryset, folders_queryset) + to_move = self._list_all_to_copy_or_move( + request, files_queryset, folders_queryset) + folders = self._list_all_destination_folders( + request, folders_queryset, current_folder, False) if request.method == 'POST' and request.POST.get('post'): if perms_needed: raise PermissionDenied try: - destination = Folder.objects.get(pk=request.POST.get('destination')) + destination = Folder.objects.get( + pk=request.POST.get('destination')) except Folder.DoesNotExist: raise PermissionDenied folders_dict = dict(folders) - if destination not in folders_dict or not folders_dict[destination][1]: + if (destination not in folders_dict or + not folders_dict[destination][1]): raise PermissionDenied # We count only topmost files and folders here n = files_queryset.count() + folders_queryset.count() - conflicting_names = [folder.name for folder in Folder.objects.filter( - parent=destination, - name__in=folders_queryset.values('name'))] + conflicting_names = [folder.name + for folder in Folder.objects.filter( + parent=destination, + name__in=folders_queryset.values('name'))] if conflicting_names: - messages.error(request, _(u"Folders with names %s already exist at the selected " - "destination") % u", ".join(conflicting_names)) + messages.error(request, + _(u"Folders with names %s already exist at the selected " + "destination") % u", ".join(conflicting_names)) elif n: - self._move_files_and_folders_impl(files_queryset, folders_queryset, destination) - self.message_user(request, _("Successfully moved %(count)d files and/or folders to folder '%(destination)s'.") % { - "count": n, - "destination": destination, - }) + self._move_files_and_folders_impl( + files_queryset, folders_queryset, destination) + self.message_user(request, + _("Successfully moved %(count)d files and/or " + "folders to folder '%(destination)s'.") % { + "count": n, + "destination": destination, + }) return None context = { @@ -865,12 +935,15 @@ def move_files_and_folders(self, request, files_queryset, folders_queryset): "admin/filer/folder/choose_move_destination.html" ], context, context_instance=template.RequestContext(request)) - move_files_and_folders.short_description = ugettext_lazy("Move selected files and/or folders") + move_files_and_folders.short_description = ugettext_lazy( + "Move selected files and/or folders") def _rename_file(self, file_obj, form_data, counter, global_counter): - original_basename, original_extension = os.path.splitext(file_obj.original_filename) + original_basename, original_extension = os.path.splitext( + file_obj.original_filename) if file_obj.name: - current_basename, current_extension = os.path.splitext(file_obj.name) + current_basename, current_extension = os.path.splitext( + file_obj.name) else: current_basename = "" current_extension = "" @@ -882,8 +955,8 @@ def _rename_file(self, file_obj, form_data, counter, global_counter): 'current_basename': current_basename, 'current_extension': current_extension, 'current_folder': file_obj.folder.name, - 'counter': counter + 1, # 1-based - 'global_counter': global_counter + 1, # 1-based + 'counter': counter + 1, # 1-based + 'global_counter': global_counter + 1, # 1-based } file_obj.save() @@ -895,9 +968,12 @@ def _rename_files(self, files, form_data, global_counter): return n def _rename_folder(self, folder, form_data, global_counter): - return self._rename_files_impl(folder.files.all(), folder.children.all(), form_data, global_counter) + return self._rename_files_impl( + folder.files.all(), folder.children.all(), + form_data, global_counter) - def _rename_files_impl(self, files_queryset, folders_queryset, form_data, global_counter): + def _rename_files_impl(self, files_queryset, folders_queryset, + form_data, global_counter): n = 0 for f in folders_queryset: @@ -911,9 +987,12 @@ def rename_files(self, request, files_queryset, folders_queryset): opts = self.model._meta app_label = opts.app_label - current_folder = self._get_current_action_folder(request, files_queryset, folders_queryset) - perms_needed = self._check_move_perms(request, files_queryset, folders_queryset) - to_rename = self._list_all_to_copy_or_move(request, files_queryset, folders_queryset) + current_folder = self._get_current_action_folder( + request, files_queryset, folders_queryset) + perms_needed = self._check_move_perms( + request, files_queryset, folders_queryset) + to_rename = self._list_all_to_copy_or_move( + request, files_queryset, folders_queryset) if request.method == 'POST' and request.POST.get('post'): if perms_needed: @@ -921,10 +1000,13 @@ def rename_files(self, request, files_queryset, folders_queryset): form = RenameFilesForm(request.POST) if form.is_valid(): if files_queryset.count() + folders_queryset.count(): - n = self._rename_files_impl(files_queryset, folders_queryset, form.cleaned_data, 0) - self.message_user(request, _("Successfully renamed %(count)d files.") % { - "count": n, - }) + n = self._rename_files_impl( + files_queryset, folders_queryset, + form.cleaned_data, 0) + self.message_user(request, + _("Successfully renamed %(count)d files.") % { + "count": n, + }) return None else: form = RenameFilesForm() @@ -985,7 +1067,8 @@ def has_collisions(filer_file): message = success_format.format(f.actual_name) self.message_user(request, _(message)) - extract_files.short_description = ugettext_lazy("Extract selected zip files") + extract_files.short_description = ugettext_lazy( + "Extract selected zip files") def _generate_new_filename(self, filename, suffix): basename, extension = os.path.splitext(filename) @@ -993,10 +1076,12 @@ def _generate_new_filename(self, filename, suffix): def _copy_file(self, file_obj, destination, suffix, overwrite): if overwrite: - # Not yet implemented as we have to find a portable (for different storage backends) way to overwrite files + # Not yet implemented as we have to find a portable + # (for different storage backends) way to overwrite files raise NotImplementedError - # We are assuming here that we are operating on an already saved database objects with current database state available + # We are assuming here that we are operating on an already saved + # database objects with current database state available filename = self._generate_new_filename(file_obj.file.name, suffix) @@ -1006,7 +1091,8 @@ def _copy_file(self, file_obj, destination, suffix, overwrite): file_obj.save() file_obj.folder = destination file_obj.file = file_obj._copy_file(filename) - file_obj.original_filename = self._generate_new_filename(file_obj.original_filename, suffix) + file_obj.original_filename = self._generate_new_filename( + file_obj.original_filename, suffix) file_obj.save() def _copy_files(self, files, destination, suffix, overwrite): @@ -1023,10 +1109,12 @@ def _get_available_name(self, destination, name): def _copy_folder(self, folder, destination, suffix, overwrite): if overwrite: - # Not yet implemented as we have to find a portable (for different storage backends) way to overwrite files + # Not yet implemented as we have to find a portable + # (for different storage backends) way to overwrite files raise NotImplementedError - # TODO: Should we also allow not to overwrite the folder if it exists, but just copy into it? + # TODO: Should we also allow not to overwrite the folder + # if it exists, but just copy into it? # TODO: Is this a race-condition? Would this be a problem? foldername = self._get_available_name(destination, folder.name) @@ -1037,7 +1125,8 @@ def _copy_folder(self, folder, destination, suffix, overwrite): folder.pk = None folder.id = None folder.name = foldername - folder.insert_at(destination, 'last-child', True) # We save folder here + # We save folder here + folder.insert_at(destination, 'last-child', True) for perm in FolderPermission.objects.filter(folder=old_folder): perm.pk = None @@ -1045,9 +1134,12 @@ def _copy_folder(self, folder, destination, suffix, overwrite): perm.folder = folder perm.save() - return 1 + self._copy_files_and_folders_impl(old_folder.files.all(), old_folder.children.all(), folder, suffix, overwrite) + return 1 + self._copy_files_and_folders_impl( + old_folder.files.all(), old_folder.children.all(), + folder, suffix, overwrite) - def _copy_files_and_folders_impl(self, files_queryset, folders_queryset, destination, suffix, overwrite): + def _copy_files_and_folders_impl(self, files_queryset, folders_queryset, + destination, suffix, overwrite): n = self._copy_files(files_queryset, destination, suffix, overwrite) for f in folders_queryset: @@ -1055,14 +1147,19 @@ def _copy_files_and_folders_impl(self, files_queryset, folders_queryset, destina return n - def copy_files_and_folders(self, request, files_queryset, folders_queryset): + def copy_files_and_folders(self, request, + files_queryset, folders_queryset): opts = self.model._meta app_label = opts.app_label - current_folder = self._get_current_action_folder(request, files_queryset, folders_queryset) - perms_needed = self._check_copy_perms(request, files_queryset, folders_queryset) - to_copy = self._list_all_to_copy_or_move(request, files_queryset, folders_queryset) - folders = self._list_all_destination_folders(request, folders_queryset, current_folder, True) + current_folder = self._get_current_action_folder( + request, files_queryset, folders_queryset) + perms_needed = self._check_copy_perms( + request, files_queryset, folders_queryset) + to_copy = self._list_all_to_copy_or_move( + request, files_queryset, folders_queryset) + folders = self._list_all_destination_folders( + request, folders_queryset, current_folder, True) if request.method == 'POST' and request.POST.get('post'): if perms_needed: @@ -1070,25 +1167,32 @@ def copy_files_and_folders(self, request, files_queryset, folders_queryset): form = CopyFilesAndFoldersForm(request.POST) if form.is_valid(): try: - destination = Folder.objects.get(pk=request.POST.get('destination')) + destination = Folder.objects.get( + pk=request.POST.get('destination')) except Folder.DoesNotExist: raise PermissionDenied folders_dict = dict(folders) - if destination not in folders_dict or not folders_dict[destination][1]: + if (destination not in folders_dict or + not folders_dict[destination][1]): raise PermissionDenied if files_queryset.count() + folders_queryset.count(): # We count all files and folders here (recursivelly) - n = self._copy_files_and_folders_impl(files_queryset, folders_queryset, destination, form.cleaned_data['suffix'], False) - self.message_user(request, _("Successfully copied %(count)d files and/or folders to folder '%(destination)s'.") % { - "count": n, - "destination": destination, - }) + n = self._copy_files_and_folders_impl( + files_queryset, folders_queryset, destination, + form.cleaned_data['suffix'], False) + self.message_user(request, + _("Successfully copied %(count)d files and/or " + "folders to folder '%(destination)s'.") % { + "count": n, + "destination": destination, + }) return None else: form = CopyFilesAndFoldersForm() try: - selected_destination_folder = int(request.POST.get('destination', 0)) + selected_destination_folder = \ + int(request.POST.get('destination', 0)) except ValueError: if current_folder: selected_destination_folder = current_folder.pk @@ -1116,7 +1220,8 @@ def copy_files_and_folders(self, request, files_queryset, folders_queryset): "admin/filer/folder/choose_copy_destination.html" ], context, context_instance=template.RequestContext(request)) - copy_files_and_folders.short_description = ugettext_lazy("Copy selected files and/or folders") + copy_files_and_folders.short_description = ugettext_lazy( + "Copy selected files and/or folders") def _check_resize_perms(self, request, files_queryset, folders_queryset): try: @@ -1129,25 +1234,39 @@ def _check_resize_perms(self, request, files_queryset, folders_queryset): def _list_folders_to_resize(self, request, folders): for fo in folders: - children = list(self._list_folders_to_resize(request, fo.children.all())) - children.extend([self._format_callback(f, request.user, self.admin_site, set()) for f in sorted(fo.files) if isinstance(f, Image)]) + children = list(self._list_folders_to_resize( + request, fo.children.all())) + children.extend([self._format_callback( + f, request.user, self.admin_site, set()) + for f in sorted(fo.files) + if isinstance(f, Image)]) if children: - yield self._format_callback(fo, request.user, self.admin_site, set()) + yield self._format_callback( + fo, request.user, self.admin_site, set()) yield children def _list_all_to_resize(self, request, files_queryset, folders_queryset): - to_resize = list(self._list_folders_to_resize(request, folders_queryset)) - to_resize.extend([self._format_callback(f, request.user, self.admin_site, set()) for f in sorted(files_queryset) if isinstance(f, Image)]) + to_resize = list(self._list_folders_to_resize( + request, folders_queryset)) + to_resize.extend([self._format_callback( + f, request.user, self.admin_site, set()) + for f in sorted(files_queryset) + if isinstance(f, Image)]) return to_resize - def _new_subject_location(self, original_width, original_height, new_width, new_height, x, y, crop): + def _new_subject_location(self, original_width, original_height, + new_width, new_height, x, y, crop): # TODO: We could probably do better return (round(new_width / 2), round(new_height / 2)) def _resize_image(self, image, form_data): original_width = float(image.width) original_height = float(image.height) - thumbnailer = FilerActionThumbnailer(file=image.file.file, name=image.file.name, source_storage=image.file.source_storage, thumbnail_storage=image.file.source_storage) + thumbnailer = FilerActionThumbnailer( + file=image.file.file, + name=image.file.name, + source_storage=image.file.source_storage, + thumbnail_storage=image.file.source_storage) # This should overwrite the original image new_image = thumbnailer.get_thumbnail({ 'size': (form_data['width'], form_data['height']), @@ -1167,7 +1286,9 @@ def _resize_image(self, image, form_data): y = float(y) new_width = float(image.width) new_height = float(image.height) - (new_x, new_y) = self._new_subject_location(original_width, original_height, new_width, new_height, x, y, form_data['crop']) + (new_x, new_y) = self._new_subject_location( + original_width, original_height, new_width, new_height, + x, y, form_data['crop']) image.subject_location = "%d,%d" % (new_x, new_y) image.save() @@ -1180,9 +1301,11 @@ def _resize_images(self, files, form_data): return n def _resize_folder(self, folder, form_data): - return self._resize_images_impl(folder.files.all(), folder.children.all(), form_data) + return self._resize_images_impl( + folder.files.all(), folder.children.all(), form_data) - def _resize_images_impl(self, files_queryset, folders_queryset, form_data): + def _resize_images_impl(self, files_queryset, + folders_queryset, form_data): n = self._resize_images(files_queryset, form_data) for f in folders_queryset: @@ -1194,9 +1317,12 @@ def resize_images(self, request, files_queryset, folders_queryset): opts = self.model._meta app_label = opts.app_label - current_folder = self._get_current_action_folder(request, files_queryset, folders_queryset) - perms_needed = self._check_resize_perms(request, files_queryset, folders_queryset) - to_resize = self._list_all_to_resize(request, files_queryset, folders_queryset) + current_folder = self._get_current_action_folder( + request, files_queryset, folders_queryset) + perms_needed = self._check_resize_perms( + request, files_queryset, folders_queryset) + to_resize = self._list_all_to_resize( + request, files_queryset, folders_queryset) if request.method == 'POST' and request.POST.get('post'): if perms_needed: @@ -1204,16 +1330,22 @@ def resize_images(self, request, files_queryset, folders_queryset): form = ResizeImagesForm(request.POST) if form.is_valid(): if form.cleaned_data.get('thumbnail_option'): - form.cleaned_data['width'] = form.cleaned_data['thumbnail_option'].width - form.cleaned_data['height'] = form.cleaned_data['thumbnail_option'].height - form.cleaned_data['crop'] = form.cleaned_data['thumbnail_option'].crop - form.cleaned_data['upscale'] = form.cleaned_data['thumbnail_option'].upscale + form.cleaned_data['width'] = \ + form.cleaned_data['thumbnail_option'].width + form.cleaned_data['height'] = \ + form.cleaned_data['thumbnail_option'].height + form.cleaned_data['crop'] = \ + form.cleaned_data['thumbnail_option'].crop + form.cleaned_data['upscale'] = \ + form.cleaned_data['thumbnail_option'].upscale if files_queryset.count() + folders_queryset.count(): # We count all files here (recursivelly) - n = self._resize_images_impl(files_queryset, folders_queryset, form.cleaned_data) - self.message_user(request, _("Successfully resized %(count)d images.") % { - "count": n, - }) + n = self._resize_images_impl( + files_queryset, folders_queryset, form.cleaned_data) + self.message_user(request, + _("Successfully resized %(count)d images.") % { + "count": n, + }) return None else: form = ResizeImagesForm() @@ -1224,7 +1356,8 @@ def resize_images(self, request, files_queryset, folders_queryset): "breadcrumbs_action": _("Resize images"), "to_resize": to_resize, "resize_form": form, - "cmsplugin_enabled": 'cmsplugin_filer_image' in django_settings.INSTALLED_APPS, + "cmsplugin_enabled": ('cmsplugin_filer_image' + in django_settings.INSTALLED_APPS), "files_queryset": files_queryset, "folders_queryset": folders_queryset, "perms_lacking": perms_needed, diff --git a/filer/admin/permissions.py b/filer/admin/permissions.py index beb24ee0e..05078a2ae 100644 --- a/filer/admin/permissions.py +++ b/filer/admin/permissions.py @@ -4,11 +4,6 @@ class PrimitivePermissionAwareModelAdmin(admin.ModelAdmin): - def has_add_permission(self, request): - # we don't have a "add" permission... but all adding is handled - # by special methods that go around these permissions anyway - # TODO: reactivate return False - return False def has_change_permission(self, request, obj=None): if hasattr(obj, 'has_edit_permission'): @@ -24,9 +19,12 @@ def has_delete_permission(self, request, obj=None): return self.has_change_permission(request, obj) def _get_post_url(self, obj): - """ Needed to retrieve the changelist url as Folder/File can be extended - and admin url may change """ - ## Code borrowed from django ModelAdmin to determine changelist on the fly + """ + Needed to retrieve the changelist url as Folder/File can be extended + and admin url may change + """ + # Code borrowed from django ModelAdmin to determine + # changelist on the fly opts = obj._meta module_name = opts.module_name return reverse('admin:%s_%s_changelist' % diff --git a/filer/models/foldermodels.py b/filer/models/foldermodels.py index 08dc020b4..b08e0cb81 100644 --- a/filer/models/foldermodels.py +++ b/filer/models/foldermodels.py @@ -106,8 +106,8 @@ class Folder(models.Model, mixins.IconsMixin): CORE_FOLDER: 'Core Folder', } - parent = models.ForeignKey('self', verbose_name=('parent'), null=True, blank=True, - related_name='children') + parent = models.ForeignKey('self', verbose_name=('parent'), null=True, + blank=True, related_name='children') name = models.CharField(_('name'), max_length=255) owner = models.ForeignKey(auth_models.User, verbose_name=('owner'), @@ -117,7 +117,7 @@ class Folder(models.Model, mixins.IconsMixin): uploaded_at = models.DateTimeField(_('uploaded at'), auto_now_add=True) created_at = models.DateTimeField(_('created at'), auto_now_add=True) - modified_at = models.DateTimeField(_('modified at'),auto_now=True) + modified_at = models.DateTimeField(_('modified at'), auto_now=True) folder_type = models.IntegerField(choices=FOLDER_TYPES.items(), default=SITE_FOLDER) @@ -129,18 +129,66 @@ class Folder(models.Model, mixins.IconsMixin): objects = FolderManager() def clean(self): + if self.name == filer.models.clipboardmodels.Clipboard.folder_name: raise ValidationError( _(u'%s is reserved for internal use. ' 'Please choose a different name') % self.name) + duplicate_folders_q = Folder.objects.filter( + parent=self.parent_id, + name=self.name) + if self.pk: + duplicate_folders_q = duplicate_folders_q.exclude( + pk=self.pk) + + if duplicate_folders_q.exists(): + raise ValidationError( + 'File or folder with this name already exists.') + + if not self.parent: + if (self.folder_type == Folder.SITE_FOLDER and + not self.site): + raise ValidationError('Folder is a Site folder. ' + 'Site is required.') + if (self.folder_type == Folder.CORE_FOLDER and not self.parent and + self.site): + raise ValidationError('Folder is a Core folder. ' + 'Site must be empty.') + + def set_site_for_folder_type(self): + """ + This will keep the rules: + * site for site folders can be changed only for the folders + with no parent(root folders) + * core folders should not have any site + """ + if self.folder_type == Folder.CORE_FOLDER: + self.site = None + else: + # site folders - make sure it keeps the site from parent + if self.parent: + self.site = self.parent.site + + def update_descendants_folder_type(self): + """ + Folder type should be preserved to all descendants + """ + self.get_descendants().update( + folder_type=self.folder_type, + site=self.site) + def save(self, *args, **kwargs): if not filer_settings.FOLDER_AFFECTS_URL: - return super(Folder, self).save(*args, **kwargs) + self.set_site_for_folder_type() + super(Folder, self).save(*args, **kwargs) + self.update_descendants_folder_type() + return with transaction.commit_manually(): - # The manual transaction management here breaks the transaction management - # from django.contrib.admin.options.ModelAdmin.change_view + # The manual transaction management here breaks the transaction + # management from + # django.contrib.admin.options.ModelAdmin.change_view storages = [] old_locations = [] new_locations = [] @@ -150,7 +198,9 @@ def delete_from_locations(locations, storages): storage.delete(location) try: + self.set_site_for_folder_type() super(Folder, self).save(*args, **kwargs) + self.update_descendants_folder_type() all_files = [] for folder in self.get_descendants(include_self=True): all_files += folder.files @@ -196,7 +246,7 @@ def entries_with_names(self, names): children of this folder and have their names in the given list of names. """ q = Q(name__in=names) - q |= Q(original_filename__in=names) & (Q(name__isnull=True)|Q(name='')) + q |= Q(original_filename__in=names) & (Q(name__isnull=True) | Q(name='')) files_with_names = self.all_files.filter(q) folders_with_names = self.children.filter(name__in=names) return list(itertools.chain(files_with_names, folders_with_names)) @@ -225,7 +275,8 @@ def logical_path(self): @property def pretty_logical_path(self): - return u"/%s" % u"/".join([f.name for f in self.logical_path+[self]]) + return u"/%s" % u"/".join([f.name + for f in self.logical_path + [self]]) @property def quoted_logical_path(self): @@ -389,4 +440,3 @@ class Meta: verbose_name = _('folder permission') verbose_name_plural = _('folder permissions') app_label = 'filer' - diff --git a/filer/tests/admin.py b/filer/tests/admin.py index be772aa3c..266c2aaf0 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -4,6 +4,7 @@ from django.core.urlresolvers import reverse import django.core.files from django.contrib.admin import helpers, site +from django.contrib.sites.models import Site from django.contrib.auth.models import User, Group from django.http import HttpRequest from filer.models.filemodels import File @@ -41,14 +42,22 @@ def test_filer_make_root_folder_get(self): def test_filer_make_root_folder_post(self): FOLDER_NAME = "root folder 1" self.assertEqual(Folder.objects.count(), 0) - response = self.client.post(reverse('admin:filer-directory_listing-make_root_folder'), - { - "name":FOLDER_NAME, - }) + data_to_post = { + "name":FOLDER_NAME, + } + response = self.client.post( + reverse('admin:filer-directory_listing-make_root_folder'), + data_to_post) + self.assertIn('Site is required', response.content) + + data_to_post['site'] = 1 + response = self.client.post( + reverse('admin:filer-directory_listing-make_root_folder'), + data_to_post) + self.assertEqual(Folder.objects.count(), 1) self.assertEqual(Folder.objects.all()[0].name, FOLDER_NAME) - #TODO: not sure why the status code is 200 - self.assertEqual(response.status_code, 200) + self.assertEqual(response.status_code, 302) def test_filer_directory_listing_root_empty_get(self): response = self.client.post(reverse('admin:filer-directory_listing-root')) @@ -63,36 +72,58 @@ def test_filer_directory_listing_root_get(self): def test_validate_no_duplcate_folders(self): FOLDER_NAME = "root folder 1" self.assertEqual(Folder.objects.count(), 0) - response = self.client.post(reverse('admin:filer-directory_listing-make_root_folder'), { - "name":FOLDER_NAME, - "_popup": 1 - }) + post_data = { "name": FOLDER_NAME, "_popup": 1 } + response = self.client.post( + reverse('admin:filer-directory_listing-make_root_folder'), + post_data) + self.assertIn('Site is required', response.content) + post_data['site'] = 1 + response = self.client.post( + reverse('admin:filer-directory_listing-make_root_folder'), + post_data) self.assertEqual(Folder.objects.count(), 1) self.assertEqual(Folder.objects.all()[0].name, FOLDER_NAME) # and create another one - response = self.client.post(reverse('admin:filer-directory_listing-make_root_folder'), - {"name":FOLDER_NAME, "_popup": 1}) + post_data = { "name": FOLDER_NAME, "_popup": 1 } + response = self.client.post( + reverse('admin:filer-directory_listing-make_root_folder'), + post_data) # second folder didn't get created self.assertEqual(Folder.objects.count(), 1) self.assertIn('File or folder with this name already exists', response.content) def test_validate_no_duplcate_folders_on_rename(self): self.assertEqual(Folder.objects.count(), 0) - response = self.client.post(reverse('admin:filer-directory_listing-make_root_folder'), { - "name": "foo", - "_popup": 1}) + post_data = { "name": "foo", "_popup": 1} + response = self.client.post( + reverse('admin:filer-directory_listing-make_root_folder'), + post_data) + self.assertIn('Site is required', response.content) + post_data['site'] = 1 + response = self.client.post( + reverse('admin:filer-directory_listing-make_root_folder'), + post_data) + self.assertEqual(Folder.objects.count(), 1) self.assertEqual(Folder.objects.all()[0].name, "foo") # and create another one - response = self.client.post(reverse('admin:filer-directory_listing-make_root_folder'), { - "name": "bar", - "_popup": 1}) + post_data = { "name": "bar", "_popup": 1 } + response = self.client.post( + reverse('admin:filer-directory_listing-make_root_folder'), + post_data) + self.assertIn('Site is required', response.content) + + post_data['site'] = 1 + response = self.client.post( + reverse('admin:filer-directory_listing-make_root_folder'), + post_data) + self.assertEqual(Folder.objects.count(), 2) bar = Folder.objects.get(name="bar") response = self.client.post("/admin/filer/folder/%d/" % bar.pk, { "name": "foo", "_popup": 1}) - self.assertIn('Folder with this name already exists', response.content) + self.assertIn('File or folder with this name already exists', response.content) # refresh from db and validate that it's name didn't change bar = Folder.objects.get(pk=bar.pk) self.assertEqual(bar.name, "bar") diff --git a/filer/views.py b/filer/views.py index a9609fb6e..43d442042 100755 --- a/filer/views.py +++ b/filer/views.py @@ -1,24 +1,11 @@ #-*- coding: utf-8 -*- from django import forms -from django.contrib.admin import widgets from django.contrib.auth.decorators import login_required from django.core.exceptions import PermissionDenied -from django.http import HttpResponseRedirect, HttpResponse +from django.http import HttpResponseRedirect from django.shortcuts import render_to_response from django.template import RequestContext -from django.utils.translation import ugettext_lazy as _ -from models import Folder, Image, Clipboard, tools, FolderRoot -from filer import settings as filer_settings - - -class NewFolderForm(forms.ModelForm): - class Meta: - model = Folder - fields = ('name',) - widgets = { - 'name': widgets.AdminTextInputWidget, - } - +from models import Folder, Image, Clipboard, tools def popup_status(request): @@ -35,6 +22,7 @@ def popup_param(request, separator="?"): else: return "" + def selectfolder_param(request, separator="&"): if selectfolder_status(request): return "%sselect_folder=1" % separator @@ -76,48 +64,6 @@ def edit_image(request, folder_id): }, context_instance=RequestContext(request)) -@login_required -def make_folder(request, folder_id=None): - if not folder_id: - folder_id = request.REQUEST.get('parent_id', None) - if folder_id: - folder = Folder.objects.get(id=folder_id) - else: - folder = None - - if request.user.is_superuser: - pass - elif folder == None: - # regular users may not add root folders unless configured otherwise - if not filer_settings.FILER_ALLOW_REGULAR_USERS_TO_ADD_ROOT_FOLDERS: - raise PermissionDenied - elif not folder.has_add_children_permission(request): - # the user does not have the permission to add subfolders - raise PermissionDenied - - if request.method == 'POST': - new_folder_form = NewFolderForm(request.POST) - if new_folder_form.is_valid(): - new_folder = new_folder_form.save(commit=False) - if (folder or FolderRoot()).entries_with_names([new_folder.name]): - new_folder_form._errors['name'] = new_folder_form.error_class([_( - 'File or folder with this name already exists.')]) - else: - new_folder.parent = folder - new_folder.owner = request.user - new_folder.save() - return HttpResponse('') - else: - new_folder_form = NewFolderForm() - return render_to_response('admin/filer/folder/new_folder_form.html', { - 'new_folder_form': new_folder_form, - 'is_popup': popup_status(request), - 'select_folder': selectfolder_status(request), - }, context_instance=RequestContext(request)) - - class UploadFileForm(forms.ModelForm): class Meta: model = Image diff --git a/test_settings.py b/test_settings.py index 9a51f06ce..c183e4878 100644 --- a/test_settings.py +++ b/test_settings.py @@ -15,6 +15,7 @@ 'easy_thumbnails', 'django.contrib.auth', 'django.contrib.contenttypes', + 'django.contrib.sites', 'django.contrib.admin', 'django.contrib.sessions', 'django.contrib.staticfiles', @@ -25,5 +26,5 @@ MEDIA_ROOT = os.path.abspath( os.path.join(TMP_ROOT, 'media') ) MEDIA_URL = '/media/' STATIC_URL = '/static/' - +SITE_ID = 1 USE_TZ = False # because of a bug in easy-thumbnails 1.0.3 From d8605b5bf2cc25e60174e67746c11f510ab7957c Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Wed, 11 Sep 2013 17:50:58 +0300 Subject: [PATCH 110/715] Added folder type display name in directory-listing template. --- filer/templates/admin/filer/folder/directory_listing.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/filer/templates/admin/filer/folder/directory_listing.html b/filer/templates/admin/filer/folder/directory_listing.html index 3a7e25db6..3c8515655 100644 --- a/filer/templates/admin/filer/folder/directory_listing.html +++ b/filer/templates/admin/filer/folder/directory_listing.html @@ -68,13 +68,13 @@
  • {% trans 'Upload' %}
  • {% include 'admin/filer/tools/upload_button_js.html' %} - +
    {% include "admin/filer/tools/search_form.html" %} {% if not folder.is_root %}

    {% if folder.parent %}{% else %}{% endif %} {% trans {{ folder.name }} - ({% blocktrans count folder.children_count as counter %}1 folder{% plural %}{{ counter }} folders{% endblocktrans %}, {% blocktrans count folder.file_count as counter %}1 file{% plural %}{{ counter }} files{% endblocktrans %}) +
    ({% blocktrans count folder.children_count as counter %}1 folder{% plural %}{{ counter }} folders{% endblocktrans %}, {% blocktrans count folder.file_count as counter %}1 file{% plural %}{{ counter }} files{% endblocktrans %})
    {{ folder.get_folder_type_display }}{% if folder.site %}: {{folder.site}}{%endif%}
    {% if is_popup %} {% if select_folder and folder.file_type == 'Folder' %} {% endif %} From 1b8ce4896c017d6af3fe6d443035b8afa1644205 Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Thu, 12 Sep 2013 12:08:50 +0300 Subject: [PATCH 111/715] Added tox support for running tests with pytest-django. --- .gitignore | 1 + filer/test_settings.py | 30 ++++++++++++++++++++++++++++++ test_urls.py => filer/test_urls.py | 0 test_settings.py | 29 +---------------------------- tox.ini | 11 +++++++++++ 5 files changed, 43 insertions(+), 28 deletions(-) create mode 100644 filer/test_settings.py rename test_urls.py => filer/test_urls.py (100%) create mode 100644 tox.ini diff --git a/.gitignore b/.gitignore index 157d67be8..783382f4d 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,4 @@ pep8.txt htmlcov/ share/ .idea +.tox diff --git a/filer/test_settings.py b/filer/test_settings.py new file mode 100644 index 000000000..38860393d --- /dev/null +++ b/filer/test_settings.py @@ -0,0 +1,30 @@ +#-*- coding: utf-8 -*- +import os, filer +DEBUG = True +PACKAGE_ROOT = os.path.abspath(os.path.join( + os.path.dirname(filer.__file__), '..')) +TMP_ROOT = os.path.abspath( os.path.join(PACKAGE_ROOT, 'tmp') ) +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(TMP_ROOT,'filer_test.sqlite3'), + }, + } +INSTALLED_APPS = [ + 'filer', + 'mptt', + 'easy_thumbnails', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.admin', + 'django.contrib.sessions', + 'django.contrib.staticfiles', +] + +ROOT_URLCONF = 'filer.test_urls' + +MEDIA_ROOT = os.path.abspath( os.path.join(TMP_ROOT, 'media') ) +MEDIA_URL = '/media/' +STATIC_URL = '/static/' + +USE_TZ = False # because of a bug in easy-thumbnails 1.0.3 diff --git a/test_urls.py b/filer/test_urls.py similarity index 100% rename from test_urls.py rename to filer/test_urls.py diff --git a/test_settings.py b/test_settings.py index 9a51f06ce..781dbc486 100644 --- a/test_settings.py +++ b/test_settings.py @@ -1,29 +1,2 @@ #-*- coding: utf-8 -*- -import os -DEBUG = True -PACKAGE_ROOT = os.path.abspath( os.path.dirname(__file__) ) -TMP_ROOT = os.path.abspath( os.path.join(PACKAGE_ROOT, 'tmp') ) -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(TMP_ROOT,'filer_test.sqlite3'), - }, - } -INSTALLED_APPS = [ - 'filer', - 'mptt', - 'easy_thumbnails', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.admin', - 'django.contrib.sessions', - 'django.contrib.staticfiles', -] - -ROOT_URLCONF = 'test_urls' - -MEDIA_ROOT = os.path.abspath( os.path.join(TMP_ROOT, 'media') ) -MEDIA_URL = '/media/' -STATIC_URL = '/static/' - -USE_TZ = False # because of a bug in easy-thumbnails 1.0.3 +from filer.test_settings import * diff --git a/tox.ini b/tox.ini new file mode 100644 index 000000000..74f90860f --- /dev/null +++ b/tox.ini @@ -0,0 +1,11 @@ +[tox] +envlist = pytest + +[testenv:pytest] +deps= + pytest-django + PIL +changedir= + {envdir} +commands= + py.test --pyargs filer.tests.__init__ --ds=filer.test_settings From 9247575efaff0c24bdd89f118bbfca0928ceaf1c Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Thu, 12 Sep 2013 14:00:49 +0300 Subject: [PATCH 112/715] Disabled test resize images action. --- filer/tests/admin.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/filer/tests/admin.py b/filer/tests/admin.py index be772aa3c..58c12fca0 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -425,9 +425,10 @@ def test_delete_files_or_folders_action_with_mixed_types(self): class FilerResizeOperationTests(BulkOperationsMixin, TestCase): def test_resize_images_action(self): # TODO: Test recursive (files and folders tree) processing - self.assertEqual(self.image_obj.width, 800) self.assertEqual(self.image_obj.height, 600) + # since the 'resize' action is disabled from the admin + return url = reverse('admin:filer-directory_listing', kwargs={ 'folder_id': self.src_folder.id, }) From 3c5038eaa127aa146495b3f692d4b84734d28f47 Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Thu, 12 Sep 2013 18:24:35 +0300 Subject: [PATCH 113/715] Bumps on the head. --- filer/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filer/__init__.py b/filer/__init__.py index 1af3239d2..7b132c224 100644 --- a/filer/__init__.py +++ b/filer/__init__.py @@ -1,3 +1,3 @@ #-*- coding: utf-8 -*- # version string following pep-0396 and pep-0386 -__version__ = '0.9pbs.8' # pragma: nocover +__version__ = '0.9pbs.9' # pragma: nocover From cd6f18d96414f15a480a7815a573d465a0d293f2 Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Fri, 13 Sep 2013 13:19:18 +0300 Subject: [PATCH 114/715] Fixed FilerApiTests.test_cdn_urls. --- filer/tests/models.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/filer/tests/models.py b/filer/tests/models.py index d84639f3c..a24b63775 100644 --- a/filer/tests/models.py +++ b/filer/tests/models.py @@ -3,6 +3,7 @@ import tempfile import urlparse import zipfile +import time from django.forms.models import modelform_factory from django.db.models import Q @@ -205,9 +206,12 @@ def test_cdn_urls(self): with SettingsOverride(filer_settings, CDN_DOMAIN=cdn_domain, USE_TZ=True, - CDN_INVALIDATION_TIME=0): + CDN_INVALIDATION_TIME=1): image = self.create_filer_image() _, netloc, _, _, _, _ = urlparse.urlparse(image.url) + self.assertEqual(netloc, '') + time.sleep(1) + _, netloc, _, _, _, _ = urlparse.urlparse(image.url) self.assertEqual(netloc, cdn_domain) for url in image.thumbnails.values(): _, netloc, _, _, _, _ = urlparse.urlparse(url) From b482a3c700e2d1698d6d28340bade80292a87272 Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Fri, 13 Sep 2013 13:21:43 +0300 Subject: [PATCH 115/715] LUN-1006: disabled tests for 'Permissions disabled' section --- filer/tests/admin.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/filer/tests/admin.py b/filer/tests/admin.py index 58c12fca0..f20524af1 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -333,6 +333,7 @@ def test_move_to_clipboard_action(self): self.assertEqual(self.src_folder.files.count(), 1) def test_files_set_public_action(self): + return self.image_obj.is_public = False self.image_obj.save() self.assertEqual(self.image_obj.is_public, False) @@ -347,6 +348,7 @@ def test_files_set_public_action(self): self.assertEqual(self.image_obj.is_public, True) def test_files_set_private_action(self): + return self.image_obj.is_public = True self.image_obj.save() self.assertEqual(self.image_obj.is_public, True) From f4cb32e2c1aa7119d093a858b47e184bd307a996 Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Fri, 13 Sep 2013 14:26:47 +0300 Subject: [PATCH 116/715] Add unittest results xml. --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 74f90860f..8bfd66875 100644 --- a/tox.ini +++ b/tox.ini @@ -8,4 +8,4 @@ deps= changedir= {envdir} commands= - py.test --pyargs filer.tests.__init__ --ds=filer.test_settings + py.test --pyargs --junitxml=unittests-results.xml filer.tests.__init__ --ds=filer.test_settings From 3d84cce7ed3291e3443ad827d44f04fc6d271c94 Mon Sep 17 00:00:00 2001 From: Zoltan Szeredi Date: Fri, 13 Sep 2013 15:52:15 +0300 Subject: [PATCH 117/715] Move tox.ini to work in progress. --- tox.ini => tox-wip.ini | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tox.ini => tox-wip.ini (100%) diff --git a/tox.ini b/tox-wip.ini similarity index 100% rename from tox.ini rename to tox-wip.ini From d2399c09ad8cab932ca77df34f71072c6678db0a Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Fri, 13 Sep 2013 19:25:17 +0300 Subject: [PATCH 118/715] New tests - unfinished. New folder type permission rules. --- docs/settings.rst | 14 +-- filer/admin/folderadmin.py | 43 ++++++-- filer/tests/__init__.py | 15 +-- filer/tests/admin.py | 220 +++++++++++++++++++++++++++++++++++++ filer/tests/helpers.py | 27 ++++- 5 files changed, 287 insertions(+), 32 deletions(-) diff --git a/docs/settings.rst b/docs/settings.rst index 5722c5eb7..c0f32e455 100644 --- a/docs/settings.rst +++ b/docs/settings.rst @@ -6,7 +6,7 @@ Settings ``FILER_ENABLE_PERMISSIONS`` ---------------------------- -Activate the or not the Permission check on the files and folders before +Activate the or not the Permission check on the files and folders before displaying them in the admin. When set to ``False`` it gives all the authorization to staff members based on standard Django model permissions. @@ -28,7 +28,7 @@ The prefix for static media where filer will look for bundled javascript, css and images. Defaults to ``/filer/`` if ``STATIC_URL`` is defined. Otherwise -falls back to ``/filer/``. It is the URL where the ``static/filer/`` +falls back to ``/filer/``. It is the URL where the ``static/filer/`` directory should be served. .. _FILER_STORAGES: @@ -122,19 +122,11 @@ Defaults to ``20`` ``FILER_SUBJECT_LOCATION_IMAGE_DEBUG`` -------------------------------------- -Draws a red circle around to point in the image that was used to do the +Draws a red circle around to point in the image that was used to do the subject location aware image cropping. Defaults to ``False`` -``FILER_ALLOW_REGULAR_USERS_TO_ADD_ROOT_FOLDERS`` -------------------------------------------------- - -Regular users are not allowed to create new folders at the root level, only -subfolders of already existing folders, unless this setting is set to ``True``. - -Defaults to ``False`` - ``FILER_FOLDER_AFFECTS_URL`` ---------------------------- diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 49ec79eed..4bd9eeed5 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -147,6 +147,13 @@ def delete_view(self, request, object_id, extra_context=None): except self.model.DoesNotExist: obj = None + if obj: + if obj.folder_type == Folder.CORE_FOLDER: + raise PermissionDenied + + if not obj.parent and not request.user.is_superuser: + raise PermissionDenied + r = super(FolderAdmin, self).delete_view( request=request, object_id=object_id, extra_context=extra_context) @@ -179,10 +186,6 @@ def get_urls(self): url(r'^(?P\d+)/list/$', self.admin_site.admin_view(self.directory_listing), name='filer-directory_listing'), - - url(r'^(?P\d+)/make_folder/$', - self.admin_site.admin_view(self.make_folder), - name='filer-directory_listing-make_folder'), url(r'^make_folder/$', self.admin_site.admin_view(self.make_folder), name='filer-directory_listing-make_root_folder'), @@ -198,6 +201,20 @@ def get_urls(self): url_patterns.extend(urls) return url_patterns + def change_view(self, request, object_id, *args, **kwargs): + obj = self.get_object(request, unquote(object_id)) + if obj.folder_type == Folder.CORE_FOLDER: + raise PermissionDenied + + if not obj.parent and not request.user.is_superuser: + raise PermissionDenied + + return super(FolderAdmin, self).change_view( + request, object_id, *args, **kwargs) + + def add_view(self, request, *args, **kwargs): + raise PermissionDenied + def make_folder(self, request, folder_id=None, *args, **kwargs): if not folder_id: folder_id = request.REQUEST.get('parent_id', None) @@ -209,15 +226,13 @@ def make_folder(self, request, folder_id=None, *args, **kwargs): if request.user.is_superuser: pass elif folder is None: - # regular users may not add root folders unless configured - # otherwise - if not filer_settings.FILER_ALLOW_REGULAR_USERS_TO_ADD_ROOT_FOLDERS: - raise PermissionDenied + # regular users may not add root folders + raise PermissionDenied elif not folder.has_add_children_permission(request): # the user does not have the permission to add subfolders raise PermissionDenied - response = self.add_view(request, *args, **kwargs) + response = super(FolderAdmin, self).add_view(request, *args, **kwargs) # this check should be enough since only save button appears if (request.method == 'POST' and "_popup" in request.POST and response.status_code == 200 and @@ -650,6 +665,16 @@ def delete_files_or_folders(self, request, Next, it delets all selected files and/or folders and redirects back to the folder. """ + + if folders_queryset.filter( + Q(folder_type=Folder.CORE_FOLDER) | + Q(parent__isnull=True)).exists(): + raise PermissionDenied + + if files_queryset.filter( + folder__folder_type=Folder.CORE_FOLDER).exists(): + raise PermissionDenied + opts = self.model._meta app_label = opts.app_label diff --git a/filer/tests/__init__.py b/filer/tests/__init__.py index 42d2dbbc3..166e94e92 100644 --- a/filer/tests/__init__.py +++ b/filer/tests/__init__.py @@ -1,8 +1,9 @@ #-*- coding: utf-8 -*- -from filer.tests.admin import * -from filer.tests.fields import * -from filer.tests.models import * -from filer.tests.permissions import * -from filer.tests.server_backends import * -from filer.tests.tools import * -from filer.tests.utils import * +from filer.tests.admin import TestFolderTypeFunctionality +# from filer.tests.admin import * +# from filer.tests.fields import * +# from filer.tests.models import * +# from filer.tests.permissions import * +# from filer.tests.server_backends import * +# from filer.tests.tools import * +# from filer.tests.utils import * diff --git a/filer/tests/admin.py b/filer/tests/admin.py index c120fad94..5ccc28b23 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -14,6 +14,7 @@ from filer.models.virtualitems import FolderRoot from filer.models import tools from filer.tests.helpers import ( + login_using, create_superuser, create_folder_structure, create_image, @@ -31,6 +32,7 @@ def setUp(self): def tearDown(self): self.client.logout() + def test_filer_app_index_get(self): response = self.client.get(reverse('admin:app_list', args=('filer',))) self.assertEqual(response.status_code, 200) @@ -418,6 +420,7 @@ def test_copy_files_and_folders_action(self): self.assertEqual(dst_image_obj.original_filename, 'test_filetest.jpg') class FilerDeleteOperationTests(BulkOperationsMixin, TestCase): + def test_delete_files_or_folders_action(self): self.assertNotEqual(File.objects.count(), 0) self.assertNotEqual(Image.objects.count(), 0) @@ -573,3 +576,220 @@ def test_admin_queries(self): def test_admin_view(self): for user in self.users.keys(): self.assert_user_adminview(user) + + +class TestFolderTypeFunctionality(TestCase): + + # def setUp(self): + # self.superuser = create_superuser() + # self.client.login(username='admin', password='secret') + + # def tearDown(self): + # self.client.logout() + + def test_default_add_view_is_forbidden(self): + with login_using(self.client, 'superuser'): + response = self.client.get(reverse('admin:filer_folder_add')) + self.assertEqual(response.status_code, 403) + + with login_using(self.client): + response = self.client.get(reverse('admin:filer_folder_add')) + self.assertEqual(response.status_code, 403) + + # only superusers can do operations on root folders + # regular users can do operations inside root folders only + + def test_add_root_folder_for_regular_user(self): + with login_using(self.client): + # regular users should not be able to add root folders at all + response = self.client.get( + reverse('admin:filer-directory_listing-make_root_folder')) + self.assertEqual(response.status_code, 403) + response = self.client.post( + reverse('admin:filer-directory_listing-make_root_folder'), {}) + self.assertEqual(response.status_code, 403) + + def test_change_root_folder_for_regular_user(self): + with login_using(self.client): + f1 = Folder.objects.create(name='foo') + # regular users should not be able to change root folders at all + for folder_type in [Folder.CORE_FOLDER, Folder.SITE_FOLDER]: + Folder.objects.filter(id=f1.id).update(folder_type=folder_type) + response = self.client.get( + reverse('admin:filer_folder_change', args=(f1.pk, ))) + self.assertEqual(response.status_code, 403) + response = self.client.post( + reverse('admin:filer_folder_change', args=(f1.pk, )), {}) + self.assertEqual(response.status_code, 403) + + def test_change_child_site_folder_for_regular_user(self): + with login_using(self.client): + f1 = Folder.objects.create(name='foo') + f2 = Folder.objects.create(name='foo_bar', parent=f1) + # regular users should be able to create child folders + response = self.client.get( + reverse('admin:filer_folder_change', args=(f2.pk, ))) + self.assertEqual(response.status_code, 200) + self.assertIn('adminform', response.context_data) + # make sure the folder that is going to be saved is a site folder + form = response.context_data['adminform'].form + self.assertEqual(form.instance.folder_type, Folder.SITE_FOLDER) + # only field 'name' should be visible + self.assertItemsEqual(['name'], form.fields.keys()) + # check if save worked + response = self.client.post( + reverse('admin:filer_folder_change', args=(f2.pk, )), { + 'name': 'foo_bar__changed' + }) + self.assertEqual(response.status_code, 302) + f2__changed = Folder.objects.get(id=f2.pk) + self.assertEqual(f2__changed.name, 'foo_bar__changed') + self.assertEqual(f2__changed.folder_type, Folder.SITE_FOLDER) + + def test_change_core_folder_for_regular_user(self): + with login_using(self.client): + f1 = Folder.objects.create( + name='foo', folder_type=Folder.CORE_FOLDER) + f2 = Folder.objects.create( + name='foo_bar', parent=f1, folder_type=Folder.CORE_FOLDER) + self.assertEqual(f1.folder_type, Folder.CORE_FOLDER) + self.assertEqual(f2.folder_type, Folder.CORE_FOLDER) + # No one should be able to change core folders + response = self.client.delete( + reverse('admin:filer_folder_delete', args=(f2.pk, ))) + self.assertEqual(response.status_code, 403) + response = self.client.delete( + reverse('admin:filer_folder_delete', args=(f1.pk, ))) + self.assertEqual(response.status_code, 403) + + + def test_delete_root_folder_for_regular_user(self): + with login_using(self.client): + f1 = Folder.objects.create(name='foo') + # regular users should not be able to delete root folders at all + for folder_type in [Folder.CORE_FOLDER, Folder.SITE_FOLDER]: + Folder.objects.filter(id=f1.id).update(folder_type=folder_type) + response = self.client.delete( + reverse('admin:filer_folder_delete', args=(f1.pk, ))) + self.assertEqual(response.status_code, 403) + #TODO + # response = self.client.post( + # reverse('admin:filer-directory_listing-root'), { + # 'action': 'delete_files_or_folders', + # 'post': 'yes', + # helpers.ACTION_CHECKBOX_NAME: ['folder-%d' % f1.id], + # }) + + def test_delete_child_site_folder_for_regular_user(self): + pass + def test_delete_child_core_folder_for_regular_user(self): + pass + + + def test_permissions_on_root_folders(self): + + + with login_using(self.client, 'superuser'): + # superusers should be able to add only root site folders + response = self.client.get( + reverse('admin:filer-directory_listing-make_root_folder')) + self.assertEqual(response.status_code, 200) + self.assertIn('adminform', response.context_data) + # make sure the folder that is going to be saved is a site folder + form = response.context_data['adminform'].form + self.assertEqual(form.instance.folder_type, Folder.SITE_FOLDER) + # only fields 'site', 'name' should be visible + self.assertItemsEqual(['site', 'name'], form.fields.keys()) +""" + def test_permissions_CRUD_core_folder(self): + # nobody can add/change/delete core folders or files from them + # these are only set programatically + + + ### TODO: root & regular folders + pass + + def test_permissions_CRUD_site_folder(self): + ### TODO: root & regular folders + pass + +######## UPLOAD FILES ######## + + def test_upload_in_core_folders(self): + pass + + def test_upload_in_site_folders(self): + pass + +####### MOVE FILES ###### + + def test_move_in_core_folders(self): + pass + + def test_move_from_core_folders(self): + pass + + def test_move_in_site_folders(self): + pass + + def test_move_from_site_folders(self): + pass + + +####### COPY FILES ####### + + def test_copy_from_core_folders(self): + pass + + def test_copy_to_core_folders(self): + pass + + def test_copy_from_site_folders(self): + pass + + def test_copy_to_site_folders(self): + pass + +####### EXTRACT FILES ####### + + def test_extract_files_in_core_folder(self): + # root & regular + pass + + def test_extract_files_in_site_folder(self): + # root & regular + pass + + def test_extract_in_unfiled_folder(self): + pass + +####### FOLDER auto-set/generate values ####### + + def test_folder_owner_set_by_request_user(self): + pass + + def test_make_folder_view_sets_parent_id_correctly(self): + # from root creation or change + # from regular folder creation or change + pass + + def test_validation_works_on_model_and_form(self): + pass + + def test_folder_type_conversion_propagate_changes(self): + pass + + def test_folder_type_conversion(self): + # from core to site folder + # viceversa + # changes are propagated to children + pass + + def test_CRUD_operations_on_folder_propagates_changes_to_children(self): + pass + +############## NO MORE FILES ON unfiled files folder ##### + + def test_upload_to_unfiled_files_folder(self): + pass +""" diff --git a/filer/tests/helpers.py b/filer/tests/helpers.py index 9a42aa0cf..d91c82802 100644 --- a/filer/tests/helpers.py +++ b/filer/tests/helpers.py @@ -4,6 +4,23 @@ from django.contrib.auth.models import User, Permission from filer.models.foldermodels import Folder, FolderPermission from filer.models.clipboardmodels import Clipboard, ClipboardItem +from contextlib import contextmanager + + +@contextmanager +def login_using(client, user_type=None): + username = 'login_using_foo' + password = 'secret' + user = User.objects.create_user(username=username, password=password) + if user_type == 'superuser': + user.is_superuser = True + user.is_staff = True + user.is_active = True + user.save() + client.login(username=username, password=password) + yield + client.logout() + user.delete() def create_superuser(): @@ -48,23 +65,23 @@ class SettingsOverride(object): """ Overrides Django settings within a context and resets them to their inital values on exit. - + Example: - + with SettingsOverride(DEBUG=True): # do something """ - + def __init__(self, settings_module, **overrides): self.settings_module = settings_module self.overrides = overrides - + def __enter__(self): self.old = {} for key, value in self.overrides.items(): self.old[key] = getattr(self.settings_module, key, None) setattr(self.settings_module, key, value) - + def __exit__(self, type, value, traceback): for key, value in self.old.items(): if value is not None: From 3f8ff531dc2124d504450321804cc296a29a890c Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Mon, 16 Sep 2013 19:41:54 +0300 Subject: [PATCH 119/715] Added some more permissions tests --- filer/admin/folderadmin.py | 38 +++- filer/tests/__init__.py | 2 +- filer/tests/admin.py | 368 ++++++++++++++++++++++++++++++------- filer/tests/helpers.py | 1 + 4 files changed, 332 insertions(+), 77 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 4bd9eeed5..7d4331750 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -665,19 +665,10 @@ def delete_files_or_folders(self, request, Next, it delets all selected files and/or folders and redirects back to the folder. """ - - if folders_queryset.filter( - Q(folder_type=Folder.CORE_FOLDER) | - Q(parent__isnull=True)).exists(): - raise PermissionDenied - - if files_queryset.filter( - folder__folder_type=Folder.CORE_FOLDER).exists(): - raise PermissionDenied + self._check_restricted(request, files_queryset, folders_queryset) opts = self.model._meta app_label = opts.app_label - # Check that the user has delete permission for the actual model if not self.has_delete_permission(request): raise PermissionDenied @@ -895,6 +886,18 @@ def _move_files_and_folders_impl(self, files_queryset, folders_queryset, f.move_to(destination, 'last-child') f.save() + def _check_restricted(self, request, files_queryset, folders_queryset): + restricted_folder = Q(folder_type=Folder.CORE_FOLDER) + if not request.user.is_superuser: + restricted_folder |= Q(parent__isnull=True) + + if folders_queryset.filter(restricted_folder).exists(): + raise PermissionDenied + + restricted_files = Q(folder__folder_type=Folder.CORE_FOLDER) + if files_queryset.filter(restricted_files).exists(): + raise PermissionDenied + def move_files_and_folders(self, request, files_queryset, folders_queryset): opts = self.model._meta @@ -910,6 +913,7 @@ def move_files_and_folders(self, request, request, folders_queryset, current_folder, False) if request.method == 'POST' and request.POST.get('post'): + self._check_restricted(request, files_queryset, folders_queryset) if perms_needed: raise PermissionDenied try: @@ -917,10 +921,24 @@ def move_files_and_folders(self, request, pk=request.POST.get('destination')) except Folder.DoesNotExist: raise PermissionDenied + + if destination.folder_type == Folder.CORE_FOLDER: + raise PermissionDenied + + # all folders need to belong to the same site as the + # destination site folder + if not destination.site: + messages.error(request, _(u"Destination folder %s does not " + "belong to any site. Folder needs to be assigned to a " + "site before you can move files in it." % \ + destination.pretty_logical_path)) + return None + folders_dict = dict(folders) if (destination not in folders_dict or not folders_dict[destination][1]): raise PermissionDenied + # We count only topmost files and folders here n = files_queryset.count() + folders_queryset.count() conflicting_names = [folder.name diff --git a/filer/tests/__init__.py b/filer/tests/__init__.py index 166e94e92..f3b7588d7 100644 --- a/filer/tests/__init__.py +++ b/filer/tests/__init__.py @@ -1,5 +1,5 @@ #-*- coding: utf-8 -*- -from filer.tests.admin import TestFolderTypeFunctionality +from filer.tests.admin import TestFolderTypeFolderPermissionLayer # from filer.tests.admin import * # from filer.tests.fields import * # from filer.tests.models import * diff --git a/filer/tests/admin.py b/filer/tests/admin.py index 5ccc28b23..ec1900c4a 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -578,14 +578,7 @@ def test_admin_view(self): self.assert_user_adminview(user) -class TestFolderTypeFunctionality(TestCase): - - # def setUp(self): - # self.superuser = create_superuser() - # self.client.login(username='admin', password='secret') - - # def tearDown(self): - # self.client.logout() +class TestFolderTypeFolderPermissionLayer(TestCase): def test_default_add_view_is_forbidden(self): with login_using(self.client, 'superuser'): @@ -622,46 +615,53 @@ def test_change_root_folder_for_regular_user(self): reverse('admin:filer_folder_change', args=(f1.pk, )), {}) self.assertEqual(response.status_code, 403) + def _test_change_child_site_folder(self): + f1 = Folder.objects.create(name='foo') + f2 = Folder.objects.create(name='foo_bar', parent=f1) + # regular users should be able to change child folders + response = self.client.get( + reverse('admin:filer_folder_change', args=(f2.pk, ))) + self.assertEqual(response.status_code, 200) + self.assertIn('adminform', response.context_data) + # make sure the folder that is going to be saved is a site folder + form = response.context_data['adminform'].form + self.assertEqual(form.instance.folder_type, Folder.SITE_FOLDER) + # only field 'name' should be visible + self.assertItemsEqual(['name'], form.fields.keys()) + # check if save worked + response = self.client.post( + reverse('admin:filer_folder_change', args=(f2.pk, )), { + 'name': 'foo_bar__changed' + }) + self.assertEqual(response.status_code, 302) + f2__changed = Folder.objects.get(id=f2.pk) + self.assertEqual(f2__changed.name, 'foo_bar__changed') + self.assertEqual(f2__changed.folder_type, Folder.SITE_FOLDER) + def test_change_child_site_folder_for_regular_user(self): with login_using(self.client): - f1 = Folder.objects.create(name='foo') - f2 = Folder.objects.create(name='foo_bar', parent=f1) - # regular users should be able to create child folders - response = self.client.get( - reverse('admin:filer_folder_change', args=(f2.pk, ))) - self.assertEqual(response.status_code, 200) - self.assertIn('adminform', response.context_data) - # make sure the folder that is going to be saved is a site folder - form = response.context_data['adminform'].form - self.assertEqual(form.instance.folder_type, Folder.SITE_FOLDER) - # only field 'name' should be visible - self.assertItemsEqual(['name'], form.fields.keys()) - # check if save worked - response = self.client.post( - reverse('admin:filer_folder_change', args=(f2.pk, )), { - 'name': 'foo_bar__changed' - }) - self.assertEqual(response.status_code, 302) - f2__changed = Folder.objects.get(id=f2.pk) - self.assertEqual(f2__changed.name, 'foo_bar__changed') - self.assertEqual(f2__changed.folder_type, Folder.SITE_FOLDER) + self._test_change_child_site_folder() + + def _test_change_core_folder(self): + f1 = Folder.objects.create( + name='foo', folder_type=Folder.CORE_FOLDER) + f2 = Folder.objects.create( + name='foo_bar', parent=f1, folder_type=Folder.CORE_FOLDER) + self.assertEqual(f1.folder_type, Folder.CORE_FOLDER) + self.assertEqual(f2.folder_type, Folder.CORE_FOLDER) + # No one should be able to change core folders + response = self.client.post( + reverse('admin:filer_folder_change', args=(f2.pk, )), + {'post': ['yes']}) + self.assertEqual(response.status_code, 403) + response = self.client.post( + reverse('admin:filer_folder_change', args=(f1.pk, )), + {'post': ['yes']}) + self.assertEqual(response.status_code, 403) def test_change_core_folder_for_regular_user(self): with login_using(self.client): - f1 = Folder.objects.create( - name='foo', folder_type=Folder.CORE_FOLDER) - f2 = Folder.objects.create( - name='foo_bar', parent=f1, folder_type=Folder.CORE_FOLDER) - self.assertEqual(f1.folder_type, Folder.CORE_FOLDER) - self.assertEqual(f2.folder_type, Folder.CORE_FOLDER) - # No one should be able to change core folders - response = self.client.delete( - reverse('admin:filer_folder_delete', args=(f2.pk, ))) - self.assertEqual(response.status_code, 403) - response = self.client.delete( - reverse('admin:filer_folder_delete', args=(f1.pk, ))) - self.assertEqual(response.status_code, 403) - + self._test_change_core_folder() def test_delete_root_folder_for_regular_user(self): with login_using(self.client): @@ -669,26 +669,89 @@ def test_delete_root_folder_for_regular_user(self): # regular users should not be able to delete root folders at all for folder_type in [Folder.CORE_FOLDER, Folder.SITE_FOLDER]: Folder.objects.filter(id=f1.id).update(folder_type=folder_type) - response = self.client.delete( - reverse('admin:filer_folder_delete', args=(f1.pk, ))) + response = self.client.post( + reverse('admin:filer_folder_delete', args=(f1.pk, )), + {'post': 'yes'}) self.assertEqual(response.status_code, 403) - #TODO - # response = self.client.post( - # reverse('admin:filer-directory_listing-root'), { - # 'action': 'delete_files_or_folders', - # 'post': 'yes', - # helpers.ACTION_CHECKBOX_NAME: ['folder-%d' % f1.id], - # }) - def test_delete_child_site_folder_for_regular_user(self): - pass - def test_delete_child_core_folder_for_regular_user(self): - pass + response = self.client.post( + reverse('admin:filer-directory_listing-root'), { + 'action': 'delete_files_or_folders', + 'post': 'yes', + helpers.ACTION_CHECKBOX_NAME: ['folder-%d' % f1.id], + }) + self.assertEqual(response.status_code, 403) + # case when viewing another folder content + # hit search and select a root folder to delete + folder_for_view = Folder.objects.create(name='bar') + response = self.client.post( + reverse('admin:filer-directory_listing', + args=(folder_for_view.pk, )), { + 'action': 'delete_files_or_folders', + 'post': 'yes', + helpers.ACTION_CHECKBOX_NAME: ['folder-%d' % f1.id], + }) + # this might be a bug since the folder requested for deletion + # is not passed to the delete_files_or_folders. For now + # just make sure it is not deleted + self.assertEqual(response.status_code, 302) + self.assertEqual( + Folder.objects.filter( + id__in=[folder_for_view.id, f1.id]).count(), 2) + + def _test_delete_child_site_folder(self): + f1 = Folder.objects.create(name='foo') + f2 = Folder.objects.create(name='bar', parent=f1) + f3 = Folder.objects.create(name='baz', parent=f1) + # regular users should be able to delete child site folders + response = self.client.post( + reverse('admin:filer_folder_delete', args=(f2.pk, )), + {'post': ['yes']}) + self.assertEqual(response.status_code, 302) + self.assertEqual(Folder.objects.filter(id=f2.id).count(), 0) + response = self.client.post( + reverse('admin:filer-directory_listing', + kwargs={'folder_id':f1.id}), { + 'action': 'delete_files_or_folders', + 'post': 'yes', + helpers.ACTION_CHECKBOX_NAME: ['folder-%d' % f3.id], + }) + self.assertEqual(response.status_code, 302) + self.assertEqual(Folder.objects.filter(id=f3.id).count(), 0) - def test_permissions_on_root_folders(self): + def test_delete_child_site_folder_for_regular_user(self): + with login_using(self.client): + self._test_delete_child_site_folder() + + def _test_delete_child_core_folder(self): + f1 = Folder.objects.create(name='foo') + f2 = Folder.objects.create( + name='bar', parent=f1, folder_type=Folder.CORE_FOLDER) + f3 = Folder.objects.create( + name='baz', parent=f1, folder_type=Folder.CORE_FOLDER) + # regular users should not be able to delete child core folders + response = self.client.post( + reverse('admin:filer_folder_delete', args=(f2.pk, )), + {'post': ['yes']}) + self.assertEqual(response.status_code, 403) + self.assertEqual(Folder.objects.filter(id=f2.id).count(), 1) + response = self.client.post( + reverse('admin:filer-directory_listing', + kwargs={'folder_id':f1.id}), { + 'action': 'delete_files_or_folders', + 'post': 'yes', + helpers.ACTION_CHECKBOX_NAME: ['folder-%d' % f3.id], + }) + self.assertEqual(response.status_code, 403) + self.assertEqual(Folder.objects.filter(id=f3.id).count(), 1) + def test_delete_child_core_folder_for_regular_user(self): + with login_using(self.client): + self._test_delete_child_core_folder() + + def test_add_root_folder_for_superuser(self): with login_using(self.client, 'superuser'): # superusers should be able to add only root site folders response = self.client.get( @@ -700,20 +763,193 @@ def test_permissions_on_root_folders(self): self.assertEqual(form.instance.folder_type, Folder.SITE_FOLDER) # only fields 'site', 'name' should be visible self.assertItemsEqual(['site', 'name'], form.fields.keys()) -""" - def test_permissions_CRUD_core_folder(self): - # nobody can add/change/delete core folders or files from them - # these are only set programatically + s1 = Site.objects.create(name='foo_site', domain='foo-domain.com') + response = self.client.post( + reverse('admin:filer-directory_listing-make_root_folder'), + {'name': 'foo', 'site': s1.id}) + self.assertEqual(response.status_code, 302) + self.assertEqual(Folder.objects.count(), 1) - ### TODO: root & regular folders - pass + def test_change_root_folder_for_superuser(self): + with login_using(self.client, 'superuser'): + f1 = Folder.objects.create( + name='foo', folder_type=Folder.CORE_FOLDER) + response = self.client.get( + reverse('admin:filer_folder_change', args=(f1.pk, ))) + self.assertEqual(response.status_code, 403) + response = self.client.post( + reverse('admin:filer_folder_change', args=(f1.pk, )), {}) + self.assertEqual(response.status_code, 403) - def test_permissions_CRUD_site_folder(self): - ### TODO: root & regular folders - pass + Folder.objects.filter(id=f1.id).update( + folder_type=Folder.SITE_FOLDER) + response = self.client.get( + reverse('admin:filer_folder_change', args=(f1.pk, ))) + self.assertEqual(response.status_code, 200) + response = self.client.post( + reverse('admin:filer_folder_change', args=(f1.pk, )), {}) + self.assertEqual(response.status_code, 200) + + def test_change_child_site_folder_for_superuser(self): + with login_using(self.client, 'superuser'): + self._test_change_child_site_folder() + + def test_change_core_folder_for_superuser(self): + with login_using(self.client, 'superuser'): + self._test_change_core_folder() + + def test_delete_root_folder_for_superuser(self): + with login_using(self.client, 'superuser'): + f1 = Folder.objects.create( + name='foo', folder_type=Folder.CORE_FOLDER) + + response = self.client.post( + reverse('admin:filer_folder_delete', args=(f1.pk, )), + {'post': 'yes'}) + self.assertEqual(response.status_code, 403) + self.assertEqual(Folder.objects.filter(id=f1.id).count(), 1) + response = self.client.post( + reverse('admin:filer-directory_listing-root'), { + 'action': 'delete_files_or_folders', + 'post': 'yes', + helpers.ACTION_CHECKBOX_NAME: ['folder-%d' % f1.id], + }) + self.assertEqual(response.status_code, 403) + self.assertEqual(Folder.objects.filter(id=f1.id).count(), 1) + + Folder.objects.filter(id=f1.id).update( + folder_type=Folder.SITE_FOLDER) + response = self.client.post( + reverse('admin:filer_folder_delete', args=(f1.pk, )), + {'post': 'yes'}) + self.assertEqual(response.status_code, 302) + self.assertEqual(Folder.objects.filter(id=f1.id).count(), 0) + f1 = Folder.objects.create( + name='foo', folder_type=Folder.SITE_FOLDER) + response = self.client.post( + reverse('admin:filer-directory_listing-root'), { + 'action': 'delete_files_or_folders', + 'post': 'yes', + helpers.ACTION_CHECKBOX_NAME: ['folder-%d' % f1.id], + }) + self.assertEqual(response.status_code, 302) + self.assertEqual(Folder.objects.filter(id=f1.id).count(), 0) + + def test_delete_child_site_folder_for_superuser(self): + with login_using(self.client, 'superuser'): + self._test_delete_child_site_folder() + + def test_delete_child_core_folder_for_superuser(self): + with login_using(self.client, 'superuser'): + self._test_delete_child_core_folder() + + def _build_some_folder_structure(self, folder_type, site): + _folders, _files = {}, {} + foo1 = Folder.objects.create( + name='foo1', folder_type=folder_type, site=site) + _folders['foo1'] = foo1 + foo2 = Folder.objects.create( + name='foo2', folder_type=folder_type, site=site) + _folders['foo2'] = foo2 + bar = Folder.objects.create( + name='bar', folder_type=folder_type, parent=foo1, site=site) + _folders['bar'] = bar + baz1 = Folder.objects.create( + name='baz1', folder_type=folder_type, parent=bar, site=site) + _folders['baz1'] = baz1 + baz2 = Folder.objects.create( + name='baz2', folder_type=folder_type, parent=bar, site=site) + _folders['baz2'] = baz2 + + file_bar = File.objects.create( + original_filename='bar_file', folder=bar, + file=django.core.files.base.ContentFile('some data')) + _files['file_bar'] = file_bar + return _folders, _files + + def _test_move_core_folders(self): + folders, files = self._build_some_folder_structure( + Folder.CORE_FOLDER, None) + + response = self.client.post( + reverse('admin:filer-directory_listing-root'), { + 'action': 'move_files_and_folders', + 'post': 'yes', + 'destination': folders['foo2'].id, + helpers.ACTION_CHECKBOX_NAME: + 'folder-%d' % (folders['bar'].id,), + }) + self.assertEqual(response.status_code, 403) + + response = self.client.post( + reverse('admin:filer-directory_listing-root'), { + 'action': 'move_files_and_folders', + 'post': 'yes', + 'destination': folders['foo2'].id, + helpers.ACTION_CHECKBOX_NAME: + 'folder-%d' % (folders['foo1'].id,), + }) + self.assertEqual(response.status_code, 403) + + def test_move_core_folder_for_regular_user(self): + with login_using(self.client): + self._test_move_core_folders() + + def test_move_core_folder_for_superuser(self): + with login_using(self.client, 'superuser'): + self._test_move_core_folders() + + def _test_move_site_folder_to_core_destination_folder(self): + folders, files = self._build_some_folder_structure( + Folder.SITE_FOLDER, Site.objects.get(id=1)) + f1 = Folder.objects.create( + name='destination', folder_type=Folder.CORE_FOLDER) + + response = self.client.post( + reverse('admin:filer-directory_listing-root'), { + 'action': 'move_files_and_folders', + 'post': 'yes', + 'destination': f1.id, + helpers.ACTION_CHECKBOX_NAME: + ['folder-%d' % (folders['bar'].id,)], + }) + self.assertEqual(response.status_code, 403) + f1.delete() + return folders, files + def test_move_site_folder_for_regular_user(self): + with login_using(self.client): + folders, files = \ + self._test_move_site_folder_to_core_destination_folder() + other_site = Site.objects.create( + name='foo_site', domain='foo_site') + f1 = Folder.objects.create( + name='destination', site=other_site) + + response = self.client.post( + reverse('admin:filer-directory_listing-root'), { + 'action': 'move_files_and_folders', + 'post': 'yes', + 'destination': f1.id, + helpers.ACTION_CHECKBOX_NAME: + 'folder-%d' % (folders['bar'].id,), + }) + self.assertEqual(response.status_code, 403) + + def test_move_site_folder_for_superuser(self): + with login_using(self.client, 'superuser'): + self._test_move_site_folder_to_core_destination_folder() + + + + +class TestFolderTypeFilesPermissionLayer(TestCase): + pass +""" ######## UPLOAD FILES ######## + def test_upload_in_root(self): + pass def test_upload_in_core_folders(self): pass diff --git a/filer/tests/helpers.py b/filer/tests/helpers.py index d91c82802..481c6db5e 100644 --- a/filer/tests/helpers.py +++ b/filer/tests/helpers.py @@ -17,6 +17,7 @@ def login_using(client, user_type=None): user.is_staff = True user.is_active = True user.save() + user.user_permissions = Permission.objects.all() client.login(username=username, password=password) yield client.logout() From bed081bde6b86f1f4a202548ed4df2efff75043d Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Thu, 19 Sep 2013 12:18:36 +0300 Subject: [PATCH 120/715] Added tests for moving files based on filer type permissions layer Changed file/folder manager to support chainable querysets --- filer/admin/folderadmin.py | 61 ++++++--- filer/models/filemodels.py | 37 +++++- filer/models/foldermodels.py | 37 +++++- filer/tests/__init__.py | 15 +-- filer/tests/admin.py | 239 +++++++++++++++++++++++------------ filer/tests/helpers.py | 47 +++++++ filer/views.py | 10 +- 7 files changed, 333 insertions(+), 113 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 7d4331750..b6061121f 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -131,6 +131,15 @@ def render_change_form(self, request, context, add=False, change=False, request=request, context=context, add=False, change=False, form_url=form_url, obj=obj) + def _restrict_view(self, request, obj): + if not obj: + return + if obj.is_restricted(): + raise PermissionDenied + + if not obj.parent and not request.user.is_superuser: + raise PermissionDenied + def delete_view(self, request, object_id, extra_context=None): """ Overrides the default to enable redirecting to the directory view after @@ -147,12 +156,7 @@ def delete_view(self, request, object_id, extra_context=None): except self.model.DoesNotExist: obj = None - if obj: - if obj.folder_type == Folder.CORE_FOLDER: - raise PermissionDenied - - if not obj.parent and not request.user.is_superuser: - raise PermissionDenied + self._restrict_view(request, obj) r = super(FolderAdmin, self).delete_view( request=request, object_id=object_id, @@ -203,11 +207,8 @@ def get_urls(self): def change_view(self, request, object_id, *args, **kwargs): obj = self.get_object(request, unquote(object_id)) - if obj.folder_type == Folder.CORE_FOLDER: - raise PermissionDenied - if not obj.parent and not request.user.is_superuser: - raise PermissionDenied + self._restrict_view(request, obj) return super(FolderAdmin, self).change_view( request, object_id, *args, **kwargs) @@ -558,6 +559,9 @@ def move_to_clipboard(self, request, files_queryset, folders_queryset): if request.method != 'POST': return None + self._check_restricted(request, files_queryset, folders_queryset, + allow_regular_users=True) + clipboard = tools.get_user_clipboard(request.user) check_files_edit_permissions(request, files_queryset) @@ -886,16 +890,13 @@ def _move_files_and_folders_impl(self, files_queryset, folders_queryset, f.move_to(destination, 'last-child') f.save() - def _check_restricted(self, request, files_queryset, folders_queryset): - restricted_folder = Q(folder_type=Folder.CORE_FOLDER) - if not request.user.is_superuser: - restricted_folder |= Q(parent__isnull=True) - - if folders_queryset.filter(restricted_folder).exists(): + def _check_restricted(self, request, files_queryset, folders_queryset, + allow_regular_users=False): + user_check = request.user if not allow_regular_users else None + if folders_queryset.restricted(user_check).exists(): raise PermissionDenied - restricted_files = Q(folder__folder_type=Folder.CORE_FOLDER) - if files_queryset.filter(restricted_files).exists(): + if files_queryset.restricted().exists(): raise PermissionDenied def move_files_and_folders(self, request, @@ -929,10 +930,30 @@ def move_files_and_folders(self, request, # destination site folder if not destination.site: messages.error(request, _(u"Destination folder %s does not " - "belong to any site. Folder needs to be assigned to a " + "belong to any site. Folders need to be assigned to a " "site before you can move files in it." % \ destination.pretty_logical_path)) - return None + return + + folders_with_sites_to_move = \ + set(folders_queryset.values_list('site_id', flat=True)) | \ + set(files_queryset.values_list('folder__site_id', flat=True)) + + if None in folders_with_sites_to_move: + messages.error(request, "Some of the selected files/folders " + "do not belong to any site. Folders need to be assigned " + "to a site before you can move files/folders from it.") + return + elif len(folders_with_sites_to_move) > 1: + # it gets here if selection is made through a search view + messages.error(request, "You cannot move files/folders that " + "belong to several sites. Select files/folders that " + "belong to only one site.") + return + elif folders_with_sites_to_move.pop() != destination.site.id: + messages.error(request, "Selected files/folders need to " + "belong to the same site as the destination folder.") + return folders_dict = dict(folders) if (destination not in folders_dict or diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index 9b76ded5f..bafaf5ff2 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -10,13 +10,17 @@ from filer.models import mixins from filer import settings as filer_settings from filer.models.foldermodels import Folder -from polymorphic import PolymorphicModel, PolymorphicManager +import polymorphic +# from polymorphic import PolymorphicModel, PolymorphicManager, query import hashlib import os +class FilesChainableQuerySet(object): + + def restricted(self): + return self.filter(folder__folder_type=Folder.CORE_FOLDER) -class FileManager(PolymorphicManager): def find_all_duplicates(self): r = {} for file_obj in self.all(): @@ -27,10 +31,30 @@ def find_all_duplicates(self): return r def find_duplicates(self, file_obj): - return [i for i in self.exclude(pk=file_obj.pk).filter(sha1=file_obj.sha1)] + return [duplicate_file + for duplicate_file in self.exclude( + pk=file_obj.pk).filter(sha1=file_obj.sha1)] + + +class EmptyFilesQS(models.query.EmptyQuerySet, FilesChainableQuerySet): + pass + + +class FileQuerySet(polymorphic.query.PolymorphicQuerySet, + FilesChainableQuerySet): + pass + +class FileManager(polymorphic.PolymorphicManager): -class File(PolymorphicModel, mixins.IconsMixin): + def get_query_set(self): + return FileQuerySet(self.model, using=self._db) + + def get_empty_query_set(self): + return EmptyFilesQS(self.model, using=self._db) + + +class File(polymorphic.PolymorphicModel, mixins.IconsMixin): file_type = 'File' _icon = "file" folder = models.ForeignKey(Folder, verbose_name=_('folder'), related_name='all_files', @@ -381,6 +405,11 @@ def logical_path(self): def duplicates(self): return File.objects.find_duplicates(self) + def is_restricted(self): + if self.folder: + return self.folder.is_restricted() + return False + class Meta: app_label = 'filer' verbose_name = _('file') diff --git a/filer/models/foldermodels.py b/filer/models/foldermodels.py index b08e0cb81..af2ec3026 100644 --- a/filer/models/foldermodels.py +++ b/filer/models/foldermodels.py @@ -5,6 +5,7 @@ from django.core import urlresolvers from django.core.exceptions import ValidationError from django.db import models +from django.db.models import query from django.db import transaction from django.db.models import Q from django.utils.http import urlquote @@ -17,9 +18,38 @@ import mptt -class FolderManager(models.Manager): +class FoldersChainableQuerySet(object): + def with_bad_metadata(self): - return self.get_query_set().filter(has_all_mandatory_data=False) + return self.filter(has_all_mandatory_data=False) + + def restricted(self, user=None): + restricted_folder = Q(folder_type=Folder.CORE_FOLDER) + if user and not user.is_superuser: + restricted_folder |= Q(parent__isnull=True) + + return self.filter(restricted_folder) + +class EmptyFoldersQS(models.query.EmptyQuerySet, FoldersChainableQuerySet): + pass + + +class FolderQueryset(query.QuerySet, FoldersChainableQuerySet): + pass + + +class FolderManager(models.Manager): + + def get_empty_query_set(self): + return EmptyFoldersQS(self.model, using=self._db) + + def get_query_set(self): + return FolderQueryset(self.model, using=self._db) + + def __getattr__(self, name): + if name.startswith('__'): + return super(FolderManager, self).__getattr__(self, name) + return getattr(self.get_query_set(), name) class FolderPermissionManager(models.Manager): @@ -347,6 +377,9 @@ def contains_folder(self, folder_name): except Folder.DoesNotExist: return False + def is_restricted(self): + return self.folder_type == Folder.CORE_FOLDER + class Meta: unique_together = (('parent', 'name'),) ordering = ('name',) diff --git a/filer/tests/__init__.py b/filer/tests/__init__.py index f3b7588d7..42d2dbbc3 100644 --- a/filer/tests/__init__.py +++ b/filer/tests/__init__.py @@ -1,9 +1,8 @@ #-*- coding: utf-8 -*- -from filer.tests.admin import TestFolderTypeFolderPermissionLayer -# from filer.tests.admin import * -# from filer.tests.fields import * -# from filer.tests.models import * -# from filer.tests.permissions import * -# from filer.tests.server_backends import * -# from filer.tests.tools import * -# from filer.tests.utils import * +from filer.tests.admin import * +from filer.tests.fields import * +from filer.tests.models import * +from filer.tests.permissions import * +from filer.tests.server_backends import * +from filer.tests.tools import * +from filer.tests.utils import * diff --git a/filer/tests/admin.py b/filer/tests/admin.py index ec1900c4a..057a6014a 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -14,14 +14,10 @@ from filer.models.virtualitems import FolderRoot from filer.models import tools from filer.tests.helpers import ( - login_using, - create_superuser, - create_folder_structure, - create_image, - create_staffuser, - create_folder_for_user, - create_folderpermission_for_user, - grant_all_folderpermissions_for_group, + login_using, get_user_message, create_superuser, create_folder_structure, + create_image, create_staffuser, create_folder_for_user, move_action, + create_folderpermission_for_user, grant_all_folderpermissions_for_group, + move_to_clipboard_action, ) @@ -264,9 +260,10 @@ def tearDown(self): folder.delete() def create_src_and_dst_folders(self): - self.src_folder = Folder(name="Src", parent=None) + site = Site.objects.get(id=1) + self.src_folder = Folder(name="Src", parent=None, site=site) self.src_folder.save() - self.dst_folder = Folder(name="Dst", parent=None) + self.dst_folder = Folder(name="Dst", parent=None, site=site) self.dst_folder.save() def create_image(self, folder, filename=None): @@ -291,26 +288,13 @@ def test_move_files_and_folders_action(self): self.assertEqual(self.src_folder.files.count(), 1) self.assertEqual(self.dst_folder.files.count(), 0) - url = reverse('admin:filer-directory_listing', kwargs={ - 'folder_id': self.src_folder.id, - }) - response = self.client.post(url, { - 'action': 'move_files_and_folders', - 'post': 'yes', - 'destination': self.dst_folder.id, - helpers.ACTION_CHECKBOX_NAME: 'file-%d' % (self.image_obj.id,), - }) + response, _ = move_action( + self.client, self.src_folder, self.dst_folder, [self.image_obj]) self.assertEqual(self.src_folder.files.count(), 0) self.assertEqual(self.dst_folder.files.count(), 1) - url = reverse('admin:filer-directory_listing', kwargs={ - 'folder_id': self.dst_folder.id, - }) - response = self.client.post(url, { - 'action': 'move_files_and_folders', - 'post': 'yes', - 'destination': self.src_folder.id, - helpers.ACTION_CHECKBOX_NAME: 'file-%d' % (self.image_obj.id,), - }) + + response, _ = move_action( + self.client, self.dst_folder, self.src_folder, [self.image_obj]) self.assertEqual(self.src_folder.files.count(), 1) self.assertEqual(self.dst_folder.files.count(), 0) @@ -333,12 +317,8 @@ def test_validate_no_duplicate_folders_on_move(self): url = reverse('admin:filer-directory_listing', kwargs={ 'folder_id': root.pk, }) - response = self.client.post(url, { - 'action': 'move_files_and_folders', - 'post': 'yes', - 'destination': foo.pk, - helpers.ACTION_CHECKBOX_NAME: 'folder-%d' % (bar.pk,), - }) + + response, _ = move_action(self.client, root, foo, [bar]) # refresh from db and validate that it hasn't been moved bar = Folder.objects.get(pk=bar.pk) self.assertEqual(bar.parent.pk, root.pk) @@ -351,10 +331,8 @@ def test_move_to_clipboard_action(self): url = reverse('admin:filer-directory_listing', kwargs={ 'folder_id': self.src_folder.id, }) - response = self.client.post(url, { - 'action': 'move_to_clipboard', - helpers.ACTION_CHECKBOX_NAME: 'file-%d' % (self.image_obj.id,), - }) + response = move_to_clipboard_action( + self.client, self.src_folder, [self.image_obj]) self.assertEqual(self.src_folder.files.count(), 0) self.assertEqual(self.dst_folder.files.count(), 0) clipboard = Clipboard.objects.get(user=self.superuser) @@ -459,6 +437,7 @@ def test_delete_files_or_folders_action_with_mixed_types(self): class FilerResizeOperationTests(BulkOperationsMixin, TestCase): + def test_resize_images_action(self): # TODO: Test recursive (files and folders tree) processing self.assertEqual(self.image_obj.width, 800) @@ -580,6 +559,7 @@ def test_admin_view(self): class TestFolderTypeFolderPermissionLayer(TestCase): + def test_default_add_view_is_forbidden(self): with login_using(self.client, 'superuser'): response = self.client.get(reverse('admin:filer_folder_add')) @@ -872,24 +852,10 @@ def _test_move_core_folders(self): folders, files = self._build_some_folder_structure( Folder.CORE_FOLDER, None) - response = self.client.post( - reverse('admin:filer-directory_listing-root'), { - 'action': 'move_files_and_folders', - 'post': 'yes', - 'destination': folders['foo2'].id, - helpers.ACTION_CHECKBOX_NAME: - 'folder-%d' % (folders['bar'].id,), - }) + response, _ = move_action(self.client, None, folders['foo2'], [folders['bar']]) self.assertEqual(response.status_code, 403) - response = self.client.post( - reverse('admin:filer-directory_listing-root'), { - 'action': 'move_files_and_folders', - 'post': 'yes', - 'destination': folders['foo2'].id, - helpers.ACTION_CHECKBOX_NAME: - 'folder-%d' % (folders['foo1'].id,), - }) + response, _ = move_action(self.client, None, folders['foo2'], [folders['foo1']]) self.assertEqual(response.status_code, 403) def test_move_core_folder_for_regular_user(self): @@ -906,42 +872,159 @@ def _test_move_site_folder_to_core_destination_folder(self): f1 = Folder.objects.create( name='destination', folder_type=Folder.CORE_FOLDER) - response = self.client.post( - reverse('admin:filer-directory_listing-root'), { - 'action': 'move_files_and_folders', - 'post': 'yes', - 'destination': f1.id, - helpers.ACTION_CHECKBOX_NAME: - ['folder-%d' % (folders['bar'].id,)], - }) + response, _ = move_action(self.client, None, f1, [folders['bar']]) self.assertEqual(response.status_code, 403) f1.delete() return folders, files def test_move_site_folder_for_regular_user(self): with login_using(self.client): - folders, files = \ - self._test_move_site_folder_to_core_destination_folder() - other_site = Site.objects.create( - name='foo_site', domain='foo_site') - f1 = Folder.objects.create( - name='destination', site=other_site) - - response = self.client.post( - reverse('admin:filer-directory_listing-root'), { - 'action': 'move_files_and_folders', - 'post': 'yes', - 'destination': f1.id, - helpers.ACTION_CHECKBOX_NAME: - 'folder-%d' % (folders['bar'].id,), - }) - self.assertEqual(response.status_code, 403) + self._test_move_site_folder_to_core_destination_folder() def test_move_site_folder_for_superuser(self): with login_using(self.client, 'superuser'): self._test_move_site_folder_to_core_destination_folder() + def _get_clipboard_files(self): + clipboard, _ = Clipboard.objects.get_or_create(user=self.client.user_used) + return clipboard.files + + def _test_move_to_clipboard_from_root(self): + file_bar = File.objects.create( + original_filename='bar', folder=None, + file=django.core.files.base.ContentFile('some data')) + self.assertEqual( + self._get_clipboard_files().count(), 0) + move_to_clipboard_action(self.client, 'unfiled', [file_bar]) + self.assertEqual( + self._get_clipboard_files().count(), 1) + + def test_move_to_clipboard_from_root_for_regular_user(self): + self.assertEqual('This test should work after removing filer ' + 'permissions', '') + with login_using(self.client): + self._test_move_to_clipboard_from_root() + + def test_move_to_clipboard_from_root_for_super_user(self): + self.assertEqual('This test should work after removing filer ' + 'permissions', '') + with login_using(self.client, 'superuser'): + self._test_move_to_clipboard_from_root() + + def _test_move_to_clipboard_from_site_folders(self): + foo = Folder.objects.create(name='mic', site=Site.objects.get(id=1)) + file_bar = File.objects.create( + original_filename='mic', folder=foo, + file=django.core.files.base.ContentFile('some data')) + self.assertEqual( + self._get_clipboard_files().count(), 0) + move_to_clipboard_action(self.client, None, [foo]) + self.assertEqual( + self._get_clipboard_files().count(), 1) + + def test_move_to_clipboard_from_site_folders_regular_user(self): + with login_using(self.client): + self._test_move_to_clipboard_from_site_folders() + + def test_move_to_clipboard_from_site_folders_superuser(self): + with login_using(self.client, 'superuser'): + self._test_move_to_clipboard_from_site_folders() + + def _test_move_to_clipboard_from_core_folders(self): + foo = Folder.objects.create(name='foo', + folder_type=Folder.CORE_FOLDER) + file_bar = File.objects.create( + original_filename='bar_file', folder=foo, + file=django.core.files.base.ContentFile('some data')) + self.assertEqual( + self._get_clipboard_files().count(), 0) + response, _ = move_to_clipboard_action(self.client, None, [foo]) + self.assertEqual(response.status_code, 403) + self.assertEqual( + self._get_clipboard_files().count(), 0) + + def test_move_to_clipboard_from_core_folders_for_regular_user(self): + with login_using(self.client): + self._test_move_to_clipboard_from_core_folders() + + def test_move_to_clipboard_from_core_folders_for_superuser(self): + with login_using(self.client, 'superuser'): + self._test_move_to_clipboard_from_core_folders() + + def _test_move_from_clipboard_to_root(self): + pass + + def _test_move_from_clipboard_to_core_folders(self): + pass + + def _test_move_from_clipboard_to_site_folders(self): + pass +class TestFolderTypeValidation(TestCase): + + def _test_message_error_user_destination_no_site_on_move(self): + site = Site.objects.get(id=1) + foo = Folder.objects.create(name='foo') + bar = Folder.objects.create(name='bar', site=site) + baz = Folder.objects.create(name='baz', site=site, parent=bar) + response, url = move_action(self.client, None, foo, [baz], follow=True) + self.assertRedirects(response, url) + self.assertIn( + 'Destination folder %s does not belong to any ' + 'site.' % foo.pretty_logical_path, + get_user_message(response).message) + + def test_message_error_user_destination_no_site_on_move_regular_user(self): + with login_using(self.client): + self._test_message_error_user_destination_no_site_on_move() + + def test_message_error_user_destination_no_site_on_move_superuser(self): + with login_using(self.client, 'superuser'): + self._test_message_error_user_destination_no_site_on_move() + + def _test_message_error_user_no_site_on_move(self): + site = Site.objects.get(id=1) + foo_root = Folder.objects.create(name='foo_root') + foo = Folder.objects.create(name='foo', parent=foo_root) + bar = Folder.objects.create(name='bar', site=site) + response, url = move_action(self.client, foo_root, bar, [foo], follow=True) + self.assertRedirects(response, url) + self.assertIn( + "Some of the selected files/folders do not belong to any site.", + get_user_message(response).message) + + def test_message_error_user_no_site_on_move_regular_user(self): + with login_using(self.client): + self._test_message_error_user_no_site_on_move() + + def test_message_error_user_no_site_on_move_superuser(self): + with login_using(self.client, 'superuser'): + self._test_message_error_user_no_site_on_move() + + def _test_message_error_user_sites_mismatch_on_move(self): + site = Site.objects.get(id=1) + other_site = Site.objects.create(name='foo_site', domain='foo_site') + # make a root for foo in order to work for regular users + foo_root = Folder.objects.create(name='foo_root', site=other_site) + foo = Folder.objects.create( + name='foo', parent=foo_root) + bar = Folder.objects.create(name='bar', site=site) + url = reverse('admin:filer-directory_listing', + kwargs={'folder_id': foo_root.id}) + response, url = move_action(self.client, foo_root, bar, [foo], follow=True) + self.assertRedirects(response, url) + self.assertIn( + "Selected files/folders need to belong to the same site as the " + "destination folder.", + get_user_message(response).message) + + def test_message_error_user_sites_mismatch_on_move_regular_user(self): + with login_using(self.client): + self._test_message_error_user_sites_mismatch_on_move() + + def test_message_error_user_sites_mismatch_on_move_superuser(self): + with login_using(self.client, 'superuser'): + self._test_message_error_user_sites_mismatch_on_move() class TestFolderTypeFilesPermissionLayer(TestCase): diff --git a/filer/tests/helpers.py b/filer/tests/helpers.py index 481c6db5e..58be5e6fa 100644 --- a/filer/tests/helpers.py +++ b/filer/tests/helpers.py @@ -5,6 +5,44 @@ from filer.models.foldermodels import Folder, FolderPermission from filer.models.clipboardmodels import Clipboard, ClipboardItem from contextlib import contextmanager +from django.core.urlresolvers import reverse +from django.contrib.admin import helpers + + +def _get_dir_listing_url(folder_id_for_view): + if folder_id_for_view is None: + return reverse('admin:filer-directory_listing-root') + if folder_id_for_view is 'unfiled': + return reverse('admin:filer-directory_listing-unfiled_images') + return reverse('admin:filer-directory_listing', + kwargs={'folder_id': folder_id_for_view.id}) + + +def _filer_object_type(filer_obj): + if isinstance(filer_obj, Folder): + return 'folder' + return 'file' + + +def move_to_clipboard_action(client, folder_view, to_move, follow=False): + objects_to_move = ['%s-%d' % (_filer_object_type(filer_obj), filer_obj.id) + for filer_obj in to_move] + url = _get_dir_listing_url(folder_view) + return client.post(url, { + 'action': 'move_to_clipboard', + 'post': 'yes', + helpers.ACTION_CHECKBOX_NAME: objects_to_move }, follow=follow), url + + +def move_action(client, folder_view, destination, to_move, follow=False): + objects_to_move = ['%s-%d' % (_filer_object_type(filer_obj), filer_obj.id) + for filer_obj in to_move] + url = _get_dir_listing_url(folder_view) + return client.post(url, { + 'action': 'move_files_and_folders', + 'post': 'yes', + 'destination': destination.id, + helpers.ACTION_CHECKBOX_NAME: objects_to_move }, follow=follow), url @contextmanager @@ -19,7 +57,9 @@ def login_using(client, user_type=None): user.save() user.user_permissions = Permission.objects.all() client.login(username=username, password=password) + client.user_used = user yield + del client.user_used client.logout() user.delete() @@ -128,3 +168,10 @@ def grant_all_folderpermissions_for_group(group): ) for permission in permission_set: group.permissions.add(permission) + +def get_user_message(response): + """Helper method to return message from response """ + for c in response.context: + message = [m for m in c.get('messages')][0] + if message: + return message diff --git a/filer/views.py b/filer/views.py index 43d442042..58f2d021e 100755 --- a/filer/views.py +++ b/filer/views.py @@ -82,6 +82,10 @@ def upload(request): def paste_clipboard_to_folder(request): if request.method == 'POST': folder = Folder.objects.get(id=request.POST.get('folder_id')) + + if folder.is_restricted(): + raise PermissionDenied + clipboard = Clipboard.objects.get(id=request.POST.get('clipboard_id')) if folder.has_add_children_permission(request): tools.move_files_from_clipboard_to_folder(request, clipboard, folder) @@ -119,8 +123,12 @@ def delete_clipboard(request): @login_required def clone_files_from_clipboard_to_folder(request): if request.method == 'POST': - clipboard = Clipboard.objects.get(id=request.POST.get('clipboard_id')) folder = Folder.objects.get(id=request.POST.get('folder_id')) + + if folder.is_restricted(): + raise PermissionDenied + + clipboard = Clipboard.objects.get(id=request.POST.get('clipboard_id')) tools.clone_files_from_clipboard_to_folder(clipboard, folder) return HttpResponseRedirect('%s%s%s' % ( request.POST.get('redirect_to', ''), From 583fd0040ceb2714645b4a1885a10572d264554a Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Thu, 19 Sep 2013 20:21:39 +0300 Subject: [PATCH 121/715] Move/copy actions now excludes core folders from destinations Refactored admin tests. --- filer/admin/folderadmin.py | 2 +- filer/tests/admin.py | 692 ++++++++++++++++++------------------- filer/tests/helpers.py | 60 ++-- filer/views.py | 7 +- 4 files changed, 376 insertions(+), 385 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index b6061121f..aac362ed7 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -855,7 +855,7 @@ def _list_all_destination_folders_recursive(self, request, folders_queryset, current_folder, folders, allow_self, level): - for fo in folders: + for fo in folders.exclude(folder_type=Folder.CORE_FOLDER): if not allow_self and fo in folders_queryset: # We do not allow moving to selected folders or their # descendants diff --git a/filer/tests/admin.py b/filer/tests/admin.py index 057a6014a..8f57c9f55 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -5,7 +5,7 @@ import django.core.files from django.contrib.admin import helpers, site from django.contrib.sites.models import Site -from django.contrib.auth.models import User, Group +from django.contrib.auth.models import User, Group, Permission from django.http import HttpRequest from filer.models.filemodels import File from filer.models.foldermodels import Folder, FolderPermission @@ -14,10 +14,11 @@ from filer.models.virtualitems import FolderRoot from filer.models import tools from filer.tests.helpers import ( - login_using, get_user_message, create_superuser, create_folder_structure, + get_user_message, create_superuser, create_folder_structure, create_image, create_staffuser, create_folder_for_user, move_action, create_folderpermission_for_user, grant_all_folderpermissions_for_group, - move_to_clipboard_action, + move_to_clipboard_action, paste_clipboard_to_folder, get_dir_listing_url, + filer_obj_as_checkox, get_make_root_folder_url ) @@ -34,23 +35,23 @@ def test_filer_app_index_get(self): self.assertEqual(response.status_code, 200) def test_filer_make_root_folder_get(self): - response = self.client.get(reverse('admin:filer-directory_listing-make_root_folder')+"?_popup=1") + response = self.client.get(get_make_root_folder_url() + "?_popup=1") self.assertEqual(response.status_code, 200) def test_filer_make_root_folder_post(self): FOLDER_NAME = "root folder 1" self.assertEqual(Folder.objects.count(), 0) data_to_post = { - "name":FOLDER_NAME, + "name": FOLDER_NAME, } response = self.client.post( - reverse('admin:filer-directory_listing-make_root_folder'), + get_make_root_folder_url(), data_to_post) self.assertIn('Site is required', response.content) data_to_post['site'] = 1 response = self.client.post( - reverse('admin:filer-directory_listing-make_root_folder'), + get_make_root_folder_url(), data_to_post) self.assertEqual(Folder.objects.count(), 1) @@ -58,62 +59,63 @@ def test_filer_make_root_folder_post(self): self.assertEqual(response.status_code, 302) def test_filer_directory_listing_root_empty_get(self): - response = self.client.post(reverse('admin:filer-directory_listing-root')) + response = self.client.post(get_dir_listing_url(None)) self.assertEqual(response.status_code, 200) def test_filer_directory_listing_root_get(self): create_folder_structure(depth=3, sibling=2, parent=None) - response = self.client.post(reverse('admin:filer-directory_listing-root')) + response = self.client.post(get_dir_listing_url(None)) self.assertEqual(response.status_code, 200) self.assertEqual(response.context['folder'].children.count(), 6) def test_validate_no_duplcate_folders(self): FOLDER_NAME = "root folder 1" self.assertEqual(Folder.objects.count(), 0) - post_data = { "name": FOLDER_NAME, "_popup": 1 } + post_data = {"name": FOLDER_NAME, "_popup": 1} response = self.client.post( - reverse('admin:filer-directory_listing-make_root_folder'), + get_make_root_folder_url(), post_data) self.assertIn('Site is required', response.content) post_data['site'] = 1 response = self.client.post( - reverse('admin:filer-directory_listing-make_root_folder'), + get_make_root_folder_url(), post_data) self.assertEqual(Folder.objects.count(), 1) self.assertEqual(Folder.objects.all()[0].name, FOLDER_NAME) # and create another one - post_data = { "name": FOLDER_NAME, "_popup": 1 } + post_data = {"name": FOLDER_NAME, "_popup": 1} response = self.client.post( - reverse('admin:filer-directory_listing-make_root_folder'), + get_make_root_folder_url(), post_data) # second folder didn't get created self.assertEqual(Folder.objects.count(), 1) - self.assertIn('File or folder with this name already exists', response.content) + self.assertIn('File or folder with this name already exists', + response.content) def test_validate_no_duplcate_folders_on_rename(self): self.assertEqual(Folder.objects.count(), 0) - post_data = { "name": "foo", "_popup": 1} + post_data = {"name": "foo", "_popup": 1} response = self.client.post( - reverse('admin:filer-directory_listing-make_root_folder'), + get_make_root_folder_url(), post_data) self.assertIn('Site is required', response.content) post_data['site'] = 1 response = self.client.post( - reverse('admin:filer-directory_listing-make_root_folder'), + get_make_root_folder_url(), post_data) self.assertEqual(Folder.objects.count(), 1) self.assertEqual(Folder.objects.all()[0].name, "foo") # and create another one - post_data = { "name": "bar", "_popup": 1 } + post_data = {"name": "bar", "_popup": 1} response = self.client.post( - reverse('admin:filer-directory_listing-make_root_folder'), + get_make_root_folder_url(), post_data) self.assertIn('Site is required', response.content) post_data['site'] = 1 response = self.client.post( - reverse('admin:filer-directory_listing-make_root_folder'), + get_make_root_folder_url(), post_data) self.assertEqual(Folder.objects.count(), 2) @@ -121,7 +123,8 @@ def test_validate_no_duplcate_folders_on_rename(self): response = self.client.post("/admin/filer/folder/%d/" % bar.pk, { "name": "foo", "_popup": 1}) - self.assertIn('File or folder with this name already exists', response.content) + self.assertIn('File or folder with this name already exists', + response.content) # refresh from db and validate that it's name didn't change bar = Folder.objects.get(pk=bar.pk) self.assertEqual(bar.name, "bar") @@ -156,28 +159,36 @@ def test_filer_upload_file(self, extra_headers={}): self.assertEqual(Image.objects.count(), 0) file_obj = django.core.files.File(open(self.filename)) response = self.client.post( - reverse('admin:filer-ajax_upload'), - {'Filename': self.image_name, 'Filedata': file_obj, 'jsessionid': self.client.session.session_key,}, + reverse('admin:filer-ajax_upload'), { + 'Filename': self.image_name, + 'Filedata': file_obj, + 'jsessionid': self.client.session.session_key, }, **extra_headers ) self.assertEqual(Image.objects.count(), 1) - self.assertEqual(Image.objects.all()[0].original_filename, self.image_name) + self.assertEqual(Image.objects.all()[0].original_filename, + self.image_name) def test_file_upload_no_duplicate_files(self, extra_headers={}): self.assertEqual(Image.objects.count(), 0) file_obj = django.core.files.File(open(self.filename)) response = self.client.post( - reverse('admin:filer-ajax_upload'), - {'Filename': self.image_name, 'Filedata': file_obj, 'jsessionid': self.client.session.session_key,}, + reverse('admin:filer-ajax_upload'), { + 'Filename': self.image_name, + 'Filedata': file_obj, + 'jsessionid': self.client.session.session_key, }, **extra_headers ) self.assertEqual(Image.objects.count(), 1) - self.assertEqual(Image.objects.all()[0].original_filename, self.image_name) - # upload the same file again. This must fail since the clipboard can't contain - # two files with the same name + self.assertEqual(Image.objects.all()[0].original_filename, + self.image_name) + # upload the same file again. This must fail since the + # clipboard can't contain two files with the same name response = self.client.post( - reverse('admin:filer-ajax_upload'), - {'Filename': self.image_name, 'Filedata': file_obj, 'jsessionid': self.client.session.session_key,}, + reverse('admin:filer-ajax_upload'), { + 'Filename': self.image_name, + 'Filedata': file_obj, + 'jsessionid': self.client.session.session_key, }, **extra_headers ) self.assertEqual(Image.objects.count(), 1) @@ -191,7 +202,7 @@ def upload(): response = self.client.post( reverse('admin:filer-ajax_upload'), {'Filename': self.image_name, 'Filedata': file_obj, - 'jsessionid': self.client.session.session_key,}) + 'jsessionid': self.client.session.session_key, }) return Image.objects.all().order_by('-id')[0] uploaded_image = upload() @@ -218,14 +229,15 @@ def paste(uploaded_image): def test_filer_ajax_upload_file(self): self.assertEqual(Image.objects.count(), 0) file_obj = django.core.files.File(open(self.filename)) - response = self.client.post( - reverse('admin:filer-ajax_upload')+'?filename=%s' % self.image_name, + response = self.client.post(reverse('admin:filer-ajax_upload') + + '?filename=%s' % self.image_name, data=file_obj.read(), content_type='application/octet-stream', **{'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'} ) self.assertEqual(Image.objects.count(), 1) - self.assertEqual(Image.objects.all()[0].original_filename, self.image_name) + self.assertEqual(Image.objects.all()[0].original_filename, + self.image_name) class BulkOperationsMixin(object): @@ -239,8 +251,10 @@ def setUp(self): self.img.save(self.filename, 'JPEG') self.create_src_and_dst_folders() self.folder = Folder.objects.create(name="root folder", parent=None) - self.sub_folder1 = Folder.objects.create(name="sub folder 1", parent=self.folder) - self.sub_folder2 = Folder.objects.create(name="sub folder 2", parent=self.folder) + self.sub_folder1 = Folder.objects.create( + name="sub folder 1", parent=self.folder) + self.sub_folder2 = Folder.objects.create( + name="sub folder 2", parent=self.folder) self.image_obj = self.create_image(self.src_folder) self.create_file(self.folder) self.create_file(self.folder) @@ -269,7 +283,9 @@ def create_src_and_dst_folders(self): def create_image(self, folder, filename=None): filename = filename or 'test_image.jpg' file_obj = django.core.files.File(open(self.filename), name=filename) - image_obj = Image.objects.create(owner=self.superuser, original_filename=self.image_name, file=file_obj, folder=folder) + image_obj = Image.objects.create( + owner=self.superuser, original_filename=self.image_name, + file=file_obj, folder=folder) image_obj.save() return image_obj @@ -277,7 +293,8 @@ def create_file(self, folder, filename=None): filename = filename or 'test_file.dat' file_data = django.core.files.base.ContentFile('some data') file_data.name = filename - file_obj = File.objects.create(owner=self.superuser, original_filename=filename, file=file_data, folder=folder) + file_obj = File.objects.create(owner=self.superuser, + original_filename=filename, file=file_data, folder=folder) file_obj.save() return file_obj @@ -307,16 +324,17 @@ def test_validate_no_duplicate_folders_on_move(self): | |--bar - and try to move the owter bar in foo. This has to fail since it would result - in two folders with the same name and parent. + and try to move the owter bar in foo. This has to fail since it + would result in two folders with the same name and parent. """ root = Folder.objects.create(name='root', owner=self.superuser) - foo = Folder.objects.create(name='foo', parent=root, owner=self.superuser) - bar = Folder.objects.create(name='bar', parent=root, owner=self.superuser) - foos_bar = Folder.objects.create(name='bar', parent=foo, owner=self.superuser) - url = reverse('admin:filer-directory_listing', kwargs={ - 'folder_id': root.pk, - }) + foo = Folder.objects.create( + name='foo', parent=root, owner=self.superuser) + bar = Folder.objects.create( + name='bar', parent=root, owner=self.superuser) + foos_bar = Folder.objects.create( + name='bar', parent=foo, owner=self.superuser) + url = get_dir_listing_url(root) response, _ = move_action(self.client, root, foo, [bar]) # refresh from db and validate that it hasn't been moved @@ -328,9 +346,7 @@ def test_move_to_clipboard_action(self): self.assertEqual(self.src_folder.files.count(), 1) self.assertEqual(self.dst_folder.files.count(), 0) - url = reverse('admin:filer-directory_listing', kwargs={ - 'folder_id': self.src_folder.id, - }) + url = get_dir_listing_url(self.src_folder) response = move_to_clipboard_action( self.client, self.src_folder, [self.image_obj]) self.assertEqual(self.src_folder.files.count(), 0) @@ -338,7 +354,8 @@ def test_move_to_clipboard_action(self): clipboard = Clipboard.objects.get(user=self.superuser) self.assertEqual(clipboard.files.count(), 1) request = HttpRequest() - tools.move_files_from_clipboard_to_folder(request, clipboard, self.src_folder) + tools.move_files_from_clipboard_to_folder( + request, clipboard, self.src_folder) tools.discard_clipboard(clipboard) self.assertEqual(clipboard.files.count(), 0) self.assertEqual(self.src_folder.files.count(), 1) @@ -348,9 +365,7 @@ def test_files_set_public_action(self): self.image_obj.is_public = False self.image_obj.save() self.assertEqual(self.image_obj.is_public, False) - url = reverse('admin:filer-directory_listing', kwargs={ - 'folder_id': self.src_folder.id, - }) + url = get_dir_listing_url(self.src_folder) response = self.client.post(url, { 'action': 'files_set_public', helpers.ACTION_CHECKBOX_NAME: 'file-%d' % (self.image_obj.id,), @@ -363,9 +378,7 @@ def test_files_set_private_action(self): self.image_obj.is_public = True self.image_obj.save() self.assertEqual(self.image_obj.is_public, True) - url = reverse('admin:filer-directory_listing', kwargs={ - 'folder_id': self.src_folder.id, - }) + url = get_dir_listing_url(self.src_folder) response = self.client.post(url, { 'action': 'files_set_private', helpers.ACTION_CHECKBOX_NAME: 'file-%d' % (self.image_obj.id,), @@ -381,9 +394,7 @@ def test_copy_files_and_folders_action(self): self.assertEqual(self.src_folder.files.count(), 1) self.assertEqual(self.dst_folder.files.count(), 0) self.assertEqual(self.image_obj.original_filename, 'test_file.jpg') - url = reverse('admin:filer-directory_listing', kwargs={ - 'folder_id': self.src_folder.id, - }) + url = get_dir_listing_url(self.src_folder) response = self.client.post(url, { 'action': 'copy_files_and_folders', 'post': 'yes', @@ -397,13 +408,14 @@ def test_copy_files_and_folders_action(self): dst_image_obj = self.dst_folder.files[0] self.assertEqual(dst_image_obj.original_filename, 'test_filetest.jpg') + class FilerDeleteOperationTests(BulkOperationsMixin, TestCase): def test_delete_files_or_folders_action(self): self.assertNotEqual(File.objects.count(), 0) self.assertNotEqual(Image.objects.count(), 0) self.assertNotEqual(Folder.objects.count(), 0) - url = reverse('admin:filer-directory_listing-root') + url = get_dir_listing_url(None) folders = [] for folder in FolderRoot().children.all(): folders.append('folder-%d' % (folder.id,)) @@ -416,14 +428,15 @@ def test_delete_files_or_folders_action(self): self.assertEqual(Folder.objects.count(), 0) def test_delete_files_or_folders_action_with_mixed_types(self): - # add more files/images so we can test the polymorphic queryset with multiple types + # add more files/images so we can test the polymorphic queryset + # with multiple types self.create_file(folder=self.src_folder) self.create_image(folder=self.src_folder) self.create_file(folder=self.src_folder) self.assertNotEqual(File.objects.count(), 0) self.assertNotEqual(Image.objects.count(), 0) - url = reverse('admin:filer-directory_listing', args=(self.folder.id,)) + url = get_dir_listing_url(self.folder) folders = [] for f in File.objects.filter(folder=self.folder): folders.append('file-%d' % (f.id,)) @@ -433,7 +446,8 @@ def test_delete_files_or_folders_action_with_mixed_types(self): 'post': 'yes', helpers.ACTION_CHECKBOX_NAME: folders, }) - self.assertEqual(File.objects.filter(folder__in=[self.folder.id, self.sub_folder1.id]).count(), 0) + self.assertEqual(File.objects.filter( + folder__in=[self.folder.id, self.sub_folder1.id]).count(), 0) class FilerResizeOperationTests(BulkOperationsMixin, TestCase): @@ -444,9 +458,7 @@ def test_resize_images_action(self): self.assertEqual(self.image_obj.height, 600) # since the 'resize' action is disabled from the admin return - url = reverse('admin:filer-directory_listing', kwargs={ - 'folder_id': self.src_folder.id, - }) + url = get_dir_listing_url(self.src_folder.id) response = self.client.post(url, { 'action': 'resize_images', 'post': 'yes', @@ -557,45 +569,13 @@ def test_admin_view(self): self.assert_user_adminview(user) -class TestFolderTypeFolderPermissionLayer(TestCase): - +class BaseTestFolderTypePermissionLayer(object): def test_default_add_view_is_forbidden(self): - with login_using(self.client, 'superuser'): - response = self.client.get(reverse('admin:filer_folder_add')) - self.assertEqual(response.status_code, 403) - - with login_using(self.client): - response = self.client.get(reverse('admin:filer_folder_add')) - self.assertEqual(response.status_code, 403) - - # only superusers can do operations on root folders - # regular users can do operations inside root folders only - - def test_add_root_folder_for_regular_user(self): - with login_using(self.client): - # regular users should not be able to add root folders at all - response = self.client.get( - reverse('admin:filer-directory_listing-make_root_folder')) - self.assertEqual(response.status_code, 403) - response = self.client.post( - reverse('admin:filer-directory_listing-make_root_folder'), {}) - self.assertEqual(response.status_code, 403) + response = self.client.get(reverse('admin:filer_folder_add')) + self.assertEqual(response.status_code, 403) - def test_change_root_folder_for_regular_user(self): - with login_using(self.client): - f1 = Folder.objects.create(name='foo') - # regular users should not be able to change root folders at all - for folder_type in [Folder.CORE_FOLDER, Folder.SITE_FOLDER]: - Folder.objects.filter(id=f1.id).update(folder_type=folder_type) - response = self.client.get( - reverse('admin:filer_folder_change', args=(f1.pk, ))) - self.assertEqual(response.status_code, 403) - response = self.client.post( - reverse('admin:filer_folder_change', args=(f1.pk, )), {}) - self.assertEqual(response.status_code, 403) - - def _test_change_child_site_folder(self): + def test_change_child_site_folder(self): f1 = Folder.objects.create(name='foo') f2 = Folder.objects.create(name='foo_bar', parent=f1) # regular users should be able to change child folders @@ -618,11 +598,7 @@ def _test_change_child_site_folder(self): self.assertEqual(f2__changed.name, 'foo_bar__changed') self.assertEqual(f2__changed.folder_type, Folder.SITE_FOLDER) - def test_change_child_site_folder_for_regular_user(self): - with login_using(self.client): - self._test_change_child_site_folder() - - def _test_change_core_folder(self): + def test_change_core_folder(self): f1 = Folder.objects.create( name='foo', folder_type=Folder.CORE_FOLDER) f2 = Folder.objects.create( @@ -639,47 +615,7 @@ def _test_change_core_folder(self): {'post': ['yes']}) self.assertEqual(response.status_code, 403) - def test_change_core_folder_for_regular_user(self): - with login_using(self.client): - self._test_change_core_folder() - - def test_delete_root_folder_for_regular_user(self): - with login_using(self.client): - f1 = Folder.objects.create(name='foo') - # regular users should not be able to delete root folders at all - for folder_type in [Folder.CORE_FOLDER, Folder.SITE_FOLDER]: - Folder.objects.filter(id=f1.id).update(folder_type=folder_type) - response = self.client.post( - reverse('admin:filer_folder_delete', args=(f1.pk, )), - {'post': 'yes'}) - self.assertEqual(response.status_code, 403) - - response = self.client.post( - reverse('admin:filer-directory_listing-root'), { - 'action': 'delete_files_or_folders', - 'post': 'yes', - helpers.ACTION_CHECKBOX_NAME: ['folder-%d' % f1.id], - }) - self.assertEqual(response.status_code, 403) - # case when viewing another folder content - # hit search and select a root folder to delete - folder_for_view = Folder.objects.create(name='bar') - response = self.client.post( - reverse('admin:filer-directory_listing', - args=(folder_for_view.pk, )), { - 'action': 'delete_files_or_folders', - 'post': 'yes', - helpers.ACTION_CHECKBOX_NAME: ['folder-%d' % f1.id], - }) - # this might be a bug since the folder requested for deletion - # is not passed to the delete_files_or_folders. For now - # just make sure it is not deleted - self.assertEqual(response.status_code, 302) - self.assertEqual( - Folder.objects.filter( - id__in=[folder_for_view.id, f1.id]).count(), 2) - - def _test_delete_child_site_folder(self): + def test_delete_child_site_folder(self): f1 = Folder.objects.create(name='foo') f2 = Folder.objects.create(name='bar', parent=f1) f3 = Folder.objects.create(name='baz', parent=f1) @@ -690,9 +626,7 @@ def _test_delete_child_site_folder(self): self.assertEqual(response.status_code, 302) self.assertEqual(Folder.objects.filter(id=f2.id).count(), 0) - response = self.client.post( - reverse('admin:filer-directory_listing', - kwargs={'folder_id':f1.id}), { + response = self.client.post(get_dir_listing_url(f1), { 'action': 'delete_files_or_folders', 'post': 'yes', helpers.ACTION_CHECKBOX_NAME: ['folder-%d' % f3.id], @@ -700,11 +634,7 @@ def _test_delete_child_site_folder(self): self.assertEqual(response.status_code, 302) self.assertEqual(Folder.objects.filter(id=f3.id).count(), 0) - def test_delete_child_site_folder_for_regular_user(self): - with login_using(self.client): - self._test_delete_child_site_folder() - - def _test_delete_child_core_folder(self): + def test_delete_child_core_folder(self): f1 = Folder.objects.create(name='foo') f2 = Folder.objects.create( name='bar', parent=f1, folder_type=Folder.CORE_FOLDER) @@ -717,9 +647,7 @@ def _test_delete_child_core_folder(self): self.assertEqual(response.status_code, 403) self.assertEqual(Folder.objects.filter(id=f2.id).count(), 1) - response = self.client.post( - reverse('admin:filer-directory_listing', - kwargs={'folder_id':f1.id}), { + response = self.client.post(get_dir_listing_url(f1), { 'action': 'delete_files_or_folders', 'post': 'yes', helpers.ACTION_CHECKBOX_NAME: ['folder-%d' % f3.id], @@ -727,102 +655,79 @@ def _test_delete_child_core_folder(self): self.assertEqual(response.status_code, 403) self.assertEqual(Folder.objects.filter(id=f3.id).count(), 1) - def test_delete_child_core_folder_for_regular_user(self): - with login_using(self.client): - self._test_delete_child_core_folder() - - def test_add_root_folder_for_superuser(self): - with login_using(self.client, 'superuser'): - # superusers should be able to add only root site folders - response = self.client.get( - reverse('admin:filer-directory_listing-make_root_folder')) - self.assertEqual(response.status_code, 200) - self.assertIn('adminform', response.context_data) - # make sure the folder that is going to be saved is a site folder - form = response.context_data['adminform'].form - self.assertEqual(form.instance.folder_type, Folder.SITE_FOLDER) - # only fields 'site', 'name' should be visible - self.assertItemsEqual(['site', 'name'], form.fields.keys()) - - s1 = Site.objects.create(name='foo_site', domain='foo-domain.com') - response = self.client.post( - reverse('admin:filer-directory_listing-make_root_folder'), - {'name': 'foo', 'site': s1.id}) - self.assertEqual(response.status_code, 302) - self.assertEqual(Folder.objects.count(), 1) - - def test_change_root_folder_for_superuser(self): - with login_using(self.client, 'superuser'): - f1 = Folder.objects.create( - name='foo', folder_type=Folder.CORE_FOLDER) - response = self.client.get( - reverse('admin:filer_folder_change', args=(f1.pk, ))) - self.assertEqual(response.status_code, 403) - response = self.client.post( - reverse('admin:filer_folder_change', args=(f1.pk, )), {}) - self.assertEqual(response.status_code, 403) - - Folder.objects.filter(id=f1.id).update( - folder_type=Folder.SITE_FOLDER) - response = self.client.get( - reverse('admin:filer_folder_change', args=(f1.pk, ))) - self.assertEqual(response.status_code, 200) - response = self.client.post( - reverse('admin:filer_folder_change', args=(f1.pk, )), {}) - self.assertEqual(response.status_code, 200) - - def test_change_child_site_folder_for_superuser(self): - with login_using(self.client, 'superuser'): - self._test_change_child_site_folder() + def test_add_root_folder(self): + # superusers should be able to add only root site folders + response = self.client.get( + get_make_root_folder_url()) + self.assertEqual(response.status_code, 200) + self.assertIn('adminform', response.context_data) + # make sure the folder that is going to be saved is a site folder + form = response.context_data['adminform'].form + self.assertEqual(form.instance.folder_type, Folder.SITE_FOLDER) + # only fields 'site', 'name' should be visible + self.assertItemsEqual(['site', 'name'], form.fields.keys()) - def test_change_core_folder_for_superuser(self): - with login_using(self.client, 'superuser'): - self._test_change_core_folder() + s1 = Site.objects.create(name='foo_site', domain='foo-domain.com') + response = self.client.post( + get_make_root_folder_url(), + {'name': 'foo', 'site': s1.id}) + self.assertEqual(response.status_code, 302) + self.assertEqual(Folder.objects.count(), 1) - def test_delete_root_folder_for_superuser(self): - with login_using(self.client, 'superuser'): - f1 = Folder.objects.create( - name='foo', folder_type=Folder.CORE_FOLDER) + def test_change_root_folder(self): + f1 = Folder.objects.create( + name='foo', folder_type=Folder.CORE_FOLDER) + response = self.client.get( + reverse('admin:filer_folder_change', args=(f1.pk, ))) + self.assertEqual(response.status_code, 403) + response = self.client.post( + reverse('admin:filer_folder_change', args=(f1.pk, )), {}) + self.assertEqual(response.status_code, 403) - response = self.client.post( - reverse('admin:filer_folder_delete', args=(f1.pk, )), - {'post': 'yes'}) - self.assertEqual(response.status_code, 403) - self.assertEqual(Folder.objects.filter(id=f1.id).count(), 1) - response = self.client.post( - reverse('admin:filer-directory_listing-root'), { - 'action': 'delete_files_or_folders', - 'post': 'yes', - helpers.ACTION_CHECKBOX_NAME: ['folder-%d' % f1.id], - }) - self.assertEqual(response.status_code, 403) - self.assertEqual(Folder.objects.filter(id=f1.id).count(), 1) + Folder.objects.filter(id=f1.id).update( + folder_type=Folder.SITE_FOLDER) + response = self.client.get( + reverse('admin:filer_folder_change', args=(f1.pk, ))) + self.assertEqual(response.status_code, 200) + response = self.client.post( + reverse('admin:filer_folder_change', args=(f1.pk, )), {}) + self.assertEqual(response.status_code, 200) - Folder.objects.filter(id=f1.id).update( - folder_type=Folder.SITE_FOLDER) - response = self.client.post( - reverse('admin:filer_folder_delete', args=(f1.pk, )), - {'post': 'yes'}) - self.assertEqual(response.status_code, 302) - self.assertEqual(Folder.objects.filter(id=f1.id).count(), 0) - f1 = Folder.objects.create( - name='foo', folder_type=Folder.SITE_FOLDER) - response = self.client.post( - reverse('admin:filer-directory_listing-root'), { - 'action': 'delete_files_or_folders', - 'post': 'yes', - helpers.ACTION_CHECKBOX_NAME: ['folder-%d' % f1.id], - }) - self.assertEqual(response.status_code, 302) - self.assertEqual(Folder.objects.filter(id=f1.id).count(), 0) + def test_delete_root_folder(self): + f1 = Folder.objects.create( + name='foo', folder_type=Folder.CORE_FOLDER) - def test_delete_child_site_folder_for_superuser(self): - with login_using(self.client, 'superuser'): - self._test_delete_child_site_folder() + response = self.client.post( + reverse('admin:filer_folder_delete', args=(f1.pk, )), + {'post': 'yes'}) + self.assertEqual(response.status_code, 403) + self.assertEqual(Folder.objects.filter(id=f1.id).count(), 1) + response = self.client.post( + get_dir_listing_url(None), { + 'action': 'delete_files_or_folders', + 'post': 'yes', + helpers.ACTION_CHECKBOX_NAME: ['folder-%d' % f1.id], + }) + self.assertEqual(response.status_code, 403) + self.assertEqual(Folder.objects.filter(id=f1.id).count(), 1) - def test_delete_child_core_folder_for_superuser(self): - with login_using(self.client, 'superuser'): - self._test_delete_child_core_folder() + Folder.objects.filter(id=f1.id).update( + folder_type=Folder.SITE_FOLDER) + response = self.client.post( + reverse('admin:filer_folder_delete', args=(f1.pk, )), + {'post': 'yes'}) + self.assertEqual(response.status_code, 302) + self.assertEqual(Folder.objects.filter(id=f1.id).count(), 0) + f1 = Folder.objects.create( + name='foo', folder_type=Folder.SITE_FOLDER) + response = self.client.post( + get_dir_listing_url(None), { + 'action': 'delete_files_or_folders', + 'post': 'yes', + helpers.ACTION_CHECKBOX_NAME: ['folder-%d' % f1.id], + }) + self.assertEqual(response.status_code, 302) + self.assertEqual(Folder.objects.filter(id=f1.id).count(), 0) def _build_some_folder_structure(self, folder_type, site): _folders, _files = {}, {} @@ -848,25 +753,19 @@ def _build_some_folder_structure(self, folder_type, site): _files['file_bar'] = file_bar return _folders, _files - def _test_move_core_folders(self): + def test_move_core_folders(self): folders, files = self._build_some_folder_structure( Folder.CORE_FOLDER, None) - response, _ = move_action(self.client, None, folders['foo2'], [folders['bar']]) + response, _ = move_action( + self.client, None, folders['foo2'], [folders['bar']]) self.assertEqual(response.status_code, 403) - response, _ = move_action(self.client, None, folders['foo2'], [folders['foo1']]) + response, _ = move_action( + self.client, None, folders['foo2'], [folders['foo1']]) self.assertEqual(response.status_code, 403) - def test_move_core_folder_for_regular_user(self): - with login_using(self.client): - self._test_move_core_folders() - - def test_move_core_folder_for_superuser(self): - with login_using(self.client, 'superuser'): - self._test_move_core_folders() - - def _test_move_site_folder_to_core_destination_folder(self): + def test_move_site_folder_to_core_destination_folder(self): folders, files = self._build_some_folder_structure( Folder.SITE_FOLDER, Site.objects.get(id=1)) f1 = Folder.objects.create( @@ -877,19 +776,15 @@ def _test_move_site_folder_to_core_destination_folder(self): f1.delete() return folders, files - def test_move_site_folder_for_regular_user(self): - with login_using(self.client): - self._test_move_site_folder_to_core_destination_folder() - - def test_move_site_folder_for_superuser(self): - with login_using(self.client, 'superuser'): - self._test_move_site_folder_to_core_destination_folder() - def _get_clipboard_files(self): - clipboard, _ = Clipboard.objects.get_or_create(user=self.client.user_used) + clipboard, _ = Clipboard.objects.get_or_create( + user=self.user) return clipboard.files - def _test_move_to_clipboard_from_root(self): + def test_move_to_clipboard_from_root(self): + if not self.user.is_superuser: + self.assertEqual('This test should work after refactor filer ' + 'permissions', '') file_bar = File.objects.create( original_filename='bar', folder=None, file=django.core.files.base.ContentFile('some data')) @@ -899,19 +794,7 @@ def _test_move_to_clipboard_from_root(self): self.assertEqual( self._get_clipboard_files().count(), 1) - def test_move_to_clipboard_from_root_for_regular_user(self): - self.assertEqual('This test should work after removing filer ' - 'permissions', '') - with login_using(self.client): - self._test_move_to_clipboard_from_root() - - def test_move_to_clipboard_from_root_for_super_user(self): - self.assertEqual('This test should work after removing filer ' - 'permissions', '') - with login_using(self.client, 'superuser'): - self._test_move_to_clipboard_from_root() - - def _test_move_to_clipboard_from_site_folders(self): + def test_move_to_clipboard_from_site_folders(self): foo = Folder.objects.create(name='mic', site=Site.objects.get(id=1)) file_bar = File.objects.create( original_filename='mic', folder=foo, @@ -922,15 +805,7 @@ def _test_move_to_clipboard_from_site_folders(self): self.assertEqual( self._get_clipboard_files().count(), 1) - def test_move_to_clipboard_from_site_folders_regular_user(self): - with login_using(self.client): - self._test_move_to_clipboard_from_site_folders() - - def test_move_to_clipboard_from_site_folders_superuser(self): - with login_using(self.client, 'superuser'): - self._test_move_to_clipboard_from_site_folders() - - def _test_move_to_clipboard_from_core_folders(self): + def test_move_to_clipboard_from_core_folders(self): foo = Folder.objects.create(name='foo', folder_type=Folder.CORE_FOLDER) file_bar = File.objects.create( @@ -943,65 +818,69 @@ def _test_move_to_clipboard_from_core_folders(self): self.assertEqual( self._get_clipboard_files().count(), 0) - def test_move_to_clipboard_from_core_folders_for_regular_user(self): - with login_using(self.client): - self._test_move_to_clipboard_from_core_folders() - - def test_move_to_clipboard_from_core_folders_for_superuser(self): - with login_using(self.client, 'superuser'): - self._test_move_to_clipboard_from_core_folders() - - def _test_move_from_clipboard_to_root(self): - pass - - def _test_move_from_clipboard_to_core_folders(self): - pass - - def _test_move_from_clipboard_to_site_folders(self): - pass - -class TestFolderTypeValidation(TestCase): - - def _test_message_error_user_destination_no_site_on_move(self): - site = Site.objects.get(id=1) - foo = Folder.objects.create(name='foo') - bar = Folder.objects.create(name='bar', site=site) - baz = Folder.objects.create(name='baz', site=site, parent=bar) - response, url = move_action(self.client, None, foo, [baz], follow=True) - self.assertRedirects(response, url) - self.assertIn( - 'Destination folder %s does not belong to any ' - 'site.' % foo.pretty_logical_path, - get_user_message(response).message) + def test_move_from_clipboard_to_root(self): + bar_file = File.objects.create( + original_filename='bar_file', + file=django.core.files.base.ContentFile('some data')) + clipboard, _ = Clipboard.objects.get_or_create( + user=self.user) + clipboard.append_file(bar_file) + self.assertEqual( + self._get_clipboard_files().count(), 1) + response = paste_clipboard_to_folder( + self.client, None, clipboard) + self.assertEqual(response.status_code, 403) + self.assertEqual( + self._get_clipboard_files().count(), 1) - def test_message_error_user_destination_no_site_on_move_regular_user(self): - with login_using(self.client): - self._test_message_error_user_destination_no_site_on_move() + def test_move_from_clipboard_to_core_folders(self): + bar_file = File.objects.create( + original_filename='bar_file', + file=django.core.files.base.ContentFile('some data')) + core_folder = Folder.objects.create( + name='foo', folder_type=Folder.CORE_FOLDER) + clipboard, _ = Clipboard.objects.get_or_create( + user=self.user) + clipboard.append_file(bar_file) + self.assertEqual( + self._get_clipboard_files().count(), 1) + response = paste_clipboard_to_folder( + self.client, core_folder, clipboard) + self.assertEqual(response.status_code, 403) + self.assertEqual( + self._get_clipboard_files().count(), 1) - def test_message_error_user_destination_no_site_on_move_superuser(self): - with login_using(self.client, 'superuser'): - self._test_message_error_user_destination_no_site_on_move() + def test_move_from_clipboard_to_site_folders(self): + bar_file = File.objects.create( + original_filename='bar_file', + file=django.core.files.base.ContentFile('some data')) + site_folder = Folder.objects.create( + name='foo', site=Site.objects.get(id=1)) + clipboard, _ = Clipboard.objects.get_or_create( + user=self.user) + clipboard.append_file(bar_file) + self.assertEqual( + self._get_clipboard_files().count(), 1) + response = paste_clipboard_to_folder( + self.client, site_folder, clipboard) + self.assertEqual(response.status_code, 302) + self.assertEqual( + self._get_clipboard_files().count(), 0) + self.assertEqual(len(site_folder.files), 1) - def _test_message_error_user_no_site_on_move(self): + def test_message_error_user_no_site_on_move(self): site = Site.objects.get(id=1) foo_root = Folder.objects.create(name='foo_root') foo = Folder.objects.create(name='foo', parent=foo_root) bar = Folder.objects.create(name='bar', site=site) - response, url = move_action(self.client, foo_root, bar, [foo], follow=True) + response, url = move_action( + self.client, foo_root, bar, [foo], follow=True) self.assertRedirects(response, url) self.assertIn( "Some of the selected files/folders do not belong to any site.", get_user_message(response).message) - def test_message_error_user_no_site_on_move_regular_user(self): - with login_using(self.client): - self._test_message_error_user_no_site_on_move() - - def test_message_error_user_no_site_on_move_superuser(self): - with login_using(self.client, 'superuser'): - self._test_message_error_user_no_site_on_move() - - def _test_message_error_user_sites_mismatch_on_move(self): + def test_message_error_user_sites_mismatch_on_move(self): site = Site.objects.get(id=1) other_site = Site.objects.create(name='foo_site', domain='foo_site') # make a root for foo in order to work for regular users @@ -1009,22 +888,133 @@ def _test_message_error_user_sites_mismatch_on_move(self): foo = Folder.objects.create( name='foo', parent=foo_root) bar = Folder.objects.create(name='bar', site=site) - url = reverse('admin:filer-directory_listing', - kwargs={'folder_id': foo_root.id}) - response, url = move_action(self.client, foo_root, bar, [foo], follow=True) + url = get_dir_listing_url(foo_root) + response, url = move_action( + self.client, foo_root, bar, [foo], follow=True) self.assertRedirects(response, url) self.assertIn( "Selected files/folders need to belong to the same site as the " "destination folder.", get_user_message(response).message) - def test_message_error_user_sites_mismatch_on_move_regular_user(self): - with login_using(self.client): - self._test_message_error_user_sites_mismatch_on_move() + def test_message_error_user_destination_no_site_on_move(self): + site = Site.objects.get(id=1) + foo = Folder.objects.create(name='foo') + bar = Folder.objects.create(name='bar', site=site) + baz = Folder.objects.create(name='baz', site=site, parent=bar) + response, url = move_action(self.client, None, foo, [baz], follow=True) + self.assertRedirects(response, url) + self.assertIn( + 'Destination folder %s does not belong to any ' + 'site.' % foo.pretty_logical_path, + get_user_message(response).message) + + def test_move_destination_filters_core_folders(self): + foo = Folder.objects.create( + name='foo', folder_type=Folder.CORE_FOLDER) + bar = Folder.objects.create( + name='bar', site=Site.objects.get(id=1)) + bar2 = Folder.objects.create( + name='bar2', site=Site.objects.get(id=1)) + bar_file = File.objects.create( + original_filename='bar_file', + file=django.core.files.base.ContentFile('some data')) + + url = get_dir_listing_url(bar) + response = self.client.post(url, { + 'action': 'move_files_and_folders', + helpers.ACTION_CHECKBOX_NAME: [filer_obj_as_checkox(bar_file)] + }) + self.assertEqual(response.status_code, 200) + self.assertIn('destination_folders', response.context) + dest_folders = response.context['destination_folders'] + self.assertNotIn(foo.id, [el[0].id for el in dest_folders]) + + def test_copy_destination_filters_restricted_folders(self): + pass - def test_message_error_user_sites_mismatch_on_move_superuser(self): - with login_using(self.client, 'superuser'): - self._test_message_error_user_sites_mismatch_on_move() + +class TestFolderTypeFolderPermissionForSuperUser( + TestCase, BaseTestFolderTypePermissionLayer): + + def setUp(self): + username = 'login_using_foo' + password = 'secret' + user = User.objects.create_user(username=username, password=password) + user.is_superuser = user.is_staff = user.is_active = True + user.save() + user.user_permissions = Permission.objects.all() + self.client.login(username=username, password=password) + self.user = user + + +class TestFolderTypeFolderPermissionLayerForRegularUser( + TestCase, BaseTestFolderTypePermissionLayer): + + def setUp(self): + username = 'login_using_foo' + password = 'secret' + user = User.objects.create_user(username=username, password=password) + user.is_staff = user.is_active = True + user.save() + user.user_permissions = Permission.objects.all() + self.client.login(username=username, password=password) + self.user = user + + def test_add_root_folder(self): + # regular users should not be able to add root folders at all + response = self.client.get( + get_make_root_folder_url()) + self.assertEqual(response.status_code, 403) + response = self.client.post( + get_make_root_folder_url(), {}) + self.assertEqual(response.status_code, 403) + + def test_change_root_folder(self): + f1 = Folder.objects.create(name='foo') + # regular users should not be able to change root folders at all + for folder_type in [Folder.CORE_FOLDER, Folder.SITE_FOLDER]: + Folder.objects.filter(id=f1.id).update(folder_type=folder_type) + response = self.client.get( + reverse('admin:filer_folder_change', args=(f1.pk, ))) + self.assertEqual(response.status_code, 403) + response = self.client.post( + reverse('admin:filer_folder_change', args=(f1.pk, )), {}) + self.assertEqual(response.status_code, 403) + + def test_delete_root_folder(self): + f1 = Folder.objects.create(name='foo') + # regular users should not be able to delete root folders at all + for folder_type in [Folder.CORE_FOLDER, Folder.SITE_FOLDER]: + Folder.objects.filter(id=f1.id).update(folder_type=folder_type) + response = self.client.post( + reverse('admin:filer_folder_delete', args=(f1.pk, )), + {'post': 'yes'}) + self.assertEqual(response.status_code, 403) + + response = self.client.post( + get_dir_listing_url(None), { + 'action': 'delete_files_or_folders', + 'post': 'yes', + helpers.ACTION_CHECKBOX_NAME: ['folder-%d' % f1.id], + }) + self.assertEqual(response.status_code, 403) + # case when viewing another folder content + # hit search and select a root folder to delete + folder_for_view = Folder.objects.create(name='bar') + response = self.client.post( + get_dir_listing_url(folder_for_view), { + 'action': 'delete_files_or_folders', + 'post': 'yes', + helpers.ACTION_CHECKBOX_NAME: ['folder-%d' % f1.id], + }) + # this might be a bug since the folder requested for deletion + # is not passed to the delete_files_or_folders. For now + # just make sure it is not deleted + self.assertEqual(response.status_code, 302) + self.assertEqual( + Folder.objects.filter( + id__in=[folder_for_view.id, f1.id]).count(), 2) class TestFolderTypeFilesPermissionLayer(TestCase): diff --git a/filer/tests/helpers.py b/filer/tests/helpers.py index 58be5e6fa..1308378e0 100644 --- a/filer/tests/helpers.py +++ b/filer/tests/helpers.py @@ -4,30 +4,45 @@ from django.contrib.auth.models import User, Permission from filer.models.foldermodels import Folder, FolderPermission from filer.models.clipboardmodels import Clipboard, ClipboardItem -from contextlib import contextmanager from django.core.urlresolvers import reverse from django.contrib.admin import helpers -def _get_dir_listing_url(folder_id_for_view): - if folder_id_for_view is None: +def get_dir_listing_url(folder): + if folder is None: return reverse('admin:filer-directory_listing-root') - if folder_id_for_view is 'unfiled': + if folder is 'unfiled': return reverse('admin:filer-directory_listing-unfiled_images') return reverse('admin:filer-directory_listing', - kwargs={'folder_id': folder_id_for_view.id}) + kwargs={'folder_id': folder.id}) +def get_make_root_folder_url(): + return reverse('admin:filer-directory_listing-make_root_folder') -def _filer_object_type(filer_obj): - if isinstance(filer_obj, Folder): - return 'folder' - return 'file' + +def filer_obj_as_checkox(filer_obj): + + def filer_object_type(filer_obj): + if isinstance(filer_obj, Folder): + return 'folder' + return 'file' + + return '%s-%d' % (filer_object_type(filer_obj), filer_obj.id) + + + +def paste_clipboard_to_folder(client, destination, clipboard): + data_to_post = { 'clipboard_id': clipboard.pk } + if destination: + data_to_post['folder_id'] = destination.id + return client.post( + reverse('admin:filer-paste_clipboard_to_folder'), data_to_post) def move_to_clipboard_action(client, folder_view, to_move, follow=False): - objects_to_move = ['%s-%d' % (_filer_object_type(filer_obj), filer_obj.id) + objects_to_move = [filer_obj_as_checkox(filer_obj) for filer_obj in to_move] - url = _get_dir_listing_url(folder_view) + url = get_dir_listing_url(folder_view) return client.post(url, { 'action': 'move_to_clipboard', 'post': 'yes', @@ -35,9 +50,9 @@ def move_to_clipboard_action(client, folder_view, to_move, follow=False): def move_action(client, folder_view, destination, to_move, follow=False): - objects_to_move = ['%s-%d' % (_filer_object_type(filer_obj), filer_obj.id) + objects_to_move = [filer_obj_as_checkox(filer_obj) for filer_obj in to_move] - url = _get_dir_listing_url(folder_view) + url = get_dir_listing_url(folder_view) return client.post(url, { 'action': 'move_files_and_folders', 'post': 'yes', @@ -45,25 +60,6 @@ def move_action(client, folder_view, destination, to_move, follow=False): helpers.ACTION_CHECKBOX_NAME: objects_to_move }, follow=follow), url -@contextmanager -def login_using(client, user_type=None): - username = 'login_using_foo' - password = 'secret' - user = User.objects.create_user(username=username, password=password) - if user_type == 'superuser': - user.is_superuser = True - user.is_staff = True - user.is_active = True - user.save() - user.user_permissions = Permission.objects.all() - client.login(username=username, password=password) - client.user_used = user - yield - del client.user_used - client.logout() - user.delete() - - def create_superuser(): superuser = User.objects.create_superuser('admin', 'admin@free.fr', diff --git a/filer/views.py b/filer/views.py index 58f2d021e..6f843bfc4 100755 --- a/filer/views.py +++ b/filer/views.py @@ -81,7 +81,12 @@ def upload(request): @login_required def paste_clipboard_to_folder(request): if request.method == 'POST': - folder = Folder.objects.get(id=request.POST.get('folder_id')) + folder_id = request.POST.get('folder_id') + + if not folder_id: + raise PermissionDenied + + folder = Folder.objects.get(id=folder_id) if folder.is_restricted(): raise PermissionDenied From 11c783b658c7670e1f0a2c65bdb21bc49dc18688 Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Fri, 20 Sep 2013 19:06:28 +0300 Subject: [PATCH 122/715] * Core folder files => readonly + no submission in view; * Restricted permissions in core folders for 'single file' move to clipboard; * Added file name validation on move action; * Added restricted on extracting archive files; * Files with name confliction on 'move from clipboard' will not get deleted anymore; * Some folder functions/buttons will no loger appear in template if folder is core folder ; * Code refactoring in admin tests; * Added some helper functions for admin tests; --- filer/admin/fileadmin.py | 11 +- filer/admin/folderadmin.py | 39 ++- filer/models/tools.py | 36 ++- filer/templates/admin/filer/change_form.html | 7 + .../admin/filer/folder/directory_listing.html | 4 +- .../admin/filer/folder/directory_table.html | 9 +- .../filer/tools/clipboard/clipboard.html | 2 +- filer/tests/admin.py | 252 ++++++++++++------ filer/tests/helpers.py | 8 +- filer/views.py | 5 +- 10 files changed, 258 insertions(+), 115 deletions(-) diff --git a/filer/admin/fileadmin.py b/filer/admin/fileadmin.py index 19ba3df39..5def825e0 100644 --- a/filer/admin/fileadmin.py +++ b/filer/admin/fileadmin.py @@ -11,11 +11,6 @@ selectfolder_status) -class FileAdminChangeFrom(forms.ModelForm): - class Meta: - model = File - - class FileAdmin(PrimitivePermissionAwareModelAdmin): list_display = ('label',) list_per_page = 10 @@ -30,7 +25,11 @@ class FileAdmin(PrimitivePermissionAwareModelAdmin): # render_change_form() override add and change to False. save_as = True - form = FileAdminChangeFrom + def get_readonly_fields(self, request, obj=None): + if obj and obj.is_restricted(): + return [field.name + for field in obj.__class__._meta.fields] + return super(FileAdmin, self).get_readonly_fields(request, obj) @classmethod def build_fieldsets(cls, extra_main_fields=(), extra_advanced_fields=(), extra_fieldsets=()): diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index aac362ed7..1b87e73f5 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -221,6 +221,8 @@ def make_folder(self, request, folder_id=None, *args, **kwargs): folder_id = request.REQUEST.get('parent_id', None) if folder_id: folder = Folder.objects.get(id=folder_id) + if folder.is_restricted(): + raise PermissionDenied else: folder = None @@ -380,6 +382,8 @@ def filter_file_permission(qs, permissions): if request.method == 'POST' and '_save' not in request.POST: for f in folder_files: if "move-to-clipboard-%d" % (f.id,) in request.POST: + if f.is_restricted(): + raise PermissionDenied clipboard = tools.get_user_clipboard(request.user) if f.has_edit_permission(request): tools.move_file_to_clipboard(request, [f], clipboard) @@ -960,17 +964,31 @@ def move_files_and_folders(self, request, not folders_dict[destination][1]): raise PermissionDenied - # We count only topmost files and folders here - n = files_queryset.count() + folders_queryset.count() - conflicting_names = [folder.name - for folder in Folder.objects.filter( - parent=destination, - name__in=folders_queryset.values('name'))] - if conflicting_names: + conflicting_folder_names = [ + folder.name for folder in Folder.objects.filter( + parent=destination, + name__in=folders_queryset.values('name'))] + + if conflicting_folder_names: messages.error(request, _(u"Folders with names %s already exist at the selected " - "destination") % u", ".join(conflicting_names)) - elif n: + "destination") % u", ".join(conflicting_folder_names)) + return + + valid_files , invalid_files = \ + tools.split_files_valid_for_destination( + files_queryset, destination) + if invalid_files: + conflicting_file_names = [f.actual_name + for f in invalid_files] + messages.error(request, + _(u"Files with names %s already exist at the selected " + "destination") % u", ".join(conflicting_file_names)) + return + + # We count only topmost files and folders here + n = files_queryset.count() + folders_queryset.count() + if n: self._move_files_and_folders_impl( files_queryset, folders_queryset, destination) self.message_user(request, @@ -1102,6 +1120,9 @@ def rename_files(self, request, files_queryset, folders_queryset): def extract_files(self, request, files_queryset, folder_queryset): success_format = "Successfully extracted archive {}." + self._check_restricted( + request, files_queryset, Folder.objects.get_empty_query_set()) + def is_valid_archive(filer_file): is_valid = filer_file.is_valid() if not is_valid: diff --git a/filer/models/tools.py b/filer/models/tools.py index aba9becb8..e2e9b8554 100644 --- a/filer/models/tools.py +++ b/filer/models/tools.py @@ -8,6 +8,9 @@ def discard_clipboard(clipboard): clipboard.files.clear() +def discard_clipboard_files(clipboard, files): + clipboard.clipboarditem_set.filter(file__in=files).delete() + def delete_clipboard(clipboard): for file_obj in clipboard.files.all(): @@ -32,7 +35,7 @@ def move_file_to_clipboard(request, files, clipboard): 'named %s') % file_obj.actual_name) continue if clipboard.append_file(file_obj): - file_obj .folder = None + file_obj.folder = None file_obj.save() count += 1 return count @@ -42,16 +45,31 @@ def move_files_from_clipboard_to_folder(request, clipboard, folder): return move_files_to_folder(request, clipboard.files.all(), folder) -def move_files_to_folder(request, files, folder): +def split_files_valid_for_destination(files, destination): file_names = [f.actual_name for f in files] already_existing = [ - f.actual_name - for f in folder.entries_with_names(file_names)] + f.actual_name + for f in destination.entries_with_names(file_names)] + + valid_files, invalid_files = [], [] for file_obj in files: if file_obj.actual_name in already_existing: - messages.error(request, _(u"File or folder named %s already exists") % file_obj.actual_name) - file_obj.delete() - continue - file_obj.folder = folder + invalid_files.append(file_obj) + else: + valid_files.append(file_obj) + return valid_files, invalid_files + + +def move_files_to_folder(request, files, destination): + valid_files, invalid_files = split_files_valid_for_destination( + files, destination) + + for file_obj in valid_files: + file_obj.folder = destination file_obj.save() - return True + + for file_obj in invalid_files: + messages.error( + request, _(u"File or folder named %s already exists in " + "this folder.") % file_obj.actual_name) + return valid_files diff --git a/filer/templates/admin/filer/change_form.html b/filer/templates/admin/filer/change_form.html index 2d208f1a5..3628dc9e0 100644 --- a/filer/templates/admin/filer/change_form.html +++ b/filer/templates/admin/filer/change_form.html @@ -34,3 +34,10 @@

    {% trans 'duplicates' %}

    {% endblock %}

    {% endblock %} + + +{% block submit_buttons_bottom %} +{% if not original.is_restricted %} +{{ block.super }} +{% endif %} +{% endblock %} diff --git a/filer/templates/admin/filer/folder/directory_listing.html b/filer/templates/admin/filer/folder/directory_listing.html index 3c8515655..aca4e5f12 100644 --- a/filer/templates/admin/filer/folder/directory_listing.html +++ b/filer/templates/admin/filer/folder/directory_listing.html @@ -64,7 +64,7 @@ {% block content %}
    @@ -78,7 +78,7 @@

    {% if folder.parent %} {% endif %} - {% else %}{% trans "Change" %}{% endif %} + {% elif not folder.is_restricted %}{% trans "Change" %}{% endif %}

    {% else %}{% if folder.is_smart_folder %} diff --git a/filer/templates/admin/filer/folder/directory_table.html b/filer/templates/admin/filer/folder/directory_table.html index 47d78273a..1ed7de561 100644 --- a/filer/templates/admin/filer/folder/directory_table.html +++ b/filer/templates/admin/filer/folder/directory_table.html @@ -23,7 +23,7 @@ {% trans - {% if item.file_type == 'Folder' %} + {% if item.file_type == 'Folder' and not item.is_restricted%} {% trans "Change" %} {% endif %}
    {{ subfolder.name }}{% if not subfolder.is_root %} ({% blocktrans count subfolder.children_count as counter %}1 folder{% plural %}{{ counter }} folders{% endblocktrans %}, {% blocktrans count subfolder.file_count as counter %}1 file{% plural %}{{ counter }} files{% endblocktrans %}){% endif %}
    @@ -40,16 +40,17 @@ {{ file.default_alt_text }} - + {% if not item.is_restricted %} {% trans "Delete" %} {% trans "Change" %} + {% endif %}
    {{ file.label }} ({{ file.size|filesize:"auto1000long" }}{% ifequal file.file_type "Image" %}, {{ file.width }}x{{ file.height }} px{% endifequal %})
    {% trans "Owner" %}: {{ file.owner|default:"n/a" }}
    - {% if enable_permissions %}
    {% trans "Permissions" %}: {% if file.is_public %}{% trans "disabled" %}{% else %}{% trans "enabled" %}{% endif %}
    {% endif %} {# {% if file.has_all_mandatory_data %}
    0 {% trans "has all mandatory metadata" %}
    {% else %}
    1 {% trans "missing metadata!" %}
    {% endif %} #} - + {% if not item.is_restricted %} + {% endif %} {% endwith %}{% endif %} diff --git a/filer/templates/admin/filer/tools/clipboard/clipboard.html b/filer/templates/admin/filer/tools/clipboard/clipboard.html index ef7373a4a..d9f0087b5 100644 --- a/filer/templates/admin/filer/tools/clipboard/clipboard.html +++ b/filer/templates/admin/filer/tools/clipboard/clipboard.html @@ -16,7 +16,7 @@ {% if is_popup %}{% endif %} {% if select_folder %}{% endif %} - + {% comment %}
    {% csrf_token %} diff --git a/filer/tests/admin.py b/filer/tests/admin.py index 8f57c9f55..5f2553472 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -18,7 +18,8 @@ create_image, create_staffuser, create_folder_for_user, move_action, create_folderpermission_for_user, grant_all_folderpermissions_for_group, move_to_clipboard_action, paste_clipboard_to_folder, get_dir_listing_url, - filer_obj_as_checkox, get_make_root_folder_url + filer_obj_as_checkox, get_make_root_folder_url, + move_single_file_to_clipboard_action, ) @@ -221,10 +222,13 @@ def paste(uploaded_image): self.assertEqual(pasted_image.folder.pk, first_folder.pk) # upload and paste the same image again second_upload = upload() - # second paste failed due to name conflict, and file in clipboard - # got deleted - with self.assertRaises(File.DoesNotExist): - paste(second_upload) + # second paste failed due to name conflict + second_pasted_image = paste(second_upload) + clipboard = self.superuser.filer_clipboards.all()[0] + # file should remain in clipboard and should not be located in + # destination folder + self.assertEqual(clipboard.files.count(), 1) + self.assertEqual(second_pasted_image.folder, None) def test_filer_ajax_upload_file(self): self.assertEqual(Image.objects.count(), 0) @@ -315,6 +319,39 @@ def test_move_files_and_folders_action(self): self.assertEqual(self.src_folder.files.count(), 1) self.assertEqual(self.dst_folder.files.count(), 0) + def test_validate_no_duplicate_folders_on_move(self): + """ move file from foo to bar + foo + |--file + bar + |--file + """ + foo = Folder.objects.create(name='foo', site=Site.objects.get(id=1)) + bar = Folder.objects.create(name='bar', site=Site.objects.get(id=1)) + file_foo = File.objects.create( + original_filename='file', folder=foo, + file=django.core.files.base.ContentFile('some data')) + file_bar = File.objects.create( + original_filename='file', folder=bar, + file=django.core.files.base.ContentFile('some data')) + + response, url = move_action( + self.client, foo, bar, [file_foo], follow=True) + self.assertRedirects(response, url) + self.assertIn( + "already exist at the selected destination", + get_user_message(response).message) + + foo = Folder.objects.get(id=foo.id) + file_foo = File.objects.get(id=file_foo.id) + self.assertEqual(foo.files.count(), 1) + self.assertEqual(file_foo.parent.id, foo.id) + + bar = Folder.objects.get(id=bar.id) + file_bar = File.objects.get(id=file_bar.id) + self.assertEqual(bar.files.count(), 1) + self.assertEqual(file_bar.parent.id, bar.id) + def test_validate_no_duplicate_folders_on_move(self): """Create the following folder hierarchy: root @@ -598,6 +635,25 @@ def test_change_child_site_folder(self): self.assertEqual(f2__changed.name, 'foo_bar__changed') self.assertEqual(f2__changed.folder_type, Folder.SITE_FOLDER) + def test_add_core_folder(self): + f1 = Folder.objects.create( + name='foo', folder_type=Folder.CORE_FOLDER) + f2 = Folder.objects.create( + name='foo_bar', parent=f1, folder_type=Folder.CORE_FOLDER) + self.assertEqual(f1.folder_type, Folder.CORE_FOLDER) + self.assertEqual(f2.folder_type, Folder.CORE_FOLDER) + url = get_make_root_folder_url() + response = self.client.get(url,{ + 'parent_id': f2.id + }) + self.assertEqual(response.status_code, 403) + + response = self.client.post(url,{ + 'parent_id': f2.id, + 'name': 'foo_bar_core' + }) + self.assertEqual(response.status_code, 403) + def test_change_core_folder(self): f1 = Folder.objects.create( name='foo', folder_type=Folder.CORE_FOLDER) @@ -785,19 +841,28 @@ def test_move_to_clipboard_from_root(self): if not self.user.is_superuser: self.assertEqual('This test should work after refactor filer ' 'permissions', '') - file_bar = File.objects.create( - original_filename='bar', folder=None, + file_foo = File.objects.create( + original_filename='foo', folder=None, file=django.core.files.base.ContentFile('some data')) self.assertEqual( self._get_clipboard_files().count(), 0) - move_to_clipboard_action(self.client, 'unfiled', [file_bar]) + + move_to_clipboard_action(self.client, 'unfiled', [file_foo]) self.assertEqual( self._get_clipboard_files().count(), 1) - def test_move_to_clipboard_from_site_folders(self): - foo = Folder.objects.create(name='mic', site=Site.objects.get(id=1)) file_bar = File.objects.create( - original_filename='mic', folder=foo, + original_filename='bar', folder=None, + file=django.core.files.base.ContentFile('some data')) + move_single_file_to_clipboard_action( + self.client, 'unfiled', [file_bar]) + self.assertEqual( + self._get_clipboard_files().count(), 2) + + def test_move_to_clipboard_from_site_folders(self): + foo = Folder.objects.create(name='foo', site=Site.objects.get(id=1)) + file_foo = File.objects.create( + original_filename='foo', folder=foo, file=django.core.files.base.ContentFile('some data')) self.assertEqual( self._get_clipboard_files().count(), 0) @@ -805,11 +870,26 @@ def test_move_to_clipboard_from_site_folders(self): self.assertEqual( self._get_clipboard_files().count(), 1) + file_bar = File.objects.create( + original_filename='bar', folder=foo, + file=django.core.files.base.ContentFile('some data')) + move_to_clipboard_action(self.client, foo, [file_bar]) + self.assertEqual( + self._get_clipboard_files().count(), 2) + + file_baz = File.objects.create( + original_filename='baz', folder=foo, + file=django.core.files.base.ContentFile('some data')) + move_single_file_to_clipboard_action( + self.client, foo, [file_baz]) + self.assertEqual( + self._get_clipboard_files().count(), 3) + def test_move_to_clipboard_from_core_folders(self): foo = Folder.objects.create(name='foo', folder_type=Folder.CORE_FOLDER) - file_bar = File.objects.create( - original_filename='bar_file', folder=foo, + file_foo = File.objects.create( + original_filename='foo_file', folder=foo, file=django.core.files.base.ContentFile('some data')) self.assertEqual( self._get_clipboard_files().count(), 0) @@ -817,6 +897,14 @@ def test_move_to_clipboard_from_core_folders(self): self.assertEqual(response.status_code, 403) self.assertEqual( self._get_clipboard_files().count(), 0) + response, _ = move_to_clipboard_action(self.client, foo, [file_foo]) + self.assertEqual(response.status_code, 403) + + response = move_single_file_to_clipboard_action( + self.client, foo, [file_foo]) + self.assertEqual(response.status_code, 403) + self.assertEqual( + self._get_clipboard_files().count(), 0) def test_move_from_clipboard_to_root(self): bar_file = File.objects.create( @@ -909,7 +997,7 @@ def test_message_error_user_destination_no_site_on_move(self): 'site.' % foo.pretty_logical_path, get_user_message(response).message) - def test_move_destination_filters_core_folders(self): + def _test_folder_destination_filters_core_folders(self, action): foo = Folder.objects.create( name='foo', folder_type=Folder.CORE_FOLDER) bar = Folder.objects.create( @@ -922,7 +1010,7 @@ def test_move_destination_filters_core_folders(self): url = get_dir_listing_url(bar) response = self.client.post(url, { - 'action': 'move_files_and_folders', + 'action': action, helpers.ACTION_CHECKBOX_NAME: [filer_obj_as_checkox(bar_file)] }) self.assertEqual(response.status_code, 200) @@ -930,7 +1018,65 @@ def test_move_destination_filters_core_folders(self): dest_folders = response.context['destination_folders'] self.assertNotIn(foo.id, [el[0].id for el in dest_folders]) + def test_move_destination_filters_core_folders(self): + self._test_folder_destination_filters_core_folders( + 'move_files_and_folders') + def test_copy_destination_filters_restricted_folders(self): + self._test_folder_destination_filters_core_folders( + 'copy_files_and_folders') + + def test_copy_site_folder_to_core_destination_folder(self): + folders, files = self._build_some_folder_structure( + Folder.SITE_FOLDER, Site.objects.get(id=1)) + f1 = Folder.objects.create( + name='destination', folder_type=Folder.CORE_FOLDER) + + url = get_dir_listing_url(None) + response = self.client.post(url, { + 'action': 'copy_files_and_folders', + 'post': 'yes', + 'destination': f1.id, + helpers.ACTION_CHECKBOX_NAME: + [filer_obj_as_checkox(folders['bar'])]}) + + self.assertEqual(response.status_code, 403) + return folders, files + + def test_file_from_core_folder_is_unchangeable(self): + f1 = Folder.objects.create(name='foo', folder_type=Folder.CORE_FOLDER) + file1 = File.objects.create( + original_filename='bar_file', folder=f1, + file=django.core.files.base.ContentFile('some data')) + url = reverse('admin:filer_file_change', args=(file1.id, )) + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + self.assertNotIn('submit', response.content) + self.assertNotIn('delete/', response.content) + # only one input(csrfmiddlewaretoken) the rest are readonly fields + self.assertEqual(response.content.count(' Date: Fri, 20 Sep 2013 19:18:51 +0300 Subject: [PATCH 123/715] stupid 'self' instead of awesome 'TestCase' --- filer/tests/admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filer/tests/admin.py b/filer/tests/admin.py index 5f2553472..6b3deac72 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -1163,7 +1163,7 @@ def test_delete_root_folder(self): id__in=[folder_for_view.id, f1.id]).count(), 2) -class TestFolderTypeFunctionality(self): +class TestFolderTypeFunctionality(TestCase): def setUp(self): username = 'login_using_foo' From 93c5a7e521639ed6d16545e53cacaae059e941c9 Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Mon, 23 Sep 2013 14:54:24 +0300 Subject: [PATCH 124/715] *extracting archives no longer available in: core or unfiled files; *archive zip validation detects malformed files; * added tests for folder save functionality --- filer/admin/folderadmin.py | 4 + filer/models/archivemodels.py | 8 +- filer/tests/admin.py | 178 ++++++++++++++++++++++++++-------- 3 files changed, 147 insertions(+), 43 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 1b87e73f5..1485c1dff 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -1120,6 +1120,10 @@ def rename_files(self, request, files_queryset, folders_queryset): def extract_files(self, request, files_queryset, folder_queryset): success_format = "Successfully extracted archive {}." + # cannot extract in unfiled files folder + if files_queryset.filter(folder=None).exists(): + raise PermissionDenied + self._check_restricted( request, files_queryset, Folder.objects.get_empty_query_set()) diff --git a/filer/models/archivemodels.py b/filer/models/archivemodels.py index b7cf69405..2bdfeb240 100644 --- a/filer/models/archivemodels.py +++ b/filer/models/archivemodels.py @@ -39,13 +39,13 @@ def extract(self, bypass_owner=False): def is_valid(self): """Checks if the file is a proper archive.""" - is_valid = False - self.file.open() try: - is_valid = self._is_valid_zip(self.file) + self.file.open() + return self._is_valid_zip(self.file) + except: + return False finally: self.file.close() - return is_valid def collisions(self): """ diff --git a/filer/tests/admin.py b/filer/tests/admin.py index 6b3deac72..ebc1eda36 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -2,12 +2,14 @@ import os from django.test import TestCase, RequestFactory from django.core.urlresolvers import reverse -import django.core.files +from django.core.exceptions import ValidationError +from django.core import files as dj_files from django.contrib.admin import helpers, site from django.contrib.sites.models import Site from django.contrib.auth.models import User, Group, Permission from django.http import HttpRequest from filer.models.filemodels import File +from filer.models.archivemodels import Archive from filer.models.foldermodels import Folder, FolderPermission from filer.models.imagemodels import Image from filer.models.clipboardmodels import Clipboard @@ -24,6 +26,7 @@ class FilerFolderAdminUrlsTests(TestCase): + def setUp(self): self.superuser = create_superuser() self.client.login(username='admin', password='secret') @@ -132,6 +135,7 @@ def test_validate_no_duplcate_folders_on_rename(self): class FilerImageAdminUrlsTests(TestCase): + def setUp(self): self.superuser = create_superuser() self.client.login(username='admin', password='secret') @@ -141,6 +145,7 @@ def tearDown(self): class FilerClipboardAdminUrlsTests(TestCase): + def setUp(self): self.superuser = create_superuser() self.client.login(username='admin', password='secret') @@ -158,7 +163,7 @@ def tearDown(self): def test_filer_upload_file(self, extra_headers={}): self.assertEqual(Image.objects.count(), 0) - file_obj = django.core.files.File(open(self.filename)) + file_obj = dj_files.File(open(self.filename)) response = self.client.post( reverse('admin:filer-ajax_upload'), { 'Filename': self.image_name, @@ -172,7 +177,7 @@ def test_filer_upload_file(self, extra_headers={}): def test_file_upload_no_duplicate_files(self, extra_headers={}): self.assertEqual(Image.objects.count(), 0) - file_obj = django.core.files.File(open(self.filename)) + file_obj = dj_files.File(open(self.filename)) response = self.client.post( reverse('admin:filer-ajax_upload'), { 'Filename': self.image_name, @@ -199,7 +204,7 @@ def test_paste_from_clipboard_no_duplicate_files(self): first_folder = Folder.objects.create(name='first') def upload(): - file_obj = django.core.files.File(open(self.filename)) + file_obj = dj_files.File(open(self.filename)) response = self.client.post( reverse('admin:filer-ajax_upload'), {'Filename': self.image_name, 'Filedata': file_obj, @@ -232,7 +237,7 @@ def paste(uploaded_image): def test_filer_ajax_upload_file(self): self.assertEqual(Image.objects.count(), 0) - file_obj = django.core.files.File(open(self.filename)) + file_obj = dj_files.File(open(self.filename)) response = self.client.post(reverse('admin:filer-ajax_upload') + '?filename=%s' % self.image_name, data=file_obj.read(), @@ -245,6 +250,7 @@ def test_filer_ajax_upload_file(self): class BulkOperationsMixin(object): + def setUp(self): self.superuser = create_superuser() self.client.login(username='admin', password='secret') @@ -286,7 +292,7 @@ def create_src_and_dst_folders(self): def create_image(self, folder, filename=None): filename = filename or 'test_image.jpg' - file_obj = django.core.files.File(open(self.filename), name=filename) + file_obj = dj_files.File(open(self.filename), name=filename) image_obj = Image.objects.create( owner=self.superuser, original_filename=self.image_name, file=file_obj, folder=folder) @@ -295,7 +301,7 @@ def create_image(self, folder, filename=None): def create_file(self, folder, filename=None): filename = filename or 'test_file.dat' - file_data = django.core.files.base.ContentFile('some data') + file_data = dj_files.base.ContentFile('some data') file_data.name = filename file_obj = File.objects.create(owner=self.superuser, original_filename=filename, file=file_data, folder=folder) @@ -304,6 +310,7 @@ def create_file(self, folder, filename=None): class FilerBulkOperationsTests(BulkOperationsMixin, TestCase): + def test_move_files_and_folders_action(self): # TODO: Test recursive (files and folders tree) move @@ -330,10 +337,10 @@ def test_validate_no_duplicate_folders_on_move(self): bar = Folder.objects.create(name='bar', site=Site.objects.get(id=1)) file_foo = File.objects.create( original_filename='file', folder=foo, - file=django.core.files.base.ContentFile('some data')) + file=dj_files.base.ContentFile('some data')) file_bar = File.objects.create( original_filename='file', folder=bar, - file=django.core.files.base.ContentFile('some data')) + file=dj_files.base.ContentFile('some data')) response, url = move_action( self.client, foo, bar, [file_foo], follow=True) @@ -511,6 +518,7 @@ def test_resize_images_action(self): class PermissionAdminTest(TestCase): + def setUp(self): self.superuser = create_superuser() self.group1 = Group.objects.create(name='group1') @@ -805,7 +813,7 @@ def _build_some_folder_structure(self, folder_type, site): file_bar = File.objects.create( original_filename='bar_file', folder=bar, - file=django.core.files.base.ContentFile('some data')) + file=dj_files.base.ContentFile('some data')) _files['file_bar'] = file_bar return _folders, _files @@ -843,7 +851,7 @@ def test_move_to_clipboard_from_root(self): 'permissions', '') file_foo = File.objects.create( original_filename='foo', folder=None, - file=django.core.files.base.ContentFile('some data')) + file=dj_files.base.ContentFile('some data')) self.assertEqual( self._get_clipboard_files().count(), 0) @@ -853,7 +861,7 @@ def test_move_to_clipboard_from_root(self): file_bar = File.objects.create( original_filename='bar', folder=None, - file=django.core.files.base.ContentFile('some data')) + file=dj_files.base.ContentFile('some data')) move_single_file_to_clipboard_action( self.client, 'unfiled', [file_bar]) self.assertEqual( @@ -863,7 +871,7 @@ def test_move_to_clipboard_from_site_folders(self): foo = Folder.objects.create(name='foo', site=Site.objects.get(id=1)) file_foo = File.objects.create( original_filename='foo', folder=foo, - file=django.core.files.base.ContentFile('some data')) + file=dj_files.base.ContentFile('some data')) self.assertEqual( self._get_clipboard_files().count(), 0) move_to_clipboard_action(self.client, None, [foo]) @@ -872,14 +880,14 @@ def test_move_to_clipboard_from_site_folders(self): file_bar = File.objects.create( original_filename='bar', folder=foo, - file=django.core.files.base.ContentFile('some data')) + file=dj_files.base.ContentFile('some data')) move_to_clipboard_action(self.client, foo, [file_bar]) self.assertEqual( self._get_clipboard_files().count(), 2) file_baz = File.objects.create( original_filename='baz', folder=foo, - file=django.core.files.base.ContentFile('some data')) + file=dj_files.base.ContentFile('some data')) move_single_file_to_clipboard_action( self.client, foo, [file_baz]) self.assertEqual( @@ -890,7 +898,7 @@ def test_move_to_clipboard_from_core_folders(self): folder_type=Folder.CORE_FOLDER) file_foo = File.objects.create( original_filename='foo_file', folder=foo, - file=django.core.files.base.ContentFile('some data')) + file=dj_files.base.ContentFile('some data')) self.assertEqual( self._get_clipboard_files().count(), 0) response, _ = move_to_clipboard_action(self.client, None, [foo]) @@ -909,7 +917,7 @@ def test_move_to_clipboard_from_core_folders(self): def test_move_from_clipboard_to_root(self): bar_file = File.objects.create( original_filename='bar_file', - file=django.core.files.base.ContentFile('some data')) + file=dj_files.base.ContentFile('some data')) clipboard, _ = Clipboard.objects.get_or_create( user=self.user) clipboard.append_file(bar_file) @@ -924,7 +932,7 @@ def test_move_from_clipboard_to_root(self): def test_move_from_clipboard_to_core_folders(self): bar_file = File.objects.create( original_filename='bar_file', - file=django.core.files.base.ContentFile('some data')) + file=dj_files.base.ContentFile('some data')) core_folder = Folder.objects.create( name='foo', folder_type=Folder.CORE_FOLDER) clipboard, _ = Clipboard.objects.get_or_create( @@ -941,7 +949,7 @@ def test_move_from_clipboard_to_core_folders(self): def test_move_from_clipboard_to_site_folders(self): bar_file = File.objects.create( original_filename='bar_file', - file=django.core.files.base.ContentFile('some data')) + file=dj_files.base.ContentFile('some data')) site_folder = Folder.objects.create( name='foo', site=Site.objects.get(id=1)) clipboard, _ = Clipboard.objects.get_or_create( @@ -1006,7 +1014,7 @@ def _test_folder_destination_filters_core_folders(self, action): name='bar2', site=Site.objects.get(id=1)) bar_file = File.objects.create( original_filename='bar_file', - file=django.core.files.base.ContentFile('some data')) + file=dj_files.base.ContentFile('some data')) url = get_dir_listing_url(bar) response = self.client.post(url, { @@ -1047,7 +1055,7 @@ def test_file_from_core_folder_is_unchangeable(self): f1 = Folder.objects.create(name='foo', folder_type=Folder.CORE_FOLDER) file1 = File.objects.create( original_filename='bar_file', folder=f1, - file=django.core.files.base.ContentFile('some data')) + file=dj_files.base.ContentFile('some data')) url = reverse('admin:filer_file_change', args=(file1.id, )) response = self.client.get(url) self.assertEqual(response.status_code, 200) @@ -1060,7 +1068,7 @@ def test_file_from_site_folder_is_changeable(self): f1 = Folder.objects.create(name='foo', site=Site.objects.get(id=1)) file1 = File.objects.create( original_filename='bar_file', folder=f1, - file=django.core.files.base.ContentFile('some data')) + file=dj_files.base.ContentFile('some data')) url = reverse('admin:filer_file_change', args=(file1.id, )) response = self.client.get(url) self.assertIn('submit', response.content) @@ -1068,16 +1076,50 @@ def test_file_from_site_folder_is_changeable(self): # at least the choose file and csrfmiddlewaretoken self.assertGreater(response.content.count(' Date: Mon, 23 Sep 2013 17:17:14 +0300 Subject: [PATCH 125/715] Removed FILER_ALLOW_REGULAR_USERS_TO_ADD_ROOT_FOLDERS since there is no more functionality for it. --- filer/settings.py | 1 - 1 file changed, 1 deletion(-) diff --git a/filer/settings.py b/filer/settings.py index 1b73c5ecc..770e279b1 100644 --- a/filer/settings.py +++ b/filer/settings.py @@ -18,7 +18,6 @@ 'filer' in settings.LOGGING['loggers']))) FILER_ENABLE_PERMISSIONS = getattr(settings, 'FILER_ENABLE_PERMISSIONS', False) -FILER_ALLOW_REGULAR_USERS_TO_ADD_ROOT_FOLDERS = getattr(settings, 'FILER_ALLOW_REGULAR_USERS_TO_ADD_ROOT_FOLDERS', False) FILER_IS_PUBLIC_DEFAULT = getattr(settings, 'FILER_IS_PUBLIC_DEFAULT', True) FILER_PAGINATE_BY = getattr(settings, 'FILER_PAGINATE_BY', 20) From c1f95a1422b29b548865201d1432c993bac92ee8 Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Wed, 25 Sep 2013 14:42:49 +0300 Subject: [PATCH 126/715] * impoved performance on find_all_duplicates method. * find_duplicates method returns now queryset instead of list --- filer/models/filemodels.py | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index bafaf5ff2..b37f79016 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -10,8 +10,8 @@ from filer.models import mixins from filer import settings as filer_settings from filer.models.foldermodels import Folder +from django.db.models import Count import polymorphic -# from polymorphic import PolymorphicModel, PolymorphicManager, query import hashlib import os @@ -21,19 +21,8 @@ class FilesChainableQuerySet(object): def restricted(self): return self.filter(folder__folder_type=Folder.CORE_FOLDER) - def find_all_duplicates(self): - r = {} - for file_obj in self.all(): - if file_obj.sha1: - q = self.filter(sha1=file_obj.sha1) - if len(q) > 1: - r[file_obj.sha1] = q - return r - def find_duplicates(self, file_obj): - return [duplicate_file - for duplicate_file in self.exclude( - pk=file_obj.pk).filter(sha1=file_obj.sha1)] + return self.exclude(pk=file_obj.pk).filter(sha1=file_obj.sha1) class EmptyFilesQS(models.query.EmptyQuerySet, FilesChainableQuerySet): @@ -53,6 +42,11 @@ def get_query_set(self): def get_empty_query_set(self): return EmptyFilesQS(self.model, using=self._db) + def find_all_duplicates(self): + return {file_data['sha1']: file_data['count'] + for file_data in File.objects.values('sha1').annotate( + count=Count('id')).filter(count__gt=1)} + class File(polymorphic.PolymorphicModel, mixins.IconsMixin): file_type = 'File' @@ -403,7 +397,7 @@ def logical_path(self): @property def duplicates(self): - return File.objects.find_duplicates(self) + return list(File.objects.find_duplicates(self)) def is_restricted(self): if self.folder: From c92895ec26c8a98cf6061c15a51ef816d870748a Mon Sep 17 00:00:00 2001 From: Marcel Cojocaru Date: Wed, 25 Sep 2013 15:36:06 +0300 Subject: [PATCH 127/715] LUN-1070 -- added credit field --- filer/admin/imageadmin.py | 2 +- ...15_auto__add_field_image_default_credit.py | 134 ++++++++++++++++++ filer/models/imagemodels.py | 2 + .../admin/filer/folder/directory_table.html | 2 +- 4 files changed, 138 insertions(+), 2 deletions(-) create mode 100644 filer/migrations/0015_auto__add_field_image_default_credit.py diff --git a/filer/admin/imageadmin.py b/filer/admin/imageadmin.py index 18d636269..4277a69fb 100644 --- a/filer/admin/imageadmin.py +++ b/filer/admin/imageadmin.py @@ -41,7 +41,7 @@ class ImageAdmin(FileAdmin): ImageAdmin.fieldsets = ImageAdmin.build_fieldsets( - extra_main_fields=('default_alt_text', 'default_caption',), + extra_main_fields=('default_alt_text', 'default_caption', 'default_credit'), extra_fieldsets=( # due to custom requirements:Subject Location section should be hidden # ('Subject Location', { diff --git a/filer/migrations/0015_auto__add_field_image_default_credit.py b/filer/migrations/0015_auto__add_field_image_default_credit.py new file mode 100644 index 000000000..f00a7c381 --- /dev/null +++ b/filer/migrations/0015_auto__add_field_image_default_credit.py @@ -0,0 +1,134 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'Image.default_credit' + db.add_column('filer_image', 'default_credit', + self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True), + keep_default=False) + + def backwards(self, orm): + + # Deleting field 'Image.default_credit' + db.delete_column('filer_image', 'default_credit') + + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'filer.archive': { + 'Meta': {'object_name': 'Archive', '_ormbases': ['filer.File']}, + 'file_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['filer.File']", 'unique': 'True', 'primary_key': 'True'}) + }, + 'filer.clipboard': { + 'Meta': {'object_name': 'Clipboard'}, + 'files': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'in_clipboards'", 'symmetrical': 'False', 'through': "orm['filer.ClipboardItem']", 'to': "orm['filer.File']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'filer_clipboards'", 'to': "orm['auth.User']"}) + }, + 'filer.clipboarditem': { + 'Meta': {'object_name': 'ClipboardItem'}, + 'clipboard': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.Clipboard']"}), + 'file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.File']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + 'filer.file': { + 'Meta': {'object_name': 'File'}, + '_file_size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'file': ('django.db.models.fields.files.FileField', [], {'db_index': 'True', 'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'folder': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'all_files'", 'null': 'True', 'to': "orm['filer.Folder']"}), + 'has_all_mandatory_data': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'original_filename': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'owned_files'", 'null': 'True', 'to': "orm['auth.User']"}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'polymorphic_filer.file_set'", 'null': 'True', 'to': "orm['contenttypes.ContentType']"}), + 'sha1': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40', 'blank': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.folder': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('parent', 'name'),)", 'object_name': 'Folder'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'filer_owned_folders'", 'null': 'True', 'to': "orm['auth.User']"}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['filer.Folder']"}), + 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.folderpermission': { + 'Meta': {'object_name': 'FolderPermission'}, + 'can_add_children': ('django.db.models.fields.SmallIntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), + 'can_edit': ('django.db.models.fields.SmallIntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), + 'can_read': ('django.db.models.fields.SmallIntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), + 'everybody': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'folder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.Folder']", 'null': 'True', 'blank': 'True'}), + 'group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'filer_folder_permissions'", 'null': 'True', 'to': "orm['auth.Group']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'type': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'filer_folder_permissions'", 'null': 'True', 'to': "orm['auth.User']"}) + }, + 'filer.image': { + 'Meta': {'object_name': 'Image', '_ormbases': ['filer.File']}, + '_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'default_alt_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'default_caption': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'default_credit': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'file_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['filer.File']", 'unique': 'True', 'primary_key': 'True'}), + 'must_always_publish_author_credit': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'must_always_publish_copyright': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'subject_location': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '64', 'null': 'True', 'blank': 'True'}) + } + } + + complete_apps = ['filer'] \ No newline at end of file diff --git a/filer/models/imagemodels.py b/filer/models/imagemodels.py index 67b027758..e4cd9157f 100644 --- a/filer/models/imagemodels.py +++ b/filer/models/imagemodels.py @@ -20,6 +20,7 @@ logger = logging.getLogger("filer") + class Image(File): SIDEBAR_IMAGE_WIDTH = 210 DEFAULT_THUMBNAILS = { @@ -41,6 +42,7 @@ class Image(File): default_alt_text = models.CharField(_('default alt text'), max_length=255, blank=True, null=True) default_caption = models.CharField(_('default caption'), max_length=255, blank=True, null=True) + default_credit = models.CharField(_('default credit'), max_length=255, blank=True, null=True) author = models.CharField(_('author'), max_length=255, null=True, blank=True) diff --git a/filer/templates/admin/filer/folder/directory_table.html b/filer/templates/admin/filer/folder/directory_table.html index a501e6839..4caf6570e 100644 --- a/filer/templates/admin/filer/folder/directory_table.html +++ b/filer/templates/admin/filer/folder/directory_table.html @@ -34,7 +34,7 @@ {% endwith %}{% endif %} {% if item.file_type == 'File' or item.file_type == 'Image' or item.file_type == 'Archive' %}{% with item as file %} - {% if is_popup and not select_folder %} {% else %}{% if action_form and not is_popup %}{% endif %}{% endif %} + {% if is_popup and not select_folder %} {% else %}{% if action_form and not is_popup %}{% endif %}{% endif %} {{ file.default_alt_text }} From 39a3eb9c1ed6b4bdeea16d05b019bb42171d3dc5 Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Thu, 26 Sep 2013 14:15:57 +0300 Subject: [PATCH 128/715] Removed folder permission model and all its logic. --- filer/admin/__init__.py | 4 +- filer/admin/folderadmin.py | 38 +--- filer/admin/permissionadmin.py | 45 ----- filer/admin/permissions.py | 14 +- .../0017_auto__del_folderpermission.py | 138 ++++++++++++++ filer/models/filemodels.py | 21 +-- filer/models/foldermodels.py | 174 +----------------- filer/models/imagemodels.py | 26 --- filer/tests/__init__.py | 3 +- filer/tests/admin.py | 39 ++-- filer/tests/helpers.py | 21 +-- 11 files changed, 179 insertions(+), 344 deletions(-) delete mode 100644 filer/admin/permissionadmin.py create mode 100644 filer/migrations/0017_auto__del_folderpermission.py diff --git a/filer/admin/__init__.py b/filer/admin/__init__.py index 80c3ba6ed..e6627b72c 100644 --- a/filer/admin/__init__.py +++ b/filer/admin/__init__.py @@ -4,9 +4,8 @@ from filer.admin.fileadmin import FileAdmin from filer.admin.folderadmin import FolderAdmin from filer.admin.imageadmin import ImageAdmin -from filer.admin.permissionadmin import PermissionAdmin from filer.admin.archiveadmin import ArchiveAdmin -from filer.models import (FolderPermission, Folder, File, Clipboard, Image, +from filer.models import (Folder, File, Clipboard, Image, Archive) @@ -14,5 +13,4 @@ admin.site.register(File, FileAdmin) admin.site.register(Clipboard, ClipboardAdmin) admin.site.register(Image, ImageAdmin) -admin.site.register(FolderPermission, PermissionAdmin) admin.site.register(Archive, ArchiveAdmin) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 1485c1dff..c2380a73b 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -31,7 +31,7 @@ check_files_read_permissions, check_folder_read_permissions) from filer.models import (Folder, FolderRoot, UnfiledImages, File, tools, - ImagesWithMissingData, FolderPermission, Image, + ImagesWithMissingData, Image, Archive) from filer.settings import FILER_STATICMEDIA_PREFIX, FILER_PAGINATE_BY from filer.utils.filer_easy_thumbnails import FilerActionThumbnailer @@ -291,33 +291,6 @@ def filter_file(qs, terms=[]): Q(owner__last_name__icontains=term)) return qs - def get_user_read_permissions(user): - if not user.is_authenticated(): - return None - elif user.is_superuser: - return 'All' - else: - permission_manager = FolderPermission.objects - read_permissions = permission_manager.get_read_id_list(user) - return read_permissions - - def _filter_generic_permission(qs, permissions, entry_type): - if permissions == 'All': - return qs - - if entry_type == 'folder': - qs = qs.filter(Q(id__in=permissions) | Q(owner=request.user)) - elif entry_type == 'file': - qs = qs.filter(Q(folder__id__in=permissions) | - Q(owner=request.user)) - return qs - - def filter_folder_permission(qs, permissions): - return _filter_generic_permission(qs, permissions, 'folder') - - def filter_file_permission(qs, permissions): - return _filter_generic_permission(qs, permissions, 'file') - q = request.GET.get('q', None) if q: search_terms = unquote(q).split(" ") @@ -353,9 +326,6 @@ def filter_file_permission(qs, permissions): folder_children += folder.virtual_folders user = request.user - permissions = get_user_read_permissions(user) - folder_qs = filter_folder_permission(folder_qs, permissions) - file_qs = filter_file_permission(file_qs, permissions) folder_children += folder_qs folder_files += file_qs @@ -1219,12 +1189,6 @@ def _copy_folder(self, folder, destination, suffix, overwrite): # We save folder here folder.insert_at(destination, 'last-child', True) - for perm in FolderPermission.objects.filter(folder=old_folder): - perm.pk = None - perm.id = None - perm.folder = folder - perm.save() - return 1 + self._copy_files_and_folders_impl( old_folder.files.all(), old_folder.children.all(), folder, suffix, overwrite) diff --git a/filer/admin/permissionadmin.py b/filer/admin/permissionadmin.py deleted file mode 100644 index 04e4ca3cb..000000000 --- a/filer/admin/permissionadmin.py +++ /dev/null @@ -1,45 +0,0 @@ -#-*- coding: utf-8 -*- -import inspect -from django.contrib import admin -from filer import settings -from filer.fields import folder - - -class PermissionAdmin(admin.ModelAdmin): - fieldsets = ( - (None, {'fields': (('type', 'folder',))}), - (None, {'fields': (('user', 'group', 'everybody'),)}), - (None, {'fields': ( - ('can_edit', 'can_read', 'can_add_children') - )} - ), - ) - raw_id_fields = ('user', 'group',) - - def formfield_for_foreignkey(self, db_field, request, **kwargs): - db = kwargs.get('using') - if db_field.name == 'folder': - if 'admin_site' in inspect.getargspec(folder.AdminFolderWidget.__init__)[0]: # Django 1.4 - widget_instance = folder.AdminFolderWidget(db_field.rel, self.admin_site, using=db) - else: # Django <= 1.3 - widget_instance = folder.AdminFolderWidget(db_field.rel, using=db) - kwargs['widget'] = widget_instance - return super(PermissionAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) - - def get_model_perms(self, request): - # don't display the permissions admin if permissions are disabled. - # This method is easier for testing than not registering the admin at all at import time - enable_permissions = settings.FILER_ENABLE_PERMISSIONS - return { - 'add': enable_permissions, - 'change': enable_permissions, - 'delete': enable_permissions, - } - - def queryset(self, request): - qs = super(PermissionAdmin, self).queryset(request) - if request.user.is_superuser: - return qs - # Only the owner of the directory is able to view/modify permissions in the admin - filtered_qs = qs.filter(folder__owner=request.user) - return filtered_qs diff --git a/filer/admin/permissions.py b/filer/admin/permissions.py index 05078a2ae..256a5ada3 100644 --- a/filer/admin/permissions.py +++ b/filer/admin/permissions.py @@ -6,17 +6,15 @@ class PrimitivePermissionAwareModelAdmin(admin.ModelAdmin): def has_change_permission(self, request, obj=None): - if hasattr(obj, 'has_edit_permission'): - if obj.has_edit_permission(request): - return True - else: - return False - else: - return True + can_change = super(PrimitivePermissionAwareModelAdmin, self).\ + has_change_permission(request, obj) + return getattr(obj, 'has_edit_permission', can_change) def has_delete_permission(self, request, obj=None): + can_delete = super(PrimitivePermissionAwareModelAdmin, self).\ + has_change_permission(request, obj) # we don't have a specific delete permission... so we use change - return self.has_change_permission(request, obj) + return getattr(obj, 'has_delete_permission', can_delete) def _get_post_url(self, obj): """ diff --git a/filer/migrations/0017_auto__del_folderpermission.py b/filer/migrations/0017_auto__del_folderpermission.py new file mode 100644 index 000000000..1876a55c9 --- /dev/null +++ b/filer/migrations/0017_auto__del_folderpermission.py @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Deleting model 'FolderPermission' + db.delete_table('filer_folderpermission') + + + def backwards(self, orm): + # Adding model 'FolderPermission' + db.create_table('filer_folderpermission', ( + ('can_add_children', self.gf('django.db.models.fields.SmallIntegerField')(default=None, null=True, blank=True)), + ('can_edit', self.gf('django.db.models.fields.SmallIntegerField')(default=None, null=True, blank=True)), + ('group', self.gf('django.db.models.fields.related.ForeignKey')(related_name='filer_folder_permissions', null=True, to=orm['auth.Group'], blank=True)), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='filer_folder_permissions', null=True, to=orm['auth.User'], blank=True)), + ('can_read', self.gf('django.db.models.fields.SmallIntegerField')(default=None, null=True, blank=True)), + ('folder', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['filer.Folder'], null=True, blank=True)), + ('type', self.gf('django.db.models.fields.SmallIntegerField')(default=0)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('everybody', self.gf('django.db.models.fields.BooleanField')(default=False)), + )) + db.send_create_signal('filer', ['FolderPermission']) + + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'filer.archive': { + 'Meta': {'object_name': 'Archive', '_ormbases': ['filer.File']}, + 'file_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['filer.File']", 'unique': 'True', 'primary_key': 'True'}) + }, + 'filer.clipboard': { + 'Meta': {'object_name': 'Clipboard'}, + 'files': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'in_clipboards'", 'symmetrical': 'False', 'through': "orm['filer.ClipboardItem']", 'to': "orm['filer.File']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'filer_clipboards'", 'to': "orm['auth.User']"}) + }, + 'filer.clipboarditem': { + 'Meta': {'object_name': 'ClipboardItem'}, + 'clipboard': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.Clipboard']"}), + 'file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.File']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + 'filer.file': { + 'Meta': {'object_name': 'File'}, + '_file_size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'file': ('django.db.models.fields.files.FileField', [], {'db_index': 'True', 'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'folder': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'all_files'", 'null': 'True', 'to': "orm['filer.Folder']"}), + 'has_all_mandatory_data': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'original_filename': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'owned_files'", 'null': 'True', 'to': "orm['auth.User']"}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'polymorphic_filer.file_set'", 'null': 'True', 'to': "orm['contenttypes.ContentType']"}), + 'sha1': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40', 'blank': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.folder': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('parent', 'name'),)", 'object_name': 'Folder'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'folder_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'filer_owned_folders'", 'null': 'True', 'to': "orm['auth.User']"}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['filer.Folder']"}), + 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'site': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['sites.Site']", 'null': 'True', 'blank': 'True'}), + 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.image': { + 'Meta': {'object_name': 'Image', '_ormbases': ['filer.File']}, + '_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'default_alt_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'default_caption': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'file_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['filer.File']", 'unique': 'True', 'primary_key': 'True'}), + 'must_always_publish_author_credit': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'must_always_publish_copyright': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'subject_location': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '64', 'null': 'True', 'blank': 'True'}) + }, + 'sites.site': { + 'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"}, + 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + } + } + + complete_apps = ['filer'] \ No newline at end of file diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index b37f79016..65f0935ad 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -257,7 +257,8 @@ def delete(self, *args, **kwargs): # Delete the model before the file super(File, self).delete(*args, **kwargs) # Delete the file if there are no other Files referencing it. - if not File.objects.filter(file=self.file.name, is_public=self.is_public).exists(): + if not File.objects.filter(file=self.file.name, + is_public=self.is_public).exists(): self.file.delete(False) delete.alters_data = True @@ -276,6 +277,9 @@ def __lt__(self, other): def has_edit_permission(self, request): return self.has_generic_permission(request, 'edit') + def has_delete_permission(self, request): + return self.has_generic_permission(request, 'delete') + def has_read_permission(self, request): return self.has_generic_permission(request, 'read') @@ -284,20 +288,11 @@ def has_add_children_permission(self, request): def has_generic_permission(self, request, permission_type): """ - Return true if the current user has permission on this - image. Return the string 'ALL' if the user has all rights. + Return true if the current user has permission on this file. """ - user = request.user - if not user.is_authenticated(): - return False - elif user.is_superuser: - return True - elif user == self.owner: - return True - elif self.folder: + if self.folder: return self.folder.has_generic_permission(request, permission_type) - else: - return False + return request.user.is_authenticated() @property def actual_name(self): diff --git a/filer/models/foldermodels.py b/filer/models/foldermodels.py index af2ec3026..fe4093a5b 100644 --- a/filer/models/foldermodels.py +++ b/filer/models/foldermodels.py @@ -52,67 +52,6 @@ def __getattr__(self, name): return getattr(self.get_query_set(), name) -class FolderPermissionManager(models.Manager): - """ - Theses methods are called by introspection from "has_generic_permisison" on - the folder model. - """ - def get_read_id_list(self, user): - """ - Give a list of a Folders where the user has read rights or the string - "All" if the user has all rights. - """ - return self.__get_id_list(user, "can_read") - - def get_edit_id_list(self, user): - return self.__get_id_list(user, "can_edit") - - def get_add_children_id_list(self, user): - return self.__get_id_list(user, "can_add_children") - - def __get_id_list(self, user, attr): - if user.is_superuser or not filer_settings.FILER_ENABLE_PERMISSIONS: - return 'All' - allow_list = set() - deny_list = set() - group_ids = user.groups.all().values_list('id', flat=True) - q = Q(user=user) | Q(group__in=group_ids) | Q(everybody=True) - perms = self.filter(q).order_by('folder__tree_id', 'folder__level', - 'folder__lft') - for perm in perms: - p = getattr(perm, attr) - - if p is None: - # Not allow nor deny, we continue with the next permission - continue - - if not perm.folder: - assert perm.type == FolderPermission.ALL - - if p == FolderPermission.ALLOW: - allow_list.update(Folder.objects.all().values_list('id', flat=True)) - else: - deny_list.update(Folder.objects.all().values_list('id', flat=True)) - - continue - - folder_id = perm.folder.id - - if p == FolderPermission.ALLOW: - allow_list.add(folder_id) - else: - deny_list.add(folder_id) - - if perm.type == FolderPermission.CHILDREN: - if p == FolderPermission.ALLOW: - allow_list.update(perm.folder.get_descendants().values_list('id', flat=True)) - else: - deny_list.update(perm.folder.get_descendants().values_list('id', flat=True)) - - # Deny has precedence over allow - return allow_list - deny_list - - class Folder(models.Model, mixins.IconsMixin): """ Represents a Folder that things (files) can be put into. Folders are *NOT* @@ -312,6 +251,9 @@ def pretty_logical_path(self): def quoted_logical_path(self): return urlquote(self.pretty_logical_path) + def has_delete_permission(self, request): + return self.has_generic_permission(request, 'delete') + def has_edit_permission(self, request): return self.has_generic_permission(request, 'edit') @@ -324,36 +266,9 @@ def has_add_children_permission(self, request): def has_generic_permission(self, request, permission_type): """ Return true if the current user has permission on this - folder. Return the string 'ALL' if the user has all rights. + folder. """ - user = request.user - if not user.is_authenticated(): - return False - elif user.is_superuser: - return True - elif user == self.owner: - return True - else: - if not hasattr(self, "permission_cache") or\ - permission_type not in self.permission_cache or \ - request.user.pk != self.permission_cache['user'].pk: - if not hasattr(self, "permission_cache") or request.user.pk != self.permission_cache['user'].pk: - self.permission_cache = { - 'user': request.user, - } - - # This calls methods on the manager i.e. get_read_id_list() - func = getattr(FolderPermission.objects, - "get_%s_id_list" % permission_type) - permission = func(user) - if permission == "All": - self.permission_cache[permission_type] = True - self.permission_cache['read'] = True - self.permission_cache['edit'] = True - self.permission_cache['add_children'] = True - else: - self.permission_cache[permission_type] = self.id in permission - return self.permission_cache[permission_type] + return request.user.is_authenticated() def get_admin_url_path(self): return urlresolvers.reverse('admin:filer_folder_change', @@ -394,82 +309,3 @@ class Meta: mptt.register(Folder) except mptt.AlreadyRegistered: pass - - -class FolderPermission(models.Model): - ALL = 0 - THIS = 1 - CHILDREN = 2 - - ALLOW = 1 - DENY = 0 - - TYPES = ( - (ALL, _('all items')), - (THIS, _('this item only')), - (CHILDREN, _('this item and all children')), - ) - - PERMISIONS = ( - (ALLOW, _('allow')), - (DENY, _('deny')), - ) - - folder = models.ForeignKey(Folder, verbose_name=('folder'), null=True, blank=True) - - type = models.SmallIntegerField(_('type'), choices=TYPES, default=ALL) - user = models.ForeignKey(auth_models.User, - related_name="filer_folder_permissions", - verbose_name=_("user"), blank=True, null=True) - group = models.ForeignKey(auth_models.Group, - related_name="filer_folder_permissions", - verbose_name=_("group"), blank=True, null=True) - everybody = models.BooleanField(_("everybody"), default=False) - - can_edit = models.SmallIntegerField(_("can edit"), choices=PERMISIONS, blank=True, null=True, default=None) - can_read = models.SmallIntegerField(_("can read"), choices=PERMISIONS, blank=True, null=True, default=None) - can_add_children = models.SmallIntegerField(_("can add children"), choices=PERMISIONS, blank=True, null=True, default=None) - - objects = FolderPermissionManager() - - def __unicode__(self): - if self.folder: - name = u'%s' % self.folder - else: - name = u'All Folders' - - ug = [] - if self.everybody: - ug.append('Everybody') - else: - if self.group: - ug.append(u"Group: %s" % self.group) - if self.user: - ug.append(u"User: %s" % self.user) - usergroup = " ".join(ug) - perms = [] - for s in ['can_edit', 'can_read', 'can_add_children']: - perm = getattr(self, s) - if perm == self.ALLOW: - perms.append(s) - elif perm == self.DENY: - perms.append('!%s' % s) - perms = ', '.join(perms) - return u"Folder: '%s'->%s [%s] [%s]" % ( - name, unicode(self.TYPES[self.type][1]), - perms, usergroup) - - def clean(self): - if self.type == self.ALL and self.folder: - raise ValidationError('Folder cannot be selected with type "all items".') - if self.type != self.ALL and not self.folder: - raise ValidationError('Folder has to be selected when type is not "all items".') - if self.everybody and (self.user or self.group): - raise ValidationError('User or group cannot be selected together with "everybody".') - if not self.user and not self.group and not self.everybody: - raise ValidationError('At least one of user, group, or "everybody" has to be selected.') - - class Meta: - verbose_name = _('folder permission') - verbose_name_plural = _('folder permissions') - app_label = 'filer' diff --git a/filer/models/imagemodels.py b/filer/models/imagemodels.py index 67b027758..c34d15599 100644 --- a/filer/models/imagemodels.py +++ b/filer/models/imagemodels.py @@ -107,32 +107,6 @@ def _get_exif(self): return self._exif_cache exif = property(_get_exif) - def has_edit_permission(self, request): - return self.has_generic_permission(request, 'edit') - - def has_read_permission(self, request): - return self.has_generic_permission(request, 'read') - - def has_add_children_permission(self, request): - return self.has_generic_permission(request, 'add_children') - - def has_generic_permission(self, request, permission_type): - """ - Return true if the current user has permission on this - image. Return the string 'ALL' if the user has all rights. - """ - user = request.user - if not user.is_authenticated() or not user.is_staff: - return False - elif user.is_superuser: - return True - elif user == self.owner: - return True - elif self.folder: - return self.folder.has_generic_permission(request, permission_type) - else: - return False - @property def label(self): if self.name in ['', None]: diff --git a/filer/tests/__init__.py b/filer/tests/__init__.py index 42d2dbbc3..d2c6fc678 100644 --- a/filer/tests/__init__.py +++ b/filer/tests/__init__.py @@ -2,7 +2,8 @@ from filer.tests.admin import * from filer.tests.fields import * from filer.tests.models import * -from filer.tests.permissions import * +# disable for now +# from filer.tests.permissions import * from filer.tests.server_backends import * from filer.tests.tools import * from filer.tests.utils import * diff --git a/filer/tests/admin.py b/filer/tests/admin.py index ebc1eda36..717eb5540 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -10,7 +10,7 @@ from django.http import HttpRequest from filer.models.filemodels import File from filer.models.archivemodels import Archive -from filer.models.foldermodels import Folder, FolderPermission +from filer.models.foldermodels import Folder from filer.models.imagemodels import Image from filer.models.clipboardmodels import Clipboard from filer.models.virtualitems import FolderRoot @@ -18,7 +18,6 @@ from filer.tests.helpers import ( get_user_message, create_superuser, create_folder_structure, create_image, create_staffuser, create_folder_for_user, move_action, - create_folderpermission_for_user, grant_all_folderpermissions_for_group, move_to_clipboard_action, paste_clipboard_to_folder, get_dir_listing_url, filer_obj_as_checkox, get_make_root_folder_url, move_single_file_to_clipboard_action, @@ -516,7 +515,7 @@ def test_resize_images_action(self): self.assertEqual(self.image_obj.width, 42) self.assertEqual(self.image_obj.height, 42) - +''' class PermissionAdminTest(TestCase): def setUp(self): @@ -613,7 +612,7 @@ def test_admin_view(self): for user in self.users.keys(): self.assert_user_adminview(user) - +''' class BaseTestFolderTypePermissionLayer(object): def test_default_add_view_is_forbidden(self): @@ -738,7 +737,7 @@ def test_add_root_folder(self): self.assertEqual(response.status_code, 302) self.assertEqual(Folder.objects.count(), 1) - def test_change_root_folder(self): + def test_change_root_core_folder(self): f1 = Folder.objects.create( name='foo', folder_type=Folder.CORE_FOLDER) response = self.client.get( @@ -748,8 +747,9 @@ def test_change_root_folder(self): reverse('admin:filer_folder_change', args=(f1.pk, )), {}) self.assertEqual(response.status_code, 403) - Folder.objects.filter(id=f1.id).update( - folder_type=Folder.SITE_FOLDER) + def test_change_root_site_folder(self): + f1 = Folder.objects.create( + name='foo', folder_type=Folder.SITE_FOLDER) response = self.client.get( reverse('admin:filer_folder_change', args=(f1.pk, ))) self.assertEqual(response.status_code, 200) @@ -846,9 +846,6 @@ def _get_clipboard_files(self): return clipboard.files def test_move_to_clipboard_from_root(self): - if not self.user.is_superuser: - self.assertEqual('This test should work after refactor filer ' - 'permissions', '') file_foo = File.objects.create( original_filename='foo', folder=None, file=dj_files.base.ContentFile('some data')) @@ -1122,7 +1119,7 @@ def test_extract_in_unfiled_folder(self): self.assertEqual(response.status_code, 403) -class TestFolderTypeFolderPermissionForSuperUser( +class TestFolderTypePermissionForSuperUser( TestCase, BaseTestFolderTypePermissionLayer): def setUp(self): @@ -1136,7 +1133,7 @@ def setUp(self): self.user = user -class TestFolderTypeFolderPermissionLayerForRegularUser( +class TestFolderTypePermissionLayerForRegularUser( TestCase, BaseTestFolderTypePermissionLayer): def setUp(self): @@ -1158,17 +1155,15 @@ def test_add_root_folder(self): get_make_root_folder_url(), {}) self.assertEqual(response.status_code, 403) - def test_change_root_folder(self): - f1 = Folder.objects.create(name='foo') + def test_change_root_site_folder(self): # regular users should not be able to change root folders at all - for folder_type in [Folder.CORE_FOLDER, Folder.SITE_FOLDER]: - Folder.objects.filter(id=f1.id).update(folder_type=folder_type) - response = self.client.get( - reverse('admin:filer_folder_change', args=(f1.pk, ))) - self.assertEqual(response.status_code, 403) - response = self.client.post( - reverse('admin:filer_folder_change', args=(f1.pk, )), {}) - self.assertEqual(response.status_code, 403) + f1 = Folder.objects.create(name='foo', folder_type=Folder.SITE_FOLDER) + response = self.client.get( + reverse('admin:filer_folder_change', args=(f1.pk, ))) + self.assertEqual(response.status_code, 403) + response = self.client.post( + reverse('admin:filer_folder_change', args=(f1.pk, )), {}) + self.assertEqual(response.status_code, 403) def test_delete_root_folder(self): f1 = Folder.objects.create(name='foo') diff --git a/filer/tests/helpers.py b/filer/tests/helpers.py index f73ec6076..a5907a59b 100644 --- a/filer/tests/helpers.py +++ b/filer/tests/helpers.py @@ -2,7 +2,7 @@ from PIL import Image, ImageChops, ImageDraw from django.contrib.auth.models import User, Permission -from filer.models.foldermodels import Folder, FolderPermission +from filer.models.foldermodels import Folder from filer.models.clipboardmodels import Clipboard, ClipboardItem from django.core.urlresolvers import reverse from django.contrib.admin import helpers @@ -152,25 +152,6 @@ def create_folder_for_user(foldername, user): return folder -def create_folderpermission_for_user(folder, user): - folder_permission = FolderPermission.objects.create( - folder=folder, - type=FolderPermission.CHILDREN, - user=user, - can_edit=FolderPermission.ALLOW, - can_read=FolderPermission.ALLOW, - can_add_children=FolderPermission.ALLOW, - ) - return folder_permission - - -def grant_all_folderpermissions_for_group(group): - permission_set = Permission.objects.filter( - codename__endswith='folderpermission', - ) - for permission in permission_set: - group.permissions.add(permission) - def get_user_message(response): """Helper method to return message from response """ for c in response.context: From f713c23faec33094f227406b3e11151f557657cd Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Thu, 26 Sep 2013 15:32:33 +0300 Subject: [PATCH 129/715] Added django-cms-roles as a dependency for django-filer. THe permission management will be build on top of cmsroles. --- filer/test_settings.py | 41 +++++++++++++++++++++++++++++++++++++++++ setup.py | 8 +++++++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/filer/test_settings.py b/filer/test_settings.py index 9471f8fea..d06d996b6 100644 --- a/filer/test_settings.py +++ b/filer/test_settings.py @@ -20,6 +20,11 @@ 'django.contrib.admin', 'django.contrib.sessions', 'django.contrib.staticfiles', + 'cms', + 'menus', + 'south', + 'sekizai', + 'cmsroles', ] ROOT_URLCONF = 'filer.test_urls' @@ -29,3 +34,39 @@ STATIC_URL = '/static/' USE_TZ = False # because of a bug in easy-thumbnails 1.0.3 + +TEMPLATE_CONTEXT_PROCESSORS = [ + "django.contrib.auth.context_processors.auth", + 'django.contrib.messages.context_processors.messages', + "django.core.context_processors.i18n", + "django.core.context_processors.debug", + "django.core.context_processors.request", + "django.core.context_processors.media", + 'django.core.context_processors.csrf', + "cms.context_processors.media", + "sekizai.context_processors.sekizai", + "django.core.context_processors.static", +] + +MIDDLEWARE_CLASSES = ( + 'django.middleware.cache.UpdateCacheMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', +) + +TEMPLATE_LOADERS = ( + 'cmsroles.test_utils.MockLoader', + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', + ) + +CMS_TEMPLATES = [('cms_mock_template.html', 'cms_mock_template.html')] +CMS_MODERATOR = True +CMS_PERMISSION = True + +CACHE_BACKEND = 'locmem:///' + +SOUTH_TESTS_MIGRATE = False diff --git a/setup.py b/setup.py index 3f8bb51bd..40cf4fa61 100644 --- a/setup.py +++ b/setup.py @@ -12,6 +12,10 @@ def read(fname): # read the contents of a text file return open(os.path.join(os.path.dirname(__file__), fname)).read() +dependency_links = [ + 'http://github.com/pbs/django-cms-roles/tarball/master#egg=django-cms-roles', +] + setup( name = "django-filer", version = version, @@ -26,9 +30,11 @@ def read(fname): install_requires = ( 'Django>=1.3,<1.5', 'easy-thumbnails>=1.0', - 'django-mptt>=0.5.1,<0.6', + 'django-mptt>=0.5.1,<0.5.3', 'django_polymorphic>=0.2', + 'django-cms-roles', ), + dependency_links=dependency_links, include_package_data=True, zip_safe=False, classifiers = [ From d42b9c7e404a1a2496ba1651fcee836fb4f684b2 Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Fri, 27 Sep 2013 18:56:38 +0300 Subject: [PATCH 130/715] SitFolder: viewable by users that have access on the folder's site --- filer/admin/folderadmin.py | 19 ++++++------ filer/admin/tools.py | 61 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 9 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index c2380a73b..2baafdd85 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -26,6 +26,7 @@ from filer.views import (popup_status, popup_param, selectfolder_status, selectfolder_param) from filer.admin.tools import (userperms_for_request, + folders_available, files_available, check_folder_edit_permissions, check_files_edit_permissions, check_files_read_permissions, @@ -302,19 +303,18 @@ def filter_file(qs, terms=[]): if len(search_terms) > 0: if folder and limit_search_to_folder and not folder.is_root: - folder_qs = folder.get_descendants() - file_qs = File.objects.filter( - folder__in=folder.get_descendants()) + folder_qs = folders_available(request, folder.get_descendants()) + file_qs = files_available(request, File.objects.filter( + folder__in=folder.get_descendants())) else: - folder_qs = Folder.objects.all() - file_qs = File.objects.all() + folder_qs = folders_available(request, Folder.objects.all()) + file_qs = files_available(request, File.objects.all()) folder_qs = filter_folder(folder_qs, search_terms) file_qs = filter_file(file_qs, search_terms) - show_result_count = True else: - folder_qs = folder.children.all() - file_qs = folder.files.all() + folder_qs = folders_available(request, folder.children.all()) + file_qs = files_available(request, folder.files.all()) show_result_count = False folder_qs = folder_qs.order_by('name') @@ -829,7 +829,8 @@ def _list_all_destination_folders_recursive(self, request, folders_queryset, current_folder, folders, allow_self, level): - for fo in folders.exclude(folder_type=Folder.CORE_FOLDER): + for fo in folders_available( + request, folders.exclude(folder_type=Folder.CORE_FOLDER)): if not allow_self and fo in folders_queryset: # We do not allow moving to selected folders or their # descendants diff --git a/filer/admin/tools.py b/filer/admin/tools.py index f2268b9a3..23d429871 100644 --- a/filer/admin/tools.py +++ b/filer/admin/tools.py @@ -1,5 +1,8 @@ #-*- coding: utf-8 -*- from django.core.exceptions import PermissionDenied +from cmsroles.siteadmin import is_site_admin, get_user_roles_on_sites_ids +from django.db.models import Q +from filer.models.foldermodels import Folder def check_files_edit_permissions(request, files): @@ -40,3 +43,61 @@ def userperms_for_request(item, request): if x: r.append(p) return r + + +def _get_sites_for_user(user): + """ + Returns all sites available for user. + This also binds the sites to the user in order to save some + queries execution + """ + available_sites = set() + for sites in get_user_roles_on_sites_ids(user).values(): + available_sites |= sites + setattr(user, '_available_sites', available_sites) + return available_sites + + +def folders_available(request, folders_qs): + """ + Returns a queryset with folders that current user can see + * core folders + * only site folders with sites available to the user + * site admins can also see site folder files with no site assigned + """ + user = request.user + + if user.is_superuser: + return folders_qs + + sites = getattr(user, '_available_sites', _get_sites_for_user(user)) + sites_q = Q(Q(folder_type=Folder.CORE_FOLDER) | + Q(site__in=sites)) + + if is_site_admin(user): + sites_q |= Q(site__isnull=True) + + return folders_qs.filter(sites_q) + + +def files_available(request, files_qs): + """ + Returns a queryset with files that current user can see: + * core folder files + * files from 'unfiled files' + * only site folder files with sites available to the user + * site admins can also see site folder files with no site assigned + """ + user = request.user + + if user.is_superuser: + return files_qs + + sites = getattr(user, '_available_sites', _get_sites_for_user(user)) + sites_q = Q(Q(folder__folder_type=Folder.CORE_FOLDER) | + Q(folder__site__in=sites) | Q(folder__isnull=True)) + + if is_site_admin(user): + sites_q |= Q(folder__site__isnull=True) + + return files_qs.filter(sites_q) From 95174a3529c056be4c1b82d4d43a6e7e8ed08f1c Mon Sep 17 00:00:00 2001 From: Marcel Cojocaru Date: Mon, 30 Sep 2013 15:55:51 +0300 Subject: [PATCH 131/715] LUN-1070 -- meta data is no more sent be function params --- filer/templates/admin/filer/folder/directory_table.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filer/templates/admin/filer/folder/directory_table.html b/filer/templates/admin/filer/folder/directory_table.html index 4caf6570e..a501e6839 100644 --- a/filer/templates/admin/filer/folder/directory_table.html +++ b/filer/templates/admin/filer/folder/directory_table.html @@ -34,7 +34,7 @@ {% endwith %}{% endif %} {% if item.file_type == 'File' or item.file_type == 'Image' or item.file_type == 'Archive' %}{% with item as file %} - {% if is_popup and not select_folder %} {% else %}{% if action_form and not is_popup %}{% endif %}{% endif %} + {% if is_popup and not select_folder %} {% else %}{% if action_form and not is_popup %}{% endif %}{% endif %} {{ file.default_alt_text }} From d805f9f90558416f69223c72c25357345aae44c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20Szeredi?= Date: Wed, 2 Oct 2013 17:09:28 +0300 Subject: [PATCH 132/715] Bump the version since there are commits on top of last tag. --- filer/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filer/__init__.py b/filer/__init__.py index 7b132c224..f0feda308 100644 --- a/filer/__init__.py +++ b/filer/__init__.py @@ -1,3 +1,3 @@ #-*- coding: utf-8 -*- # version string following pep-0396 and pep-0386 -__version__ = '0.9pbs.9' # pragma: nocover +__version__ = '0.9pbs.10' # pragma: nocover From a50d40296cc3d0299553e7e97de74a53b2f222de Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Thu, 3 Oct 2013 18:45:42 +0300 Subject: [PATCH 133/715] * moved views methods in the specific model admins; * added new admin tools to detect if user has permissions for specific actions * added site filtering based on user roles over sites * action checkboxes will not be available for core files and folders; * actions will not be available when doing searches * replaced all permission logic * left all disabled actions commented and mostly unchanged; these will need to be changed if they will be enabled again --- filer/admin/clipboardadmin.py | 69 +- filer/admin/fileadmin.py | 14 +- filer/admin/folderadmin.py | 700 ++++++++---------- filer/admin/permissions.py | 113 ++- filer/admin/tools.py | 124 ++-- filer/models/filemodels.py | 20 - filer/models/foldermodels.py | 20 +- filer/server/views.py | 10 - .../filer/folder/choose_copy_destination.html | 4 - .../folder/choose_images_resize_options.html | 4 - .../filer/folder/choose_move_destination.html | 4 - .../filer/folder/choose_rename_format.html | 4 - .../admin/filer/folder/directory_table.html | 4 +- filer/tests/__init__.py | 2 - filer/tests/admin.py | 472 +++++++++--- filer/views.py | 121 --- 16 files changed, 902 insertions(+), 783 deletions(-) diff --git a/filer/admin/clipboardadmin.py b/filer/admin/clipboardadmin.py index 97ba50a76..06e1b10e1 100644 --- a/filer/admin/clipboardadmin.py +++ b/filer/admin/clipboardadmin.py @@ -1,16 +1,18 @@ #-*- coding: utf-8 -*- from django.forms.models import modelform_factory +from django.core.exceptions import PermissionDenied from django.contrib import admin -from django.http import HttpResponse +from django.http import HttpResponse, HttpResponseRedirect from django.utils import simplejson from django.utils.translation import ugettext as _ from django.views.decorators.csrf import csrf_exempt from filer import settings as filer_settings -from filer.models import Clipboard, ClipboardItem +from filer.models import Clipboard, ClipboardItem, Folder, tools from filer.utils.files import ( handle_upload, UploadException, matching_file_subtypes ) - +from filer.views import popup_param, selectfolder_param +from filer.admin.tools import is_valid_destination # ModelAdmins class ClipboardItemInline(admin.TabularInline): @@ -28,16 +30,15 @@ class ClipboardAdmin(admin.ModelAdmin): def get_urls(self): from django.conf.urls.defaults import patterns, url urls = super(ClipboardAdmin, self).get_urls() - from filer import views url_patterns = patterns('', url(r'^operations/paste_clipboard_to_folder/$', - self.admin_site.admin_view(views.paste_clipboard_to_folder), + self.admin_site.admin_view(self.paste_clipboard_to_folder), name='filer-paste_clipboard_to_folder'), url(r'^operations/discard_clipboard/$', - self.admin_site.admin_view(views.discard_clipboard), + self.admin_site.admin_view(self.discard_clipboard), name='filer-discard_clipboard'), url(r'^operations/delete_clipboard/$', - self.admin_site.admin_view(views.delete_clipboard), + self.admin_site.admin_view(self.delete_clipboard), name='filer-delete_clipboard'), # upload does it's own permission stuff (because of the stupid # flash missing cookie stuff) @@ -48,6 +49,60 @@ def get_urls(self): url_patterns.extend(urls) return url_patterns + def get_clipboard(self, request): + return Clipboard.objects.get(id=request.POST.get('clipboard_id')) + + def paste_clipboard_to_folder(self, request): + if request.method == 'POST': + folder_id = request.POST.get('folder_id') + + if not folder_id: + raise PermissionDenied + + folder = Folder.objects.get(id=folder_id) + if not is_valid_destination(request, folder): + raise PermissionDenied + + clipboard = self.get_clipboard(request) + files_moved = tools.move_files_from_clipboard_to_folder( + request, clipboard, folder) + tools.discard_clipboard_files(clipboard, files_moved) + return HttpResponseRedirect('%s%s%s' % ( + request.REQUEST.get('redirect_to', ''), + popup_param(request), + selectfolder_param(request))) + + def discard_clipboard(self, request): + if request.method == 'POST': + clipboard = self.get_clipboard(request) + tools.discard_clipboard(clipboard) + return HttpResponseRedirect('%s%s%s' % ( + request.POST.get('redirect_to', ''), + popup_param(request), + selectfolder_param(request))) + + def delete_clipboard(self, request): + if request.method == 'POST': + tools.delete_clipboard(self.get_clipboard(request)) + return HttpResponseRedirect('%s%s%s' % ( + request.POST.get('redirect_to', ''), + popup_param(request), + selectfolder_param(request))) + + def clone_files_from_clipboard_to_folder(self, request): + if request.method == 'POST': + folder = Folder.objects.get(id=request.POST.get('folder_id')) + + if folder.is_restricted(): + raise PermissionDenied + + tools.clone_files_from_clipboard_to_folder( + self.get_clipboard(request), folder) + return HttpResponseRedirect('%s%s%s' % ( + request.POST.get('redirect_to', ''), + popup_param(request), + selectfolder_param(request))) + @csrf_exempt def ajax_upload(self, request, folder_id=None): """ diff --git a/filer/admin/fileadmin.py b/filer/admin/fileadmin.py index 5def825e0..e3cae62bc 100644 --- a/filer/admin/fileadmin.py +++ b/filer/admin/fileadmin.py @@ -1,17 +1,14 @@ #-*- coding: utf-8 -*- -from django import forms from django.contrib.admin.util import unquote from django.core.urlresolvers import reverse from django.http import HttpResponseRedirect from django.utils.translation import ugettext as _ -from filer import settings -from filer.admin.permissions import PrimitivePermissionAwareModelAdmin -from filer.models import File +from filer.admin.permissions import FilePermissionModelAdmin from filer.views import (popup_param, selectfolder_param, popup_status, selectfolder_status) -class FileAdmin(PrimitivePermissionAwareModelAdmin): +class FileAdmin(FilePermissionModelAdmin): list_display = ('label',) list_per_page = 10 search_fields = ['name', 'original_filename', 'sha1', 'description'] @@ -44,13 +41,6 @@ def build_fieldsets(cls, extra_main_fields=(), extra_advanced_fields=(), extra_f 'classes': ('collapse',), }), ) + extra_fieldsets - # custom requirement: hide 'Permissions disabled' section - # if settings.FILER_ENABLE_PERMISSIONS: - # fieldsets = fieldsets + ( - # (None, { - # 'fields': ('is_public',) - # }), - # ) return fieldsets diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 2baafdd85..c9ce9973b 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -7,9 +7,11 @@ from filer.admin.patched.admin_utils import get_deleted_objects from django.core.exceptions import PermissionDenied from django.core.paginator import Paginator, InvalidPage, EmptyPage -from django.core.urlresolvers import reverse +from django.core.urlresolvers import reverse, resolve from django.db import router from django.db.models import Q +from django.contrib.sites.models import Site +from django.contrib.contenttypes.models import ContentType from django.http import HttpResponseRedirect, Http404, HttpResponse from django.shortcuts import render_to_response from django.template import RequestContext @@ -22,15 +24,15 @@ from filer import settings from filer.admin.forms import (CopyFilesAndFoldersForm, ResizeImagesForm, RenameFilesForm) -from filer.admin.permissions import PrimitivePermissionAwareModelAdmin +from filer.admin.permissions import FolderPermissionModelAdmin from filer.views import (popup_status, popup_param, selectfolder_status, selectfolder_param) -from filer.admin.tools import (userperms_for_request, - folders_available, files_available, - check_folder_edit_permissions, - check_files_edit_permissions, - check_files_read_permissions, - check_folder_read_permissions) +from filer.admin.tools import (folders_available, files_available, + has_admin_role, has_role_on_site, + has_admin_role_on_site, + get_admin_sites_for_user, + has_multi_file_action_permission, + is_valid_destination,) from filer.models import (Folder, FolderRoot, UnfiledImages, File, tools, ImagesWithMissingData, Image, Archive) @@ -43,7 +45,7 @@ import inspect -class FolderAdmin(PrimitivePermissionAwareModelAdmin): +class FolderAdmin(FolderPermissionModelAdmin): list_display = ('name',) list_per_page = 20 list_filter = ('owner',) @@ -51,22 +53,34 @@ class FolderAdmin(PrimitivePermissionAwareModelAdmin): save_as = True # see ImageAdmin actions = [ 'move_to_clipboard', - # custom requirements: hide 'set public/private' actions - # 'files_set_public', 'files_set_private', - 'delete_files_or_folders', 'move_files_and_folders', + 'delete_files_or_folders', + 'move_files_and_folders', 'copy_files_and_folders', - # custom requirements: hide 'resize_images' and 'rename_files' actions - # 'resize_images', 'rename_files', 'extract_files'] # form fields exclude = ('parent', 'owner', 'folder_type') - raw_id_fields = ('owner', 'site', ) + raw_id_fields = ('owner', ) + + def formfield_for_foreignkey(self, db_field, request=None, **kwargs): + """ + Filters sites available to the user based on his roles on sites + """ + formfield = super(FolderAdmin, self).formfield_for_foreignkey( + db_field, request, **kwargs) + if request and db_field.rel.to is Site: + admin_sites = [site.id + for site in get_admin_sites_for_user(request.user)] + formfield.queryset = Site.objects.filter(id__in=admin_sites) + return formfield def get_form(self, request, obj=None, **kwargs): """ Returns a Form class for use in the admin add view. This is used by add_view and change_view. + + Sets the parent folder and owner for the folder that will be edited + in the form """ folder_form = super(FolderAdmin, self).get_form( @@ -132,15 +146,6 @@ def render_change_form(self, request, context, add=False, change=False, request=request, context=context, add=False, change=False, form_url=form_url, obj=obj) - def _restrict_view(self, request, obj): - if not obj: - return - if obj.is_restricted(): - raise PermissionDenied - - if not obj.parent and not request.user.is_superuser: - raise PermissionDenied - def delete_view(self, request, object_id, extra_context=None): """ Overrides the default to enable redirecting to the directory view after @@ -157,8 +162,6 @@ def delete_view(self, request, object_id, extra_context=None): except self.model.DoesNotExist: obj = None - self._restrict_view(request, obj) - r = super(FolderAdmin, self).delete_view( request=request, object_id=object_id, extra_context=extra_context) @@ -182,7 +185,6 @@ def icon_img(self, xs): def get_urls(self): from django.conf.urls.defaults import patterns, url urls = super(FolderAdmin, self).get_urls() - from filer import views url_patterns = patterns('', # we override the default list view with our own directory listing # of the root directories @@ -206,38 +208,18 @@ def get_urls(self): url_patterns.extend(urls) return url_patterns - def change_view(self, request, object_id, *args, **kwargs): - obj = self.get_object(request, unquote(object_id)) - - self._restrict_view(request, obj) - - return super(FolderAdmin, self).change_view( - request, object_id, *args, **kwargs) - def add_view(self, request, *args, **kwargs): raise PermissionDenied def make_folder(self, request, folder_id=None, *args, **kwargs): - if not folder_id: - folder_id = request.REQUEST.get('parent_id', None) - if folder_id: - folder = Folder.objects.get(id=folder_id) - if folder.is_restricted(): - raise PermissionDenied - else: - folder = None - - if request.user.is_superuser: - pass - elif folder is None: - # regular users may not add root folders - raise PermissionDenied - elif not folder.has_add_children_permission(request): - # the user does not have the permission to add subfolders - raise PermissionDenied - response = super(FolderAdmin, self).add_view(request, *args, **kwargs) - # this check should be enough since only save button appears + + # since filer overwrites django's dismissPopup we need to make sure + # that the response from django's add_view is the + # dismiss popup response so we can overwrite it + # since only save button appears its enough to make sure that the + # request is a POST from a popup view and the response is a + # successed HttpResponse if (request.method == 'POST' and "_popup" in request.POST and response.status_code == 200 and not isinstance(response, TemplateResponse) and @@ -249,7 +231,9 @@ def make_folder(self, request, folder_id=None, *args, **kwargs): # custom views def directory_listing(self, request, folder_id=None, viewtype=None): - clipboard = tools.get_user_clipboard(request.user) + user = request.user + hide_all_actions = False + clipboard = tools.get_user_clipboard(user) if viewtype == 'images_with_missing_data': folder = ImagesWithMissingData() elif viewtype == 'unfiled_images': @@ -259,11 +243,27 @@ def directory_listing(self, request, folder_id=None, viewtype=None): else: try: folder = Folder.objects.get(id=folder_id) + if not self.can_view_folder_content(request, folder): + raise PermissionDenied + # hide actions from view if folder is core folder + hide_all_actions = folder.is_restricted() except Folder.DoesNotExist: raise Http404 + # search + q = request.GET.get('q', None) + if q: + search_terms = unquote(q).split(" ") + else: + search_terms = [] + q = '' + # Check actions to see if any are available on this changelist - actions = self.get_actions(request) + # do not let any actions available if we're in search view since + # there is no way to detect the current folder + actions = {} + if not search_terms and not hide_all_actions: + actions = self.get_actions(request) # Remove action checkboxes if there aren't any actions available. list_display = list(self.list_display) @@ -273,31 +273,6 @@ def directory_listing(self, request, folder_id=None, viewtype=None): except ValueError: pass - # search - def filter_folder(qs, terms=[]): - for term in terms: - qs = qs.filter(Q(name__icontains=term) | - Q(owner__username__icontains=term) | - Q(owner__first_name__icontains=term) | - Q(owner__last_name__icontains=term)) - return qs - - def filter_file(qs, terms=[]): - for term in terms: - qs = qs.filter(Q(name__icontains=term) | - Q(description__icontains=term) | - Q(original_filename__icontains=term) | - Q(owner__username__icontains=term) | - Q(owner__first_name__icontains=term) | - Q(owner__last_name__icontains=term)) - return qs - - q = request.GET.get('q', None) - if q: - search_terms = unquote(q).split(" ") - else: - search_terms = [] - q = '' limit_search_to_folder = request.GET.get('limit_search_to_folder', False) in (True, 'on') @@ -309,8 +284,27 @@ def filter_file(qs, terms=[]): else: folder_qs = folders_available(request, Folder.objects.all()) file_qs = files_available(request, File.objects.all()) - folder_qs = filter_folder(folder_qs, search_terms) - file_qs = filter_file(file_qs, search_terms) + + def folder_search_qs(qs, terms=[]): + for term in terms: + qs = qs.filter(Q(name__icontains=term) | + Q(owner__username__icontains=term) | + Q(owner__first_name__icontains=term) | + Q(owner__last_name__icontains=term)) + return qs + + def file_search_qs(qs, terms=[]): + for term in terms: + qs = qs.filter(Q(name__icontains=term) | + Q(description__icontains=term) | + Q(original_filename__icontains=term) | + Q(owner__username__icontains=term) | + Q(owner__first_name__icontains=term) | + Q(owner__last_name__icontains=term)) + return qs + + folder_qs = folder_search_qs(folder_qs, search_terms) + file_qs = file_search_qs(file_qs, search_terms) show_result_count = True else: folder_qs = folders_available(request, folder.children.all()) @@ -325,19 +319,9 @@ def filter_file(qs, terms=[]): if folder.is_root: folder_children += folder.virtual_folders - user = request.user folder_children += folder_qs folder_files += file_qs - try: - permissions = { - 'has_edit_permission': folder.has_edit_permission(request), - 'has_read_permission': folder.has_read_permission(request), - 'has_add_children_permission': - folder.has_add_children_permission(request), - } - except: - permissions = {} folder_files.sort() items = folder_children + folder_files paginator = Paginator(items, FILER_PAGINATE_BY) @@ -354,12 +338,9 @@ def filter_file(qs, terms=[]): if "move-to-clipboard-%d" % (f.id,) in request.POST: if f.is_restricted(): raise PermissionDenied - clipboard = tools.get_user_clipboard(request.user) - if f.has_edit_permission(request): - tools.move_file_to_clipboard(request, [f], clipboard) - return HttpResponseRedirect(request.get_full_path()) - else: - raise PermissionDenied + clipboard = tools.get_user_clipboard(user) + tools.move_file_to_clipboard(request, [f], clipboard) + return HttpResponseRedirect(request.get_full_path()) selected = request.POST.getlist(helpers.ACTION_CHECKBOX_NAME) # Actions with no confirmation @@ -394,7 +375,6 @@ def filter_file(qs, terms=[]): self.get_action_choices(request) else: action_form = None - selection_note_all = ungettext('%(total_count)s selected', 'All %(total_count)s selected', paginator.count) @@ -408,12 +388,10 @@ def filter_file(qs, terms=[]): { 'folder': folder, 'clipboard_files': File.objects.filter( - in_clipboards__clipboarditem__clipboard__user=request.user + in_clipboards__clipboarditem__clipboard__user=user ).distinct(), 'paginator': paginator, 'paginated_items': paginated_items, - 'permissions': permissions, - 'permstest': userperms_for_request(folder, request), 'current_url': request.path, 'title': u'Directory listing for %s' % folder.name, 'search_string': ' '.join(search_terms), @@ -433,7 +411,6 @@ def filter_file(qs, terms=[]): 'selection_note_all': selection_note_all % { 'total_count': paginator.count}, 'media': self.media, - 'enable_permissions': settings.FILER_ENABLE_PERMISSIONS }, context_instance=RequestContext(request)) def response_action(self, request, files_queryset, folders_queryset): @@ -526,24 +503,14 @@ def move_to_clipboard(self, request, files_queryset, folders_queryset): Action which moves the selected files and files in selected folders to clipboard. """ - - if not self.has_change_permission(request): - raise PermissionDenied - if request.method != 'POST': return None - self._check_restricted(request, files_queryset, folders_queryset, - allow_regular_users=True) + if not has_multi_file_action_permission( + request, files_queryset, folders_queryset): + raise PermissionDenied clipboard = tools.get_user_clipboard(request.user) - - check_files_edit_permissions(request, files_queryset) - check_folder_edit_permissions(request, folders_queryset) - - # TODO: Display a confirmation page if moving more than X files - # to clipboard? - # We define it like that so that we can modify it inside the # move_files function files_count = [0] @@ -569,67 +536,6 @@ def move_folders(folders): move_to_clipboard.short_description = ugettext_lazy( "Move selected files to clipboard") - def files_set_public_or_private(self, request, set_public, - files_queryset, folders_queryset): - """ - Action which enables or disables permissions for selected - files and files in selected folders to clipboard - (set them private or public). - """ - - if not self.has_change_permission(request): - raise PermissionDenied - - if request.method != 'POST': - return None - - check_files_edit_permissions(request, files_queryset) - check_folder_edit_permissions(request, folders_queryset) - - # We define it like that so that we can modify it inside the - # set_files function - files_count = [0] - - def set_files(files): - for f in files: - if f.is_public != set_public: - f.is_public = set_public - f.save() - files_count[0] += 1 - - def set_folders(folders): - for f in folders: - set_files(f.files) - set_folders(f.children.all()) - - set_files(files_queryset) - set_folders(folders_queryset) - - if set_public: - self.message_user(request, - _("Successfully disabled permissions for %(count)d files.") % { - "count": files_count[0], }) - else: - self.message_user(request, - _("Successfully enabled permissions for %(count)d files.") % { - "count": files_count[0], }) - - return None - - def files_set_private(self, request, files_queryset, folders_queryset): - return self.files_set_public_or_private( - request, False, files_queryset, folders_queryset) - - files_set_private.short_description = ugettext_lazy( - "Enable permissions for selected files") - - def files_set_public(self, request, files_queryset, folders_queryset): - return self.files_set_public_or_private( - request, True, files_queryset, folders_queryset) - - files_set_public.short_description = ugettext_lazy( - "Disable permissions for selected files") - def delete_files_or_folders(self, request, files_queryset, folders_queryset): """ @@ -643,14 +549,18 @@ def delete_files_or_folders(self, request, Next, it delets all selected files and/or folders and redirects back to the folder. """ - self._check_restricted(request, files_queryset, folders_queryset) - opts = self.model._meta - app_label = opts.app_label # Check that the user has delete permission for the actual model if not self.has_delete_permission(request): raise PermissionDenied + if not has_multi_file_action_permission( + request, files_queryset, folders_queryset): + raise PermissionDenied + + opts = self.model._meta + app_label = opts.app_label + current_folder = self._get_current_action_folder( request, files_queryset, folders_queryset) @@ -777,24 +687,6 @@ def _format_callback(self, obj, user, admin_site, perms_needed): return u'%s: %s' % (capfirst(opts.verbose_name), force_unicode(obj)) - def _check_copy_perms(self, request, files_queryset, folders_queryset): - try: - check_files_read_permissions(request, files_queryset) - check_folder_read_permissions(request, folders_queryset) - except PermissionDenied: - return True - return False - - def _check_move_perms(self, request, files_queryset, folders_queryset): - try: - check_files_read_permissions(request, files_queryset) - check_folder_read_permissions(request, folders_queryset) - check_files_edit_permissions(request, files_queryset) - check_folder_edit_permissions(request, folders_queryset) - except PermissionDenied: - return True - return False - def _get_current_action_folder(self, request, files_queryset, folders_queryset): if files_queryset: @@ -829,19 +721,14 @@ def _list_all_destination_folders_recursive(self, request, folders_queryset, current_folder, folders, allow_self, level): - for fo in folders_available( - request, folders.exclude(folder_type=Folder.CORE_FOLDER)): + for fo in folders_available(request, folders): if not allow_self and fo in folders_queryset: # We do not allow moving to selected folders or their # descendants continue - if not fo.has_read_permission(request): - continue - # We do not allow copying/moving back to the folder itself - enabled = ((allow_self or fo != current_folder) and - fo.has_add_children_permission(request)) + enabled = ((allow_self or fo != current_folder)) yield (fo, (mark_safe(("  " * level) + force_unicode(fo)), enabled)) @@ -852,8 +739,11 @@ def _list_all_destination_folders_recursive(self, request, def _list_all_destination_folders(self, request, folders_queryset, current_folder, allow_self): + # do not allow move/copy in core folders or site folders with no site + destination_candidates = FolderRoot().children.exclude( + folder_type=Folder.CORE_FOLDER).exclude(site__isnull=True) return list(self._list_all_destination_folders_recursive( - request, folders_queryset, current_folder, FolderRoot().children, + request, folders_queryset, current_folder, destination_candidates, allow_self, 0)) def _move_files_and_folders_impl(self, files_queryset, folders_queryset, @@ -865,56 +755,39 @@ def _move_files_and_folders_impl(self, files_queryset, folders_queryset, f.move_to(destination, 'last-child') f.save() - def _check_restricted(self, request, files_queryset, folders_queryset, - allow_regular_users=False): - user_check = request.user if not allow_regular_users else None - if folders_queryset.restricted(user_check).exists(): - raise PermissionDenied - - if files_queryset.restricted().exists(): - raise PermissionDenied - def move_files_and_folders(self, request, files_queryset, folders_queryset): opts = self.model._meta app_label = opts.app_label + if not has_multi_file_action_permission( + request, files_queryset, folders_queryset): + raise PermissionDenied current_folder = self._get_current_action_folder( request, files_queryset, folders_queryset) - perms_needed = self._check_move_perms( - request, files_queryset, folders_queryset) to_move = self._list_all_to_copy_or_move( request, files_queryset, folders_queryset) folders = self._list_all_destination_folders( request, folders_queryset, current_folder, False) if request.method == 'POST' and request.POST.get('post'): - self._check_restricted(request, files_queryset, folders_queryset) - if perms_needed: - raise PermissionDenied try: destination = Folder.objects.get( pk=request.POST.get('destination')) + if not is_valid_destination(request, destination): + raise PermissionDenied except Folder.DoesNotExist: raise PermissionDenied - if destination.folder_type == Folder.CORE_FOLDER: - raise PermissionDenied - # all folders need to belong to the same site as the # destination site folder - if not destination.site: - messages.error(request, _(u"Destination folder %s does not " - "belong to any site. Folders need to be assigned to a " - "site before you can move files in it." % \ - destination.pretty_logical_path)) - return - folders_with_sites_to_move = \ set(folders_queryset.values_list('site_id', flat=True)) | \ - set(files_queryset.values_list('folder__site_id', flat=True)) + set(files_queryset.exclude(folder__isnull=True).\ + values_list('folder__site_id', flat=True)) - if None in folders_with_sites_to_move: + if (folders_with_sites_to_move and + None in folders_with_sites_to_move): messages.error(request, "Some of the selected files/folders " "do not belong to any site. Folders need to be assigned " "to a site before you can move files/folders from it.") @@ -925,36 +798,19 @@ def move_files_and_folders(self, request, "belong to several sites. Select files/folders that " "belong to only one site.") return - elif folders_with_sites_to_move.pop() != destination.site.id: + elif (folders_with_sites_to_move and + folders_with_sites_to_move.pop() != destination.site.id): messages.error(request, "Selected files/folders need to " "belong to the same site as the destination folder.") return folders_dict = dict(folders) if (destination not in folders_dict or - not folders_dict[destination][1]): + not folders_dict[destination][1]): raise PermissionDenied - conflicting_folder_names = [ - folder.name for folder in Folder.objects.filter( - parent=destination, - name__in=folders_queryset.values('name'))] - - if conflicting_folder_names: - messages.error(request, - _(u"Folders with names %s already exist at the selected " - "destination") % u", ".join(conflicting_folder_names)) - return - - valid_files , invalid_files = \ - tools.split_files_valid_for_destination( - files_queryset, destination) - if invalid_files: - conflicting_file_names = [f.actual_name - for f in invalid_files] - messages.error(request, - _(u"Files with names %s already exist at the selected " - "destination") % u", ".join(conflicting_file_names)) + if not self._are_candidate_names_valid( + request, files_queryset, folders_queryset, destination): return # We count only topmost files and folders here @@ -978,7 +834,6 @@ def move_files_and_folders(self, request, "destination_folders": folders, "files_queryset": files_queryset, "folders_queryset": folders_queryset, - "perms_lacking": perms_needed, "opts": opts, "root_path": reverse('admin:index'), "app_label": app_label, @@ -993,110 +848,18 @@ def move_files_and_folders(self, request, move_files_and_folders.short_description = ugettext_lazy( "Move selected files and/or folders") - def _rename_file(self, file_obj, form_data, counter, global_counter): - original_basename, original_extension = os.path.splitext( - file_obj.original_filename) - if file_obj.name: - current_basename, current_extension = os.path.splitext( - file_obj.name) - else: - current_basename = "" - current_extension = "" - file_obj.name = form_data['rename_format'] % { - 'original_filename': file_obj.original_filename, - 'original_basename': original_basename, - 'original_extension': original_extension, - 'current_filename': file_obj.name or "", - 'current_basename': current_basename, - 'current_extension': current_extension, - 'current_folder': file_obj.folder.name, - 'counter': counter + 1, # 1-based - 'global_counter': global_counter + 1, # 1-based - } - file_obj.save() - - def _rename_files(self, files, form_data, global_counter): - n = 0 - for f in sorted(files): - self._rename_file(f, form_data, n, global_counter + n) - n += 1 - return n - - def _rename_folder(self, folder, form_data, global_counter): - return self._rename_files_impl( - folder.files.all(), folder.children.all(), - form_data, global_counter) - - def _rename_files_impl(self, files_queryset, folders_queryset, - form_data, global_counter): - n = 0 - - for f in folders_queryset: - n += self._rename_folder(f, form_data, global_counter + n) - - n += self._rename_files(files_queryset, form_data, global_counter + n) - - return n - - def rename_files(self, request, files_queryset, folders_queryset): - opts = self.model._meta - app_label = opts.app_label - - current_folder = self._get_current_action_folder( - request, files_queryset, folders_queryset) - perms_needed = self._check_move_perms( - request, files_queryset, folders_queryset) - to_rename = self._list_all_to_copy_or_move( - request, files_queryset, folders_queryset) - - if request.method == 'POST' and request.POST.get('post'): - if perms_needed: - raise PermissionDenied - form = RenameFilesForm(request.POST) - if form.is_valid(): - if files_queryset.count() + folders_queryset.count(): - n = self._rename_files_impl( - files_queryset, folders_queryset, - form.cleaned_data, 0) - self.message_user(request, - _("Successfully renamed %(count)d files.") % { - "count": n, - }) - return None - else: - form = RenameFilesForm() - - context = { - "title": _("Rename files"), - "instance": current_folder, - "breadcrumbs_action": _("Rename files"), - "to_rename": to_rename, - "rename_form": form, - "files_queryset": files_queryset, - "folders_queryset": folders_queryset, - "perms_lacking": perms_needed, - "opts": opts, - "root_path": reverse('admin:index'), - "app_label": app_label, - "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, - } - - # Display the rename format selection page - return render_to_response([ - "admin/filer/folder/choose_rename_format.html" - ], context, context_instance=template.RequestContext(request)) - - rename_files.short_description = ugettext_lazy("Rename files") - def extract_files(self, request, files_queryset, folder_queryset): success_format = "Successfully extracted archive {}." + files_queryset = files_queryset.filter( + polymorphic_ctype=ContentType.objects.get_for_model(Archive).id) # cannot extract in unfiled files folder - if files_queryset.filter(folder=None).exists(): + if files_queryset.filter(folder__isnull=True).exists(): raise PermissionDenied - self._check_restricted( - request, files_queryset, Folder.objects.get_empty_query_set()) + if not has_multi_file_action_permission(request, files_queryset, + Folder.objects.get_empty_query_set()): + raise PermissionDenied def is_valid_archive(filer_file): is_valid = filer_file.is_valid() @@ -1121,9 +884,7 @@ def has_collisions(filer_file): return len(collisions) > 0 for f in files_queryset: - if not isinstance(f, Archive) or \ - not is_valid_archive(f) or \ - has_collisions(f): + if not is_valid_archive(f) or has_collisions(f): continue f.extract() message = success_format.format(f.actual_name) @@ -1132,10 +893,6 @@ def has_collisions(filer_file): extract_files.short_description = ugettext_lazy( "Extract selected zip files") - def _generate_new_filename(self, filename, suffix): - basename, extension = os.path.splitext(filename) - return basename + suffix + extension - def _copy_file(self, file_obj, destination, suffix, overwrite): if overwrite: # Not yet implemented as we have to find a portable @@ -1145,7 +902,7 @@ def _copy_file(self, file_obj, destination, suffix, overwrite): # We are assuming here that we are operating on an already saved # database objects with current database state available - filename = self._generate_new_filename(file_obj.file.name, suffix) + filename = self._generate_name(file_obj.file.name, suffix) # Due to how inheritance works, we have to set both pk and id to None file_obj.pk = None @@ -1153,7 +910,7 @@ def _copy_file(self, file_obj, destination, suffix, overwrite): file_obj.save() file_obj.folder = destination file_obj.file = file_obj._copy_file(filename) - file_obj.original_filename = self._generate_new_filename( + file_obj.original_filename = self._generate_name( file_obj.original_filename, suffix) file_obj.save() @@ -1162,25 +919,13 @@ def _copy_files(self, files, destination, suffix, overwrite): self._copy_file(f, destination, suffix, overwrite) return len(files) - def _get_available_name(self, destination, name): - count = itertools.count(1) - original = name - while destination.contains_folder(name): - name = "%s_%s" % (original, count.next()) - return name - def _copy_folder(self, folder, destination, suffix, overwrite): if overwrite: # Not yet implemented as we have to find a portable # (for different storage backends) way to overwrite files raise NotImplementedError - # TODO: Should we also allow not to overwrite the folder - # if it exists, but just copy into it? - - # TODO: Is this a race-condition? Would this be a problem? - foldername = self._get_available_name(destination, folder.name) - + foldername = self._generate_name(folder.name, suffix) old_folder = Folder.objects.get(pk=folder.pk) # Due to how inheritance works, we have to set both pk and id to None @@ -1203,6 +948,31 @@ def _copy_files_and_folders_impl(self, files_queryset, folders_queryset, return n + def _generate_name(self, filename, suffix): + if not suffix: + return filename + basename, extension = os.path.splitext(filename) + return basename + suffix + extension + + def _are_candidate_names_valid( + self, request, file_qs, folder_qs, destination, suffix=None): + candidate_folder_names = [self._generate_name(name, suffix) + for name in folder_qs.values_list( + 'name', flat=True)] + candidate_file_names = [ + self._generate_name(file_obj.actual_name, suffix) + for file_obj in file_qs] + + existing_names = destination.entries_with_names( + candidate_folder_names + candidate_file_names) + + if existing_names: + messages.error(request, + _(u"File or folders with names %s already exist at the " + "selected destination") % u", ".join(existing_names)) + return False + return True + def copy_files_and_folders(self, request, files_queryset, folders_queryset): opts = self.model._meta @@ -1210,32 +980,37 @@ def copy_files_and_folders(self, request, current_folder = self._get_current_action_folder( request, files_queryset, folders_queryset) - perms_needed = self._check_copy_perms( - request, files_queryset, folders_queryset) to_copy = self._list_all_to_copy_or_move( request, files_queryset, folders_queryset) folders = self._list_all_destination_folders( request, folders_queryset, current_folder, True) if request.method == 'POST' and request.POST.get('post'): - if perms_needed: - raise PermissionDenied form = CopyFilesAndFoldersForm(request.POST) if form.is_valid(): try: destination = Folder.objects.get( pk=request.POST.get('destination')) + if not is_valid_destination(request, destination): + raise PermissionDenied except Folder.DoesNotExist: raise PermissionDenied + folders_dict = dict(folders) if (destination not in folders_dict or not folders_dict[destination][1]): raise PermissionDenied + + suffix = form.cleaned_data['suffix'] + if not self._are_candidate_names_valid( + request, files_queryset, folders_queryset, + destination, suffix): return + if files_queryset.count() + folders_queryset.count(): # We count all files and folders here (recursivelly) n = self._copy_files_and_folders_impl( files_queryset, folders_queryset, destination, - form.cleaned_data['suffix'], False) + suffix, False) self.message_user(request, _("Successfully copied %(count)d files and/or " "folders to folder '%(destination)s'.") % { @@ -1264,7 +1039,6 @@ def copy_files_and_folders(self, request, "copy_form": form, "files_queryset": files_queryset, "folders_queryset": folders_queryset, - "perms_lacking": perms_needed, "opts": opts, "root_path": reverse('admin:index'), "app_label": app_label, @@ -1278,15 +1052,97 @@ def copy_files_and_folders(self, request, copy_files_and_folders.short_description = ugettext_lazy( "Copy selected files and/or folders") +''' + def _rename_file(self, file_obj, form_data, counter, global_counter): + original_basename, original_extension = os.path.splitext( + file_obj.original_filename) + if file_obj.name: + current_basename, current_extension = os.path.splitext( + file_obj.name) + else: + current_basename = "" + current_extension = "" + file_obj.name = form_data['rename_format'] % { + 'original_filename': file_obj.original_filename, + 'original_basename': original_basename, + 'original_extension': original_extension, + 'current_filename': file_obj.name or "", + 'current_basename': current_basename, + 'current_extension': current_extension, + 'current_folder': file_obj.folder.name, + 'counter': counter + 1, # 1-based + 'global_counter': global_counter + 1, # 1-based + } + file_obj.save() - def _check_resize_perms(self, request, files_queryset, folders_queryset): - try: - check_files_read_permissions(request, files_queryset) - check_folder_read_permissions(request, folders_queryset) - check_files_edit_permissions(request, files_queryset) - except PermissionDenied: - return True - return False + def _rename_files(self, files, form_data, global_counter): + n = 0 + for f in sorted(files): + self._rename_file(f, form_data, n, global_counter + n) + n += 1 + return n + + def _rename_folder(self, folder, form_data, global_counter): + return self._rename_files_impl( + folder.files.all(), folder.children.all(), + form_data, global_counter) + + def _rename_files_impl(self, files_queryset, folders_queryset, + form_data, global_counter): + n = 0 + + for f in folders_queryset: + n += self._rename_folder(f, form_data, global_counter + n) + + n += self._rename_files(files_queryset, form_data, global_counter + n) + + return n + + def rename_files(self, request, files_queryset, folders_queryset): + # this logic needs to be suplimented with folder type permission layer + opts = self.model._meta + app_label = opts.app_label + + current_folder = self._get_current_action_folder( + request, files_queryset, folders_queryset) + to_rename = self._list_all_to_copy_or_move( + request, files_queryset, folders_queryset) + + if request.method == 'POST' and request.POST.get('post'): + form = RenameFilesForm(request.POST) + if form.is_valid(): + if files_queryset.count() + folders_queryset.count(): + n = self._rename_files_impl( + files_queryset, folders_queryset, + form.cleaned_data, 0) + self.message_user(request, + _("Successfully renamed %(count)d files.") % { + "count": n, + }) + return None + else: + form = RenameFilesForm() + + context = { + "title": _("Rename files"), + "instance": current_folder, + "breadcrumbs_action": _("Rename files"), + "to_rename": to_rename, + "rename_form": form, + "files_queryset": files_queryset, + "folders_queryset": folders_queryset, + "opts": opts, + "root_path": reverse('admin:index'), + "app_label": app_label, + "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, + } + + # Display the rename format selection page + return render_to_response([ + "admin/filer/folder/choose_rename_format.html" + ], context, context_instance=template.RequestContext(request)) + + rename_files.short_description = ugettext_lazy("Rename files") def _list_folders_to_resize(self, request, folders): for fo in folders: @@ -1375,14 +1231,10 @@ def resize_images(self, request, files_queryset, folders_queryset): current_folder = self._get_current_action_folder( request, files_queryset, folders_queryset) - perms_needed = self._check_resize_perms( - request, files_queryset, folders_queryset) to_resize = self._list_all_to_resize( request, files_queryset, folders_queryset) if request.method == 'POST' and request.POST.get('post'): - if perms_needed: - raise PermissionDenied form = ResizeImagesForm(request.POST) if form.is_valid(): if form.cleaned_data.get('thumbnail_option'): @@ -1416,7 +1268,6 @@ def resize_images(self, request, files_queryset, folders_queryset): in django_settings.INSTALLED_APPS), "files_queryset": files_queryset, "folders_queryset": folders_queryset, - "perms_lacking": perms_needed, "opts": opts, "root_path": reverse('admin:index'), "app_label": app_label, @@ -1429,3 +1280,62 @@ def resize_images(self, request, files_queryset, folders_queryset): ], context, context_instance=template.RequestContext(request)) resize_images.short_description = ugettext_lazy("Resize selected images") + + def files_set_public_or_private(self, request, set_public, + files_queryset, folders_queryset): + """ + Action which enables or disables permissions for selected + files and files in selected folders to clipboard + (set them private or public). + """ + + if not self.has_change_permission(request): + raise PermissionDenied + + if request.method != 'POST': + return None + + # We define it like that so that we can modify it inside the + # set_files function + files_count = [0] + + def set_files(files): + for f in files: + if f.is_public != set_public: + f.is_public = set_public + f.save() + files_count[0] += 1 + + def set_folders(folders): + for f in folders: + set_files(f.files) + set_folders(f.children.all()) + + set_files(files_queryset) + set_folders(folders_queryset) + + if set_public: + self.message_user(request, + _("Successfully disabled permissions for %(count)d files.") % { + "count": files_count[0], }) + else: + self.message_user(request, + _("Successfully enabled permissions for %(count)d files.") % { + "count": files_count[0], }) + + return None + + def files_set_private(self, request, files_queryset, folders_queryset): + return self.files_set_public_or_private( + request, False, files_queryset, folders_queryset) + + files_set_private.short_description = ugettext_lazy( + "Enable permissions for selected files") + + def files_set_public(self, request, files_queryset, folders_queryset): + return self.files_set_public_or_private( + request, True, files_queryset, folders_queryset) + + files_set_public.short_description = ugettext_lazy( + "Disable permissions for selected files") +''' diff --git a/filer/admin/permissions.py b/filer/admin/permissions.py index 256a5ada3..0b08ec0c7 100644 --- a/filer/admin/permissions.py +++ b/filer/admin/permissions.py @@ -1,20 +1,13 @@ #-*- coding: utf-8 -*- from django.contrib import admin -from django.core.urlresolvers import reverse +from django.core.urlresolvers import reverse, resolve +from filer.models import Folder +from filer.admin.tools import (has_admin_role, has_role_on_site, + has_admin_role_on_site, + get_admin_sites_for_user, + get_sites_for_user,) - -class PrimitivePermissionAwareModelAdmin(admin.ModelAdmin): - - def has_change_permission(self, request, obj=None): - can_change = super(PrimitivePermissionAwareModelAdmin, self).\ - has_change_permission(request, obj) - return getattr(obj, 'has_edit_permission', can_change) - - def has_delete_permission(self, request, obj=None): - can_delete = super(PrimitivePermissionAwareModelAdmin, self).\ - has_change_permission(request, obj) - # we don't have a specific delete permission... so we use change - return getattr(obj, 'has_delete_permission', can_delete) +class CommonModelAdmin(admin.ModelAdmin): def _get_post_url(self, obj): """ @@ -28,3 +21,95 @@ def _get_post_url(self, obj): return reverse('admin:%s_%s_changelist' % (opts.app_label, module_name), current_app=self.admin_site.name) + + +class FolderPermissionModelAdmin(CommonModelAdmin): + + def has_add_permission(self, request): + # allow only make folder view + current_view = resolve(request.path_info).url_name + if not current_view == 'filer-directory_listing-make_root_folder': + return False + + folder_id = request.REQUEST.get('parent_id', None) + if not folder_id: + # only site admins and superusers can add root folders + if has_admin_role(request.user): + return True + else: + folder = Folder.objects.get(id=folder_id) + # nobody can add subfolders in core folders + if folder.is_restricted(): + return False + # only site admins can add subfolders in site folders with no site + if not folder.site and has_admin_role(request.user): + return True + # regular users need to have permissions to add folders and + # need to have a role over the site owner of the folder + can_add = super(CommonModelAdmin, self).\ + has_add_permission(request) + if (folder.site and can_add + and has_role_on_site(request.user, folder.site)): + return True + return False + + def has_change_permission(self, request, obj=None): + folder = obj + can_change = super(CommonModelAdmin, self).\ + has_change_permission(request, folder) + + if not folder: + return request.user.has_perm('filer.can_use_directory_listing') + + # nobody can change core folder + if folder.is_restricted(): + return False + # only admins can change site folders with no site owner + if not folder.site and has_admin_role(request.user): + return True + + if folder.site: + if not folder.parent: + # only site admins can change root site folders + return has_admin_role_on_site(request.user, folder.site) + return can_change and has_role_on_site(request.user, folder.site) + + return False + + def has_delete_permission(self, request, obj=None): + folder = obj + can_delete = super(CommonModelAdmin, self).\ + has_delete_permission(request, obj) + + if not folder: + return can_delete + + if folder.is_restricted(): + return False + + # only admins can delete site folders with no site owner + if not folder.site and has_admin_role(request.user): + return True + + if folder.site: + if not folder.parent: + # only site admins can change root site folders + return has_admin_role_on_site(request.user, folder.site) + return can_delete and has_role_on_site(request.user, folder.site) + + return False + + def can_view_folder_content(self, request, folder): + if folder.is_restricted(): + return True + # only admins can see site folders with no site owner + if not folder.site and has_admin_role(request.user): + return True + + if folder.site and has_role_on_site(request.user, folder.site): + return True + + return False + +class FilePermissionModelAdmin(CommonModelAdmin): + pass diff --git a/filer/admin/tools.py b/filer/admin/tools.py index 23d429871..04e2f8607 100644 --- a/filer/admin/tools.py +++ b/filer/admin/tools.py @@ -1,61 +1,64 @@ #-*- coding: utf-8 -*- from django.core.exceptions import PermissionDenied -from cmsroles.siteadmin import is_site_admin, get_user_roles_on_sites_ids +from cmsroles.siteadmin import (is_site_admin, get_user_roles_on_sites_ids, + get_administered_sites) from django.db.models import Q from filer.models.foldermodels import Folder -def check_files_edit_permissions(request, files): - for f in files: - if not f.has_edit_permission(request): - raise PermissionDenied +def has_admin_role(user): + def _fetch_admin_role(): + is_admin = is_site_admin(user) + setattr(user, '_is_site_admin', is_admin) + return is_admin -def check_folder_edit_permissions(request, folders): - for f in folders: - if not f.has_edit_permission(request): - raise PermissionDenied - check_files_edit_permissions(request, f.files) - check_folder_edit_permissions(request, f.children.all()) + return getattr(user, '_is_site_admin', _fetch_admin_role()) -def check_files_read_permissions(request, files): - for f in files: - if not f.has_read_permission(request): - raise PermissionDenied +def get_admin_sites_for_user(user): + def _fetch_admin_sites(): + admin_sites = get_administered_sites(user) + setattr(user, '_administered_sites', admin_sites) + return admin_sites -def check_folder_read_permissions(request, folders): - for f in folders: - if not f.has_read_permission(request): - raise PermissionDenied - check_files_read_permissions(request, f.files) - check_folder_read_permissions(request, f.children.all()) + return getattr(user, '_administered_sites', _fetch_admin_sites()) -def userperms_for_request(item, request): - r = [] - ps = ['read', 'edit', 'add_children'] - for p in ps: - attr = "has_%s_permission" % p - if hasattr(item, attr): - x = getattr(item, attr)(request) - if x: - r.append(p) - return r +def has_role_on_site(user, site): + return user.is_superuser or site.id in get_sites_for_user(user) -def _get_sites_for_user(user): +def has_admin_role_on_site(user, site): + return site.id in [_site.id + for _site in get_admin_sites_for_user(user)] + +def get_sites_for_user(user): """ Returns all sites available for user. - This also binds the sites to the user in order to save some - queries execution """ - available_sites = set() - for sites in get_user_roles_on_sites_ids(user).values(): - available_sites |= sites - setattr(user, '_available_sites', available_sites) - return available_sites + def _fetch_sites_for_user(): + available_sites = set() + for sites in get_user_roles_on_sites_ids(user).values(): + available_sites |= sites + setattr(user, '_available_sites', available_sites) + return available_sites + + return getattr(user, '_available_sites', _fetch_sites_for_user()) + + +def is_valid_destination(request, folder): + if folder.is_restricted(): + return False + user = request.user + if user.is_superuser: + return True + if not folder.site: + return False + if folder.site.id in get_sites_for_user(user): + return True + return False def folders_available(request, folders_qs): @@ -70,11 +73,10 @@ def folders_available(request, folders_qs): if user.is_superuser: return folders_qs - sites = getattr(user, '_available_sites', _get_sites_for_user(user)) sites_q = Q(Q(folder_type=Folder.CORE_FOLDER) | - Q(site__in=sites)) + Q(site__in=get_sites_for_user(user))) - if is_site_admin(user): + if has_admin_role(user): sites_q |= Q(site__isnull=True) return folders_qs.filter(sites_q) @@ -93,11 +95,43 @@ def files_available(request, files_qs): if user.is_superuser: return files_qs - sites = getattr(user, '_available_sites', _get_sites_for_user(user)) sites_q = Q(Q(folder__folder_type=Folder.CORE_FOLDER) | - Q(folder__site__in=sites) | Q(folder__isnull=True)) + Q(folder__site__in=get_sites_for_user(user)) | + Q(folder__isnull=True)) - if is_site_admin(user): + if has_admin_role(user): sites_q |= Q(folder__site__isnull=True) return files_qs.filter(sites_q) + + +def has_multi_file_action_permission(request, files, folders): + # unfiled files can be moved/deleted so better to just exclude them + # from checking permissions for them + files = files.exclude(folder__isnull=True) + + if files.restricted().exists() or folders.restricted().exists(): + return False + user = request.user + if user.is_superuser: + return True + # only superusers can move/delete files/folders with no site ownership + if (files.filter(folder__site__isnull=True).exists() or + folders.filter(site__isnull=True).exists()): + return False + + _exists_root_folders = folders.filter(parent__isnull=True).exists() + if _exists_root_folders: + if not has_admin_role(user): + return False + # allow site admins to move/delete root files/folders that belong + # to the site where is admin + sites_allowed = [s.id for s in get_admin_sites_for_user(user)] + else: + sites_allowed = get_sites_for_user(user) + + if (files.exclude(folder__site__in=sites_allowed).exists() or + folders.exclude(site__in=sites_allowed).exists()): + return False + + return True diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index 65f0935ad..76edfb4c0 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -274,26 +274,6 @@ def label(self): def __lt__(self, other): return cmp(self.label.lower(), other.label.lower()) < 0 - def has_edit_permission(self, request): - return self.has_generic_permission(request, 'edit') - - def has_delete_permission(self, request): - return self.has_generic_permission(request, 'delete') - - def has_read_permission(self, request): - return self.has_generic_permission(request, 'read') - - def has_add_children_permission(self, request): - return self.has_generic_permission(request, 'add_children') - - def has_generic_permission(self, request, permission_type): - """ - Return true if the current user has permission on this file. - """ - if self.folder: - return self.folder.has_generic_permission(request, permission_type) - return request.user.is_authenticated() - @property def actual_name(self): """The name displayed to the user. diff --git a/filer/models/foldermodels.py b/filer/models/foldermodels.py index fe4093a5b..64357ce20 100644 --- a/filer/models/foldermodels.py +++ b/filer/models/foldermodels.py @@ -14,6 +14,7 @@ import filer.models.clipboardmodels from filer.models import mixins from filer import settings as filer_settings +# from filer.admin.tools import has_role_on_site, has_admin_role_on_site import mptt @@ -251,25 +252,6 @@ def pretty_logical_path(self): def quoted_logical_path(self): return urlquote(self.pretty_logical_path) - def has_delete_permission(self, request): - return self.has_generic_permission(request, 'delete') - - def has_edit_permission(self, request): - return self.has_generic_permission(request, 'edit') - - def has_read_permission(self, request): - return self.has_generic_permission(request, 'read') - - def has_add_children_permission(self, request): - return self.has_generic_permission(request, 'add_children') - - def has_generic_permission(self, request, permission_type): - """ - Return true if the current user has permission on this - folder. - """ - return request.user.is_authenticated() - def get_admin_url_path(self): return urlresolvers.reverse('admin:filer_folder_change', args=(self.id,)) diff --git a/filer/server/views.py b/filer/server/views.py index dcd6b87e7..48f2a8311 100644 --- a/filer/server/views.py +++ b/filer/server/views.py @@ -19,11 +19,6 @@ def serve_protected_file(request, path): file_obj = File.objects.get(file=path, is_public=False) except File.DoesNotExist: raise Http404('File not found') - if not file_obj.has_read_permission(request): - if settings.DEBUG: - raise PermissionDenied - else: - raise Http404('File not found') return server.serve(request, file_obj=file_obj.file, save_as=False) @@ -39,11 +34,6 @@ def serve_protected_thumbnail(request, path): file_obj = File.objects.get(file=source_path, is_public=False) except File.DoesNotExist: raise Http404('File not found') - if not file_obj.has_read_permission(request): - if settings.DEBUG: - raise PermissionDenied - else: - raise Http404('File not found') try: thumbnail = ThumbnailFile(name=path, storage=file_obj.file.thumbnail_storage) return thumbnail_server.serve(request, thumbnail, save_as=False) diff --git a/filer/templates/admin/filer/folder/choose_copy_destination.html b/filer/templates/admin/filer/folder/choose_copy_destination.html index 1121a8833..1f0605638 100644 --- a/filer/templates/admin/filer/folder/choose_copy_destination.html +++ b/filer/templates/admin/filer/folder/choose_copy_destination.html @@ -8,9 +8,6 @@ {% block extrastyle %}{{ block.super }}{% endblock %} {% block content %} -{% if perms_lacking %} -

    {% blocktrans %}Your account doesn't have permissions to copy all of the selected files and/or folders.{% endblocktrans %}

    -{% else %} {% if not destination_folders %}

    {% blocktrans %}There are no destination folders available.{% endblocktrans %}

    {% else %} @@ -41,5 +38,4 @@ {% endif %} {% endif %} -{% endif %} {% endblock %} diff --git a/filer/templates/admin/filer/folder/choose_images_resize_options.html b/filer/templates/admin/filer/folder/choose_images_resize_options.html index 69b46addf..46b8260b9 100644 --- a/filer/templates/admin/filer/folder/choose_images_resize_options.html +++ b/filer/templates/admin/filer/folder/choose_images_resize_options.html @@ -8,9 +8,6 @@ {% block extrastyle %}{{ block.super }}{% endblock %} {% block content %} -{% if perms_lacking %} -

    {% blocktrans %}Your account doesn't have permissions to resize all of the selected images.{% endblocktrans %}

    -{% else %} {% if not to_resize %}

    {% blocktrans %}There are no images available to resize.{% endblocktrans %}

    {% else %} @@ -37,5 +34,4 @@
    {% endif %} -{% endif %} {% endblock %} diff --git a/filer/templates/admin/filer/folder/choose_move_destination.html b/filer/templates/admin/filer/folder/choose_move_destination.html index d79774b83..c9c94d297 100644 --- a/filer/templates/admin/filer/folder/choose_move_destination.html +++ b/filer/templates/admin/filer/folder/choose_move_destination.html @@ -8,9 +8,6 @@ {% block extrastyle %}{{ block.super }}{% endblock %} {% block content %} -{% if perms_lacking %} -

    {% blocktrans %}Your account doesn't have permissions to move all of the selected files and/or folders.{% endblocktrans %}

    -{% else %} {% if not destination_folders %}

    {% blocktrans %}There are no destination folders available.{% endblocktrans %}

    {% else %} @@ -40,5 +37,4 @@ {% endif %} {% endif %} -{% endif %} {% endblock %} diff --git a/filer/templates/admin/filer/folder/choose_rename_format.html b/filer/templates/admin/filer/folder/choose_rename_format.html index c86d6058e..77f6630a2 100644 --- a/filer/templates/admin/filer/folder/choose_rename_format.html +++ b/filer/templates/admin/filer/folder/choose_rename_format.html @@ -8,9 +8,6 @@ {% block extrastyle %}{{ block.super }}{% endblock %} {% block content %} -{% if perms_lacking %} -

    {% blocktrans %}Your account doesn't have permissions to rename all of the selected files.{% endblocktrans %}

    -{% else %} {% if not to_rename %}

    {% blocktrans %}There are no files available to rename.{% endblocktrans %}

    {% else %} @@ -55,5 +52,4 @@ {% endif %} -{% endif %} {% endblock %} diff --git a/filer/templates/admin/filer/folder/directory_table.html b/filer/templates/admin/filer/folder/directory_table.html index 1ed7de561..d82015cb4 100644 --- a/filer/templates/admin/filer/folder/directory_table.html +++ b/filer/templates/admin/filer/folder/directory_table.html @@ -18,7 +18,7 @@ {% for item in paginated_items.object_list %} {% if item.file_type == 'Folder' or item.file_type == 'DummyFolder' %}{% with item as subfolder%} - {% if select_folder and item.file_type == 'Folder' %} {% else %}{% if action_form and item.pk and not is_popup %}{% endif %}{% endif %} + {% if select_folder and item.file_type == 'Folder' %} {% else %}{% if action_form and item.pk and not is_popup and not item.is_restricted %}{% endif %}{% endif %} {% trans @@ -36,7 +36,7 @@ {% endwith %}{% endif %} {% if item.file_type == 'File' or item.file_type == 'Image' or item.file_type == 'Archive' %}{% with item as file %} - {% if is_popup and not select_folder %} {% else %}{% if action_form and not is_popup %}{% endif %}{% endif %} + {% if is_popup and not select_folder %} {% else %}{% if action_form and not is_popup and not item.is_restricted %}{% endif %}{% endif %} {{ file.default_alt_text }} diff --git a/filer/tests/__init__.py b/filer/tests/__init__.py index d2c6fc678..ca6c2a782 100644 --- a/filer/tests/__init__.py +++ b/filer/tests/__init__.py @@ -2,8 +2,6 @@ from filer.tests.admin import * from filer.tests.fields import * from filer.tests.models import * -# disable for now -# from filer.tests.permissions import * from filer.tests.server_backends import * from filer.tests.tools import * from filer.tests.utils import * diff --git a/filer/tests/admin.py b/filer/tests/admin.py index 717eb5540..f247cb414 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -22,6 +22,9 @@ filer_obj_as_checkox, get_make_root_folder_url, move_single_file_to_clipboard_action, ) +from cmsroles.models import Role +from cmsroles.tests import HelpersMixin +from cmsroles.siteadmin import get_site_admin_required_permission class FilerFolderAdminUrlsTests(TestCase): @@ -62,12 +65,12 @@ def test_filer_make_root_folder_post(self): self.assertEqual(response.status_code, 302) def test_filer_directory_listing_root_empty_get(self): - response = self.client.post(get_dir_listing_url(None)) + response = self.client.get(get_dir_listing_url(None)) self.assertEqual(response.status_code, 200) def test_filer_directory_listing_root_get(self): create_folder_structure(depth=3, sibling=2, parent=None) - response = self.client.post(get_dir_listing_url(None)) + response = self.client.get(get_dir_listing_url(None)) self.assertEqual(response.status_code, 200) self.assertEqual(response.context['folder'].children.count(), 6) @@ -515,104 +518,7 @@ def test_resize_images_action(self): self.assertEqual(self.image_obj.width, 42) self.assertEqual(self.image_obj.height, 42) -''' -class PermissionAdminTest(TestCase): - def setUp(self): - self.superuser = create_superuser() - self.group1 = Group.objects.create(name='group1') - self.group2 = Group.objects.create(name='group2') - self.user1 = create_staffuser('Alice') - self.user2 = create_staffuser('Bob') - self.user3 = create_staffuser('Chuck') - self.group1.user_set.add(self.user1) - self.group1.user_set.add(self.user2) - self.group2.user_set.add(self.user3) - grant_all_folderpermissions_for_group(self.group1) - grant_all_folderpermissions_for_group(self.group2) - self.factory = RequestFactory() - self.folder1 = create_folder_for_user('folder1', self.user1) - self.folder3 = create_folder_for_user('folder3', self.user1) - self.folder2 = create_folder_for_user('folder2', self.user3) - self.folder_permission1 = create_folderpermission_for_user( - self.folder1, self.user1 - ) - self.folder_permission3 = create_folderpermission_for_user( - self.folder3, self.user1 - ) - self.folder_permission2 = create_folderpermission_for_user( - self.folder2, self.user3 - ) - all_folderpermissions = [ - self.folder_permission1, - self.folder_permission2, - self.folder_permission3, - ] - self.users = { - self.user1: { - 'folderpermissions': [ - self.folder_permission1, - self.folder_permission3, - ] - }, - self.user2: { - 'folderpermissions': [], - }, - self.user3: { - 'folderpermissions': [ - self.folder_permission2, - ] - }, - self.superuser: { - 'folderpermissions': all_folderpermissions, - } - } - - def assert_user_response(self, user, response): - self.assertEqual(200, response.status_code) - qs = response.context['cl'].query_set - self.assert_user_folder_permission_qs(user, qs) - - def assert_user_folder_permission_qs(self, user, qs): - self.assertItemsEqual(qs, self.users[user]['folderpermissions']) - - def assert_user_adminview(self, user): - self.client.login(username=user, password='secret') - response = self.client.get( - reverse('admin:filer_folderpermission_changelist') - ) - self.assert_user_response(user, response) - self.client.logout() - - def assert_user_query(self, user): - folder_permission_admin = site._registry[FolderPermission] - request = self.factory.get( - reverse('admin:filer_folderpermission_changelist') - ) - request.user = user - qs = folder_permission_admin.queryset(request) - self.assert_user_folder_permission_qs(user, qs) - - def tearDown(self): - self.client.logout() - - def test_render_add_view(self): - """ - Really stupid and simple test to see if the add Permission view can - be rendered. - """ - response = self.client.get(reverse('admin:filer_folderpermission_add')) - self.assertEqual(response.status_code, 200) - - def test_admin_queries(self): - for user in self.users.keys(): - self.assert_user_query(user) - - def test_admin_view(self): - for user in self.users.keys(): - self.assert_user_adminview(user) - -''' class BaseTestFolderTypePermissionLayer(object): def test_default_add_view_is_forbidden(self): @@ -620,7 +526,7 @@ def test_default_add_view_is_forbidden(self): self.assertEqual(response.status_code, 403) def test_change_child_site_folder(self): - f1 = Folder.objects.create(name='foo') + f1 = Folder.objects.create(name='foo', site=Site.objects.get(id=1)) f2 = Folder.objects.create(name='foo_bar', parent=f1) # regular users should be able to change child folders response = self.client.get( @@ -679,7 +585,7 @@ def test_change_core_folder(self): self.assertEqual(response.status_code, 403) def test_delete_child_site_folder(self): - f1 = Folder.objects.create(name='foo') + f1 = Folder.objects.create(name='foo', site=Site.objects.get(id=1)) f2 = Folder.objects.create(name='bar', parent=f1) f3 = Folder.objects.create(name='baz', parent=f1) # regular users should be able to delete child site folders @@ -730,7 +636,8 @@ def test_add_root_folder(self): # only fields 'site', 'name' should be visible self.assertItemsEqual(['site', 'name'], form.fields.keys()) - s1 = Site.objects.create(name='foo_site', domain='foo-domain.com') + s1, _ = Site.objects.get_or_create( + name='foo_site', domain='foo-domain.com') response = self.client.post( get_make_root_folder_url(), {'name': 'foo', 'site': s1.id}) @@ -834,7 +741,6 @@ def test_move_site_folder_to_core_destination_folder(self): Folder.SITE_FOLDER, Site.objects.get(id=1)) f1 = Folder.objects.create( name='destination', folder_type=Folder.CORE_FOLDER) - response, _ = move_action(self.client, None, f1, [folders['bar']]) self.assertEqual(response.status_code, 403) f1.delete() @@ -871,6 +777,7 @@ def test_move_to_clipboard_from_site_folders(self): file=dj_files.base.ContentFile('some data')) self.assertEqual( self._get_clipboard_files().count(), 0) + move_to_clipboard_action(self.client, None, [foo]) self.assertEqual( self._get_clipboard_files().count(), 1) @@ -903,7 +810,9 @@ def test_move_to_clipboard_from_core_folders(self): self.assertEqual( self._get_clipboard_files().count(), 0) response, _ = move_to_clipboard_action(self.client, foo, [file_foo]) - self.assertEqual(response.status_code, 403) + # actions are not available if current view is core folder + self.assertEqual( + self._get_clipboard_files().count(), 0) response = move_single_file_to_clipboard_action( self.client, foo, [file_foo]) @@ -975,12 +884,12 @@ def test_message_error_user_no_site_on_move(self): def test_message_error_user_sites_mismatch_on_move(self): site = Site.objects.get(id=1) - other_site = Site.objects.create(name='foo_site', domain='foo_site') + other_site, _ = Site.objects.get_or_create( + name='foo_site', domain='foo-domain.com') # make a root for foo in order to work for regular users foo_root = Folder.objects.create(name='foo_root', site=other_site) - foo = Folder.objects.create( - name='foo', parent=foo_root) - bar = Folder.objects.create(name='bar', site=site) + foo = Folder.objects.create(name='foo', parent=foo_root) + bar = Folder.objects.create(name='bar11', site=site) url = get_dir_listing_url(foo_root) response, url = move_action( self.client, foo_root, bar, [foo], follow=True) @@ -990,17 +899,13 @@ def test_message_error_user_sites_mismatch_on_move(self): "destination folder.", get_user_message(response).message) - def test_message_error_user_destination_no_site_on_move(self): + def test_destination_no_site_on_move(self): site = Site.objects.get(id=1) foo = Folder.objects.create(name='foo') bar = Folder.objects.create(name='bar', site=site) baz = Folder.objects.create(name='baz', site=site, parent=bar) - response, url = move_action(self.client, None, foo, [baz], follow=True) - self.assertRedirects(response, url) - self.assertIn( - 'Destination folder %s does not belong to any ' - 'site.' % foo.pretty_logical_path, - get_user_message(response).message) + response, url = move_action(self.client, None, foo, [baz]) + assert response.status_code == 403 def _test_folder_destination_filters_core_folders(self, action): foo = Folder.objects.create( @@ -1027,6 +932,16 @@ def test_move_destination_filters_core_folders(self): self._test_folder_destination_filters_core_folders( 'move_files_and_folders') + def test_move_from_unfiled(self): + foo_file = File.objects.create( + original_filename='foo_file', + file=dj_files.base.ContentFile('some data')) + bar = Folder.objects.create( + name='bar', site=Site.objects.get(id=1)) + response, url = move_action(self.client, 'unfiled', bar, [foo_file]) + self.assertEqual(File.objects.filter(folder=bar).count(), 1) + self.assertEqual(File.objects.filter(folder__isnull=True).count(), 0) + def test_copy_destination_filters_restricted_folders(self): self._test_folder_destination_filters_core_folders( 'copy_files_and_folders') @@ -1093,11 +1008,13 @@ def _build_files_structure_for_archive(self): def test_extract_files_in_core_folder(self): files = self._build_files_structure_for_archive() url = get_dir_listing_url(files['foo']) + assert Folder.objects.get(id=files['foo'].id).files.count() == 1 response = self.client.post(url, { 'action': 'extract_files', helpers.ACTION_CHECKBOX_NAME: [filer_obj_as_checkox(files['foo_file'])]}) - self.assertEqual(response.status_code, 403) + # will not get extracted since no actions available in core folders + assert Folder.objects.get(id=files['foo'].id).files.count() == 1 def test_extract_files_in_site_folder(self): files = self._build_files_structure_for_archive() @@ -1136,16 +1053,40 @@ def setUp(self): class TestFolderTypePermissionLayerForRegularUser( TestCase, BaseTestFolderTypePermissionLayer): + def _user_setup(self, user): + foo_base_group = Group.objects.create(name='foo_base_group') + developer_role = Role.objects.create( + name='foo_role', group=foo_base_group, + is_site_wide=True) + other_site, _ = Site.objects.get_or_create( + name='foo_site', domain='foo-domain.com') + developer_role.grant_to_user(user, Site.objects.get(id=1)) + developer_role.grant_to_user(user, other_site) + def setUp(self): username = 'login_using_foo' password = 'secret' user = User.objects.create_user(username=username, password=password) user.is_staff = user.is_active = True user.save() - user.user_permissions = Permission.objects.all() + filer_perms = Permission.objects.filter( + content_type__app_label='filer') + user.user_permissions = filer_perms + self._user_setup(user) self.client.login(username=username, password=password) self.user = user + def _make_user_site_admin(self): + base_group = Group.objects.get(name='foo_base_group') + base_group.permissions.add(get_site_admin_required_permission()) + + def test_add_root_folder_for_site_admins(self): + # site admins should be able to do this the same as superusers + # add site admin perm to make the current user a site admin + self._make_user_site_admin() + self_cls = TestFolderTypePermissionLayerForRegularUser + super(self_cls, self).test_add_root_folder() + def test_add_root_folder(self): # regular users should not be able to add root folders at all response = self.client.get( @@ -1166,9 +1107,9 @@ def test_change_root_site_folder(self): self.assertEqual(response.status_code, 403) def test_delete_root_folder(self): - f1 = Folder.objects.create(name='foo') + f1 = Folder.objects.create(name='foo', site=Site.objects.get(id=1)) # regular users should not be able to delete root folders at all - for folder_type in [Folder.CORE_FOLDER, Folder.SITE_FOLDER]: + for folder_type in [Folder.SITE_FOLDER, Folder.CORE_FOLDER]: Folder.objects.filter(id=f1.id).update(folder_type=folder_type) response = self.client.post( reverse('admin:filer_folder_delete', args=(f1.pk, )), @@ -1184,7 +1125,8 @@ def test_delete_root_folder(self): self.assertEqual(response.status_code, 403) # case when viewing another folder content # hit search and select a root folder to delete - folder_for_view = Folder.objects.create(name='bar') + folder_for_view = Folder.objects.create( + name='bar', site=Site.objects.get(id=1)) response = self.client.post( get_dir_listing_url(folder_for_view), { 'action': 'delete_files_or_folders', @@ -1199,6 +1141,296 @@ def test_delete_root_folder(self): Folder.objects.filter( id__in=[folder_for_view.id, f1.id]).count(), 2) + def test_message_error_user_no_site_on_move_for_site_admins(self): + self._make_user_site_admin() + self.test_message_error_user_no_site_on_move() + + def test_message_error_user_no_site_on_move(self): + site = Site.objects.get(id=1) + foo_root = Folder.objects.create(name='foo_root') + foo = Folder.objects.create(name='foo', parent=foo_root) + bar = Folder.objects.create(name='bar', site=site) + response, url = move_action( + self.client, foo_root, bar, [foo]) + self.assertEqual(response.status_code, 403) + + def test_move_to_clipboard_from_site_folders_for_site_admins(self): + self._make_user_site_admin() + self_cls = TestFolderTypePermissionLayerForRegularUser + super(self_cls, self).test_move_to_clipboard_from_site_folders() + + def test_move_to_clipboard_from_site_folders(self): + foo = Folder.objects.create(name='foo', site=Site.objects.get(id=1)) + file_foo = File.objects.create( + original_filename='foo', folder=foo, + file=dj_files.base.ContentFile('some data')) + self.assertEqual( + self._get_clipboard_files().count(), 0) + + move_to_clipboard_action(self.client, None, [foo]) + self.assertEqual( + self._get_clipboard_files().count(), 0) + + file_bar = File.objects.create( + original_filename='bar', folder=foo, + file=dj_files.base.ContentFile('some data')) + move_to_clipboard_action(self.client, foo, [file_bar]) + self.assertEqual( + self._get_clipboard_files().count(), 1) + + file_baz = File.objects.create( + original_filename='baz', folder=foo, + file=dj_files.base.ContentFile('some data')) + move_single_file_to_clipboard_action( + self.client, foo, [file_baz]) + self.assertEqual( + self._get_clipboard_files().count(), 2) + + +class TestSiteFolderRoleFiltering(TestCase, HelpersMixin): + + def setUp(self): + self._create_simple_setup() + for user in User.objects.all(): + user.set_password('secret') + user.save() + self.foo_site = Site.objects.get(name='foo.site.com') + self.bar_site = Site.objects.get(name='bar.site.com') + self.folders, self.files = self._build_folder_structure() + + def get_listed_objects(self, folder, data={}): + response = self.client.get(get_dir_listing_url(folder), data) + try: + items = response.context['paginator'].object_list + except: + items = [] + return response, items + + def _build_folder_structure(self): + unfiled_file = File.objects.create(original_filename='unfiled_file', + file=dj_files.base.ContentFile('some data')) + foo = Folder.objects.create(name='foo', site=self.foo_site) + foo_file = File.objects.create(original_filename='foo_file', + file=dj_files.base.ContentFile('some data'), folder=foo) + bar = Folder.objects.create(name='bar', site=self.bar_site) + bar_file = File.objects.create(original_filename='bar_file', + file=dj_files.base.ContentFile('some data'), folder=bar) + none = Folder.objects.create(name='no_site') + none_file = File.objects.create(original_filename='none_file', + file=dj_files.base.ContentFile('some data'), folder=none) + core = Folder.objects.create( + name='core', folder_type=Folder.CORE_FOLDER) + core_file = File.objects.create(original_filename='core_file', + file=dj_files.base.ContentFile('some data'), folder=core) + + return {'foo': foo, 'bar': bar, 'none': none, 'core': core}, { + 'foo_file': foo_file, + 'bar_file': bar_file, + 'unfiled_file': unfiled_file, + 'core_file': core_file, + 'none_file': none_file} + + def test_search_for_site_admin(self): + # jack is admin on bar site + self.client.login(username='jack', password='secret') + response, items = self.get_listed_objects(None, {'q': 'file'}) + expected = set([self.files['core_file'], self.files['none_file'], + self.files['bar_file'], self.files['unfiled_file']]) + assert expected <= set(items) + assert self.files['foo_file'] not in items + #unfiled present + assert len(expected) + 1 <= len(items) + + def test_search_for_other_users(self): + # bob is writer on bar site + self.client.login(username='bob', password='secret') + response, items = self.get_listed_objects(None, {'q': 'file'}) + expected = set([self.files['core_file'], + self.files['bar_file'], self.files['unfiled_file']]) + assert expected <= set(items) + assert self.files['foo_file'] not in items + assert self.files['none_file'] not in items + #unfiled present + assert len(expected) + 1 <= len(items) + + def test_search_for_multi_site_user(self): + # joe is site admin for foo and bar + self.client.login(username='joe', password='secret') + response, items = self.get_listed_objects(None, {'q': 'file'}) + expected = set(self.files.values()) + assert expected <= set(items) + #unfiled present + assert len(expected) + 1 <= len(items) + + def test_dir_listing_for_site_admin(self): + # jack is admin on bar site + self.client.login(username='jack', password='secret') + + response, items = self.get_listed_objects(None) + expected = set([ + self.folders['core'], self.folders['bar'], self.folders['none']]) + assert expected <= set(items) + assert self.folders['foo'] not in items + #unfiled folder present + assert len(expected) + 1 == len(items) + + response, items = self.get_listed_objects('unfiled') + assert [self.files['unfiled_file']] == items + + response, items = self.get_listed_objects(self.folders['core']) + assert [self.files['core_file']] == items + + response, items = self.get_listed_objects(self.folders['foo']) + assert response.status_code == 403 + + response, items = self.get_listed_objects(self.folders['none']) + assert [self.files['none_file']] == items + + def test_dir_listing_for_other_users(self): + # bob is writer on bar site + self.client.login(username='bob', password='secret') + + response, items = self.get_listed_objects(None) + expected = set([self.folders['core'], self.folders['bar']]) + assert expected <= set(items) + assert self.folders['foo'] not in items + assert self.folders['none'] not in items + #unfiled folder present + assert len(expected) + 1 == len(items) + + response = self.client.get(get_dir_listing_url('unfiled')) + items = response.context['paginator'].object_list + assert [self.files['unfiled_file']] == items + + response, items = self.get_listed_objects(self.folders['core']) + assert [self.files['core_file']] == items + + response, items = self.get_listed_objects(self.folders['foo']) + assert response.status_code == 403 + + response, items = self.get_listed_objects(self.folders['none']) + assert response.status_code == 403 + + def _test_destination_on_copy_for_site_admin(self, action): + # joe is site admin for foo and bar + self.client.login(username='joe', password='secret') + url = get_dir_listing_url('unfiled') + response = self.client.post(url, { + 'action': action, + helpers.ACTION_CHECKBOX_NAME: [ + filer_obj_as_checkox(self.files['unfiled_file'])] + }) + self.assertEqual(response.status_code, 200) + self.assertIn('destination_folders', response.context) + dest_folders = [_dest[0] + for _dest in response.context['destination_folders']] + expected = set([self.folders['bar'], self.folders['foo']]) + assert expected == set(dest_folders) + + def _test_destination_action_for_multi_site_user(self, action): + # bob will be a site admin on foo and writer on bar + admin_role = Role.objects.get(name='site admin') + admin_role.grant_to_user( + User.objects.get(username='bob'), self.foo_site) + self.client.login(username='bob', password='secret') + url = get_dir_listing_url('unfiled') + response = self.client.post(url, { + 'action': action, + helpers.ACTION_CHECKBOX_NAME: [ + filer_obj_as_checkox(self.files['unfiled_file'])] + }) + self.assertEqual(response.status_code, 200) + self.assertIn('destination_folders', response.context) + dest_folders = [_dest[0] + for _dest in response.context['destination_folders']] + expected = set([self.folders['bar'], self.folders['foo']]) + assert expected == set(dest_folders) + + def _test_destination_action_for_other_users(self, action): + # bob is writer on bar site + self.client.login(username='bob', password='secret') + url = get_dir_listing_url('unfiled') + response = self.client.post(url, { + 'action': action, + helpers.ACTION_CHECKBOX_NAME: [ + filer_obj_as_checkox(self.files['unfiled_file'])] + }) + self.assertEqual(response.status_code, 200) + self.assertIn('destination_folders', response.context) + dest_folders = [_dest[0] + for _dest in response.context['destination_folders']] + assert set([self.folders['bar']]) == set(dest_folders) + + def test_destination_on_copy_for_multi_site_user(self): + self._test_destination_action_for_multi_site_user( + 'copy_files_and_folders') + + def test_destination_on_move_for_multi_site_user(self): + self._test_destination_action_for_multi_site_user( + 'move_files_and_folders') + + def test_destination_on_copy_for_other_users(self): + self._test_destination_action_for_other_users( + 'copy_files_and_folders') + + def test_destination_on_move_for_other_users(self): + self._test_destination_action_for_other_users( + 'move_files_and_folders') + + def test_destination_on_copy_for_site_admin(self): + self._test_destination_on_copy_for_site_admin( + 'copy_files_and_folders') + + def test_destination_on_move_for_site_admin(self): + self._test_destination_on_copy_for_site_admin( + 'move_files_and_folders') + + def test_on_site_change_filtering(self): + # jack is site admin on bar site + self.client.login(username='jack', password='secret') + response = self.client.get( + reverse('admin:filer_folder_change', + args=(self.folders['bar'].pk, ))) + self.assertEqual(response.status_code, 200) + form = response.context_data['adminform'].form + assert set([self.bar_site]) == set(form.fields['site'].queryset) + self.client.logout() + # bob is writer on bar + self.client.login(username='bob', password='secret') + response = self.client.get( + reverse('admin:filer_folder_change', + args=(self.folders['bar'].pk, ))) + self.assertEqual(response.status_code, 403) + self.client.logout() + # make bob a site admin on foo + admin_role = Role.objects.get(name='site admin') + admin_role.grant_to_user( + User.objects.get(username='bob'), self.foo_site) + # bob still doesn't have access on bar folder + self.client.login(username='bob', password='secret') + response = self.client.get( + reverse('admin:filer_folder_change', + args=(self.folders['bar'].pk, ))) + self.assertEqual(response.status_code, 403) + # bob should have access on foo folder + response = self.client.get( + reverse('admin:filer_folder_change', + args=(self.folders['foo'].pk, ))) + self.assertEqual(response.status_code, 200) + form = response.context_data['adminform'].form + assert set([self.foo_site]) == set(form.fields['site'].queryset) + self.client.logout() + # joe is multi site admin + self.client.login(username='joe', password='secret') + response = self.client.get( + reverse('admin:filer_folder_change', + args=(self.folders['bar'].pk, ))) + self.assertEqual(response.status_code, 200) + form = response.context_data['adminform'].form + expected = set([self.bar_site, self.foo_site]) + assert expected == set(form.fields['site'].queryset) + self.client.logout() + class TestFolderTypeFunctionality(TestCase): diff --git a/filer/views.py b/filer/views.py index 6ca933a77..c6c09360a 100755 --- a/filer/views.py +++ b/filer/views.py @@ -1,13 +1,4 @@ #-*- coding: utf-8 -*- -from django import forms -from django.contrib.auth.decorators import login_required -from django.core.exceptions import PermissionDenied -from django.http import HttpResponseRedirect -from django.shortcuts import render_to_response -from django.template import RequestContext -from models import Folder, Image, Clipboard, tools - - def popup_status(request): return ('_popup' in request.REQUEST or 'pop' in request.REQUEST) @@ -28,115 +19,3 @@ def selectfolder_param(request, separator="&"): return "%sselect_folder=1" % separator else: return "" - - -def _userperms(item, request): - r = [] - ps = ['read', 'edit', 'add_children'] - for p in ps: - attr = "has_%s_permission" % p - if hasattr(item, attr): - x = getattr(item, attr)(request) - if x: - r.append(p) - return r - - -@login_required -def edit_folder(request, folder_id): - # TODO: implement edit_folder view - folder = None - return render_to_response('admin/filer/folder/folder_edit.html', { - 'folder': folder, - 'is_popup': popup_status(request), - 'select_folder': selectfolder_status(request), - }, context_instance=RequestContext(request)) - - -@login_required -def edit_image(request, folder_id): - # TODO: implement edit_image view - folder = None - return render_to_response('filer/image_edit.html', { - 'folder': folder, - 'is_popup': popup_status(request), - 'select_folder': selectfolder_status(request), - }, context_instance=RequestContext(request)) - - -class UploadFileForm(forms.ModelForm): - class Meta: - model = Image - - -@login_required -def upload(request): - return render_to_response('filer/upload.html', { - 'title': u'Upload files', - 'is_popup': popup_status(request), - 'select_folder': selectfolder_status(request), - }, context_instance=RequestContext(request)) - - -@login_required -def paste_clipboard_to_folder(request): - if request.method == 'POST': - folder_id = request.POST.get('folder_id') - - if not folder_id: - raise PermissionDenied - - folder = Folder.objects.get(id=folder_id) - - if folder.is_restricted(): - raise PermissionDenied - - clipboard = Clipboard.objects.get(id=request.POST.get('clipboard_id')) - if folder.has_add_children_permission(request): - files_moved = tools.move_files_from_clipboard_to_folder( - request, clipboard, folder) - tools.discard_clipboard_files(clipboard, files_moved) - else: - raise PermissionDenied - return HttpResponseRedirect('%s%s%s' % ( - request.REQUEST.get('redirect_to', ''), - popup_param(request), - selectfolder_param(request))) - - -@login_required -def discard_clipboard(request): - if request.method == 'POST': - clipboard = Clipboard.objects.get(id=request.POST.get('clipboard_id')) - tools.discard_clipboard(clipboard) - return HttpResponseRedirect('%s%s%s' % ( - request.POST.get('redirect_to', ''), - popup_param(request), - selectfolder_param(request))) - - -@login_required -def delete_clipboard(request): - if request.method == 'POST': - clipboard = Clipboard.objects.get(id=request.POST.get('clipboard_id')) - tools.delete_clipboard(clipboard) - return HttpResponseRedirect('%s%s%s' % ( - request.POST.get('redirect_to', ''), - popup_param(request), - selectfolder_param(request))) - - -@login_required -def clone_files_from_clipboard_to_folder(request): - if request.method == 'POST': - folder = Folder.objects.get(id=request.POST.get('folder_id')) - - if folder.is_restricted(): - raise PermissionDenied - - clipboard = Clipboard.objects.get(id=request.POST.get('clipboard_id')) - tools.clone_files_from_clipboard_to_folder(clipboard, folder) - return HttpResponseRedirect('%s%s%s' % ( - request.POST.get('redirect_to', ''), - popup_param(request), - selectfolder_param(request))) From e20244c3e2020267a1280935a2306aa9910b0f5c Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Fri, 4 Oct 2013 11:05:02 +0300 Subject: [PATCH 134/715] Removed unused tests for old permissions. --- filer/tests/permissions.py | 310 ------------------------------------- 1 file changed, 310 deletions(-) delete mode 100644 filer/tests/permissions.py diff --git a/filer/tests/permissions.py b/filer/tests/permissions.py deleted file mode 100644 index 5246e9c5a..000000000 --- a/filer/tests/permissions.py +++ /dev/null @@ -1,310 +0,0 @@ -#-*- coding: utf-8 -*- -from django.contrib.auth.models import User, Group -from django.core.files import File as DjangoFile -from django.test.testcases import TestCase -from filer import settings as filer_settings -from filer.models.clipboardmodels import Clipboard -from filer.models.foldermodels import Folder, FolderPermission -from filer.models.imagemodels import Image -from filer.tests.utils import Mock -from filer.tests.helpers import create_image, create_superuser -import os - -class FolderPermissionsTestCase(TestCase): - - def setUp(self): - self.superuser = create_superuser() - self.client.login(username='admin', password='secret') - - self.unauth_user = User.objects.create(username='unauth_user') - - self.owner = User.objects.create(username='owner') - - self.test_user1 = User.objects.create(username='test1', password='secret') - self.test_user2 = User.objects.create(username='test2', password='secret') - - self.group1 = Group.objects.create(name='name1') - self.group2 = Group.objects.create(name='name2') - - self.test_user1.groups.add(self.group1) - self.test_user2.groups.add(self.group2) - - self.img = create_image() - self.image_name = 'test_file.jpg' - self.filename = os.path.join(os.path.dirname(__file__), - self.image_name) - self.img.save(self.filename, 'JPEG') - - self.file = DjangoFile(open(self.filename), name=self.image_name) - # This is actually a "file" for filer considerations - self.image = Image.objects.create(owner=self.superuser, - original_filename=self.image_name, - file=self.file) - self.clipboard = Clipboard.objects.create(user=self.superuser) - self.clipboard.append_file(self.image) - - self.folder = Folder.objects.create(name='test_folder') - - self.folder_perm = Folder.objects.create(name='test_folder2') - - def tearDown(self): - self.image.delete() - - def test_superuser_has_rights(self): - request = Mock() - setattr(request, 'user', self.superuser) - - result = self.folder.has_read_permission(request) - self.assertEqual(result, True) - - def test_unlogged_user_has_no_rights(self): - old_setting = filer_settings.FILER_ENABLE_PERMISSIONS - try: - filer_settings.FILER_ENABLE_PERMISSIONS = True - request = Mock() - setattr(request, 'user', self.unauth_user) - - result = self.folder.has_read_permission(request) - self.assertEqual(result, False) - finally: - filer_settings.FILER_ENABLE_PERMISSIONS = old_setting - - def test_unlogged_user_has_rights_when_permissions_disabled(self): - request = Mock() - setattr(request, 'user', self.unauth_user) - - result = self.folder.has_read_permission(request) - self.assertEqual(result, True) - - def test_owner_user_has_rights(self): - # Set owner as the owner of the folder. - self.folder.owner = self.owner - request = Mock() - setattr(request, 'user', self.owner) - - result = self.folder.has_read_permission(request) - self.assertEqual(result, True) - - def test_combined_groups(self): - request1 = Mock() - setattr(request1, 'user', self.test_user1) - request2 = Mock() - setattr(request2, 'user', self.test_user2) - - old_setting = filer_settings.FILER_ENABLE_PERMISSIONS - try: - filer_settings.FILER_ENABLE_PERMISSIONS = True - - self.assertEqual(self.folder.has_read_permission(request1), False) - self.assertEqual(self.folder.has_read_permission(request2), False) - self.assertEqual(self.folder_perm.has_read_permission(request1), False) - self.assertEqual(self.folder_perm.has_read_permission(request2), False) - - self.assertEqual(FolderPermission.objects.count(), 0) - - FolderPermission.objects.create(folder=self.folder, type=FolderPermission.CHILDREN, group=self.group1, can_edit=FolderPermission.DENY, can_read=FolderPermission.ALLOW, can_add_children=FolderPermission.DENY) - FolderPermission.objects.create(folder=self.folder_perm, type=FolderPermission.CHILDREN, group=self.group2, can_edit=FolderPermission.DENY, can_read=FolderPermission.ALLOW, can_add_children=FolderPermission.DENY) - - self.assertEqual(FolderPermission.objects.count(), 2) - - # We have to invalidate cache - delattr(self.folder, 'permission_cache') - delattr(self.folder_perm, 'permission_cache') - - self.assertEqual(self.folder.has_read_permission(request1), True) - self.assertEqual(self.folder.has_read_permission(request2), False) - self.assertEqual(self.folder_perm.has_read_permission(request1), False) - self.assertEqual(self.folder_perm.has_read_permission(request2), True) - - self.test_user1.groups.add(self.group2) - self.test_user2.groups.add(self.group1) - - # We have to invalidate cache - delattr(self.folder, 'permission_cache') - delattr(self.folder_perm, 'permission_cache') - - self.assertEqual(self.folder.has_read_permission(request1), True) - self.assertEqual(self.folder.has_read_permission(request2), True) - self.assertEqual(self.folder_perm.has_read_permission(request1), True) - self.assertEqual(self.folder_perm.has_read_permission(request2), True) - - finally: - filer_settings.FILER_ENABLE_PERMISSIONS = old_setting - - def test_overlapped_groups_deny1(self): - # Tests overlapped groups with explicit deny - - request1 = Mock() - setattr(request1, 'user', self.test_user1) - - old_setting = filer_settings.FILER_ENABLE_PERMISSIONS - try: - filer_settings.FILER_ENABLE_PERMISSIONS = True - - self.assertEqual(self.folder.has_read_permission(request1), False) - self.assertEqual(self.folder_perm.has_read_permission(request1), False) - - self.assertEqual(FolderPermission.objects.count(), 0) - - FolderPermission.objects.create(folder=self.folder, type=FolderPermission.CHILDREN, group=self.group1, can_edit=FolderPermission.DENY, can_read=FolderPermission.ALLOW, can_add_children=FolderPermission.DENY) - FolderPermission.objects.create(folder=self.folder, type=FolderPermission.CHILDREN, group=self.group2, can_edit=FolderPermission.ALLOW, can_read=FolderPermission.ALLOW, can_add_children=FolderPermission.ALLOW) - - self.assertEqual(FolderPermission.objects.count(), 2) - - # We have to invalidate cache - delattr(self.folder, 'permission_cache') - - self.assertEqual(self.test_user1.groups.filter(pk=self.group1.pk).exists(), True) - self.assertEqual(self.test_user1.groups.filter(pk=self.group2.pk).exists(), False) - - self.assertEqual(self.folder.has_read_permission(request1), True) - self.assertEqual(self.folder.has_edit_permission(request1), False) - - self.assertEqual(self.test_user1.groups.count(), 1) - - self.test_user1.groups.add(self.group2) - - self.assertEqual(self.test_user1.groups.count(), 2) - - # We have to invalidate cache - delattr(self.folder, 'permission_cache') - - self.assertEqual(self.folder.has_read_permission(request1), True) - self.assertEqual(self.folder.has_edit_permission(request1), False) - - finally: - filer_settings.FILER_ENABLE_PERMISSIONS = old_setting - - def test_overlapped_groups_deny2(self): - # Tests overlapped groups with explicit deny - # Similar test to test_overlapped_groups_deny1, only order of groups is different - - request2 = Mock() - setattr(request2, 'user', self.test_user2) - - old_setting = filer_settings.FILER_ENABLE_PERMISSIONS - try: - filer_settings.FILER_ENABLE_PERMISSIONS = True - - self.assertEqual(self.folder.has_read_permission(request2), False) - self.assertEqual(self.folder_perm.has_read_permission(request2), False) - - self.assertEqual(FolderPermission.objects.count(), 0) - - FolderPermission.objects.create(folder=self.folder_perm, type=FolderPermission.CHILDREN, group=self.group2, can_edit=FolderPermission.DENY, can_read=FolderPermission.ALLOW, can_add_children=FolderPermission.DENY) - FolderPermission.objects.create(folder=self.folder_perm, type=FolderPermission.CHILDREN, group=self.group1, can_edit=FolderPermission.ALLOW, can_read=FolderPermission.ALLOW, can_add_children=FolderPermission.ALLOW) - - self.assertEqual(FolderPermission.objects.count(), 2) - - # We have to invalidate cache - delattr(self.folder_perm, 'permission_cache') - - self.assertEqual(self.test_user2.groups.filter(pk=self.group2.pk).exists(), True) - self.assertEqual(self.test_user2.groups.filter(pk=self.group1.pk).exists(), False) - - self.assertEqual(self.folder_perm.has_read_permission(request2), True) - self.assertEqual(self.folder_perm.has_edit_permission(request2), False) - - self.assertEqual(self.test_user2.groups.count(), 1) - - self.test_user2.groups.add(self.group1) - - self.assertEqual(self.test_user2.groups.count(), 2) - - # We have to invalidate cache - delattr(self.folder_perm, 'permission_cache') - - self.assertEqual(self.folder_perm.has_read_permission(request2), True) - self.assertEqual(self.folder_perm.has_edit_permission(request2), False) - - finally: - filer_settings.FILER_ENABLE_PERMISSIONS = old_setting - - def test_overlapped_groups1(self): - # Tests overlapped groups without explicit deny - - request1 = Mock() - setattr(request1, 'user', self.test_user1) - - old_setting = filer_settings.FILER_ENABLE_PERMISSIONS - try: - filer_settings.FILER_ENABLE_PERMISSIONS = True - - self.assertEqual(self.folder.has_read_permission(request1), False) - self.assertEqual(self.folder_perm.has_read_permission(request1), False) - - self.assertEqual(FolderPermission.objects.count(), 0) - - FolderPermission.objects.create(folder=self.folder, type=FolderPermission.CHILDREN, group=self.group1, can_edit=None, can_read=FolderPermission.ALLOW, can_add_children=None) - FolderPermission.objects.create(folder=self.folder, type=FolderPermission.CHILDREN, group=self.group2, can_edit=FolderPermission.ALLOW, can_read=FolderPermission.ALLOW, can_add_children=FolderPermission.ALLOW) - - self.assertEqual(FolderPermission.objects.count(), 2) - - # We have to invalidate cache - delattr(self.folder, 'permission_cache') - - self.assertEqual(self.test_user1.groups.filter(pk=self.group1.pk).exists(), True) - self.assertEqual(self.test_user1.groups.filter(pk=self.group2.pk).exists(), False) - - self.assertEqual(self.folder.has_read_permission(request1), True) - self.assertEqual(self.folder.has_edit_permission(request1), False) - - self.assertEqual(self.test_user1.groups.count(), 1) - - self.test_user1.groups.add(self.group2) - - self.assertEqual(self.test_user1.groups.count(), 2) - - # We have to invalidate cache - delattr(self.folder, 'permission_cache') - - self.assertEqual(self.folder.has_read_permission(request1), True) - self.assertEqual(self.folder.has_edit_permission(request1), True) - - finally: - filer_settings.FILER_ENABLE_PERMISSIONS = old_setting - - def test_overlapped_groups2(self): - # Tests overlapped groups without explicit deny - # Similar test to test_overlapped_groups1, only order of groups is different - - request2 = Mock() - setattr(request2, 'user', self.test_user2) - - old_setting = filer_settings.FILER_ENABLE_PERMISSIONS - try: - filer_settings.FILER_ENABLE_PERMISSIONS = True - - self.assertEqual(self.folder.has_read_permission(request2), False) - self.assertEqual(self.folder_perm.has_read_permission(request2), False) - - self.assertEqual(FolderPermission.objects.count(), 0) - - FolderPermission.objects.create(folder=self.folder_perm, type=FolderPermission.CHILDREN, group=self.group2, can_edit=None, can_read=FolderPermission.ALLOW, can_add_children=None) - FolderPermission.objects.create(folder=self.folder_perm, type=FolderPermission.CHILDREN, group=self.group1, can_edit=FolderPermission.ALLOW, can_read=FolderPermission.ALLOW, can_add_children=FolderPermission.ALLOW) - - self.assertEqual(FolderPermission.objects.count(), 2) - - # We have to invalidate cache - delattr(self.folder_perm, 'permission_cache') - - self.assertEqual(self.test_user2.groups.filter(pk=self.group2.pk).exists(), True) - self.assertEqual(self.test_user2.groups.filter(pk=self.group1.pk).exists(), False) - - self.assertEqual(self.folder_perm.has_read_permission(request2), True) - self.assertEqual(self.folder_perm.has_edit_permission(request2), False) - - self.assertEqual(self.test_user2.groups.count(), 1) - - self.test_user2.groups.add(self.group1) - - self.assertEqual(self.test_user2.groups.count(), 2) - - # We have to invalidate cache - delattr(self.folder_perm, 'permission_cache') - - self.assertEqual(self.folder_perm.has_read_permission(request2), True) - self.assertEqual(self.folder_perm.has_edit_permission(request2), True) - - finally: - filer_settings.FILER_ENABLE_PERMISSIONS = old_setting From 1b2121d3618897f6a8a73e5c8da71585f1b361cf Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Fri, 4 Oct 2013 11:22:29 +0300 Subject: [PATCH 135/715] Changed restricted name methods to readonly since restricted will be a new feature. --- filer/admin/clipboardadmin.py | 2 +- filer/admin/fileadmin.py | 2 +- filer/admin/folderadmin.py | 6 +++--- filer/admin/permissions.py | 8 ++++---- filer/admin/tools.py | 4 ++-- filer/models/filemodels.py | 6 +++--- filer/models/foldermodels.py | 12 ++++-------- filer/templates/admin/filer/change_form.html | 2 +- .../admin/filer/folder/directory_listing.html | 4 ++-- .../admin/filer/folder/directory_table.html | 10 +++++----- .../admin/filer/tools/clipboard/clipboard.html | 2 +- 11 files changed, 27 insertions(+), 31 deletions(-) diff --git a/filer/admin/clipboardadmin.py b/filer/admin/clipboardadmin.py index 06e1b10e1..6c210251b 100644 --- a/filer/admin/clipboardadmin.py +++ b/filer/admin/clipboardadmin.py @@ -93,7 +93,7 @@ def clone_files_from_clipboard_to_folder(self, request): if request.method == 'POST': folder = Folder.objects.get(id=request.POST.get('folder_id')) - if folder.is_restricted(): + if folder.is_readonly(): raise PermissionDenied tools.clone_files_from_clipboard_to_folder( diff --git a/filer/admin/fileadmin.py b/filer/admin/fileadmin.py index e3cae62bc..40d55d390 100644 --- a/filer/admin/fileadmin.py +++ b/filer/admin/fileadmin.py @@ -23,7 +23,7 @@ class FileAdmin(FilePermissionModelAdmin): save_as = True def get_readonly_fields(self, request, obj=None): - if obj and obj.is_restricted(): + if obj and obj.is_readonly(): return [field.name for field in obj.__class__._meta.fields] return super(FileAdmin, self).get_readonly_fields(request, obj) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index c9ce9973b..08cdabf8a 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -90,7 +90,7 @@ def get_form(self, request, obj=None, **kwargs): if obj and obj.pk: # change view parent_id = obj.parent_id - is_core_folder = obj.folder_type == Folder.CORE_FOLDER + is_core_folder = obj.is_readonly() else: # add view parent_id = request.REQUEST.get('parent_id', None) or None @@ -246,7 +246,7 @@ def directory_listing(self, request, folder_id=None, viewtype=None): if not self.can_view_folder_content(request, folder): raise PermissionDenied # hide actions from view if folder is core folder - hide_all_actions = folder.is_restricted() + hide_all_actions = folder.is_readonly() except Folder.DoesNotExist: raise Http404 @@ -336,7 +336,7 @@ def file_search_qs(qs, terms=[]): if request.method == 'POST' and '_save' not in request.POST: for f in folder_files: if "move-to-clipboard-%d" % (f.id,) in request.POST: - if f.is_restricted(): + if f.is_readonly(): raise PermissionDenied clipboard = tools.get_user_clipboard(user) tools.move_file_to_clipboard(request, [f], clipboard) diff --git a/filer/admin/permissions.py b/filer/admin/permissions.py index 0b08ec0c7..1d3c77459 100644 --- a/filer/admin/permissions.py +++ b/filer/admin/permissions.py @@ -39,7 +39,7 @@ def has_add_permission(self, request): else: folder = Folder.objects.get(id=folder_id) # nobody can add subfolders in core folders - if folder.is_restricted(): + if folder.is_readonly(): return False # only site admins can add subfolders in site folders with no site if not folder.site and has_admin_role(request.user): @@ -62,7 +62,7 @@ def has_change_permission(self, request, obj=None): return request.user.has_perm('filer.can_use_directory_listing') # nobody can change core folder - if folder.is_restricted(): + if folder.is_readonly(): return False # only admins can change site folders with no site owner if not folder.site and has_admin_role(request.user): @@ -84,7 +84,7 @@ def has_delete_permission(self, request, obj=None): if not folder: return can_delete - if folder.is_restricted(): + if folder.is_readonly(): return False # only admins can delete site folders with no site owner @@ -100,7 +100,7 @@ def has_delete_permission(self, request, obj=None): return False def can_view_folder_content(self, request, folder): - if folder.is_restricted(): + if folder.is_readonly(): return True # only admins can see site folders with no site owner if not folder.site and has_admin_role(request.user): diff --git a/filer/admin/tools.py b/filer/admin/tools.py index 04e2f8607..aecd50cfa 100644 --- a/filer/admin/tools.py +++ b/filer/admin/tools.py @@ -49,7 +49,7 @@ def _fetch_sites_for_user(): def is_valid_destination(request, folder): - if folder.is_restricted(): + if folder.is_readonly(): return False user = request.user if user.is_superuser: @@ -110,7 +110,7 @@ def has_multi_file_action_permission(request, files, folders): # from checking permissions for them files = files.exclude(folder__isnull=True) - if files.restricted().exists() or folders.restricted().exists(): + if files.readonly().exists() or folders.readonly().exists(): return False user = request.user if user.is_superuser: diff --git a/filer/models/filemodels.py b/filer/models/filemodels.py index 76edfb4c0..1a9ded2e2 100644 --- a/filer/models/filemodels.py +++ b/filer/models/filemodels.py @@ -18,7 +18,7 @@ class FilesChainableQuerySet(object): - def restricted(self): + def readonly(self): return self.filter(folder__folder_type=Folder.CORE_FOLDER) def find_duplicates(self, file_obj): @@ -374,9 +374,9 @@ def logical_path(self): def duplicates(self): return list(File.objects.find_duplicates(self)) - def is_restricted(self): + def is_readonly(self): if self.folder: - return self.folder.is_restricted() + return self.folder.is_readonly() return False class Meta: diff --git a/filer/models/foldermodels.py b/filer/models/foldermodels.py index 64357ce20..95cb0cc84 100644 --- a/filer/models/foldermodels.py +++ b/filer/models/foldermodels.py @@ -14,8 +14,6 @@ import filer.models.clipboardmodels from filer.models import mixins from filer import settings as filer_settings -# from filer.admin.tools import has_role_on_site, has_admin_role_on_site - import mptt @@ -24,13 +22,11 @@ class FoldersChainableQuerySet(object): def with_bad_metadata(self): return self.filter(has_all_mandatory_data=False) - def restricted(self, user=None): + def readonly(self): restricted_folder = Q(folder_type=Folder.CORE_FOLDER) - if user and not user.is_superuser: - restricted_folder |= Q(parent__isnull=True) - return self.filter(restricted_folder) + class EmptyFoldersQS(models.query.EmptyQuerySet, FoldersChainableQuerySet): pass @@ -133,7 +129,7 @@ def set_site_for_folder_type(self): with no parent(root folders) * core folders should not have any site """ - if self.folder_type == Folder.CORE_FOLDER: + if self.is_readonly(): self.site = None else: # site folders - make sure it keeps the site from parent @@ -274,7 +270,7 @@ def contains_folder(self, folder_name): except Folder.DoesNotExist: return False - def is_restricted(self): + def is_readonly(self): return self.folder_type == Folder.CORE_FOLDER class Meta: diff --git a/filer/templates/admin/filer/change_form.html b/filer/templates/admin/filer/change_form.html index 3628dc9e0..e5a1a5eb5 100644 --- a/filer/templates/admin/filer/change_form.html +++ b/filer/templates/admin/filer/change_form.html @@ -37,7 +37,7 @@

    {% trans 'duplicates' %}

    {% block submit_buttons_bottom %} -{% if not original.is_restricted %} +{% if not original.is_readonly %} {{ block.super }} {% endif %} {% endblock %} diff --git a/filer/templates/admin/filer/folder/directory_listing.html b/filer/templates/admin/filer/folder/directory_listing.html index aca4e5f12..627d3c066 100644 --- a/filer/templates/admin/filer/folder/directory_listing.html +++ b/filer/templates/admin/filer/folder/directory_listing.html @@ -64,7 +64,7 @@ {% block content %}
    @@ -78,7 +78,7 @@

    {% if folder.parent %} {% endif %} - {% elif not folder.is_restricted %}{% trans "Change" %}{% endif %} + {% elif not folder.is_readonly %}{% trans "Change" %}{% endif %}

    {% else %}{% if folder.is_smart_folder %} diff --git a/filer/templates/admin/filer/folder/directory_table.html b/filer/templates/admin/filer/folder/directory_table.html index d82015cb4..01499288d 100644 --- a/filer/templates/admin/filer/folder/directory_table.html +++ b/filer/templates/admin/filer/folder/directory_table.html @@ -18,12 +18,12 @@ {% for item in paginated_items.object_list %} {% if item.file_type == 'Folder' or item.file_type == 'DummyFolder' %}{% with item as subfolder%} - {% if select_folder and item.file_type == 'Folder' %} {% else %}{% if action_form and item.pk and not is_popup and not item.is_restricted %}{% endif %}{% endif %} + {% if select_folder and item.file_type == 'Folder' %} {% else %}{% if action_form and item.pk and not is_popup and not item.is_readonly %}{% endif %}{% endif %} {% trans - {% if item.file_type == 'Folder' and not item.is_restricted%} + {% if item.file_type == 'Folder' and not item.is_readonly%} {% trans "Change" %} {% endif %}
    {{ subfolder.name }}{% if not subfolder.is_root %} ({% blocktrans count subfolder.children_count as counter %}1 folder{% plural %}{{ counter }} folders{% endblocktrans %}, {% blocktrans count subfolder.file_count as counter %}1 file{% plural %}{{ counter }} files{% endblocktrans %}){% endif %}
    @@ -36,11 +36,11 @@ {% endwith %}{% endif %} {% if item.file_type == 'File' or item.file_type == 'Image' or item.file_type == 'Archive' %}{% with item as file %} - {% if is_popup and not select_folder %} {% else %}{% if action_form and not is_popup and not item.is_restricted %}{% endif %}{% endif %} + {% if is_popup and not select_folder %} {% else %}{% if action_form and not is_popup and not item.is_readonly %}{% endif %}{% endif %} {{ file.default_alt_text }} - {% if not item.is_restricted %} + {% if not item.is_readonly %} {% trans "Delete" %} {% trans "Change" %} {% endif %} @@ -49,7 +49,7 @@ {# {% if file.has_all_mandatory_data %}
    0 {% trans "has all mandatory metadata" %}
    {% else %}
    1 {% trans "missing metadata!" %}
    {% endif %} #} - {% if not item.is_restricted %} + {% if not item.is_readonly %} {% endif %} diff --git a/filer/templates/admin/filer/tools/clipboard/clipboard.html b/filer/templates/admin/filer/tools/clipboard/clipboard.html index d9f0087b5..1474a2eed 100644 --- a/filer/templates/admin/filer/tools/clipboard/clipboard.html +++ b/filer/templates/admin/filer/tools/clipboard/clipboard.html @@ -16,7 +16,7 @@ {% if is_popup %}{% endif %} {% if select_folder %}{% endif %} - + {% comment %}
    {% csrf_token %} From 2f0b044c0a376a7afeaa86389953f0d6d72f4260 Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Fri, 4 Oct 2013 11:58:57 +0300 Subject: [PATCH 136/715] LUN-1041: removed focal point feature. --- filer/admin/imageadmin.py | 17 +--- filer/static/filer/js/focal_point.js | 86 ------------------- filer/static/filer/js/raphael.js | 7 -- .../admin/filer/image/change_form.html | 1 - 4 files changed, 1 insertion(+), 110 deletions(-) delete mode 100644 filer/static/filer/js/focal_point.js delete mode 100644 filer/static/filer/js/raphael.js diff --git a/filer/admin/imageadmin.py b/filer/admin/imageadmin.py index 4277a69fb..571dcf3d2 100644 --- a/filer/admin/imageadmin.py +++ b/filer/admin/imageadmin.py @@ -26,15 +26,6 @@ def sidebar_image_ratio(self): class Meta: model = Image - class Media: - css = { - #'all': (settings.MEDIA_URL + 'filer/css/focal_point.css',) - } - js = ( - filer_settings.FILER_STATICMEDIA_PREFIX + 'js/raphael.js', - filer_settings.FILER_STATICMEDIA_PREFIX + 'js/focal_point.js', - ) - class ImageAdmin(FileAdmin): form = ImageAdminForm @@ -42,11 +33,5 @@ class ImageAdmin(FileAdmin): ImageAdmin.fieldsets = ImageAdmin.build_fieldsets( extra_main_fields=('default_alt_text', 'default_caption', 'default_credit'), - extra_fieldsets=( - # due to custom requirements:Subject Location section should be hidden - # ('Subject Location', { - # 'fields': ('subject_location',), - # 'classes': ('collapse',), - # }), - ) + extra_fieldsets=() ) diff --git a/filer/static/filer/js/focal_point.js b/filer/static/filer/js/focal_point.js deleted file mode 100644 index 200ccefab..000000000 --- a/filer/static/filer/js/focal_point.js +++ /dev/null @@ -1,86 +0,0 @@ -(function($) { -$(function(){ - var PAPER_WIDTH, PAPER_HEIGTH; - var paper, ratio; - var isDrag = false; - var dragger = function (e) { - this.dx = e.clientX; - this.dy = e.clientY; - isDrag = this; - this.animate({"fill-opacity": .3, "fill": "#fffccc"}, 500); - }; - - document.onmousemove = function (e) { - e = e || window.event; - if (isDrag) { - isDrag.translate(e.clientX - isDrag.dx, e.clientY - isDrag.dy); - paper.safari(); - isDrag.dx = e.clientX; - isDrag.dy = e.clientY; - } - }; - - document.onmouseup = function (e) { - if (isDrag) { - isDrag.animate({"fill-opacity": .2, "fill": "#fff"}, 500); - if (isDrag.type == "circle") { - updatePosition(isDrag.attrs.cx, isDrag.attrs.cy); - } - } - isDrag = false; - }; - - var focalPoint; - - function add(x, y) { - if (isNaN(x)) { - x = PAPER_WIDTH / 2; - y = PAPER_HEIGTH / 2; - } - var el = paper.circle(x, y, 15); - el.attr("fill", "#fff"); - el.attr("fill-opacity", .2); - el.attr("stroke", "#c00"); - el.attr('stroke-width', 2); - - - el.mousedown(dragger); - el.node.style.cursor = "move"; - focalPoint = el; - } - - function remove(id){ - focalPoint.remove(); - focalPoint = null; - } - - function updatePosition(x, y) { - $("#id_subject_location").val(x === undefined ? '' : parseInt(parseInt(x)*ratio) + ',' + parseInt(parseInt(y)*ratio) ); - } - - - $('#image_container img').load(function(){ - PAPER_WIDTH = $('#image_container img').width(); - PAPER_HEIGTH = $('#image_container img').height(); - $('#image_container').height(PAPER_HEIGTH + 'px'); - - // interface - ratio = parseFloat($('#image_container img').attr('rel')); - paper = Raphael(document.getElementById("paper"), PAPER_WIDTH, PAPER_HEIGTH); - // read location from form - var location = $("#id_subject_location").val(); - var x, y; - if (location){ - x = parseInt(parseInt(location.split(',')[0])/ratio); - y = parseInt(parseInt(location.split(',')[1])/ratio); - } - add(x, y); - }); -}); -})(django.jQuery); - - - - - - \ No newline at end of file diff --git a/filer/static/filer/js/raphael.js b/filer/static/filer/js/raphael.js deleted file mode 100644 index 8718b5bc7..000000000 --- a/filer/static/filer/js/raphael.js +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Raphael 1.3.1 - JavaScript Vector Library - * - * Copyright (c) 2008 - 2009 Dmitry Baranovskiy (http://raphaeljs.com) - * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. - */ -Raphael=(function(){var a=/[, ]+/,aO=/^(circle|rect|path|ellipse|text|image)$/,L=document,au=window,l={was:"Raphael" in au,is:au.Raphael},an=function(){if(an.is(arguments[0],"array")){var d=arguments[0],e=w[aW](an,d.splice(0,3+an.is(d[0],al))),S=e.set();for(var R=0,a0=d[m];R

    ";if(ag.childNodes[m]!=2){return null;}}an.svg=!(an.vml=an.type=="VML");aT[aY]=an[aY];an._id=0;an._oid=0;an.fn={};an.is=function(e,d){d=aZ.call(d);return((d=="object"||d=="undefined")&&typeof e==d)||(e==null&&d=="null")||aZ.call(aw.call(e).slice(8,-1))==d;};an.setWindow=function(d){au=d;L=au.document;};var aD=function(e){if(an.vml){var d=/^\s+|\s+$/g;aD=aj(function(R){var S;R=(R+at)[aP](d,at);try{var a0=new ActiveXObject("htmlfile");a0.write("");a0.close();S=a0.body;}catch(a2){S=createPopup().document.body;}var i=S.createTextRange();try{S.style.color=R;var a1=i.queryCommandValue("ForeColor");a1=((a1&255)<<16)|(a1&65280)|((a1&16711680)>>>16);return"#"+("000000"+a1[aA](16)).slice(-6);}catch(a2){return"none";}});}else{var E=L.createElement("i");E.title="Rapha\xebl Colour Picker";E.style.display="none";L.body[aL](E);aD=aj(function(i){E.style.color=i;return L.defaultView.getComputedStyle(E,at).getPropertyValue("color");});}return aD(e);};an.hsb2rgb=aj(function(a3,a1,a7){if(an.is(a3,"object")&&"h" in a3&&"s" in a3&&"b" in a3){a7=a3.b;a1=a3.s;a3=a3.h;}var R,S,a8;if(a7==0){return{r:0,g:0,b:0,hex:"#000"};}if(a3>1||a1>1||a7>1){a3/=255;a1/=255;a7/=255;}var a0=~~(a3*6),a4=(a3*6)-a0,E=a7*(1-a1),e=a7*(1-(a1*a4)),a9=a7*(1-(a1*(1-a4)));R=[a7,e,E,E,a9,a7,a7][a0];S=[a9,a7,a7,e,E,E,a9][a0];a8=[E,E,a9,a7,a7,e,E][a0];R*=255;S*=255;a8*=255;var a5={r:R,g:S,b:a8},d=(~~R)[aA](16),a2=(~~S)[aA](16),a6=(~~a8)[aA](16);d=d[aP](aU,"0");a2=a2[aP](aU,"0");a6=a6[aP](aU,"0");a5.hex="#"+d+a2+a6;return a5;},an);an.rgb2hsb=aj(function(d,e,a1){if(an.is(d,"object")&&"r" in d&&"g" in d&&"b" in d){a1=d.b;e=d.g;d=d.r;}if(an.is(d,"string")){var a3=an.getRGB(d);d=a3.r;e=a3.g;a1=a3.b;}if(d>1||e>1||a1>1){d/=255;e/=255;a1/=255;}var a0=g(d,e,a1),i=aI(d,e,a1),R,E,S=a0;if(i==a0){return{h:0,s:0,b:a0};}else{var a2=(a0-i);E=a2/a0;if(d==a0){R=(e-a1)/a2;}else{if(e==a0){R=2+((a1-d)/a2);}else{R=4+((d-e)/a2);}}R/=6;R<0&&R++;R>1&&R--;}return{h:R,s:E,b:S};},an);var aE=/,?([achlmqrstvxz]),?/gi;an._path2string=function(){return this.join(",")[aP](aE,"$1");};function aj(E,e,d){function i(){var R=Array[aY].slice.call(arguments,0),a0=R[az]("\u25ba"),S=i.cache=i.cache||{},a1=i.count=i.count||[];if(S[Q](a0)){return d?d(S[a0]):S[a0];}a1[m]>=1000&&delete S[a1.shift()];a1[f](a0);S[a0]=E[aW](e,R);return d?d(S[a0]):S[a0];}return i;}an.getRGB=aj(function(d){if(!d||!!((d=d+at).indexOf("-")+1)){return{r:-1,g:-1,b:-1,hex:"none",error:1};}if(d=="none"){return{r:-1,g:-1,b:-1,hex:"none"};}!(({hs:1,rg:1})[Q](d.substring(0,2))||d.charAt()=="#")&&(d=aD(d));var S,i,E,a2,a3,a0=d.match(x);if(a0){if(a0[2]){a2=G(a0[2].substring(5),16);E=G(a0[2].substring(3,5),16);i=G(a0[2].substring(1,3),16);}if(a0[3]){a2=G((a3=a0[3].charAt(3))+a3,16);E=G((a3=a0[3].charAt(2))+a3,16);i=G((a3=a0[3].charAt(1))+a3,16);}if(a0[4]){a0=a0[4][z](/\s*,\s*/);i=W(a0[0]);E=W(a0[1]);a2=W(a0[2]);}if(a0[5]){a0=a0[5][z](/\s*,\s*/);i=W(a0[0])*2.55;E=W(a0[1])*2.55;a2=W(a0[2])*2.55;}if(a0[6]){a0=a0[6][z](/\s*,\s*/);i=W(a0[0]);E=W(a0[1]);a2=W(a0[2]);return an.hsb2rgb(i,E,a2);}if(a0[7]){a0=a0[7][z](/\s*,\s*/);i=W(a0[0])*2.55;E=W(a0[1])*2.55;a2=W(a0[2])*2.55;return an.hsb2rgb(i,E,a2);}a0={r:i,g:E,b:a2};var e=(~~i)[aA](16),R=(~~E)[aA](16),a1=(~~a2)[aA](16);e=e[aP](aU,"0");R=R[aP](aU,"0");a1=a1[aP](aU,"0");a0.hex="#"+e+R+a1;return a0;}return{r:-1,g:-1,b:-1,hex:"none",error:1};},an);an.getColor=function(e){var i=this.getColor.start=this.getColor.start||{h:0,s:1,b:e||0.75},d=this.hsb2rgb(i.h,i.s,i.b);i.h+=0.075;if(i.h>1){i.h=0;i.s-=0.2;i.s<=0&&(this.getColor.start={h:0,s:1,b:i.b});}return d.hex;};an.getColor.reset=function(){delete this.start;};an.parsePathString=aj(function(d){if(!d){return null;}var i={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},e=[];if(an.is(d,"array")&&an.is(d[0],"array")){e=av(d);}if(!e[m]){(d+at)[aP](/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,function(R,E,a1){var a0=[],S=aZ.call(E);a1[aP](/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig,function(a3,a2){a2&&a0[f](+a2);});while(a0[m]>=i[S]){e[f]([E][aS](a0.splice(0,i[S])));if(!i[S]){break;}}});}e[aA]=an._path2string;return e;});an.findDotsAtSegment=function(e,d,be,bc,a0,R,a2,a1,a8){var a6=1-a8,a5=aM(a6,3)*e+aM(a6,2)*3*a8*be+a6*3*a8*a8*a0+aM(a8,3)*a2,a3=aM(a6,3)*d+aM(a6,2)*3*a8*bc+a6*3*a8*a8*R+aM(a8,3)*a1,ba=e+2*a8*(be-e)+a8*a8*(a0-2*be+e),a9=d+2*a8*(bc-d)+a8*a8*(R-2*bc+d),bd=be+2*a8*(a0-be)+a8*a8*(a2-2*a0+be),bb=bc+2*a8*(R-bc)+a8*a8*(a1-2*R+bc),a7=(1-a8)*e+a8*be,a4=(1-a8)*d+a8*bc,E=(1-a8)*a0+a8*a2,i=(1-a8)*R+a8*a1,S=(90-ab.atan((ba-bd)/(a9-bb))*180/ab.PI);(ba>bd||a91){bi=ab.sqrt(by)*bi;bg=ab.sqrt(by)*bg;}var E=bi*bi,br=bg*bg,bt=(a4==S?-1:1)*ab.sqrt(ab.abs((E*br-E*bn*bn-br*bo*bo)/(E*bn*bn+br*bo*bo))),bd=bt*bi*bn/bg+(a9+a8)/2,bc=bt*-bg*bo/bi+(bE+bD)/2,a3=ab.asin(((bE-bc)/bg).toFixed(7)),a2=ab.asin(((bD-bc)/bg).toFixed(7));a3=a9a2){a3=a3-R*2;}if(!S&&a2>a3){a2=a2-R*2;}}else{a3=bb[0];a2=bb[1];bd=bb[2];bc=bb[3];}var a7=a2-a3;if(ab.abs(a7)>bf){var be=a2,bh=a8,a5=bD;a2=a3+bf*(S&&a2>a3?1:-1);a8=bd+bi*ab.cos(a2);bD=bc+bg*ab.sin(a2);bm=K(a8,bD,bi,bg,ba,0,S,bh,a5,[a2,be,bd,bc]);}a7=a2-a3;var a1=ab.cos(a3),bC=ab.sin(a3),a0=ab.cos(a2),bB=ab.sin(a2),bp=ab.tan(a7/4),bs=4/3*bi*bp,bq=4/3*bg*bp,bz=[a9,bE],bx=[a9+bs*bC,bE-bq*a1],bw=[a8+bs*bB,bD-bq*a0],bu=[a8,bD];bx[0]=2*bz[0]-bx[0];bx[1]=2*bz[1]-bx[1];if(bb){return[bx,bw,bu][aS](bm);}else{bm=[bx,bw,bu][aS](bm)[az]()[z](",");var bk=[];for(var bv=0,bl=bm[m];bv1000000000000&&(a0=0.5);ab.abs(S)>1000000000000&&(S=0.5);if(a0>0&&a0<1){e=M(i,d,R,E,a9,a8,a5,a2,a0);a6[f](e.x);a3[f](e.y);}if(S>0&&S<1){e=M(i,d,R,E,a9,a8,a5,a2,S);a6[f](e.x);a3[f](e.y);}a7=(a8-2*E+d)-(a2-2*a8+E);a4=2*(E-d)-2*(a8-E);a1=d-E;a0=(-a4+ab.sqrt(a4*a4-4*a7*a1))/2/a7;S=(-a4-ab.sqrt(a4*a4-4*a7*a1))/2/a7;ab.abs(a0)>1000000000000&&(a0=0.5);ab.abs(S)>1000000000000&&(S=0.5);if(a0>0&&a0<1){e=M(i,d,R,E,a9,a8,a5,a2,a0);a6[f](e.x);a3[f](e.y);}if(S>0&&S<1){e=M(i,d,R,E,a9,a8,a5,a2,S);a6[f](e.x);a3[f](e.y);}return{min:{x:aI[aW](0,a6),y:aI[aW](0,a3)},max:{x:g[aW](0,a6),y:g[aW](0,a3)}};}),H=aj(function(a9,a4){var R=r(a9),a5=a4&&r(a4),a6={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},d={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},a0=function(ba,bb){var i,bc;if(!ba){return["C",bb.x,bb.y,bb.x,bb.y,bb.x,bb.y];}!(ba[0] in {T:1,Q:1})&&(bb.qx=bb.qy=null);switch(ba[0]){case"M":bb.X=ba[1];bb.Y=ba[2];break;case"A":ba=["C"][aS](K[aW](0,[bb.x,bb.y][aS](ba.slice(1))));break;case"S":i=bb.x+(bb.x-(bb.bx||bb.x));bc=bb.y+(bb.y-(bb.by||bb.y));ba=["C",i,bc][aS](ba.slice(1));break;case"T":bb.qx=bb.x+(bb.x-(bb.qx||bb.x));bb.qy=bb.y+(bb.y-(bb.qy||bb.y));ba=["C"][aS](aK(bb.x,bb.y,bb.qx,bb.qy,ba[1],ba[2]));break;case"Q":bb.qx=ba[1];bb.qy=ba[2];ba=["C"][aS](aK(bb.x,bb.y,ba[1],ba[2],ba[3],ba[4]));break;case"L":ba=["C"][aS](aX(bb.x,bb.y,ba[1],ba[2]));break;case"H":ba=["C"][aS](aX(bb.x,bb.y,ba[1],bb.y));break;case"V":ba=["C"][aS](aX(bb.x,bb.y,bb.x,ba[1]));break;case"Z":ba=["C"][aS](aX(bb.x,bb.y,bb.X,bb.Y));break;}return ba;},e=function(ba,bb){if(ba[bb][m]>7){ba[bb].shift();var bc=ba[bb];while(bc[m]){ba.splice(bb++,0,["C"][aS](bc.splice(0,6)));}ba.splice(bb,1);a7=g(R[m],a5&&a5[m]||0);}},E=function(be,bd,bb,ba,bc){if(be&&bd&&be[bc][0]=="M"&&bd[bc][0]!="M"){bd.splice(bc,0,["M",ba.x,ba.y]);bb.bx=0;bb.by=0;bb.x=be[bc][1];bb.y=be[bc][2];a7=g(R[m],a5&&a5[m]||0);}};for(var a2=0,a7=g(R[m],a5&&a5[m]||0);a23){return{container:1,x:arguments[0],y:arguments[1],width:arguments[2],height:arguments[3]};}}},aG=function(d,i){var e=this;for(var E in i){if(i[Q](E)&&!(E in d)){switch(typeof i[E]){case"function":(function(R){d[E]=d===e?R:function(){return R[aW](e,arguments);};})(i[E]);break;case"object":d[E]=d[E]||{};aG.call(this,d[E],i[E]);break;default:d[E]=i[E];break;}}}},ak=function(d,e){d==e.top&&(e.top=d.prev);d==e.bottom&&(e.bottom=d.next);d.next&&(d.next.prev=d.prev);d.prev&&(d.prev.next=d.next);},Y=function(d,e){if(e.top===d){return;}ak(d,e);d.next=null;d.prev=e.top;e.top.next=d;e.top=d;},k=function(d,e){if(e.bottom===d){return;}ak(d,e);d.next=e.bottom;d.prev=null;e.bottom.prev=d;e.bottom=d;},A=function(e,d,i){ak(e,i);d==i.top&&(i.top=e);d.next&&(d.next.prev=e);e.next=d.next;e.prev=d;d.next=e;},aq=function(e,d,i){ak(e,i);d==i.bottom&&(i.bottom=e);d.prev&&(d.prev.next=e);e.prev=d.prev;d.prev=e;e.next=d;},s=function(d){return function(){throw new Error("Rapha\xebl: you are calling to method \u201c"+d+"\u201d of removed object");};},ar=/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/;if(an.svg){aT[aY].svgns="http://www.w3.org/2000/svg";aT[aY].xlink="http://www.w3.org/1999/xlink";var O=function(d){return +d+(~~d===d)*0.5;},V=function(S){for(var e=0,E=S[m];e0.5)*2-1);aM(a1-0.5,2)+aM(S-0.5,2)>0.25&&(S=ab.sqrt(0.25-aM(a1-0.5,2))*ba+0.5)&&S!=0.5&&(S=S.toFixed(5)-0.00001*ba);}return at;});a7=a7[z](/\s*\-\s*/);if(a4=="linear"){var a0=a7.shift();a0=-W(a0);if(isNaN(a0)){return null;}var R=[0,0,ab.cos(a0*ab.PI/180),ab.sin(a0*ab.PI/180)],a6=1/(g(ab.abs(R[2]),ab.abs(R[3]))||1);R[2]*=a6;R[3]*=a6;if(R[2]<0){R[0]=-R[2];R[2]=0;}if(R[3]<0){R[1]=-R[3];R[3]=0;}}var a3=p(a7);if(!a3){return null;}var e=aJ(a4+"Gradient");e.id="r"+(an._id++)[aA](36);aJ(e,a4=="radial"?{fx:a1,fy:S}:{x1:R[0],y1:R[1],x2:R[2],y2:R[3]});d.defs[aL](e);for(var a2=0,a8=a3[m];a2a1.height)&&(a1.height=a0.y+a0.height-a1.y);(a0.x+a0.width-a1.x>a1.width)&&(a1.width=a0.x+a0.width-a1.x);}}E&&this.hide();return a1;};ax[aY].attr=function(){if(this.removed){return this;}if(arguments[m]==0){var R={};for(var E in this.attrs){if(this.attrs[Q](E)){R[E]=this.attrs[E];}}this._.rt.deg&&(R.rotation=this.rotate());(this._.sx!=1||this._.sy!=1)&&(R.scale=this.scale());R.gradient&&R.fill=="none"&&(R.fill=R.gradient)&&delete R.gradient;return R;}if(arguments[m]==1&&an.is(arguments[0],"string")){if(arguments[0]=="translation"){return t.call(this);}if(arguments[0]=="rotation"){return this.rotate();}if(arguments[0]=="scale"){return this.scale();}if(arguments[0]=="fill"&&this.attrs.fill=="none"&&this.attrs.gradient){return this.attrs.gradient;}return this.attrs[arguments[0]];}if(arguments[m]==1&&an.is(arguments[0],"array")){var d={};for(var e in arguments[0]){if(arguments[0][Q](e)){d[arguments[0][e]]=this.attrs[arguments[0][e]];}}return d;}if(arguments[m]==2){var S={};S[arguments[0]]=arguments[1];aa(this,S);}else{if(arguments[m]==1&&an.is(arguments[0],"object")){aa(this,arguments[0]);}}return this;};ax[aY].toFront=function(){if(this.removed){return this;}this.node.parentNode[aL](this.node);var d=this.paper;d.top!=this&&Y(this,d);return this;};ax[aY].toBack=function(){if(this.removed){return this;}if(this.node.parentNode.firstChild!=this.node){this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild);k(this,this.paper);var d=this.paper;}return this;};ax[aY].insertAfter=function(d){if(this.removed){return this;}var e=d.node;if(e.nextSibling){e.parentNode.insertBefore(this.node,e.nextSibling);}else{e.parentNode[aL](this.node);}A(this,d,this.paper);return this;};ax[aY].insertBefore=function(d){if(this.removed){return this;}var e=d.node;e.parentNode.insertBefore(this.node,e);aq(this,d,this.paper);return this;};var P=function(e,d,S,R){d=O(d);S=O(S);var E=aJ("circle");e.canvas&&e.canvas[aL](E);var i=new ax(E,e);i.attrs={cx:d,cy:S,r:R,fill:"none",stroke:"#000"};i.type="circle";aJ(E,i.attrs);return i;};var aF=function(i,d,a1,e,S,a0){d=O(d);a1=O(a1);var R=aJ("rect");i.canvas&&i.canvas[aL](R);var E=new ax(R,i);E.attrs={x:d,y:a1,width:e,height:S,r:a0||0,rx:a0||0,ry:a0||0,fill:"none",stroke:"#000"};E.type="rect";aJ(R,E.attrs);return E;};var ai=function(e,d,a0,S,R){d=O(d);a0=O(a0);var E=aJ("ellipse");e.canvas&&e.canvas[aL](E);var i=new ax(E,e);i.attrs={cx:d,cy:a0,rx:S,ry:R,fill:"none",stroke:"#000"};i.type="ellipse";aJ(E,i.attrs);return i;};var o=function(i,a0,d,a1,e,S){var R=aJ("image");aJ(R,{x:d,y:a1,width:e,height:S,preserveAspectRatio:"none"});R.setAttributeNS(i.xlink,"href",a0);i.canvas&&i.canvas[aL](R);var E=new ax(R,i);E.attrs={x:d,y:a1,width:e,height:S,src:a0};E.type="image";return E;};var X=function(e,d,S,R){var E=aJ("text");aJ(E,{x:d,y:S,"text-anchor":"middle"});e.canvas&&e.canvas[aL](E);var i=new ax(E,e);i.attrs={x:d,y:S,"text-anchor":"middle",text:R,font:j.font,stroke:"none",fill:"#000"};i.type="text";aa(i,i.attrs);return i;};var aV=function(e,d){this.width=e||this.width;this.height=d||this.height;this.canvas[v]("width",this.width);this.canvas[v]("height",this.height);return this;};var w=function(){var E=ao[aW](null,arguments),i=E&&E.container,e=E.x,a0=E.y,R=E.width,d=E.height;if(!i){throw new Error("SVG container not found.");}var S=aJ("svg");R=R||512;d=d||342;aJ(S,{xmlns:"http://www.w3.org/2000/svg",version:1.1,width:R,height:d});if(i==1){S.style.cssText="position:absolute;left:"+e+"px;top:"+a0+"px";L.body[aL](S);}else{if(i.firstChild){i.insertBefore(S,i.firstChild);}else{i[aL](S);}}i=new aT;i.width=R;i.height=d;i.canvas=S;aG.call(i,i,an.fn);i.clear();return i;};aT[aY].clear=function(){var d=this.canvas;while(d.firstChild){d.removeChild(d.firstChild);}this.bottom=this.top=null;(this.desc=aJ("desc"))[aL](L.createTextNode("Created with Rapha\xebl"));d[aL](this.desc);d[aL](this.defs=aJ("defs"));};aT[aY].remove=function(){this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var d in this){this[d]=s(d);}};}if(an.vml){var aH=function(a8){var a5=/[ahqstv]/ig,a0=r;(a8+at).match(a5)&&(a0=H);a5=/[clmz]/g;if(a0==r&&!(a8+at).match(a5)){var e={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},R=/([clmz]),?([^clmz]*)/gi,S=/-?[^,\s-]+/g;var a4=(a8+at)[aP](R,function(a9,bb,i){var ba=[];i[aP](S,function(bc){ba[f](O(bc));});return e[bb]+ba;});return a4;}var a6=a0(a8),E,a4=[],d;for(var a2=0,a7=a6[m];a21&&(e=1);a7.opacity=e;}a8.fill&&(a7.on=true);if(a7.on==null||a8.fill=="none"){a7.on=false;}if(a7.on&&a8.fill){var i=a8.fill.match(c);if(i){a7.src=i[1];a7.type="tile";}else{a7.color=an.getRGB(a8.fill).hex;a7.src=at;a7.type="solid";if(an.getRGB(a8.fill).error&&(bd.type in {circle:1,ellipse:1}||(a8.fill+at).charAt()!="r")&&b(bd,a8.fill)){a9.fill="none";a9.gradient=a8.fill;}}}ba&&a6[aL](a7);var R=(a6.getElementsByTagName("stroke")&&a6.getElementsByTagName("stroke")[0]),bb=false;!R&&(bb=R=ah("stroke"));if((a8.stroke&&a8.stroke!="none")||a8["stroke-width"]||a8["stroke-opacity"]!=null||a8["stroke-dasharray"]||a8["stroke-miterlimit"]||a8["stroke-linejoin"]||a8["stroke-linecap"]){R.on=true;}(a8.stroke=="none"||R.on==null||a8.stroke==0||a8["stroke-width"]==0)&&(R.on=false);R.on&&a8.stroke&&(R.color=an.getRGB(a8.stroke).hex);var e=((+a9["stroke-opacity"]+1||2)-1)*((+a9.opacity+1||2)-1),a4=(W(a8["stroke-width"])||1)*0.75;e<0&&(e=0);e>1&&(e=1);a8["stroke-width"]==null&&(a4=a9["stroke-width"]);a8["stroke-width"]&&(R.weight=a4);a4&&a4<1&&(e*=a4)&&(R.weight=1);R.opacity=e;a8["stroke-linejoin"]&&(R.joinstyle=a8["stroke-linejoin"]||"miter");R.miterlimit=a8["stroke-miterlimit"]||8;a8["stroke-linecap"]&&(R.endcap=a8["stroke-linecap"]=="butt"?"flat":a8["stroke-linecap"]=="square"?"square":"round");if(a8["stroke-dasharray"]){var a5={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};R.dashstyle=a5[Q](a8["stroke-dasharray"])?a5[a8["stroke-dasharray"]]:at;}bb&&a6[aL](R);}if(bd.type=="text"){var a0=bd.paper.span.style;a9.font&&(a0.font=a9.font);a9["font-family"]&&(a0.fontFamily=a9["font-family"]);a9["font-size"]&&(a0.fontSize=a9["font-size"]);a9["font-weight"]&&(a0.fontWeight=a9["font-weight"]);a9["font-style"]&&(a0.fontStyle=a9["font-style"]);bd.node.string&&(bd.paper.span.innerHTML=(bd.node.string+at)[aP](/"));bd.W=a9.w=bd.paper.span.offsetWidth;bd.H=a9.h=bd.paper.span.offsetHeight;bd.X=a9.x;bd.Y=a9.y+O(bd.H/2);switch(a9["text-anchor"]){case"start":bd.node.style["v-text-align"]="left";bd.bbx=O(bd.W/2);break;case"end":bd.node.style["v-text-align"]="right";bd.bbx=-O(bd.W/2);break;default:bd.node.style["v-text-align"]="center";break;}}};var b=function(d,a1){d.attrs=d.attrs||{};var a2=d.attrs,a4=d.node.getElementsByTagName("fill"),S="linear",a0=".5 .5";d.attrs.gradient=a1;a1=(a1+at)[aP](ar,function(a6,a7,i){S="radial";if(a7&&i){a7=W(a7);i=W(i);aM(a7-0.5,2)+aM(i-0.5,2)>0.25&&(i=ab.sqrt(0.25-aM(a7-0.5,2))*((i>0.5)*2-1)+0.5);a0=a7+am+i;}return at;});a1=a1[z](/\s*\-\s*/);if(S=="linear"){var e=a1.shift();e=-W(e);if(isNaN(e)){return null;}}var R=p(a1);if(!R){return null;}d=d.shape||d.node;a4=a4[0]||ah("fill");if(R[m]){a4.on=true;a4.method="none";a4.type=(S=="radial")?"gradientradial":"gradient";a4.color=R[0].color;a4.color2=R[R[m]-1].color;var a5=[];for(var E=0,a3=R[m];E');};}catch(af){ah=function(d){return L.createElement("<"+d+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">');};}var w=function(){var i=ao[aW](null,arguments),d=i.container,a2=i.height,a3,e=i.width,a1=i.x,a0=i.y;if(!d){throw new Error("VML container not found.");}var R=new aT,S=R.canvas=L.createElement("div"),E=S.style;e=e||512;a2=a2||342;e==+e&&(e+="px");a2==+a2&&(a2+="px");R.width=1000;R.height=1000;R.coordsize="1000 1000";R.coordorigin="0 0";R.span=L.createElement("span");R.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";S[aL](R.span);E.cssText=an.format("width:{0};height:{1};position:absolute;clip:rect(0 {0} {1} 0);overflow:hidden",e,a2);if(d==1){L.body[aL](S);E.left=a1+"px";E.top=a0+"px";}else{d.style.width=e;d.style.height=a2;if(d.firstChild){d.insertBefore(S,d.firstChild);}else{d[aL](S);}}aG.call(R,R,an.fn);return R;};aT[aY].clear=function(){this.canvas.innerHTML=at;this.span=L.createElement("span");this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";this.canvas[aL](this.span);this.bottom=this.top=null;};aT[aY].remove=function(){this.canvas.parentNode.removeChild(this.canvas);for(var d in this){this[d]=s(d);}};}if((/^Apple|^Google/).test(navigator.vendor)&&!(navigator.userAgent.indexOf("Version/4.0")+1)){aT[aY].safari=function(){var d=this.rect(-99,-99,this.width+99,this.height+99);setTimeout(function(){d.remove();});};}else{aT[aY].safari=function(){};}var ae=(function(){if(L.addEventListener){return function(R,i,e,d){var E=function(S){return e.call(d,S);};R.addEventListener(i,E,false);return function(){R.removeEventListener(i,E,false);return true;};};}else{if(L.attachEvent){return function(S,E,i,e){var R=function(a0){return i.call(e,a0||au.event);};S.attachEvent("on"+E,R);var d=function(){S.detachEvent("on"+E,R);return true;};return d;};}}})();for(var ac=F[m];ac--;){(function(d){ax[aY][d]=function(e){if(an.is(e,"function")){this.events=this.events||[];this.events.push({name:d,f:e,unbind:ae(this.shape||this.node,d,e,this)});}return this;};ax[aY]["un"+d]=function(E){var i=this.events,e=i[m];while(e--){if(i[e].name==d&&i[e].f==E){i[e].unbind();i.splice(e,1);!i.length&&delete this.events;return this;}}return this;};})(F[ac]);}ax[aY].hover=function(e,d){return this.mouseover(e).mouseout(d);};ax[aY].unhover=function(e,d){return this.unmouseover(e).unmouseout(d);};aT[aY].circle=function(d,i,e){return P(this,d||0,i||0,e||0);};aT[aY].rect=function(d,R,e,i,E){return aF(this,d||0,R||0,e||0,i||0,E||0);};aT[aY].ellipse=function(d,E,i,e){return ai(this,d||0,E||0,i||0,e||0);};aT[aY].path=function(d){d&&!an.is(d,"string")&&!an.is(d[0],"array")&&(d+=at);return q(an.format[aW](an,arguments),this);};aT[aY].image=function(E,d,R,e,i){return o(this,E||"about:blank",d||0,R||0,e||0,i||0);};aT[aY].text=function(d,i,e){return X(this,d||0,i||0,e||at);};aT[aY].set=function(d){arguments[m]>1&&(d=Array[aY].splice.call(arguments,0,arguments[m]));return new T(d);};aT[aY].setSize=aV;aT[aY].top=aT[aY].bottom=null;aT[aY].raphael=an;function u(){return this.x+am+this.y;}ax[aY].scale=function(a6,a5,E,e){if(a6==null&&a5==null){return{x:this._.sx,y:this._.sy,toString:u};}a5=a5||a6;!+a5&&(a5=a6);var ba,a8,a9,a7,bm=this.attrs;if(a6!=0){var a4=this.getBBox(),a1=a4.x+a4.width/2,R=a4.y+a4.height/2,bl=a6/this._.sx,bk=a5/this._.sy;E=(+E||E==0)?E:a1;e=(+e||e==0)?e:R;var a3=~~(a6/ab.abs(a6)),a0=~~(a5/ab.abs(a5)),be=this.node.style,bo=E+(a1-E)*bl,bn=e+(R-e)*bk;switch(this.type){case"rect":case"image":var a2=bm.width*a3*bl,bd=bm.height*a0*bk;this.attr({height:bd,r:bm.r*aI(a3*bl,a0*bk),width:a2,x:bo-a2/2,y:bn-bd/2});break;case"circle":case"ellipse":this.attr({rx:bm.rx*a3*bl,ry:bm.ry*a0*bk,r:bm.r*aI(a3*bl,a0*bk),cx:bo,cy:bn});break;case"path":var bg=ad(bm.path),bh=true;for(var bj=0,bc=bg[m];bjS){if(e&&!a8.start){a6=an.findDotsAtSegment(a5,a4,E[1],E[2],E[3],E[4],E[5],E[6],(S-a3)/a1);R+=["C",a6.start.x,a6.start.y,a6.m.x,a6.m.y,a6.x,a6.y];if(a0){return R;}a8.start=R;R=["M",a6.x,a6.y+"C",a6.n.x,a6.n.y,a6.end.x,a6.end.y,E[5],E[6]][az]();a3+=a1;a5=+E[5];a4=+E[6];continue;}if(!d&&!e){a6=an.findDotsAtSegment(a5,a4,E[1],E[2],E[3],E[4],E[5],E[6],(S-a3)/a1);return{x:a6.x,y:a6.y,alpha:a6.alpha};}}a3+=a1;a5=+E[5];a4=+E[6];}R+=E;}a8.end=R;a6=d?a3:e?a8:an.findDotsAtSegment(a5,a4,E[1],E[2],E[3],E[4],E[5],E[6],1);a6.alpha&&(a6={x:a6.x,y:a6.y,alpha:a6.alpha});return a6;};},n=aj(function(E,d,a0,S,a6,a5,a4,a3){var R={x:0,y:0},a2=0;for(var a1=0;a1<1.01;a1+=0.01){var e=M(E,d,a0,S,a6,a5,a4,a3,a1);a1&&(a2+=ab.sqrt(aM(R.x-e.x,2)+aM(R.y-e.y,2)));R=e;}return a2;});var ap=aB(1),C=aB(),J=aB(0,1);ax[aY].getTotalLength=function(){if(this.type!="path"){return;}return ap(this.attrs.path);};ax[aY].getPointAtLength=function(d){if(this.type!="path"){return;}return C(this.attrs.path,d);};ax[aY].getSubpath=function(i,e){if(this.type!="path"){return;}if(ab.abs(this.getTotalLength()-e)<0.000001){return J(this.attrs.path,i).end;}var d=J(this.attrs.path,e,1);return i?J(d,i).end:d;};an.easing_formulas={linear:function(d){return d;},"<":function(d){return aM(d,3);},">":function(d){return aM(d-1,3)+1;},"<>":function(d){d=d*2;if(d<1){return aM(d,3)/2;}d-=2;return(aM(d,3)+2)/2;},backIn:function(e){var d=1.70158;return e*e*((d+1)*e-d);},backOut:function(e){e=e-1;var d=1.70158;return e*e*((d+1)*e+d)+1;},elastic:function(i){if(i==0||i==1){return i;}var e=0.3,d=e/4;return aM(2,-10*i)*ab.sin((i-d)*(2*ab.PI)/e)+1;},bounce:function(E){var e=7.5625,i=2.75,d;if(E<(1/i)){d=e*E*E;}else{if(E<(2/i)){E-=(1.5/i);d=e*E*E+0.75;}else{if(E<(2.5/i)){E-=(2.25/i);d=e*E*E+0.9375;}else{E-=(2.625/i);d=e*E*E+0.984375;}}}return d;}};var I={length:0},aR=function(){var a2=+new Date;for(var be in I){if(be!="length"&&I[Q](be)){var bj=I[be];if(bj.stop){delete I[be];I[m]--;continue;}var a0=a2-bj.start,bb=bj.ms,ba=bj.easing,bf=bj.from,a7=bj.diff,E=bj.to,a6=bj.t,a9=bj.prev||0,a1=bj.el,R=bj.callback,a8={},d;if(a0255?255:(d<0?0:d);},t=function(d,i){if(d==null){return{x:this._.tx,y:this._.ty,toString:u};}this._.tx+=+d;this._.ty+=+i;switch(this.type){case"circle":case"ellipse":this.attr({cx:+d+this.attrs.cx,cy:+i+this.attrs.cy});break;case"rect":case"image":case"text":this.attr({x:+d+this.attrs.x,y:+i+this.attrs.y});break;case"path":var e=ad(this.attrs.path);e[0][1]+=+d;e[0][2]+=+i;this.attr({path:e});break;}return this;};ax[aY].animateWith=function(e,i,d,R,E){I[e.id]&&(i.start=I[e.id].start);return this.animate(i,d,R,E);};ax[aY].animateAlong=ay();ax[aY].animateAlongBack=ay(1);function ay(d){return function(E,i,e,S){var R={back:d};an.is(e,"function")?(S=e):(R.rot=e);E&&E.constructor==ax&&(E=E.attrs.path);E&&(R.along=E);return this.animate(R,i,S);};}ax[aY].onAnimation=function(d){this._run=d||0;return this;};ax[aY].animate=function(be,a5,a4,E){if(an.is(a4,"function")||!a4){E=a4||null;}var a9={},e={},a2={};for(var a6 in be){if(be[Q](a6)){if(Z[Q](a6)){a9[a6]=this.attr(a6);(a9[a6]==null)&&(a9[a6]=j[a6]);e[a6]=be[a6];switch(Z[a6]){case"along":var bc=ap(be[a6]),a7=C(be[a6],bc*!!be.back),R=this.getBBox();a2[a6]=bc/a5;a2.tx=R.x;a2.ty=R.y;a2.sx=a7.x;a2.sy=a7.y;e.rot=be.rot;e.back=be.back;e.len=bc;be.rot&&(a2.r=W(this.rotate())||0);break;case"number":a2[a6]=(e[a6]-a9[a6])/a5;break;case"colour":a9[a6]=an.getRGB(a9[a6]);var a8=an.getRGB(e[a6]);a2[a6]={r:(a8.r-a9[a6].r)/a5,g:(a8.g-a9[a6].g)/a5,b:(a8.b-a9[a6].b)/a5};break;case"path":var S=H(a9[a6],e[a6]);a9[a6]=S[0];var a3=S[1];a2[a6]=[];for(var bb=0,a1=a9[a6][m];bb
    {{ original.label }} -
     
    {% trans "Full size preview" %}
    From 620db0d406c188951e9d7700dfbc7824ea47fae8 Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Fri, 4 Oct 2013 18:57:35 +0300 Subject: [PATCH 137/715] LUN-1116: Added functionality for the rule that users cand see only current site's folders when editing pages. --- filer/admin/tools.py | 22 ++++++++++++++++++++-- filer/models/foldermodels.py | 4 +++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/filer/admin/tools.py b/filer/admin/tools.py index aecd50cfa..16674a5b2 100644 --- a/filer/admin/tools.py +++ b/filer/admin/tools.py @@ -73,8 +73,17 @@ def folders_available(request, folders_qs): if user.is_superuser: return folders_qs + available_sites = get_sites_for_user(user) + current_site = request.REQUEST.get('folder__site', None) + if current_site: + current_site = int(current_site) + if current_site not in available_sites: + available_sites = [] + else: + available_sites = [current_site] + sites_q = Q(Q(folder_type=Folder.CORE_FOLDER) | - Q(site__in=get_sites_for_user(user))) + Q(site__in=available_sites)) if has_admin_role(user): sites_q |= Q(site__isnull=True) @@ -95,8 +104,17 @@ def files_available(request, files_qs): if user.is_superuser: return files_qs + available_sites = get_sites_for_user(user) + current_site = request.REQUEST.get('folder__site', None) + if current_site: + current_site = int(current_site) + if current_site not in available_sites: + available_sites = [] + else: + available_sites = [current_site] + sites_q = Q(Q(folder__folder_type=Folder.CORE_FOLDER) | - Q(folder__site__in=get_sites_for_user(user)) | + Q(folder__site__in=available_sites) | Q(folder__isnull=True)) if has_admin_role(user): diff --git a/filer/models/foldermodels.py b/filer/models/foldermodels.py index 95cb0cc84..a63273444 100644 --- a/filer/models/foldermodels.py +++ b/filer/models/foldermodels.py @@ -277,7 +277,9 @@ class Meta: unique_together = (('parent', 'name'),) ordering = ('name',) permissions = (("can_use_directory_listing", - "Can use directory listing"),) + "Can use directory listing"), + ("can_restrict_folder", + "Can restrict folder"),) app_label = 'filer' verbose_name = _("Folder") verbose_name_plural = _("Folders") From 574e2e8c64fce39d8924daef5b3e1d307374197a Mon Sep 17 00:00:00 2001 From: Laura Feier Date: Mon, 7 Oct 2013 19:52:17 +0300 Subject: [PATCH 138/715] LUN-1116: current site folder filtering when selecting filer objs. * actions for files/folders are now hidden when selecting filer objects for plugins * actions available: make subfolders, upload files, move from clip * changed redirect for file/folder admin to be the same --- filer/admin/clipboardadmin.py | 28 +++--- .../admin/{permissions.py => common_admin.py} | 92 ++++++++++++++++++- filer/admin/fileadmin.py | 76 +-------------- filer/admin/folderadmin.py | 71 +------------- filer/admin/tools.py | 55 ++++++----- .../admin/filer/folder/directory_listing.html | 27 +++++- .../admin/filer/folder/directory_table.html | 8 +- .../filer/tools/clipboard/clipboard.html | 3 + .../admin/filer/tools/search_form.html | 3 +- .../admin/filer/widgets/admin_file.html | 6 ++ .../admin/filer/widgets/admin_folder.html | 6 ++ filer/views.py | 6 ++ 12 files changed, 193 insertions(+), 188 deletions(-) rename filer/admin/{permissions.py => common_admin.py} (50%) diff --git a/filer/admin/clipboardadmin.py b/filer/admin/clipboardadmin.py index 6c210251b..aaf7af200 100644 --- a/filer/admin/clipboardadmin.py +++ b/filer/admin/clipboardadmin.py @@ -11,7 +11,7 @@ from filer.utils.files import ( handle_upload, UploadException, matching_file_subtypes ) -from filer.views import popup_param, selectfolder_param +from filer.views import popup_param, selectfolder_param, current_site_param from filer.admin.tools import is_valid_destination # ModelAdmins @@ -67,27 +67,30 @@ def paste_clipboard_to_folder(self, request): files_moved = tools.move_files_from_clipboard_to_folder( request, clipboard, folder) tools.discard_clipboard_files(clipboard, files_moved) - return HttpResponseRedirect('%s%s%s' % ( + return HttpResponseRedirect('%s%s%s%s' % ( request.REQUEST.get('redirect_to', ''), popup_param(request), - selectfolder_param(request))) + selectfolder_param(request), + current_site_param(request))) def discard_clipboard(self, request): if request.method == 'POST': clipboard = self.get_clipboard(request) tools.discard_clipboard(clipboard) - return HttpResponseRedirect('%s%s%s' % ( - request.POST.get('redirect_to', ''), + return HttpResponseRedirect('%s%s%s%s' % ( + request.REQUEST.get('redirect_to', ''), popup_param(request), - selectfolder_param(request))) + selectfolder_param(request), + current_site_param(request))) def delete_clipboard(self, request): if request.method == 'POST': tools.delete_clipboard(self.get_clipboard(request)) - return HttpResponseRedirect('%s%s%s' % ( - request.POST.get('redirect_to', ''), + return HttpResponseRedirect('%s%s%s%s' % ( + request.REQUEST.get('redirect_to', ''), popup_param(request), - selectfolder_param(request))) + selectfolder_param(request), + current_site_param(request))) def clone_files_from_clipboard_to_folder(self, request): if request.method == 'POST': @@ -98,10 +101,11 @@ def clone_files_from_clipboard_to_folder(self, request): tools.clone_files_from_clipboard_to_folder( self.get_clipboard(request), folder) - return HttpResponseRedirect('%s%s%s' % ( - request.POST.get('redirect_to', ''), + return HttpResponseRedirect('%s%s%s%s' % ( + request.REQUEST.get('redirect_to', ''), popup_param(request), - selectfolder_param(request))) + selectfolder_param(request), + current_site_param(request))) @csrf_exempt def ajax_upload(self, request, folder_id=None): diff --git a/filer/admin/permissions.py b/filer/admin/common_admin.py similarity index 50% rename from filer/admin/permissions.py rename to filer/admin/common_admin.py index 1d3c77459..49d28fa25 100644 --- a/filer/admin/permissions.py +++ b/filer/admin/common_admin.py @@ -1,11 +1,15 @@ #-*- coding: utf-8 -*- from django.contrib import admin +from django.contrib.admin.util import unquote from django.core.urlresolvers import reverse, resolve +from django.http import HttpResponseRedirect from filer.models import Folder from filer.admin.tools import (has_admin_role, has_role_on_site, has_admin_role_on_site, get_admin_sites_for_user, get_sites_for_user,) +from filer.views import (popup_param, selectfolder_param, popup_status, + selectfolder_status, current_site_param) class CommonModelAdmin(admin.ModelAdmin): @@ -22,6 +26,83 @@ def _get_post_url(self, obj): (opts.app_label, module_name), current_app=self.admin_site.name) + def _get_parent_for_view(self, obj): + return obj.parent + + def delete_view(self, request, object_id, extra_context=None): + """ + Overrides the default to enable redirecting to the directory view after + deletion of a image. + + we need to fetch the object and find out who the parent is + before super, because super will delete the object and make it + impossible to find out the parent folder to redirect to. + """ + parent_folder = None + try: + obj = self.queryset(request).get(pk=unquote(object_id)) + parent_folder = self._get_parent_for_view(obj) + except self.model.DoesNotExist: + obj = None + + r = super(CommonModelAdmin, self).delete_view( + request=request, object_id=object_id, + extra_context=extra_context) + + url = r.get("Location", None) + if (url in ["../../../../", "../../"] or + url == self._get_post_url(obj)): + if parent_folder: + url = reverse('admin:filer-directory_listing', + kwargs={'folder_id': parent_folder.id}) + else: + url = reverse('admin:filer-directory_listing-root') + url = "%s%s%s%s" % (url, popup_param(request), + selectfolder_param(request, "&"), + current_site_param(request),) + + return HttpResponseRedirect(url) + return r + + def render_change_form(self, request, context, add=False, change=False, + form_url='', obj=None): + extra_context = {'current_site': request.REQUEST.get( + 'current_site', None), + 'show_delete': True, + 'is_popup': popup_status(request), + 'select_folder': selectfolder_status(request), } + context.update(extra_context) + return super(CommonModelAdmin, self).render_change_form( + request=request, context=context, add=False, + change=False, form_url=form_url, obj=obj) + + def response_change(self, request, obj): + """ + Overrides the default to be able to forward to the directory listing + instead of the default change_list_view + """ + r = super(CommonModelAdmin, self).response_change(request, obj) + ## Code borrowed from django ModelAdmin to determine changelist + ## on the fly + if r['Location']: + parent_folder = self._get_parent_for_view(obj) + # it was a successful save + if (r['Location'] in ['../'] or + r['Location'] == self._get_post_url(obj)): + if parent_folder: + url = reverse('admin:filer-directory_listing', + kwargs={'folder_id': parent_folder.id}) + else: + url = reverse('admin:filer-directory_listing-root') + url = "%s%s%s%s" % (url, popup_param(request), + selectfolder_param(request, "&"), + current_site_param(request),) + return HttpResponseRedirect(url) + else: + # this means it probably was a save_and_continue_editing + pass + return r + class FolderPermissionModelAdmin(CommonModelAdmin): @@ -46,7 +127,7 @@ def has_add_permission(self, request): return True # regular users need to have permissions to add folders and # need to have a role over the site owner of the folder - can_add = super(CommonModelAdmin, self).\ + can_add = super(FolderPermissionModelAdmin, self).\ has_add_permission(request) if (folder.site and can_add and has_role_on_site(request.user, folder.site)): @@ -55,7 +136,7 @@ def has_add_permission(self, request): def has_change_permission(self, request, obj=None): folder = obj - can_change = super(CommonModelAdmin, self).\ + can_change = super(FolderPermissionModelAdmin, self).\ has_change_permission(request, folder) if not folder: @@ -78,7 +159,7 @@ def has_change_permission(self, request, obj=None): def has_delete_permission(self, request, obj=None): folder = obj - can_delete = super(CommonModelAdmin, self).\ + can_delete = super(FolderPermissionModelAdmin, self).\ has_delete_permission(request, obj) if not folder: @@ -112,4 +193,7 @@ def can_view_folder_content(self, request, folder): return False class FilePermissionModelAdmin(CommonModelAdmin): - pass + + def _get_parent_for_view(self, obj): + return obj.folder + diff --git a/filer/admin/fileadmin.py b/filer/admin/fileadmin.py index 40d55d390..d399bbfd3 100644 --- a/filer/admin/fileadmin.py +++ b/filer/admin/fileadmin.py @@ -1,11 +1,8 @@ #-*- coding: utf-8 -*- -from django.contrib.admin.util import unquote from django.core.urlresolvers import reverse from django.http import HttpResponseRedirect from django.utils.translation import ugettext as _ -from filer.admin.permissions import FilePermissionModelAdmin -from filer.views import (popup_param, selectfolder_param, popup_status, - selectfolder_status) +from filer.admin.common_admin import FilePermissionModelAdmin class FileAdmin(FilePermissionModelAdmin): @@ -43,77 +40,6 @@ def build_fieldsets(cls, extra_main_fields=(), extra_advanced_fields=(), extra_f ) + extra_fieldsets return fieldsets - - def response_change(self, request, obj): - """ - Overrides the default to be able to forward to the directory listing - instead of the default change_list_view - """ - r = super(FileAdmin, self).response_change(request, obj) - if r['Location']: - # it was a successful save - if (r['Location'] in ['../'] or - r['Location'] == self._get_post_url(obj)): - # this means it was a save: redirect to the directory view - if obj.folder: - url = reverse('admin:filer-directory_listing', - kwargs={'folder_id': obj.folder.id}) - else: - url = reverse( - 'admin:filer-directory_listing-unfiled_images') - url = "%s%s%s" % (url,popup_param(request), - selectfolder_param(request,"&")) - return HttpResponseRedirect(url) - else: - # this means it probably was a save_and_continue_editing - pass - return r - - def render_change_form(self, request, context, add=False, change=False, - form_url='', obj=None): - extra_context = {'show_delete': True, - 'is_popup': popup_status(request), - 'select_folder': selectfolder_status(request),} - context.update(extra_context) - return super(FileAdmin, self).render_change_form( - request=request, context=context, add=False, change=False, - form_url=form_url, obj=obj) - - def delete_view(self, request, object_id, extra_context=None): - """ - Overrides the default to enable redirecting to the directory view after - deletion of a image. - - we need to fetch the object and find out who the parent is - before super, because super will delete the object and make it - impossible to find out the parent folder to redirect to. - """ - parent_folder = None - try: - obj = self.queryset(request).get(pk=unquote(object_id)) - parent_folder = obj.folder - except self.model.DoesNotExist: - obj = None - - r = super(FileAdmin, self).delete_view( - request=request, object_id=object_id, - extra_context=extra_context) - - url = r.get("Location", None) - # Check against filer_file_changelist as file deletion is always made by - # the base class - if (url in ["../../../../", "../../"] or - url == reverse("admin:filer_file_changelist")): - if parent_folder: - url = reverse('admin:filer-directory_listing', - kwargs={'folder_id': parent_folder.id}) - else: - url = reverse('admin:filer-directory_listing-unfiled_images') - url = "%s%s%s" % (url,popup_param(request), - selectfolder_param(request,"&")) - return HttpResponseRedirect(url) - return r - def get_model_perms(self, request): """ It seems this is only used for the list view. NICE :-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 08cdabf8a..6413755f0 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -24,9 +24,9 @@ from filer import settings from filer.admin.forms import (CopyFilesAndFoldersForm, ResizeImagesForm, RenameFilesForm) -from filer.admin.permissions import FolderPermissionModelAdmin +from filer.admin.common_admin import FolderPermissionModelAdmin from filer.views import (popup_status, popup_param, selectfolder_status, - selectfolder_param) + selectfolder_param, current_site_param) from filer.admin.tools import (folders_available, files_available, has_admin_role, has_role_on_site, has_admin_role_on_site, @@ -111,72 +111,6 @@ def clean(form_instance): folder_form.clean = clean return folder_form - def response_change(self, request, obj): - """ - Overrides the default to be able to forward to the directory listing - instead of the default change_list_view - """ - r = super(FolderAdmin, self).response_change(request, obj) - ## Code borrowed from django ModelAdmin to determine changelist - ## on the fly - if r['Location']: - # it was a successful save - if (r['Location'] in ['../'] or - r['Location'] == self._get_post_url(obj)): - if obj.parent: - url = reverse('admin:filer-directory_listing', - kwargs={'folder_id': obj.parent.id}) - else: - url = reverse('admin:filer-directory_listing-root') - url = "%s%s%s" % (url, popup_param(request), - selectfolder_param(request, "&")) - return HttpResponseRedirect(url) - else: - # this means it probably was a save_and_continue_editing - pass - return r - - def render_change_form(self, request, context, add=False, change=False, - form_url='', obj=None): - extra_context = {'show_delete': True, - 'is_popup': popup_status(request), - 'select_folder': selectfolder_status(request), } - context.update(extra_context) - return super(FolderAdmin, self).render_change_form( - request=request, context=context, add=False, - change=False, form_url=form_url, obj=obj) - - def delete_view(self, request, object_id, extra_context=None): - """ - Overrides the default to enable redirecting to the directory view after - deletion of a folder. - - we need to fetch the object and find out who the parent is - before super, because super will delete the object and make it - impossible to find out the parent folder to redirect to. - """ - parent_folder = None - try: - obj = self.queryset(request).get(pk=unquote(object_id)) - parent_folder = obj.parent - except self.model.DoesNotExist: - obj = None - - r = super(FolderAdmin, self).delete_view( - request=request, object_id=object_id, - extra_context=extra_context) - url = r.get("Location", None) - if url in ["../../../../", "../../"] or url == self._get_post_url(obj): - if parent_folder: - url = reverse('admin:filer-directory_listing', - kwargs={'folder_id': parent_folder.id}) - else: - url = reverse('admin:filer-directory_listing-root') - url = "%s%s%s" % (url, popup_param(request), - selectfolder_param(request, "&")) - return HttpResponseRedirect(url) - return r - def icon_img(self, xs): return mark_safe(('') % FILER_STATICMEDIA_PREFIX) @@ -390,6 +324,7 @@ def file_search_qs(qs, terms=[]): 'clipboard_files': File.objects.filter( in_clipboards__clipboarditem__clipboard__user=user ).distinct(), + 'current_site': request.REQUEST.get('current_site', None), 'paginator': paginator, 'paginated_items': paginated_items, 'current_url': request.path, diff --git a/filer/admin/tools.py b/filer/admin/tools.py index 16674a5b2..613fa5fde 100644 --- a/filer/admin/tools.py +++ b/filer/admin/tools.py @@ -60,6 +60,18 @@ def is_valid_destination(request, folder): return True return False +def _filter_available_sites(request): + current_site = request.REQUEST.get('current_site', None) + user = request.user + available_sites = get_sites_for_user(user) + if current_site: + current_site = int(current_site) + if not user.is_superuser and current_site not in available_sites: + available_sites = [] + else: + available_sites = [current_site] + return available_sites + def folders_available(request, folders_qs): """ @@ -67,25 +79,23 @@ def folders_available(request, folders_qs): * core folders * only site folders with sites available to the user * site admins can also see site folder files with no site assigned + + * current_site param is passed only with cms plugin change form so this + will restrict visible files/folder for the ones that belong to that + site for all users, even superusers """ user = request.user + current_site = request.REQUEST.get('current_site', None) - if user.is_superuser: + if user.is_superuser and not current_site: return folders_qs - available_sites = get_sites_for_user(user) - current_site = request.REQUEST.get('folder__site', None) - if current_site: - current_site = int(current_site) - if current_site not in available_sites: - available_sites = [] - else: - available_sites = [current_site] + available_sites = _filter_available_sites(request) sites_q = Q(Q(folder_type=Folder.CORE_FOLDER) | Q(site__in=available_sites)) - if has_admin_role(user): + if has_admin_role(user) and not current_site: sites_q |= Q(site__isnull=True) return folders_qs.filter(sites_q) @@ -98,27 +108,26 @@ def files_available(request, files_qs): * files from 'unfiled files' * only site folder files with sites available to the user * site admins can also see site folder files with no site assigned + + * current_site param is passed only with cms plugin change form so this + will restrict visible files/folder for the ones that belong to that + site for all users, even superusers """ user = request.user + current_site = request.REQUEST.get('current_site', None) - if user.is_superuser: + if user.is_superuser and not current_site: return files_qs - available_sites = get_sites_for_user(user) - current_site = request.REQUEST.get('folder__site', None) - if current_site: - current_site = int(current_site) - if current_site not in available_sites: - available_sites = [] - else: - available_sites = [current_site] + available_sites = _filter_available_sites(request) sites_q = Q(Q(folder__folder_type=Folder.CORE_FOLDER) | - Q(folder__site__in=available_sites) | - Q(folder__isnull=True)) + Q(folder__site__in=available_sites)) - if has_admin_role(user): - sites_q |= Q(folder__site__isnull=True) + if not current_site: + sites_q |= Q(folder__isnull=True) + if has_admin_role(user): + sites_q |= Q(folder__site__isnull=True) return files_qs.filter(sites_q) diff --git a/filer/templates/admin/filer/folder/directory_listing.html b/filer/templates/admin/filer/folder/directory_listing.html index 627d3c066..1a3397db0 100644 --- a/filer/templates/admin/filer/folder/directory_listing.html +++ b/filer/templates/admin/filer/folder/directory_listing.html @@ -12,6 +12,31 @@ +{% if current_site %} + +{% endif %} {% if action_form %}{% if actions_on_top or actions_on_bottom %} -{% if current_site %} - -{% endif %} + {% if action_form %}{% if actions_on_top or actions_on_bottom %} {% endblock %} {% block pretitle %} diff --git a/filer/templates/admin/filer/folder/change_form.html b/filer/templates/admin/filer/folder/change_form.html index 5684dcc99..447fc39be 100644 --- a/filer/templates/admin/filer/folder/change_form.html +++ b/filer/templates/admin/filer/folder/change_form.html @@ -2,6 +2,21 @@ {% load i18n admin_modify adminmedia filermedia %} {% load url from future %} +{% block extrastyle %}{{ block.super }} + +{% endblock %} + +{% block extrahead %} +{{ block.super }} + +{% endblock %} + {% block breadcrumbs %} "))),this.clickableElements.length&&function t(){e.hiddenFileInput&&e.hiddenFileInput.parentNode.removeChild(e.hiddenFileInput),e.hiddenFileInput=document.createElement("input"),e.hiddenFileInput.setAttribute("type","file"),(null===e.options.maxFiles||e.options.maxFiles>1)&&e.hiddenFileInput.setAttribute("multiple","multiple"),e.hiddenFileInput.className="dz-hidden-input",null!==e.options.acceptedFiles&&e.hiddenFileInput.setAttribute("accept",e.options.acceptedFiles),null!==e.options.capture&&e.hiddenFileInput.setAttribute("capture",e.options.capture),e.hiddenFileInput.setAttribute("tabindex","-1"),e.hiddenFileInput.style.visibility="hidden",e.hiddenFileInput.style.position="absolute",e.hiddenFileInput.style.top="0",e.hiddenFileInput.style.left="0",e.hiddenFileInput.style.height="0",e.hiddenFileInput.style.width="0",o.getElement(e.options.hiddenInputContainer,"hiddenInputContainer").appendChild(e.hiddenFileInput),e.hiddenFileInput.addEventListener("change",function(){var n=e.hiddenFileInput.files;if(n.length){var r,i=c(n,!0);try{for(i.s();!(r=i.n()).done;){var o=r.value;e.addFile(o)}}catch(e){i.e(e)}finally{i.f()}}e.emit("addedfiles",n),t()})}(),this.URL=null!==window.URL?window.URL:window.webkitURL;var t,n=c(this.events,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.on(r,this.options[r])}}catch(e){n.e(e)}finally{n.f()}this.on("uploadprogress",function(){return e.updateTotalUploadProgress()}),this.on("removedfile",function(){return e.updateTotalUploadProgress()}),this.on("canceled",function(t){return e.emit("complete",t)}),this.on("complete",function(t){if(0===e.getAddedFiles().length&&0===e.getUploadingFiles().length&&0===e.getQueuedFiles().length)return setTimeout(function(){return e.emit("queuecomplete")},0)});var i=function(e){if(function(e){if(e.dataTransfer.types)for(var t=0;t")),n+='');var r=o.createElement(n);return"FORM"!==this.element.tagName?(t=o.createElement('
    '))).appendChild(r):(this.element.setAttribute("enctype","multipart/form-data"),this.element.setAttribute("method",this.options.method)),null!=t?t:r}},{key:"getExistingFallback",value:function(){for(var e=function(e){var t,n=c(e,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;if(/(^| )fallback($| )/.test(r.className))return r}}catch(e){n.e(e)}finally{n.f()}},t=0,n=["div","form"];t0){for(var r=["tb","gb","mb","kb","b"],i=0;i=Math.pow(this.options.filesizeBase,4-i)/10){t=e/Math.pow(this.options.filesizeBase,4-i),n=o;break}}t=Math.round(10*t)/10}return"".concat(t," ").concat(this.options.dictFileSizeUnits[n])}},{key:"_updateMaxFilesReachedClass",value:function(){return null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(this.getAcceptedFiles().length===this.options.maxFiles&&this.emit("maxfilesreached",this.files),this.element.classList.add("dz-max-files-reached")):this.element.classList.remove("dz-max-files-reached")}},{key:"drop",value:function(e){if(e.dataTransfer){this.emit("drop",e);for(var t=[],n=0;n0){var i,o=c(r,!0);try{for(o.s();!(i=o.n()).done;){var s=i.value;s.isFile?s.file(function(e){if(!n.options.ignoreHiddenFiles||"."!==e.name.substring(0,1))return e.fullPath="".concat(t,"/").concat(e.name),n.addFile(e)}):s.isDirectory&&n._addFilesFromDirectory(s,"".concat(t,"/").concat(s.name))}}catch(e){o.e(e)}finally{o.f()}e()}return null},i)}()}},{key:"accept",value:function(e,t){this.options.maxFilesize&&e.size>1024*this.options.maxFilesize*1024?t(this.options.dictFileTooBig.replace("{{filesize}}",Math.round(e.size/1024/10.24)/100).replace("{{maxFilesize}}",this.options.maxFilesize)):o.isValidFile(e,this.options.acceptedFiles)?null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(t(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}",this.options.maxFiles)),this.emit("maxfilesexceeded",e)):this.options.accept.call(this,e,t):t(this.options.dictInvalidFileType)}},{key:"addFile",value:function(e){var t=this;e.upload={uuid:o.uuidv4(),progress:0,total:e.size,bytesSent:0,filename:this._renameFile(e)},this.files.push(e),e.status=o.ADDED,this.emit("addedfile",e),this._enqueueThumbnail(e),this.accept(e,function(n){n?(e.accepted=!1,t._errorProcessing([e],n)):(e.accepted=!0,t.options.autoQueue&&t.enqueueFile(e)),t._updateMaxFilesReachedClass()})}},{key:"enqueueFiles",value:function(e){var t,n=c(e,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.enqueueFile(r)}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"enqueueFile",value:function(e){var t=this;if(e.status!==o.ADDED||!0!==e.accepted)throw new Error("This file can't be queued because it has already been processed or was rejected.");if(e.status=o.QUEUED,this.options.autoProcessQueue)return setTimeout(function(){return t.processQueue()},0)}},{key:"_enqueueThumbnail",value:function(e){var t=this;if(this.options.createImageThumbnails&&e.type.match(/image.*/)&&e.size<=1024*this.options.maxThumbnailFilesize*1024)return this._thumbnailQueue.push(e),setTimeout(function(){return t._processThumbnailQueue()},0)}},{key:"_processThumbnailQueue",value:function(){var e=this;if(!this._processingThumbnail&&0!==this._thumbnailQueue.length){this._processingThumbnail=!0;var t=this._thumbnailQueue.shift();return this.createThumbnail(t,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,!0,function(n){return e.emit("thumbnail",t,n),e._processingThumbnail=!1,e._processThumbnailQueue()})}}},{key:"removeFile",value:function(e){if(e.status===o.UPLOADING&&this.cancelUpload(e),this.files=b(this.files,e),this.emit("removedfile",e),0===this.files.length)return this.emit("reset")}},{key:"removeAllFiles",value:function(e){null==e&&(e=!1);var t,n=c(this.files.slice(),!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;(r.status!==o.UPLOADING||e)&&this.removeFile(r)}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"resizeImage",value:function(e,t,n,r,i){var s=this;return this.createThumbnail(e,t,n,r,!0,function(t,n){if(null==n)return i(e);var r=s.options.resizeMimeType;null==r&&(r=e.type);var a=n.toDataURL(r,s.options.resizeQuality);return"image/jpeg"!==r&&"image/jpg"!==r||(a=E.restore(e.dataURL,a)),i(o.dataURItoBlob(a))})}},{key:"createThumbnail",value:function(e,t,n,r,i,o){var s=this,a=new FileReader;a.onload=function(){e.dataURL=a.result,"image/svg+xml"!==e.type?s.createThumbnailFromUrl(e,t,n,r,i,o):null!=o&&o(a.result)},a.readAsDataURL(e)}},{key:"displayExistingFile",value:function(e,t,n,r){var i=this,o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4];this.emit("addedfile",e),this.emit("complete",e),o?(e.dataURL=t,this.createThumbnailFromUrl(e,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,this.options.fixOrientation,function(t){i.emit("thumbnail",e,t),n&&n()},r)):(this.emit("thumbnail",e,t),n&&n())}},{key:"createThumbnailFromUrl",value:function(e,t,n,r,i,o,s){var a=this,l=document.createElement("img");return s&&(l.crossOrigin=s),i="from-image"!=getComputedStyle(document.body).imageOrientation&&i,l.onload=function(){var s=function(e){return e(1)};return"undefined"!=typeof EXIF&&null!==EXIF&&i&&(s=function(e){return EXIF.getData(l,function(){return e(EXIF.getTag(this,"Orientation"))})}),s(function(i){e.width=l.width,e.height=l.height;var s=a.options.resize.call(a,e,t,n,r),c=document.createElement("canvas"),u=c.getContext("2d");switch(c.width=s.trgWidth,c.height=s.trgHeight,i>4&&(c.width=s.trgHeight,c.height=s.trgWidth),i){case 2:u.translate(c.width,0),u.scale(-1,1);break;case 3:u.translate(c.width,c.height),u.rotate(Math.PI);break;case 4:u.translate(0,c.height),u.scale(1,-1);break;case 5:u.rotate(.5*Math.PI),u.scale(1,-1);break;case 6:u.rotate(.5*Math.PI),u.translate(0,-c.width);break;case 7:u.rotate(.5*Math.PI),u.translate(c.height,-c.width),u.scale(-1,1);break;case 8:u.rotate(-.5*Math.PI),u.translate(-c.height,0)}x(u,l,null!=s.srcX?s.srcX:0,null!=s.srcY?s.srcY:0,s.srcWidth,s.srcHeight,null!=s.trgX?s.trgX:0,null!=s.trgY?s.trgY:0,s.trgWidth,s.trgHeight);var d=c.toDataURL("image/png");if(null!=o)return o(d,c)})},null!=o&&(l.onerror=o),l.src=e.dataURL}},{key:"processQueue",value:function(){var e=this.options.parallelUploads,t=this.getUploadingFiles().length,n=t;if(!(t>=e)){var r=this.getQueuedFiles();if(r.length>0){if(this.options.uploadMultiple)return this.processFiles(r.slice(0,e-t));for(;n1?t-1:0),r=1;rt.options.chunkSize),e[0].upload.totalChunkCount=Math.ceil(r.size/t.options.chunkSize)}if(e[0].upload.chunked){var i=e[0],s=n[0];i.upload.chunks=[];var a=function(){for(var n=0;void 0!==i.upload.chunks[n];)n++;if(!(n>=i.upload.totalChunkCount)){var r=n*t.options.chunkSize,a=Math.min(r+t.options.chunkSize,s.size),l={name:t._getParamName(0),data:s.webkitSlice?s.webkitSlice(r,a):s.slice(r,a),filename:i.upload.filename,chunkIndex:n};i.upload.chunks[n]={file:i,index:n,dataBlock:l,status:o.UPLOADING,progress:0,retries:0},t._uploadData(e,[l])}};if(i.upload.finishedChunkUpload=function(n,r){var s=!0;n.status=o.SUCCESS,n.dataBlock=null,n.xhr=null;for(var l=0;l1?t-1:0),r=1;r=s;a?o++:o--)i[o]=t.charCodeAt(o);return new Blob([r],{type:n})};var b=function(e,t){return e.filter(function(e){return e!==t}).map(function(e){return e})},w=function(e){return e.replace(/[\-_](\w)/g,function(e){return e.charAt(1).toUpperCase()})};g.createElement=function(e){var t=document.createElement("div");return t.innerHTML=e,t.childNodes[0]},g.elementInside=function(e,t){if(e===t)return!0;for(;e=e.parentNode;)if(e===t)return!0;return!1},g.getElement=function(e,t){var n;if("string"==typeof e?n=document.querySelector(e):null!=e.nodeType&&(n=e),null==n)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector or a plain HTML element."));return n},g.getElements=function(e,t){var n,r;if(e instanceof Array){r=[];try{var i,o=c(e,!0);try{for(o.s();!(i=o.n()).done;)n=i.value,r.push(this.getElement(n,t))}catch(e){o.e(e)}finally{o.f()}}catch(e){r=null}}else if("string"==typeof e){r=[];var s,a=c(document.querySelectorAll(e),!0);try{for(a.s();!(s=a.n()).done;)n=s.value,r.push(n)}catch(e){a.e(e)}finally{a.f()}}else null!=e.nodeType&&(r=[e]);if(null==r||!r.length)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector, a plain HTML element or a list of those."));return r},g.confirm=function(e,t,n){return window.confirm(e)?t():null!=n?n():void 0},g.isValidFile=function(e,t){if(!t)return!0;t=t.split(",");var n,r=e.type,i=r.replace(/\/.*$/,""),o=c(t,!0);try{for(o.s();!(n=o.n()).done;){var s=n.value;if("."===(s=s.trim()).charAt(0)){if(-1!==e.name.toLowerCase().indexOf(s.toLowerCase(),e.name.length-s.length))return!0}else if(/\/\*$/.test(s)){if(i===s.replace(/\/.*$/,""))return!0}else if(r===s)return!0}}catch(e){o.e(e)}finally{o.f()}return!1},"undefined"!=typeof jQuery&&null!==jQuery&&(jQuery.fn.dropzone=function(e){return this.each(function(){return new g(this,e)})}),g.ADDED="added",g.QUEUED="queued",g.ACCEPTED=g.QUEUED,g.UPLOADING="uploading",g.PROCESSING=g.UPLOADING,g.CANCELED="canceled",g.ERROR="error",g.SUCCESS="success";var x=function(e,t,n,r,i,o,s,a,l,c){var u=function(e){e.naturalWidth;var t=e.naturalHeight,n=document.createElement("canvas");n.width=1,n.height=t;var r=n.getContext("2d");r.drawImage(e,0,0);for(var i=r.getImageData(1,0,1,t).data,o=0,s=t,a=t;a>o;)0===i[4*(a-1)+3]?s=a:o=a,a=s+o>>1;var l=a/t;return 0===l?1:l}(t);return e.drawImage(t,n,r,i,o,s,a,l,c/u)},E=function(){function e(){d(this,e)}return p(e,null,[{key:"initClass",value:function(){this.KEY_STR="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}},{key:"encode64",value:function(e){for(var t="",n=void 0,r=void 0,i="",o=void 0,s=void 0,a=void 0,l="",c=0;o=(n=e[c++])>>2,s=(3&n)<<4|(r=e[c++])>>4,a=(15&r)<<2|(i=e[c++])>>6,l=63&i,isNaN(r)?a=l=64:isNaN(i)&&(l=64),t=t+this.KEY_STR.charAt(o)+this.KEY_STR.charAt(s)+this.KEY_STR.charAt(a)+this.KEY_STR.charAt(l),n=r=i="",o=s=a=l="",ce.length)break}return n}},{key:"decode64",value:function(e){var t=void 0,n=void 0,r="",i=void 0,o=void 0,s="",a=0,l=[];for(/[^A-Za-z0-9\+\/\=]/g.exec(e)&&console.warn("There were invalid base64 characters in the input text.\nValid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\nExpect errors in decoding."),e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");t=this.KEY_STR.indexOf(e.charAt(a++))<<2|(i=this.KEY_STR.indexOf(e.charAt(a++)))>>4,n=(15&i)<<4|(o=this.KEY_STR.indexOf(e.charAt(a++)))>>2,r=(3&o)<<6|(s=this.KEY_STR.indexOf(e.charAt(a++))),l.push(t),64!==o&&l.push(n),64!==s&&l.push(r),t=n=r="",i=o=s="",at.options.priority?-1:e.options.priority=0;n--)this._subscribers[n].fn!==e&&this._subscribers[n].id!==e||(this._subscribers[n].channel=null,this._subscribers.splice(n,1));else this._subscribers=[];if(t&&this.autoCleanChannel(),n=this._subscribers.length-1,e)for(;n>=0;n--)this._subscribers[n].fn!==e&&this._subscribers[n].id!==e||(this._subscribers[n].channel=null,this._subscribers.splice(n,1));else this._subscribers=[]},t.prototype.autoCleanChannel=function(){if(0===this._subscribers.length){for(var e in this._channels)if(this._channels.hasOwnProperty(e))return;if(null!=this._parent){var t=this.namespace.split(":"),n=t[t.length-1];this._parent.removeChannel(n)}}},t.prototype.removeChannel=function(e){this.hasChannel(e)&&(this._channels[e]=null,delete this._channels[e],this.autoCleanChannel())},t.prototype.publish=function(e){for(var t,n,r,i=0,o=this._subscribers.length,s=!1;i0)for(;i{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";var e=n(295),t=n.n(e),r=n(216);window.Cl=window.Cl||{};class i{constructor(e={}){this.options={linksSelector:".js-toggler-link",dataHeaderSelector:"toggler-header-selector",dataContentSelector:"toggler-content-selector",collapsedClass:"js-collapsed",expandedClass:"js-expanded",hiddenClass:"hidden",...e},this.togglerInstances=[],document.querySelectorAll(this.options.linksSelector).forEach(e=>{const t=new o(e,this.options);this.togglerInstances.push(t)})}destroy(){this.links=null,this.togglerInstances.forEach(e=>e.destroy()),this.togglerInstances=[]}}class o{constructor(e,t={}){this.options={...t},this.link=e,this.headerSelector=this.link.dataset[this.options.dataHeaderSelector],this.contentSelector=this.link.dataset[this.options.dataContentSelector],this.header=document.querySelector(this.headerSelector),this.header=this.header||this.link,this.content=document.querySelector(this.contentSelector),this.content&&this._initLink()}_updateClasses(){this.content.classList.contains(this.options.hiddenClass)?(this.header.classList.remove(this.options.expandedClass),this.header.classList.add(this.options.collapsedClass)):(this.header.classList.add(this.options.expandedClass),this.header.classList.remove(this.options.collapsedClass))}_onTogglerClick(e){this.content.classList.toggle(this.options.hiddenClass),this._updateClasses(),e.preventDefault()}_initLink(){this._updateClasses(),this.link.addEventListener("click",e=>this._onTogglerClick(e))}destroy(){this.options=null,this.link=null}}Cl.Toggler=i,Cl.TogglerConstructor=o;const s=i;n(413);var a=n(628),l=n.n(a);document.addEventListener("DOMContentLoaded",()=>{let e=0,t=1;const n=document.querySelector(".js-upload-button");if(!n)return;const r=document.querySelector(".js-upload-button-disabled"),i=n.dataset.url;if(!i)return;const o=document.querySelector(".js-filer-dropzone-upload-welcome"),s=document.querySelector(".js-filer-dropzone-upload-info-container"),a=document.querySelector(".js-filer-dropzone-upload-info"),c=document.querySelector(".js-filer-dropzone-upload-number"),u=".js-filer-dropzone-progress",d=document.querySelector(".js-filer-dropzone-upload-success"),f=document.querySelector(".js-filer-dropzone-upload-canceled"),p=document.querySelector(".js-filer-dropzone-cancel"),h=document.querySelector(".js-filer-dropzone-info-message"),v="hidden",m=parseInt(n.dataset.maxUploaderConnections||3,10),y=parseInt(n.dataset.maxFilesize||0,10);let g=!1;const b=()=>{c&&(c.textContent=`${t-e}/${t}`)},w=()=>{n&&n.remove()},x=()=>{const e=window.location.toString();window.location.replace(((e,t,n)=>{const r=new RegExp(`([?&])${t}=.*?(&|$)`,"i"),i=-1!==e.indexOf("?")?"&":"?",o=window.location.hash;return(e=e.replace(/#.*$/,"")).match(r)?e.replace(r,`$1${t}=${n}$2`)+o:e+i+t+"="+n+o})(e,"order_by","-modified_at"))};let E;Cl.mediator.subscribe("filer-upload-in-progress",w),n.addEventListener("click",e=>{e.preventDefault()}),l().autoDiscover=!1;try{E=new(l())(n,{url:i,paramName:"file",maxFilesize:y,parallelUploads:m,clickable:n,previewTemplate:"
    ",addRemoveLinks:!1,autoProcessQueue:!0})}catch(e){return void console.error("[Filer Upload] Failed to create Dropzone instance:",e)}E.on("addedfile",n=>{Cl.mediator.remove("filer-upload-in-progress",w),Cl.mediator.publish("filer-upload-in-progress"),e++,t=E.files.length,h&&h.classList.remove(v),o&&o.classList.add(v),d&&d.classList.add(v),s&&s.classList.remove(v),p&&p.classList.remove(v),f&&f.classList.add(v),b()}),E.on("uploadprogress",(e,t)=>{const n=Math.round(t),r=`file-${encodeURIComponent(e.name)}${e.size}${e.lastModified}`,i=document.getElementById(r);let o;if(i){const e=i.querySelector(u);e&&(e.style.width=`${n}%`)}else if(a){o=a.cloneNode(!0);const t=o.querySelector(".js-filer-dropzone-file-name");t&&(t.textContent=e.name);const i=o.querySelector(u);i&&(i.style.width=`${n}%`),o.classList.remove(v),o.setAttribute("id",r),s&&s.appendChild(o)}}),E.on("success",(n,r)=>{const i=`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}`,s=document.getElementById(i);s&&s.remove(),r.error&&(g=!0,window.filerShowError(`${n.name}: ${r.error}`)),e--,b(),0===e&&(t=1,o&&o.classList.add(v),c&&c.classList.add(v),f&&f.classList.add(v),p&&p.classList.add(v),d&&d.classList.remove(v),g?setTimeout(x,1e3):x())}),E.on("error",(n,r)=>{const i=`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}`,s=document.getElementById(i);s&&s.remove(),g=!0,window.filerShowError(`${n.name}: ${r}`),e--,b(),0===e&&(t=1,o&&o.classList.add(v),c&&c.classList.add(v),f&&f.classList.add(v),p&&p.classList.add(v),d&&d.classList.remove(v),setTimeout(x,1e3))}),p&&p.addEventListener("click",e=>{e.preventDefault(),p.classList.add(v),c&&c.classList.add(v),s&&s.classList.add(v),f&&f.classList.remove(v),setTimeout(()=>{window.location.reload()},1e3)}),r&&Cl.filerTooltip&&Cl.filerTooltip(),document.dispatchEvent(new Event("filer-upload-scripts-executed"))}),l()&&(l().autoDiscover=!1),document.addEventListener("DOMContentLoaded",()=>{const e=".js-img-preview",t=".js-filer-dropzone",n=document.querySelectorAll(t),r=".js-filer-dropzone-progress",i=".js-img-wrapper",o="hidden",s="filer-dropzone-mobile",a="js-object-attached",c=e=>{e.offsetWidth<500?e.classList.add(s):e.classList.remove(s)},u=e=>{try{window.parent.CMS.API.Messages.open({message:e})}catch{window.filerShowError?window.filerShowError(e):alert(e)}},d=function(t){const n=t.dataset.url,s=t.querySelector(".vForeignKeyRawIdAdminField"),d="image"===s?.getAttribute("name"),f=t.querySelector(".js-related-lookup"),p=t.querySelector(".js-related-edit"),h=t.querySelector(".js-filer-dropzone-message"),v=t.querySelector(".filerClearer"),m=t.querySelector(".js-file-selector");t.dropzone||(window.addEventListener("resize",()=>{c(t)}),new(l())(t,{url:n,paramName:"file",maxFiles:1,maxFilesize:t.dataset.maxFilesize,previewTemplate:document.querySelector(".js-filer-dropzone-template")?.innerHTML||"
    ",clickable:!1,addRemoveLinks:!1,init:function(){c(t),this.on("removedfile",()=>{m&&(m.style.display=""),t.classList.remove(a),this.removeAllFiles(),v?.click()}),this.element.querySelectorAll("img").forEach(e=>{e.addEventListener("dragstart",e=>{e.preventDefault()})}),v&&v.addEventListener("click",()=>{t.classList.remove(a)})},maxfilesexceeded:function(){this.removeAllFiles(!0)},drop:function(){this.removeAllFiles(!0),v?.click();const e=t.querySelector(r);e&&e.classList.remove(o),m&&(m.style.display="block"),f?.classList.add("related-lookup-change"),p?.classList.add("related-lookup-change"),h?.classList.add(o),t.classList.remove("dz-drag-hover"),t.classList.add(a)},success:function(n,a){const l=t.querySelector(r);if(l&&l.classList.add(o),n&&"success"===n.status&&a){if(a.file_id&&s){s.value=a.file_id;const e=new Event("change",{bubbles:!0});s.dispatchEvent(e)}if(a.thumbnail_180&&d){const n=t.querySelector(e);n&&(n.style.backgroundImage=`url(${a.thumbnail_180})`);const r=t.querySelector(i);r&&r.classList.remove(o)}}else a&&a.error&&u(`${n.name}: ${a.error}`),this.removeAllFiles(!0);this.element.querySelectorAll("img").forEach(e=>{e.addEventListener("dragstart",e=>{e.preventDefault()})})},error:function(e,t,n){n&&n.error&&(t+=` ; ${n.error}`),u(`${e.name}: ${t}`),this.removeAllFiles(!0)},reset:function(){if(d){const n=t.querySelector(i);n&&n.classList.add(o);const r=t.querySelector(e);r&&(r.style.backgroundImage="none")}if(t.classList.remove(a),s&&(s.value=""),f?.classList.remove("related-lookup-change"),p?.classList.remove("related-lookup-change"),h?.classList.remove(o),s){const e=new Event("change",{bubbles:!0});s.dispatchEvent(e)}}}))};n.length&&l()&&(window.filerDropzoneInitialized||(window.filerDropzoneInitialized=!0,l().autoDiscover=!1),n.forEach(d),document.addEventListener("formset:added",e=>{let n,r,i;e.detail&&e.detail.formsetName?(r=parseInt(document.getElementById(`id_${e.detail.formsetName}-TOTAL_FORMS`).value,10)-1,i=document.getElementById(`${e.detail.formsetName}-${r}`),n=i?.querySelectorAll(t)||[]):(i=e.target,n=i?.querySelectorAll(t)||[]),n?.forEach(d)}))}),document.addEventListener("DOMContentLoaded",()=>{let e=0,t=0;const n=[],r=document.querySelector(".js-filer-dropzone-base"),i=".js-filer-dropzone";let o;const s=document.querySelector(".js-filer-dropzone-info-message"),a=document.querySelector(".js-filer-dropzone-folder-name"),c=document.querySelector(".js-filer-dropzone-upload-info-container"),u=document.querySelector(".js-filer-dropzone-upload-info"),d=document.querySelector(".js-filer-dropzone-upload-welcome"),f=document.querySelector(".js-filer-dropzone-upload-number"),p=document.querySelector(".js-filer-upload-count"),h=document.querySelector(".js-filer-upload-text"),v=".js-filer-dropzone-progress",m=document.querySelector(".js-filer-dropzone-upload-success"),y=document.querySelector(".js-filer-dropzone-upload-canceled"),g=document.querySelector(".js-filer-dropzone-cancel"),b="dz-drag-hover",w=document.querySelector(".drag-hover-border"),x="hidden";let E,S,k,L=!1;const A=()=>{f&&(f.textContent=`${t-e}/${t}`),h&&h.classList.remove("hidden"),p&&p.classList.remove("hidden")},C=()=>{n.forEach(e=>{e.destroy()})},_=(e,t)=>document.getElementById(`file-${encodeURIComponent(e.name)}${e.size}${e.lastModified}${t}`);if(r){S=r.dataset.url,k=r.dataset.folderName;const e=document.body;e.dataset.url=S,e.dataset.folderName=k,e.dataset.maxFiles=r.dataset.maxFiles,e.dataset.maxFilesize=r.dataset.maxFiles,e.classList.add("js-filer-dropzone")}Cl.mediator.subscribe("filer-upload-in-progress",C),o=document.querySelectorAll(i),o.length&&l()&&(l().autoDiscover=!1,o.forEach(r=>{if(r.dropzone)return;const p=r.dataset.url,h=new(l())(r,{url:p,paramName:"file",maxFiles:parseInt(r.dataset.maxFiles)||100,maxFilesize:parseInt(r.dataset.maxFilesize),previewTemplate:"
    ",clickable:!1,addRemoveLinks:!1,parallelUploads:r.dataset["max-uploader-connections"]||3,accept:(n,r)=>{let i;if(Cl.mediator.remove("filer-upload-in-progress",C),Cl.mediator.publish("filer-upload-in-progress"),clearTimeout(E),clearTimeout(E),d&&d.classList.add(x),g&&g.classList.remove(x),_(n,p))r("duplicate");else{i=u.cloneNode(!0);const o=i.querySelector(".js-filer-dropzone-file-name");o&&(o.textContent=n.name);const s=i.querySelector(v);s&&(s.style.width="0"),i.setAttribute("id",`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}${p}`),c&&c.appendChild(i),e++,t++,A(),r()}o.forEach(e=>e.classList.remove("reset-hover")),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b))},dragover:e=>{const t=e.target.closest(i),n=t?.dataset.folderName,l=r.classList.contains("js-filer-dropzone-folder"),c=r.getBoundingClientRect(),u=w?window.getComputedStyle(w):null,d=u?u.borderTopWidth:"0px",f=u?u.borderLeftWidth:"0px",p={top:`${c.top}px`,bottom:`${c.bottom}px`,left:`${c.left}px`,right:`${c.right}px`,width:c.width-2*parseInt(f,10)+"px",height:c.height-2*parseInt(d,10)+"px",display:"block"};l&&w&&Object.assign(w.style,p),o.forEach(e=>e.classList.add("reset-hover")),m&&m.classList.add(x),s&&s.classList.remove(x),r.classList.add(b),r.classList.remove("reset-hover"),a&&n&&(a.textContent=n)},dragend:()=>{clearTimeout(E),E=setTimeout(()=>{s&&s.classList.add(x)},1e3),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b)),w&&Object.assign(w.style,{top:"0",bottom:"0",width:"0",height:"0"})},dragleave:()=>{clearTimeout(E),E=setTimeout(()=>{s&&s.classList.add(x)},1e3),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b)),w&&Object.assign(w.style,{top:"0",bottom:"0",width:"0",height:"0"})},sending:e=>{const t=_(e,p);t&&t.classList.remove(x)},uploadprogress:(e,t)=>{const n=_(e,p);if(n){const e=n.querySelector(v);e&&(e.style.width=`${t}%`)}},success:t=>{e--,A();const n=_(t,p);n&&n.remove()},queuecomplete:()=>{0===e&&(A(),g&&g.classList.add(x),u&&u.classList.add(x),L?(f&&f.classList.add(x),setTimeout(()=>{window.location.reload()},1e3)):(m&&m.classList.remove(x),window.location.reload()))},error:(e,t)=>{A(),"duplicate"!==t&&(L=!0,window.filerShowError&&window.filerShowError(`${e.name}: ${t.message}`))}});n.push(h),g&&g.addEventListener("click",e=>{e.preventDefault(),g.classList.add(x),y&&y.classList.remove(x),h.removeAllFiles(!0)})}))}),n(117),n(221),n(472),n(902),n(577),window.Cl=window.Cl||{},Cl.mediator=new(t()),Cl.FocalPoint=r.A,Cl.Toggler=s,document.addEventListener("DOMContentLoaded",()=>{let e;window.filerShowError=t=>{const n=document.querySelector(".messagelist"),r=document.querySelector("#header"),i="js-filer-error",o=`
    • {msg}
    `.replace("{msg}",t);n?n.outerHTML=o:r&&r.insertAdjacentHTML("afterend",o),e&&clearTimeout(e),e=setTimeout(()=>{const e=document.querySelector(`.${i}`);e&&e.remove()},5e3)};const t=document.querySelector(".js-filter-files");t&&(t.addEventListener("focus",e=>{const t=e.target.closest(".navigator-top-nav");t&&t.classList.add("search-is-focused")}),t.addEventListener("blur",e=>{const t=e.target.closest(".navigator-top-nav");if(t){const n=t.querySelector(".dropdown-container a");n&&e.relatedTarget===n||t.classList.remove("search-is-focused")}}));const n=document.querySelector(".js-filter-files-container");n&&n.addEventListener("submit",e=>{}),(()=>{const e=document.querySelector(".js-filter-files"),t=".navigator-top-nav",n=document.querySelector(t),r=n?.querySelector(".filter-search-wrapper .filer-dropdown-container");e&&(e.addEventListener("keydown",function(e){e.key;const n=this.closest(t);n&&n.classList.add("search-is-focused")}),r&&(r.addEventListener("show.bs.filer-dropdown",()=>{n&&n.classList.add("search-is-focused")}),r.addEventListener("hide.bs.filer-dropdown",()=>{n&&n.classList.remove("search-is-focused")})))})(),(()=>{const e=document.querySelectorAll(".navigator-table tr, .navigator-list .list-item"),t=document.querySelector(".actions-wrapper"),n=document.querySelectorAll(".action-select, #action-toggle, #files-action-toggle, #folders-action-toggle, .actions .clear a");setTimeout(()=>{n.forEach(e=>{if(e.checked){const t=e.closest(".list-item");t&&t.classList.add("selected")}}),Array.from(e).some(e=>e.classList.contains("selected"))&&t&&t.classList.add("action-selected")},100),n.forEach(n=>{n.addEventListener("change",function(){const n=this.closest(".list-item");n&&(this.checked?n.classList.add("selected"):n.classList.remove("selected")),setTimeout(()=>{const n=Array.from(e).some(e=>e.classList.contains("selected"));t&&(n?t.classList.add("action-selected"):t.classList.remove("action-selected"))},0)})})})(),(()=>{const e=document.querySelector(".js-actions-menu");if(!e)return;const t=e.querySelector(".filer-dropdown-menu"),n=document.querySelector('.actions select[name="action"]'),r=n?.querySelectorAll("option")||[],i=document.querySelector('.actions button[type="submit"]'),o=document.querySelector(".js-action-delete"),s=document.querySelector(".js-action-copy"),a=document.querySelector(".js-action-move"),l="delete_files_or_folders",c="copy_files_and_folders",u="move_files_and_folders",d=document.querySelectorAll(".navigator-table tr, .navigator-list .list-item"),f=(e,t)=>{t&&r.forEach(r=>{r.value===e&&(t.style.display="",t.addEventListener("click",t=>{if(t.preventDefault(),Array.from(d).some(e=>e.classList.contains("selected"))&&n&&i){n.value=e;const t=n.querySelector(`option[value="${e}"]`);t&&(t.selected=!0),i.click()}}))})};f(l,o),f(c,s),f(u,a),r.forEach((e,n)=>{if(0!==n){const n=document.createElement("li"),r=document.createElement("a");r.href="#",r.textContent=e.textContent,e.value!==l&&e.value!==c&&e.value!==u||r.classList.add("hidden"),n.appendChild(r),t&&t.appendChild(n)}}),t&&t.addEventListener("click",e=>{if("A"===e.target.tagName){const r=e.target.closest("li"),o=Array.from(t.querySelectorAll("li")).indexOf(r)+1;if(e.preventDefault(),n&&i){const e=n.querySelectorAll("option");e[o]&&(n.value=e[o].value,e[o].selected=!0),i.click()}}}),e.addEventListener("click",e=>{Array.from(d).some(e=>e.classList.contains("selected"))||(e.preventDefault(),e.stopPropagation())})})(),(()=>{const e=document.querySelector(".navigator-top-nav");if(!e)return;const t=document.querySelector(".breadcrumbs-container");if(!t)return;const n=t.querySelector(".navigator-breadcrumbs"),r=t.querySelector(".filer-dropdown-container"),i=document.querySelector(".filter-files-container"),o=document.querySelector(".actions-wrapper"),s=document.querySelector(".navigator-button-wrapper"),a=n?.offsetWidth||0,l=r?.offsetWidth||0,c=i?.offsetWidth||0,u=o?.offsetWidth||0,d=s?.offsetWidth||0,f=window.getComputedStyle(e),p=parseInt(f.paddingLeft,10)+parseInt(f.paddingRight,10);let h=e.offsetWidth;const v=80+a+l+c+u+d+p,m="breadcrumb-min-width",y=()=>{h{h=e.offsetWidth,y()})})(),(()=>{const e=document.querySelectorAll(".navigator-list .list-item input.action-select"),t=".navigator-list .navigator-folders-body .list-item input.action-select",n=".navigator-list .navigator-files-body .list-item input.action-select",r=document.querySelector("#files-action-toggle"),i=document.querySelector("#folders-action-toggle");i&&i.addEventListener("click",function(){const e=document.querySelectorAll(t);this.checked?e.forEach(e=>{e.checked||e.click()}):e.forEach(e=>{e.checked&&e.click()})}),r&&r.addEventListener("click",function(){const e=document.querySelectorAll(n);this.checked?e.forEach(e=>{e.checked||e.click()}):e.forEach(e=>{e.checked&&e.click()})}),e.forEach(e=>{e.addEventListener("click",function(){const e=document.querySelectorAll(n),o=document.querySelectorAll(t);if(this.checked){const t=Array.from(e).every(e=>e.checked),n=Array.from(o).every(e=>e.checked);t&&r&&(r.checked=!0),n&&i&&(i.checked=!0)}else{const t=Array.from(e).some(e=>!e.checked),n=Array.from(o).some(e=>!e.checked);t&&r&&(r.checked=!1),n&&i&&(i.checked=!1)}})});const o=document.querySelector(".navigator .actions .clear a");o&&o.addEventListener("click",()=>{i&&(i.checked=!1),r&&(r.checked=!1)})})(),document.querySelectorAll(".js-copy-url").forEach(e=>{e.addEventListener("click",function(e){const t=new URL(this.dataset.url,document.location.href),n=this.dataset.msg||"URL copied to clipboard",r=document.createElement("template");e.preventDefault(),document.querySelectorAll(".info.filer-tooltip").forEach(e=>{e.remove()}),navigator.clipboard.writeText(t.href),r.innerHTML=`
    ${n}
    `,this.classList.add("filer-tooltip-wrapper"),this.appendChild(r.content.firstChild);const i=this;setTimeout(()=>{const e=i.querySelector(".info");e&&e.remove()},1200)})}),(new r.A).initialize(),new s})})()})(); \ No newline at end of file diff --git a/filer/tests/admin.py b/filer/tests/admin.py index 0f9f67625..c064f94fb 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -23,9 +23,9 @@ from filer.tests.helpers import ( get_user_message, create_superuser, create_folder_structure, create_image, move_action, - move_to_clipboard_action, paste_clipboard_to_folder, get_dir_listing_url, + get_dir_listing_url, filer_obj_as_checkox, get_make_root_folder_url, enable_restriction, - move_single_file_to_clipboard_action, SettingsOverride + SettingsOverride ) from filer.utils.checktrees import TreeChecker from filer import settings as filer_settings @@ -261,42 +261,6 @@ def test_file_upload_no_duplicate_files(self, extra_headers={}): self.assertIn(errormsg, response.content.decode()) self.assertEqual(clip.files.count(), 1) - def test_paste_from_clipboard_no_duplicate_files(self): - first_folder = Folder.objects.create( - name='first', site=Site.objects.get(id=1)) - - def upload(): - file_obj = dj_files.File(open(self.filename, 'rb')) - response = self.client.post( - reverse('admin:filer-ajax_upload'), - {'Filename': self.image_name, 'Filedata': file_obj, - 'jsessionid': self.client.session.session_key, }) - return Image.objects.all().order_by('-id')[0] - - uploaded_image = upload() - self.assertEqual(uploaded_image.original_filename, self.image_name) - - def paste(uploaded_image): - # current user should have one clipboard created - clipboard = Clipboard.objects.get(user=self.superuser) - response = self.client.post( - reverse('admin:filer-paste_clipboard_to_folder'), - {'folder_id': first_folder.pk, - 'clipboard_id': clipboard.pk}) - return Image.objects.get(pk=uploaded_image.pk) - - pasted_image = paste(uploaded_image) - self.assertEqual(pasted_image.folder.pk, first_folder.pk) - # upload and paste the same image again - second_upload = upload() - # second paste failed due to name conflict - second_pasted_image = paste(second_upload) - clipboard = Clipboard.objects.get(user=self.superuser) - # file should remain in clipboard and should not be located in - # destination folder - self.assertEqual(clipboard.files.count(), 1) - self.assertEqual(second_pasted_image.folder, None) - def test_filer_ajax_upload_file(self): self.assertEqual(Image.objects.count(), 0) file_obj = dj_files.File(open(self.filename, 'rb')) @@ -477,24 +441,6 @@ def test_validate_no_duplicate_folders_on_move(self): bar = Folder.objects.get(pk=bar.pk) self.assertEqual(bar.parent.pk, root.pk) - def test_move_to_clipboard_action(self): - # TODO: Test recursive (files and folders tree) move - - self.assertEqual(self.src_folder.files.count(), 1) - self.assertEqual(self.dst_folder.files.count(), 0) - url = get_dir_listing_url(self.src_folder) - response = move_to_clipboard_action( - self.client, self.src_folder, [self.image_obj]) - self.assertEqual(self.src_folder.files.count(), 0) - self.assertEqual(self.dst_folder.files.count(), 0) - clipboard = Clipboard.objects.get(user=self.superuser) - self.assertEqual(clipboard.files.count(), 1) - request = HttpRequest() - tools.move_files_from_clipboard_to_folder( - request, clipboard, self.src_folder) - tools.discard_clipboard(clipboard) - self.assertEqual(clipboard.files.count(), 0) - self.assertEqual(self.src_folder.files.count(), 1) def test_files_set_public_action(self): return @@ -864,127 +810,6 @@ def test_move_site_folder_to_core_destination_folder(self): assert Folder.objects.filter(parent=f1).count() == 0 f1.delete(to_trash=False) - def _get_clipboard_files(self): - clipboard, _ = Clipboard.objects.get_or_create( - user=self.user) - return clipboard.files - - def test_move_to_clipboard_from_root(self): - file_foo = File.objects.create( - original_filename='foo', folder=None, - file=dj_files.base.ContentFile(b'some data', name='data.bin')) - self.assertEqual( - self._get_clipboard_files().count(), 0) - - move_to_clipboard_action(self.client, 'unfiled', [file_foo]) - self.assertEqual( - self._get_clipboard_files().count(), 1) - - file_bar = File.objects.create( - original_filename='bar', folder=None, - file=dj_files.base.ContentFile(b'some data', name='data.bin')) - move_single_file_to_clipboard_action( - self.client, 'unfiled', [file_bar]) - self.assertEqual( - self._get_clipboard_files().count(), 2) - - def test_move_to_clipboard_from_site_folders(self): - foo = Folder.objects.create(name='foo', site=Site.objects.get(id=1)) - file_foo = File.objects.create( - original_filename='foo', folder=foo, - file=dj_files.base.ContentFile(b'some data', name='data.bin')) - self.assertEqual( - self._get_clipboard_files().count(), 0) - - move_to_clipboard_action(self.client, None, [foo]) - self.assertEqual( - self._get_clipboard_files().count(), 0) - - file_bar = File.objects.create( - original_filename='bar', folder=foo, - file=dj_files.base.ContentFile(b'some data', name='data.bin')) - move_to_clipboard_action(self.client, foo, [file_bar]) - self.assertEqual( - self._get_clipboard_files().count(), 1) - - file_baz = File.objects.create( - original_filename='baz', folder=foo, - file=dj_files.base.ContentFile(b'some data', name='data.bin')) - move_single_file_to_clipboard_action( - self.client, foo, [file_baz]) - self.assertEqual( - self._get_clipboard_files().count(), 2) - - def test_move_to_clipboard_from_core_folders(self): - foo = Folder.objects.create(name='foo', - folder_type=Folder.CORE_FOLDER) - file_foo = File.objects.create( - original_filename='foo_file', folder=foo, - file=dj_files.base.ContentFile(b'some data', name='data.bin')) - self.assertEqual( - self._get_clipboard_files().count(), 0) - response, _ = move_to_clipboard_action(self.client, None, [foo]) - self.assertEqual( - self._get_clipboard_files().count(), 0) - response, _ = move_to_clipboard_action(self.client, foo, [file_foo]) - # actions are not available if current view is core folder - self.assertEqual( - self._get_clipboard_files().count(), 0) - - response = move_single_file_to_clipboard_action( - self.client, foo, [file_foo]) - self.assertEqual( - self._get_clipboard_files().count(), 0) - - def test_move_from_clipboard_to_root(self): - bar_file = File.objects.create( - original_filename='bar_file', - file=dj_files.base.ContentFile(b'some data', name='data.bin')) - clipboard, _ = Clipboard.objects.get_or_create( - user=self.user) - clipboard.append_file(bar_file) - self.assertEqual( - self._get_clipboard_files().count(), 1) - response = paste_clipboard_to_folder( - self.client, None, clipboard) - self.assertEqual(response.status_code, 403) - self.assertEqual( - self._get_clipboard_files().count(), 1) - - def test_move_from_clipboard_to_core_folders(self): - bar_file = File.objects.create( - original_filename='bar_file', - file=dj_files.base.ContentFile(b'some data', name='data.bin')) - core_folder = Folder.objects.create( - name='foo', folder_type=Folder.CORE_FOLDER) - clipboard, _ = Clipboard.objects.get_or_create( - user=self.user) - clipboard.append_file(bar_file) - self.assertEqual( - self._get_clipboard_files().count(), 1) - response = paste_clipboard_to_folder( - self.client, core_folder, clipboard) - self.assertEqual(response.status_code, 403) - self.assertEqual( - self._get_clipboard_files().count(), 1) - - def test_move_from_clipboard_to_site_folders(self): - bar_file = File.objects.create( - original_filename='bar_file', - file=dj_files.base.ContentFile(b'some data', name='data.bin')) - site_folder = Folder.objects.create( - name='foo', site=Site.objects.get(id=1)) - clipboard, _ = Clipboard.objects.get_or_create( - user=self.user) - clipboard.append_file(bar_file) - self.assertEqual( - self._get_clipboard_files().count(), 1) - response = paste_clipboard_to_folder( - self.client, site_folder, clipboard) - self.assertEqual(response.status_code, 302) - self.assertEqual( - self._get_clipboard_files().count(), 0) - self.assertEqual(len(site_folder.files), 1) def test_message_error_move_root_folder(self): site = Site.objects.get(id=1) @@ -1315,38 +1140,6 @@ def request_move_root_folder(self): bar = Folder.objects.create(name='bar', site=site) return move_action(self.client, foo_root, bar, [foo]) - def test_move_to_clipboard_from_site_folders_for_site_admins(self): - self._make_user_site_admin() - self_cls = TestFolderTypePermissionLayerForRegularUser - super(self_cls, self).test_move_to_clipboard_from_site_folders() - - def test_move_to_clipboard_from_site_folders(self): - foo = Folder.objects.create(name='foo', site=Site.objects.get(id=1)) - file_foo = File.objects.create( - original_filename='foo', folder=foo, - file=dj_files.base.ContentFile(b'some data', name='data.bin')) - self.assertEqual( - self._get_clipboard_files().count(), 0) - - move_to_clipboard_action(self.client, None, [foo]) - self.assertEqual( - self._get_clipboard_files().count(), 0) - - file_bar = File.objects.create( - original_filename='bar', folder=foo, - file=dj_files.base.ContentFile(b'some data', name='data.bin')) - move_to_clipboard_action(self.client, foo, [file_bar]) - self.assertEqual( - self._get_clipboard_files().count(), 1) - - file_baz = File.objects.create( - original_filename='baz', folder=foo, - file=dj_files.base.ContentFile(b'some data', name='data.bin')) - move_single_file_to_clipboard_action( - self.client, foo, [file_baz]) - self.assertEqual( - self._get_clipboard_files().count(), 2) - def test_error_unallowed_restriction_change(self): self._make_user_site_admin() site = Site.objects.get(id=1) @@ -1915,49 +1708,6 @@ def test_make_subfolder_in_restricted(self): response = self.client.post(get_make_root_folder_url(), post_data) self.assertEqual(response.status_code, 403) - def test_move_from_clipboard_in_restricted(self): - bar_file = File.objects.create( - original_filename='bar_file', - file=dj_files.base.ContentFile(b'some data', name='data.bin')) - clipboard, _ = Clipboard.objects.get_or_create(user=self.user) - clipboard.append_file(bar_file) - response = paste_clipboard_to_folder( - self.client, self.folders['foo'], clipboard) - self.assertEqual(response.status_code, 403) - - def test_move_from_restricted_to_clipboard(self): - clipboard, _ = Clipboard.objects.get_or_create(user=self.user) - self.assertEqual(clipboard.files.count(), 0) - self.assertEqual(clipboard.clipboarditem_set.count(), 0) - - response, url = move_to_clipboard_action( - self.client, self.folders['foo'], [self.files['foo_file']]) - - clipboard, _ = Clipboard.objects.get_or_create(user=self.user) - self.assertEqual(clipboard.files.count(), 0) - self.assertEqual(clipboard.clipboarditem_set.count(), 0) - self.assertEqual( - File.objects.filter(folder=self.folders['foo']).count(), 2) - - response = move_single_file_to_clipboard_action( - self.client, self.folders['foo'], [self.files['foo_file']]) - - clipboard, _ = Clipboard.objects.get_or_create(user=self.user) - self.assertEqual(clipboard.files.count(), 0) - self.assertEqual(clipboard.clipboarditem_set.count(), 0) - self.assertEqual( - File.objects.filter(folder=self.folders['foo']).count(), 2) - - def test_move_restricted_to_clipboard(self): - bar = Folder.objects.create( - name='bar', site=self.site) - bar_file = File.objects.create( - original_filename='bar_file', restricted=True, - file=dj_files.base.ContentFile(b'some data', name='data.bin'), folder=bar) - response = move_single_file_to_clipboard_action( - self.client, bar, [bar_file]) - self.assertEqual(response.status_code, 403) - def test_move_in_restricted(self): bar = Folder.objects.create(name='bar', site=self.site) bar_subfolder = Folder.objects.create( @@ -2230,18 +1980,6 @@ def test_extract_files_shared_folder(self): [filer_obj_as_checkox(bar_zippy)]}) assert Folder.objects.get(id=self.bar.id).files.count() == 1 - def test_move_to_clipboard_from_shared_folder(self): - bar_file = File.objects.create( - original_filename='bar_file.txt', folder=self.bar, - file=dj_files.base.ContentFile(b'file', name='file.bin')) - response = move_to_clipboard_action( - self.client, self.bar, [bar_file]) - self.assertEqual(Clipboard.objects.all().get().files.count(), 0) - move_single_file_to_clipboard_action( - self.client, self.bar, [bar_file]) - self.assertEqual(Clipboard.objects.all().get().files.count(), 0) - - class TestSharedFolderFunctionality(TestCase): """ * only root folders can be shared From 53de0b643266fea9f955e548f9b822758a1b6aab Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Tue, 9 Jun 2026 14:18:52 +0300 Subject: [PATCH 688/715] BEN-2954: filer archive model added --- filer/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filer/settings.py b/filer/settings.py index 5ac715abf..7d2c96520 100644 --- a/filer/settings.py +++ b/filer/settings.py @@ -67,7 +67,7 @@ # classes that I should check for when adding files FILER_FILE_MODELS = getattr( settings, 'FILER_FILE_MODELS', - (FILER_IMAGE_MODEL, 'filer.File')) + (FILER_IMAGE_MODEL, 'filer.Archive', 'filer.File')) _FALLBACK_STORAGE_BACKEND = 'django.core.files.storage.FileSystemStorage' From f504aefbae9bc0fafb9aa3689ab97a9ecfd85619 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Tue, 9 Jun 2026 15:01:42 +0300 Subject: [PATCH 689/715] BEn-2954: test archive and browser reload after drag file upload --- filer/admin/folderadmin.py | 22 +++++++++++-- .../static/filer/js/addons/table-dropzone.js | 32 ++++++++++++++++--- .../static/filer/js/dist/filer-base.bundle.js | 2 +- 3 files changed, 48 insertions(+), 8 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 5c22883b0..ff3392ef6 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -1248,12 +1248,18 @@ def extract_files(self, request, files_queryset, folders_queryset): if request.method != 'POST': return None - from django.contrib.contenttypes.models import ContentType from ..models import Archive success_format = "Successfully extracted archive {}." - files_queryset = files_queryset.filter( - polymorphic_ctype=ContentType.objects.get_for_model(Archive).id) + # Filter by zip file extension rather than polymorphic_ctype, + # because zip files may have been uploaded as plain File instances + zip_extensions = Archive._filename_extensions # ['.zip'] + from django.db.models import Q + extension_filter = Q() + for ext in zip_extensions: + extension_filter |= Q(original_filename__iendswith=ext) + extension_filter |= Q(file__iendswith=ext) + files_queryset = files_queryset.filter(extension_filter) if not files_queryset.exists(): self.message_user(request, _("No archive files were selected.")) @@ -1267,6 +1273,15 @@ def extract_files(self, request, files_queryset, folders_queryset): Folder.objects.none()): raise PermissionDenied + def _as_archive(filer_file): + """Convert a File instance to Archive so extract methods work.""" + if isinstance(filer_file, Archive): + return filer_file + archive = Archive() + archive.__dict__.update(filer_file.__dict__) + archive.extract_errors = [] + return archive + def is_valid_archive(filer_file): is_valid = filer_file.is_valid() if not is_valid: @@ -1290,6 +1305,7 @@ def has_collisions(filer_file): return len(collisions) > 0 for f in files_queryset: + f = _as_archive(f) if not is_valid_archive(f) or has_collisions(f): continue f.extract() diff --git a/filer/static/filer/js/addons/table-dropzone.js b/filer/static/filer/js/addons/table-dropzone.js index 1f4ee09ca..cf7e3868d 100644 --- a/filer/static/filer/js/addons/table-dropzone.js +++ b/filer/static/filer/js/addons/table-dropzone.js @@ -36,6 +36,24 @@ document.addEventListener('DOMContentLoaded', () => { let baseUrl; let baseFolderTitle; + // utility to update query string (same as upload-button) + const updateQuery = (uri, key, value) => { + const re = new RegExp(`([?&])${key}=.*?(&|$)`, 'i'); + const separator = uri.indexOf('?') !== -1 ? '&' : '?'; + const hash = window.location.hash; + uri = uri.replace(/#.*$/, ''); + if (uri.match(re)) { + return uri.replace(re, `$1${key}=${value}$2`) + hash; + } else { + return uri + separator + key + '=' + value + hash; + } + }; + + const reloadOrdered = () => { + const uri = window.location.toString(); + window.location.replace(updateQuery(uri, 'order_by', '-modified_at')); + }; + const updateUploadNumber = () => { if (uploadNumber) { uploadNumber.textContent = `${maxSubmitNum - submitNum}/${maxSubmitNum}`; @@ -249,23 +267,29 @@ document.addEventListener('DOMContentLoaded', () => { uploadNumber.classList.add(hiddenClass); } setTimeout(() => { - window.location.reload(); + reloadOrdered(); }, 1000); } else { if (uploadSuccess) { uploadSuccess.classList.remove(hiddenClass); } - window.location.reload(); + reloadOrdered(); } }, error: (file, error) => { - updateUploadNumber(); if (error === 'duplicate') { + // submitNum was never incremented for duplicates return; } + submitNum--; + updateUploadNumber(); + const fileEl = getElementByFile(file, dropzoneUrl); + if (fileEl) { + fileEl.remove(); + } hasErrors = true; if (window.filerShowError) { - window.filerShowError(`${file.name}: ${error.message}`); + window.filerShowError(`${file.name}: ${error.message || error}`); } } }); diff --git a/filer/static/filer/js/dist/filer-base.bundle.js b/filer/static/filer/js/dist/filer-base.bundle.js index f4aa57036..9a614eab2 100644 --- a/filer/static/filer/js/dist/filer-base.bundle.js +++ b/filer/static/filer/js/dist/filer-base.bundle.js @@ -1,2 +1,2 @@ /*! For license information please see filer-base.bundle.js.LICENSE.txt */ -(()=>{var e={117(){"use strict";document.addEventListener("DOMContentLoaded",()=>{const e=document.getElementById("destination");if(!e)return;const t=e.querySelectorAll("option"),n=t.length,r=document.querySelector(".js-submit-copy-move"),i=document.querySelector(".js-disabled-btn-tooltip");1===n&&t[0].disabled&&(r&&(r.style.display="none"),i&&(i.style.display="inline-block")),Cl.filerTooltip&&Cl.filerTooltip()})},413(){"use strict";(()=>{const e="filer-dropdown-backdrop",t='[data-toggle="filer-dropdown"]';class n{constructor(e){this.element=e,e.addEventListener("click",()=>this.toggle())}toggle(){const t=this.element,n=r(t),o=n.classList.contains("open"),s={relatedTarget:t};if(t.disabled||t.classList.contains("disabled"))return!1;if(i(),!o){if("ontouchstart"in document.documentElement&&!n.closest(".navbar-nav")){const n=document.createElement("div");n.className=e,t.parentNode.insertBefore(n,t.nextSibling),n.addEventListener("click",i)}const r=new CustomEvent("show.bs.filer-dropdown",{bubbles:!0,cancelable:!0,detail:s});if(n.dispatchEvent(r),r.defaultPrevented)return!1;t.focus(),t.setAttribute("aria-expanded","true"),n.classList.add("open");const o=new CustomEvent("shown.bs.filer-dropdown",{bubbles:!0,detail:s});n.dispatchEvent(o)}return!1}keydown(e){const n=this.element,i=r(n),o=i.classList.contains("open"),s=Array.from(i.querySelectorAll(".filer-dropdown-menu li:not(.disabled):visible a")).filter(e=>null!==e.offsetParent),a=s.indexOf(e.target);if(!/(38|40|27|32)/.test(e.which)||/input|textarea/i.test(e.target.tagName))return;if(e.preventDefault(),e.stopPropagation(),n.disabled||n.classList.contains("disabled"))return;if(!o&&27!==e.which||o&&27===e.which)return 27===e.which&&i.querySelector(t)?.focus(),n.click();if(!s.length)return;let l=a;38===e.which&&a>0&&l--,40===e.which&&ae.remove()),document.querySelectorAll(t).forEach(e=>{const t=r(e),i={relatedTarget:e};if(!t.classList.contains("open"))return;if(n&&"click"===n.type&&/input|textarea/i.test(n.target.tagName)&&t.contains(n.target))return;const o=new CustomEvent("hide.bs.filer-dropdown",{bubbles:!0,cancelable:!0,detail:i});if(t.dispatchEvent(o),o.defaultPrevented)return;e.setAttribute("aria-expanded","false"),t.classList.remove("open");const s=new CustomEvent("hidden.bs.filer-dropdown",{bubbles:!0,detail:i});t.dispatchEvent(s)}))}function o(e){return this.forEach(t=>{let r=t._filerDropdownInstance;r||(r=new n(t),t._filerDropdownInstance=r),"string"==typeof e&&r[e].call(t)}),this}NodeList.prototype.dropdown||(NodeList.prototype.dropdown=function(e){return o.call(this,e)}),HTMLCollection.prototype.dropdown||(HTMLCollection.prototype.dropdown=function(e){return o.call(this,e)}),document.addEventListener("click",i),document.addEventListener("click",e=>{e.target.closest(".filer-dropdown form")&&e.stopPropagation()}),document.addEventListener("click",e=>{const r=e.target.closest(t);if(r){const t=r._filerDropdownInstance||new n(r);r._filerDropdownInstance||(r._filerDropdownInstance=t),t.toggle(e)}}),document.addEventListener("keydown",e=>{const r=e.target.closest(t);if(r){const t=r._filerDropdownInstance||new n(r);r._filerDropdownInstance||(r._filerDropdownInstance=t),t.keydown(e)}}),document.addEventListener("keydown",e=>{const r=e.target.closest(".filer-dropdown-menu");if(r){const i=r.parentNode.querySelector(t);if(i){const t=i._filerDropdownInstance||new n(i);i._filerDropdownInstance||(i._filerDropdownInstance=t),t.keydown(e)}}}),window.FilerDropdown=n})()},577(){!function(){"use strict";const e=document.getElementById("django-admin-popup-response-constants");let t;if(e)switch(t=JSON.parse(e.dataset.popupResponse),t.action){case"change":opener.dismissRelatedImageLookupPopup(window,t.new_value,null,t.obj,null);break;case"delete":opener.dismissDeleteRelatedObjectPopup(window,t.value);break;default:opener.dismissAddRelatedObjectPopup(window,t.value,t.obj)}}()},216(e,t,n){"use strict";n.d(t,{A:()=>r}),e=n.hmd(e),window.Cl=window.Cl||{},(()=>{class t{constructor(e={}){this.options={containerSelector:".js-focal-point",imageSelector:".js-focal-point-image",circleSelector:".js-focal-point-circle",locationSelector:".js-focal-point-location",draggableClass:"draggable",hiddenClass:"hidden",dataLocation:"locationSelector",...e},this.focalPointInstances=[],this._init=this._init.bind(this)}_init(e){const t=new n(e,this.options);this.focalPointInstances.push(t)}initialize(){document.querySelectorAll(this.options.containerSelector).forEach(e=>{this._init(e)}),window.Cl.mediator&&window.Cl.mediator.subscribe("focal-point:init",this._init)}destroy(){window.Cl.mediator&&window.Cl.mediator.remove("focal-point:init",this._init),this.focalPointInstances.forEach(e=>{e.destroy()}),this.focalPointInstances=[]}}class n{constructor(e,t={}){this.options={imageSelector:".js-focal-point-image",circleSelector:".js-focal-point-circle",locationSelector:".js-focal-point-location",draggableClass:"draggable",hiddenClass:"hidden",dataLocation:"locationSelector",...t},this.container=e,this.image=this.container.querySelector(this.options.imageSelector),this.circle=this.container.querySelector(this.options.circleSelector),this.ratio=parseFloat(this.image?.dataset.ratio||1),this.location=this._getLocation(),this.isDragging=!1,this.dragStartX=0,this.dragStartY=0,this.circleStartX=0,this.circleStartY=0,this._onImageLoaded=this._onImageLoaded.bind(this),this._onMouseDown=this._onMouseDown.bind(this),this._onMouseMove=this._onMouseMove.bind(this),this._onMouseUp=this._onMouseUp.bind(this),this.image?.complete?this._onImageLoaded():this.image&&this.image.addEventListener("load",this._onImageLoaded)}_updateLocationValue(e,t){const n=`${Math.round(e*this.ratio)},${Math.round(t*this.ratio)}`;this.location&&(this.location.value=n)}_getLocation(){const e=this.container.dataset[this.options.dataLocation];if(e){const t=document.querySelector(e);if(t)return t}return this.container.querySelector(this.options.locationSelector)}_makeDraggable(){this.circle&&(this.circle.classList.add(this.options.draggableClass),this.circle.addEventListener("mousedown",this._onMouseDown),this.circle.addEventListener("touchstart",this._onMouseDown,{passive:!1}))}_onMouseDown(e){e.preventDefault(),this.isDragging=!0;const t="touchstart"===e.type?e.touches[0]:e,n=this.container.getBoundingClientRect();this.dragStartX=t.clientX-n.left,this.dragStartY=t.clientY-n.top;const r=this.circle.getBoundingClientRect();this.circleStartX=r.left-n.left+r.width/2,this.circleStartY=r.top-n.top+r.height/2,document.addEventListener("mousemove",this._onMouseMove),document.addEventListener("mouseup",this._onMouseUp),document.addEventListener("touchmove",this._onMouseMove,{passive:!1}),document.addEventListener("touchend",this._onMouseUp)}_onMouseMove(e){if(!this.isDragging)return;e.preventDefault();const t="touchmove"===e.type?e.touches[0]:e,n=this.container.getBoundingClientRect(),r=t.clientX-n.left,i=t.clientY-n.top,o=r-this.dragStartX,s=i-this.dragStartY;let a=this.circleStartX+o,l=this.circleStartY+s;a=Math.max(0,Math.min(n.width-1,a)),l=Math.max(0,Math.min(n.height-1,l)),this.circle.style.left=`${a}px`,this.circle.style.top=`${l}px`,this._updateLocationValue(a,l)}_onMouseUp(){this.isDragging=!1,document.removeEventListener("mousemove",this._onMouseMove),document.removeEventListener("mouseup",this._onMouseUp),document.removeEventListener("touchmove",this._onMouseMove),document.removeEventListener("touchend",this._onMouseUp)}_onImageLoaded(){if(!this.image||0===this.image.naturalWidth)return;this.circle?.classList.remove(this.options.hiddenClass);const e=this.location?.value||"",t=this.image.offsetWidth,n=this.image.offsetHeight;let r,i;if(e.length){const t=e.split(",");r=Math.round(Number(t[0])/this.ratio),i=Math.round(Number(t[1])/this.ratio)}else r=t/2,i=n/2;isNaN(r)||isNaN(i)||(this.circle&&(this.circle.style.left=`${r}px`,this.circle.style.top=`${i}px`),this._makeDraggable(),this._updateLocationValue(r,i))}destroy(){this.circle?.classList.contains(this.options.draggableClass)&&(this.circle.removeEventListener("mousedown",this._onMouseDown),this.circle.removeEventListener("touchstart",this._onMouseDown)),document.removeEventListener("mousemove",this._onMouseMove),document.removeEventListener("mouseup",this._onMouseUp),document.removeEventListener("touchmove",this._onMouseMove),document.removeEventListener("touchend",this._onMouseUp),this.image&&this.image.removeEventListener("load",this._onImageLoaded),this.options=null,this.container=null,this.image=null,this.circle=null,this.location=null,this.ratio=null}}window.Cl.FocalPoint=t,window.Cl.FocalPointConstructor=n,e.exports&&(e.exports=t)})();const r=window.Cl.FocalPoint},902(){"use strict";const e=e=>{const t=(e=(e=e.replace(/__dot__/g,".")).replace(/__dash__/g,"-")).lastIndexOf("__");return-1===t?e:e.substring(0,t)};window.dismissPopupAndReload=e=>{document.location.reload(),e.close()},window.dismissRelatedImageLookupPopup=(t,n,r,i,o)=>{const s=e(t.name),a=document.getElementById(s);if(!a)return;const l=a.closest(".filerFile");if(!l)return;const c=l.querySelector(".edit"),u=l.querySelector(".thumbnail_img"),d=l.querySelector(".description_text"),f=l.querySelector(".filerClearer"),p=l.parentElement.querySelector(".dz-message"),h=l.querySelector("input"),v=h.value;h.value=n;const m=h.closest(".js-filer-dropzone");m&&m.classList.add("js-object-attached"),r&&u&&(u.src=r,u.classList.remove("hidden"),u.removeAttribute("srcset")),d&&(d.textContent=i),f&&f.classList.remove("hidden"),a.classList.add("related-lookup-change"),c&&c.classList.add("related-lookup-change"),o&&c&&c.setAttribute("href",`${o}?_edit_from_widget=1`),p&&p.classList.add("hidden"),v!==n&&h.dispatchEvent(new Event("change",{bubbles:!0})),t.close()},window.dismissRelatedFolderLookupPopup=(t,n,r)=>{const i=e(t.name),o=document.getElementById(i);if(!o)return;const s=o.closest(".filerFile");if(!s)return;const a=s.querySelector(".thumbnail_img"),l=document.getElementById(`id_${i}_clear`),c=document.getElementById(`id_${i}`),u=s.querySelector(".description_text"),d=document.getElementById(i);c&&(c.value=n),a&&a.classList.remove("hidden"),u&&(u.textContent=r),l&&l.classList.remove("hidden"),d&&d.classList.add("hidden"),t.close()},document.addEventListener("DOMContentLoaded",()=>{document.querySelectorAll(".js-dismiss-popup").forEach(e=>{e.addEventListener("click",function(e){e.preventDefault();const t=this.dataset.fileId,n=this.dataset.iconUrl,r=this.dataset.label;if(this.classList.contains("js-dismiss-image")){const e=this.dataset.changeUrl||"";window.opener.dismissRelatedImageLookupPopup(window,t,n,r,e)}else this.classList.contains("js-dismiss-folder")&&window.opener.dismissRelatedFolderLookupPopup(window,t,r)})});const e=document.getElementById("popup-dismiss-data");if(e&&window.opener){const t=e.dataset.pk,n=e.dataset.label;window.opener.dismissRelatedPopup(window,t,n)}})},221(){"use strict";window.Cl=window.Cl||{},Cl.filerTooltip=()=>{const e=".js-filer-tooltip";document.querySelectorAll(e).forEach(t=>{t.addEventListener("mouseover",function(){const t=this.getAttribute("title");if(!t)return;this.dataset.filerTooltip=t,this.removeAttribute("title");const n=document.createElement("p");n.className="filer-tooltip",n.textContent=t;const r=document.querySelector(e);r&&r.appendChild(n)}),t.addEventListener("mouseout",function(){const e=this.dataset.filerTooltip;e&&this.setAttribute("title",e),document.querySelectorAll(".filer-tooltip").forEach(e=>{e.remove()})})})}},472(){"use strict";document.addEventListener("DOMContentLoaded",()=>{const e=e=>{e.preventDefault();const t=e.currentTarget,n=t.closest(".filerFile");if(!n)return;const r=n.querySelector("input"),i=n.querySelector(".thumbnail_img"),o=n.querySelector(".description_text"),s=n.querySelector(".lookup"),a=n.querySelector(".edit"),l=n.parentElement.querySelector(".dz-message"),c="hidden";if(t.classList.add(c),r&&(r.value=""),i){i.classList.add(c);var u=i.parentElement;"A"===u.tagName&&u.removeAttribute("href")}s&&s.classList.remove("related-lookup-change"),a&&a.classList.remove("related-lookup-change"),l&&l.classList.remove(c),o&&(o.textContent="")};document.querySelectorAll(".filerFile .vForeignKeyRawIdAdminField").forEach(e=>{e.setAttribute("type","hidden")}),document.querySelectorAll(".filerFile .filerClearer").forEach(t=>{t.addEventListener("click",e)})})},628(e){var t;self,t=function(){return function(){var e={3099:function(e){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},6077:function(e,t,n){var r=n(111);e.exports=function(e){if(!r(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},1223:function(e,t,n){var r=n(5112),i=n(30),o=n(3070),s=r("unscopables"),a=Array.prototype;null==a[s]&&o.f(a,s,{configurable:!0,value:i(null)}),e.exports=function(e){a[s][e]=!0}},1530:function(e,t,n){"use strict";var r=n(8710).charAt;e.exports=function(e,t,n){return t+(n?r(e,t).length:1)}},5787:function(e){e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e}},9670:function(e,t,n){var r=n(111);e.exports=function(e){if(!r(e))throw TypeError(String(e)+" is not an object");return e}},4019:function(e){e.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},260:function(e,t,n){"use strict";var r,i=n(4019),o=n(9781),s=n(7854),a=n(111),l=n(6656),c=n(648),u=n(8880),d=n(1320),f=n(3070).f,p=n(9518),h=n(7674),v=n(5112),m=n(9711),y=s.Int8Array,g=y&&y.prototype,b=s.Uint8ClampedArray,w=b&&b.prototype,x=y&&p(y),E=g&&p(g),S=Object.prototype,k=S.isPrototypeOf,L=v("toStringTag"),A=m("TYPED_ARRAY_TAG"),C=i&&!!h&&"Opera"!==c(s.opera),_=!1,T={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},F={BigInt64Array:8,BigUint64Array:8},I=function(e){if(!a(e))return!1;var t=c(e);return l(T,t)||l(F,t)};for(r in T)s[r]||(C=!1);if((!C||"function"!=typeof x||x===Function.prototype)&&(x=function(){throw TypeError("Incorrect invocation")},C))for(r in T)s[r]&&h(s[r],x);if((!C||!E||E===S)&&(E=x.prototype,C))for(r in T)s[r]&&h(s[r].prototype,E);if(C&&p(w)!==E&&h(w,E),o&&!l(E,L))for(r in _=!0,f(E,L,{get:function(){return a(this)?this[A]:void 0}}),T)s[r]&&u(s[r],A,r);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:C,TYPED_ARRAY_TAG:_&&A,aTypedArray:function(e){if(I(e))return e;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(e){if(h){if(k.call(x,e))return e}else for(var t in T)if(l(T,r)){var n=s[t];if(n&&(e===n||k.call(n,e)))return e}throw TypeError("Target is not a typed array constructor")},exportTypedArrayMethod:function(e,t,n){if(o){if(n)for(var r in T){var i=s[r];i&&l(i.prototype,e)&&delete i.prototype[e]}E[e]&&!n||d(E,e,n?t:C&&g[e]||t)}},exportTypedArrayStaticMethod:function(e,t,n){var r,i;if(o){if(h){if(n)for(r in T)(i=s[r])&&l(i,e)&&delete i[e];if(x[e]&&!n)return;try{return d(x,e,n?t:C&&y[e]||t)}catch(e){}}for(r in T)!(i=s[r])||i[e]&&!n||d(i,e,t)}},isView:function(e){if(!a(e))return!1;var t=c(e);return"DataView"===t||l(T,t)||l(F,t)},isTypedArray:I,TypedArray:x,TypedArrayPrototype:E}},3331:function(e,t,n){"use strict";var r=n(7854),i=n(9781),o=n(4019),s=n(8880),a=n(2248),l=n(7293),c=n(5787),u=n(9958),d=n(7466),f=n(7067),p=n(1179),h=n(9518),v=n(7674),m=n(8006).f,y=n(3070).f,g=n(1285),b=n(8003),w=n(9909),x=w.get,E=w.set,S="ArrayBuffer",k="DataView",L="prototype",A="Wrong index",C=r[S],_=C,T=r[k],F=T&&T[L],I=Object.prototype,M=r.RangeError,R=p.pack,z=p.unpack,q=function(e){return[255&e]},U=function(e){return[255&e,e>>8&255]},j=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},O=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},P=function(e){return R(e,23,4)},D=function(e){return R(e,52,8)},N=function(e,t){y(e[L],t,{get:function(){return x(this)[t]}})},B=function(e,t,n,r){var i=f(n),o=x(e);if(i+t>o.byteLength)throw M(A);var s=x(o.buffer).bytes,a=i+o.byteOffset,l=s.slice(a,a+t);return r?l:l.reverse()},$=function(e,t,n,r,i,o){var s=f(n),a=x(e);if(s+t>a.byteLength)throw M(A);for(var l=x(a.buffer).bytes,c=s+a.byteOffset,u=r(+i),d=0;dG;)(W=Y[G++])in _||s(_,W,C[W]);H.constructor=_}v&&h(F)!==I&&v(F,I);var Q=new T(new _(2)),X=F.setInt8;Q.setInt8(0,2147483648),Q.setInt8(1,2147483649),!Q.getInt8(0)&&Q.getInt8(1)||a(F,{setInt8:function(e,t){X.call(this,e,t<<24>>24)},setUint8:function(e,t){X.call(this,e,t<<24>>24)}},{unsafe:!0})}else _=function(e){c(this,_,S);var t=f(e);E(this,{bytes:g.call(new Array(t),0),byteLength:t}),i||(this.byteLength=t)},T=function(e,t,n){c(this,T,k),c(e,_,k);var r=x(e).byteLength,o=u(t);if(o<0||o>r)throw M("Wrong offset");if(o+(n=void 0===n?r-o:d(n))>r)throw M("Wrong length");E(this,{buffer:e,byteLength:n,byteOffset:o}),i||(this.buffer=e,this.byteLength=n,this.byteOffset=o)},i&&(N(_,"byteLength"),N(T,"buffer"),N(T,"byteLength"),N(T,"byteOffset")),a(T[L],{getInt8:function(e){return B(this,1,e)[0]<<24>>24},getUint8:function(e){return B(this,1,e)[0]},getInt16:function(e){var t=B(this,2,e,arguments.length>1?arguments[1]:void 0);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=B(this,2,e,arguments.length>1?arguments[1]:void 0);return t[1]<<8|t[0]},getInt32:function(e){return O(B(this,4,e,arguments.length>1?arguments[1]:void 0))},getUint32:function(e){return O(B(this,4,e,arguments.length>1?arguments[1]:void 0))>>>0},getFloat32:function(e){return z(B(this,4,e,arguments.length>1?arguments[1]:void 0),23)},getFloat64:function(e){return z(B(this,8,e,arguments.length>1?arguments[1]:void 0),52)},setInt8:function(e,t){$(this,1,e,q,t)},setUint8:function(e,t){$(this,1,e,q,t)},setInt16:function(e,t){$(this,2,e,U,t,arguments.length>2?arguments[2]:void 0)},setUint16:function(e,t){$(this,2,e,U,t,arguments.length>2?arguments[2]:void 0)},setInt32:function(e,t){$(this,4,e,j,t,arguments.length>2?arguments[2]:void 0)},setUint32:function(e,t){$(this,4,e,j,t,arguments.length>2?arguments[2]:void 0)},setFloat32:function(e,t){$(this,4,e,P,t,arguments.length>2?arguments[2]:void 0)},setFloat64:function(e,t){$(this,8,e,D,t,arguments.length>2?arguments[2]:void 0)}});b(_,S),b(T,k),e.exports={ArrayBuffer:_,DataView:T}},1048:function(e,t,n){"use strict";var r=n(7908),i=n(1400),o=n(7466),s=Math.min;e.exports=[].copyWithin||function(e,t){var n=r(this),a=o(n.length),l=i(e,a),c=i(t,a),u=arguments.length>2?arguments[2]:void 0,d=s((void 0===u?a:i(u,a))-c,a-l),f=1;for(c0;)c in n?n[l]=n[c]:delete n[l],l+=f,c+=f;return n}},1285:function(e,t,n){"use strict";var r=n(7908),i=n(1400),o=n(7466);e.exports=function(e){for(var t=r(this),n=o(t.length),s=arguments.length,a=i(s>1?arguments[1]:void 0,n),l=s>2?arguments[2]:void 0,c=void 0===l?n:i(l,n);c>a;)t[a++]=e;return t}},8533:function(e,t,n){"use strict";var r=n(2092).forEach,i=n(9341)("forEach");e.exports=i?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}},8457:function(e,t,n){"use strict";var r=n(9974),i=n(7908),o=n(3411),s=n(7659),a=n(7466),l=n(6135),c=n(1246);e.exports=function(e){var t,n,u,d,f,p,h=i(e),v="function"==typeof this?this:Array,m=arguments.length,y=m>1?arguments[1]:void 0,g=void 0!==y,b=c(h),w=0;if(g&&(y=r(y,m>2?arguments[2]:void 0,2)),null==b||v==Array&&s(b))for(n=new v(t=a(h.length));t>w;w++)p=g?y(h[w],w):h[w],l(n,w,p);else for(f=(d=b.call(h)).next,n=new v;!(u=f.call(d)).done;w++)p=g?o(d,y,[u.value,w],!0):u.value,l(n,w,p);return n.length=w,n}},1318:function(e,t,n){var r=n(5656),i=n(7466),o=n(1400),s=function(e){return function(t,n,s){var a,l=r(t),c=i(l.length),u=o(s,c);if(e&&n!=n){for(;c>u;)if((a=l[u++])!=a)return!0}else for(;c>u;u++)if((e||u in l)&&l[u]===n)return e||u||0;return!e&&-1}};e.exports={includes:s(!0),indexOf:s(!1)}},2092:function(e,t,n){var r=n(9974),i=n(8361),o=n(7908),s=n(7466),a=n(5417),l=[].push,c=function(e){var t=1==e,n=2==e,c=3==e,u=4==e,d=6==e,f=7==e,p=5==e||d;return function(h,v,m,y){for(var g,b,w=o(h),x=i(w),E=r(v,m,3),S=s(x.length),k=0,L=y||a,A=t?L(h,S):n||f?L(h,0):void 0;S>k;k++)if((p||k in x)&&(b=E(g=x[k],k,w),e))if(t)A[k]=b;else if(b)switch(e){case 3:return!0;case 5:return g;case 6:return k;case 2:l.call(A,g)}else switch(e){case 4:return!1;case 7:l.call(A,g)}return d?-1:c||u?u:A}};e.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterOut:c(7)}},6583:function(e,t,n){"use strict";var r=n(5656),i=n(9958),o=n(7466),s=n(9341),a=Math.min,l=[].lastIndexOf,c=!!l&&1/[1].lastIndexOf(1,-0)<0,u=s("lastIndexOf"),d=c||!u;e.exports=d?function(e){if(c)return l.apply(this,arguments)||0;var t=r(this),n=o(t.length),s=n-1;for(arguments.length>1&&(s=a(s,i(arguments[1]))),s<0&&(s=n+s);s>=0;s--)if(s in t&&t[s]===e)return s||0;return-1}:l},1194:function(e,t,n){var r=n(7293),i=n(5112),o=n(7392),s=i("species");e.exports=function(e){return o>=51||!r(function(){var t=[];return(t.constructor={})[s]=function(){return{foo:1}},1!==t[e](Boolean).foo})}},9341:function(e,t,n){"use strict";var r=n(7293);e.exports=function(e,t){var n=[][e];return!!n&&r(function(){n.call(null,t||function(){throw 1},1)})}},3671:function(e,t,n){var r=n(3099),i=n(7908),o=n(8361),s=n(7466),a=function(e){return function(t,n,a,l){r(n);var c=i(t),u=o(c),d=s(c.length),f=e?d-1:0,p=e?-1:1;if(a<2)for(;;){if(f in u){l=u[f],f+=p;break}if(f+=p,e?f<0:d<=f)throw TypeError("Reduce of empty array with no initial value")}for(;e?f>=0:d>f;f+=p)f in u&&(l=n(l,u[f],f,c));return l}};e.exports={left:a(!1),right:a(!0)}},5417:function(e,t,n){var r=n(111),i=n(3157),o=n(5112)("species");e.exports=function(e,t){var n;return i(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!i(n.prototype)?r(n)&&null===(n=n[o])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)}},3411:function(e,t,n){var r=n(9670),i=n(9212);e.exports=function(e,t,n,o){try{return o?t(r(n)[0],n[1]):t(n)}catch(t){throw i(e),t}}},7072:function(e,t,n){var r=n(5112)("iterator"),i=!1;try{var o=0,s={next:function(){return{done:!!o++}},return:function(){i=!0}};s[r]=function(){return this},Array.from(s,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var n=!1;try{var o={};o[r]=function(){return{next:function(){return{done:n=!0}}}},e(o)}catch(e){}return n}},4326:function(e){var t={}.toString;e.exports=function(e){return t.call(e).slice(8,-1)}},648:function(e,t,n){var r=n(1694),i=n(4326),o=n(5112)("toStringTag"),s="Arguments"==i(function(){return arguments}());e.exports=r?i:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),o))?n:s?i(t):"Object"==(r=i(t))&&"function"==typeof t.callee?"Arguments":r}},9920:function(e,t,n){var r=n(6656),i=n(3887),o=n(1236),s=n(3070);e.exports=function(e,t){for(var n=i(t),a=s.f,l=o.f,c=0;c=74)&&(r=s.match(/Chrome\/(\d+)/))&&(i=r[1]),e.exports=i&&+i},748:function(e){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},2109:function(e,t,n){var r=n(7854),i=n(1236).f,o=n(8880),s=n(1320),a=n(3505),l=n(9920),c=n(4705);e.exports=function(e,t){var n,u,d,f,p,h=e.target,v=e.global,m=e.stat;if(n=v?r:m?r[h]||a(h,{}):(r[h]||{}).prototype)for(u in t){if(f=t[u],d=e.noTargetGet?(p=i(n,u))&&p.value:n[u],!c(v?u:h+(m?".":"#")+u,e.forced)&&void 0!==d){if(typeof f==typeof d)continue;l(f,d)}(e.sham||d&&d.sham)&&o(f,"sham",!0),s(n,u,f,e)}}},7293:function(e){e.exports=function(e){try{return!!e()}catch(e){return!0}}},7007:function(e,t,n){"use strict";n(4916);var r=n(1320),i=n(7293),o=n(5112),s=n(2261),a=n(8880),l=o("species"),c=!i(function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")}),u="$0"==="a".replace(/./,"$0"),d=o("replace"),f=!!/./[d]&&""===/./[d]("a","$0"),p=!i(function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]});e.exports=function(e,t,n,d){var h=o(e),v=!i(function(){var t={};return t[h]=function(){return 7},7!=""[e](t)}),m=v&&!i(function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[l]=function(){return n},n.flags="",n[h]=/./[h]),n.exec=function(){return t=!0,null},n[h](""),!t});if(!v||!m||"replace"===e&&(!c||!u||f)||"split"===e&&!p){var y=/./[h],g=n(h,""[e],function(e,t,n,r,i){return t.exec===s?v&&!i?{done:!0,value:y.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}},{REPLACE_KEEPS_$0:u,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:f}),b=g[0],w=g[1];r(String.prototype,e,b),r(RegExp.prototype,h,2==t?function(e,t){return w.call(e,this,t)}:function(e){return w.call(e,this)})}d&&a(RegExp.prototype[h],"sham",!0)}},9974:function(e,t,n){var r=n(3099);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}}},5005:function(e,t,n){var r=n(857),i=n(7854),o=function(e){return"function"==typeof e?e:void 0};e.exports=function(e,t){return arguments.length<2?o(r[e])||o(i[e]):r[e]&&r[e][t]||i[e]&&i[e][t]}},1246:function(e,t,n){var r=n(648),i=n(7497),o=n(5112)("iterator");e.exports=function(e){if(null!=e)return e[o]||e["@@iterator"]||i[r(e)]}},8554:function(e,t,n){var r=n(9670),i=n(1246);e.exports=function(e){var t=i(e);if("function"!=typeof t)throw TypeError(String(e)+" is not iterable");return r(t.call(e))}},647:function(e,t,n){var r=n(7908),i=Math.floor,o="".replace,s=/\$([$&'`]|\d\d?|<[^>]*>)/g,a=/\$([$&'`]|\d\d?)/g;e.exports=function(e,t,n,l,c,u){var d=n+e.length,f=l.length,p=a;return void 0!==c&&(c=r(c),p=s),o.call(u,p,function(r,o){var s;switch(o.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,n);case"'":return t.slice(d);case"<":s=c[o.slice(1,-1)];break;default:var a=+o;if(0===a)return r;if(a>f){var u=i(a/10);return 0===u?r:u<=f?void 0===l[u-1]?o.charAt(1):l[u-1]+o.charAt(1):r}s=l[a-1]}return void 0===s?"":s})}},7854:function(e,t,n){var r=function(e){return e&&e.Math==Math&&e};e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},6656:function(e){var t={}.hasOwnProperty;e.exports=function(e,n){return t.call(e,n)}},3501:function(e){e.exports={}},490:function(e,t,n){var r=n(5005);e.exports=r("document","documentElement")},4664:function(e,t,n){var r=n(9781),i=n(7293),o=n(317);e.exports=!r&&!i(function(){return 7!=Object.defineProperty(o("div"),"a",{get:function(){return 7}}).a})},1179:function(e){var t=Math.abs,n=Math.pow,r=Math.floor,i=Math.log,o=Math.LN2;e.exports={pack:function(e,s,a){var l,c,u,d=new Array(a),f=8*a-s-1,p=(1<>1,v=23===s?n(2,-24)-n(2,-77):0,m=e<0||0===e&&1/e<0?1:0,y=0;for((e=t(e))!=e||e===1/0?(c=e!=e?1:0,l=p):(l=r(i(e)/o),e*(u=n(2,-l))<1&&(l--,u*=2),(e+=l+h>=1?v/u:v*n(2,1-h))*u>=2&&(l++,u/=2),l+h>=p?(c=0,l=p):l+h>=1?(c=(e*u-1)*n(2,s),l+=h):(c=e*n(2,h-1)*n(2,s),l=0));s>=8;d[y++]=255&c,c/=256,s-=8);for(l=l<0;d[y++]=255&l,l/=256,f-=8);return d[--y]|=128*m,d},unpack:function(e,t){var r,i=e.length,o=8*i-t-1,s=(1<>1,l=o-7,c=i-1,u=e[c--],d=127&u;for(u>>=7;l>0;d=256*d+e[c],c--,l-=8);for(r=d&(1<<-l)-1,d>>=-l,l+=t;l>0;r=256*r+e[c],c--,l-=8);if(0===d)d=1-a;else{if(d===s)return r?NaN:u?-1/0:1/0;r+=n(2,t),d-=a}return(u?-1:1)*r*n(2,d-t)}}},8361:function(e,t,n){var r=n(7293),i=n(4326),o="".split;e.exports=r(function(){return!Object("z").propertyIsEnumerable(0)})?function(e){return"String"==i(e)?o.call(e,""):Object(e)}:Object},9587:function(e,t,n){var r=n(111),i=n(7674);e.exports=function(e,t,n){var o,s;return i&&"function"==typeof(o=t.constructor)&&o!==n&&r(s=o.prototype)&&s!==n.prototype&&i(e,s),e}},2788:function(e,t,n){var r=n(5465),i=Function.toString;"function"!=typeof r.inspectSource&&(r.inspectSource=function(e){return i.call(e)}),e.exports=r.inspectSource},9909:function(e,t,n){var r,i,o,s=n(8536),a=n(7854),l=n(111),c=n(8880),u=n(6656),d=n(5465),f=n(6200),p=n(3501),h=a.WeakMap;if(s){var v=d.state||(d.state=new h),m=v.get,y=v.has,g=v.set;r=function(e,t){return t.facade=e,g.call(v,e,t),t},i=function(e){return m.call(v,e)||{}},o=function(e){return y.call(v,e)}}else{var b=f("state");p[b]=!0,r=function(e,t){return t.facade=e,c(e,b,t),t},i=function(e){return u(e,b)?e[b]:{}},o=function(e){return u(e,b)}}e.exports={set:r,get:i,has:o,enforce:function(e){return o(e)?i(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!l(t)||(n=i(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}}},7659:function(e,t,n){var r=n(5112),i=n(7497),o=r("iterator"),s=Array.prototype;e.exports=function(e){return void 0!==e&&(i.Array===e||s[o]===e)}},3157:function(e,t,n){var r=n(4326);e.exports=Array.isArray||function(e){return"Array"==r(e)}},4705:function(e,t,n){var r=n(7293),i=/#|\.prototype\./,o=function(e,t){var n=a[s(e)];return n==c||n!=l&&("function"==typeof t?r(t):!!t)},s=o.normalize=function(e){return String(e).replace(i,".").toLowerCase()},a=o.data={},l=o.NATIVE="N",c=o.POLYFILL="P";e.exports=o},111:function(e){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},1913:function(e){e.exports=!1},7850:function(e,t,n){var r=n(111),i=n(4326),o=n(5112)("match");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[o])?!!t:"RegExp"==i(e))}},9212:function(e,t,n){var r=n(9670);e.exports=function(e){var t=e.return;if(void 0!==t)return r(t.call(e)).value}},3383:function(e,t,n){"use strict";var r,i,o,s=n(7293),a=n(9518),l=n(8880),c=n(6656),u=n(5112),d=n(1913),f=u("iterator"),p=!1;[].keys&&("next"in(o=[].keys())?(i=a(a(o)))!==Object.prototype&&(r=i):p=!0);var h=null==r||s(function(){var e={};return r[f].call(e)!==e});h&&(r={}),d&&!h||c(r,f)||l(r,f,function(){return this}),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:p}},7497:function(e){e.exports={}},133:function(e,t,n){var r=n(7293);e.exports=!!Object.getOwnPropertySymbols&&!r(function(){return!String(Symbol())})},590:function(e,t,n){var r=n(7293),i=n(5112),o=n(1913),s=i("iterator");e.exports=!r(function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,n="";return e.pathname="c%20d",t.forEach(function(e,r){t.delete("b"),n+=r+e}),o&&!e.toJSON||!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[s]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==n||"x"!==new URL("http://x",void 0).host})},8536:function(e,t,n){var r=n(7854),i=n(2788),o=r.WeakMap;e.exports="function"==typeof o&&/native code/.test(i(o))},1574:function(e,t,n){"use strict";var r=n(9781),i=n(7293),o=n(1956),s=n(5181),a=n(5296),l=n(7908),c=n(8361),u=Object.assign,d=Object.defineProperty;e.exports=!u||i(function(){if(r&&1!==u({b:1},u(d({},"a",{enumerable:!0,get:function(){d(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach(function(e){t[e]=e}),7!=u({},e)[n]||o(u({},t)).join("")!=i})?function(e,t){for(var n=l(e),i=arguments.length,u=1,d=s.f,f=a.f;i>u;)for(var p,h=c(arguments[u++]),v=d?o(h).concat(d(h)):o(h),m=v.length,y=0;m>y;)p=v[y++],r&&!f.call(h,p)||(n[p]=h[p]);return n}:u},30:function(e,t,n){var r,i=n(9670),o=n(6048),s=n(748),a=n(3501),l=n(490),c=n(317),u=n(6200),d="prototype",f="script",p=u("IE_PROTO"),h=function(){},v=function(e){return"<"+f+">"+e+""},m=function(){try{r=document.domain&&new ActiveXObject("htmlfile")}catch(e){}var e,t,n;m=r?function(e){e.write(v("")),e.close();var t=e.parentWindow.Object;return e=null,t}(r):(t=c("iframe"),n="java"+f+":",t.style.display="none",l.appendChild(t),t.src=String(n),(e=t.contentWindow.document).open(),e.write(v("document.F=Object")),e.close(),e.F);for(var i=s.length;i--;)delete m[d][s[i]];return m()};a[p]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(h[d]=i(e),n=new h,h[d]=null,n[p]=e):n=m(),void 0===t?n:o(n,t)}},6048:function(e,t,n){var r=n(9781),i=n(3070),o=n(9670),s=n(1956);e.exports=r?Object.defineProperties:function(e,t){o(e);for(var n,r=s(t),a=r.length,l=0;a>l;)i.f(e,n=r[l++],t[n]);return e}},3070:function(e,t,n){var r=n(9781),i=n(4664),o=n(9670),s=n(7593),a=Object.defineProperty;t.f=r?a:function(e,t,n){if(o(e),t=s(t,!0),o(n),i)try{return a(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},1236:function(e,t,n){var r=n(9781),i=n(5296),o=n(9114),s=n(5656),a=n(7593),l=n(6656),c=n(4664),u=Object.getOwnPropertyDescriptor;t.f=r?u:function(e,t){if(e=s(e),t=a(t,!0),c)try{return u(e,t)}catch(e){}if(l(e,t))return o(!i.f.call(e,t),e[t])}},8006:function(e,t,n){var r=n(6324),i=n(748).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,i)}},5181:function(e,t){t.f=Object.getOwnPropertySymbols},9518:function(e,t,n){var r=n(6656),i=n(7908),o=n(6200),s=n(8544),a=o("IE_PROTO"),l=Object.prototype;e.exports=s?Object.getPrototypeOf:function(e){return e=i(e),r(e,a)?e[a]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?l:null}},6324:function(e,t,n){var r=n(6656),i=n(5656),o=n(1318).indexOf,s=n(3501);e.exports=function(e,t){var n,a=i(e),l=0,c=[];for(n in a)!r(s,n)&&r(a,n)&&c.push(n);for(;t.length>l;)r(a,n=t[l++])&&(~o(c,n)||c.push(n));return c}},1956:function(e,t,n){var r=n(6324),i=n(748);e.exports=Object.keys||function(e){return r(e,i)}},5296:function(e,t){"use strict";var n={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,i=r&&!n.call({1:2},1);t.f=i?function(e){var t=r(this,e);return!!t&&t.enumerable}:n},7674:function(e,t,n){var r=n(9670),i=n(6077);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,o){return r(n),i(o),t?e.call(n,o):n.__proto__=o,n}}():void 0)},288:function(e,t,n){"use strict";var r=n(1694),i=n(648);e.exports=r?{}.toString:function(){return"[object "+i(this)+"]"}},3887:function(e,t,n){var r=n(5005),i=n(8006),o=n(5181),s=n(9670);e.exports=r("Reflect","ownKeys")||function(e){var t=i.f(s(e)),n=o.f;return n?t.concat(n(e)):t}},857:function(e,t,n){var r=n(7854);e.exports=r},2248:function(e,t,n){var r=n(1320);e.exports=function(e,t,n){for(var i in t)r(e,i,t[i],n);return e}},1320:function(e,t,n){var r=n(7854),i=n(8880),o=n(6656),s=n(3505),a=n(2788),l=n(9909),c=l.get,u=l.enforce,d=String(String).split("String");(e.exports=function(e,t,n,a){var l,c=!!a&&!!a.unsafe,f=!!a&&!!a.enumerable,p=!!a&&!!a.noTargetGet;"function"==typeof n&&("string"!=typeof t||o(n,"name")||i(n,"name",t),(l=u(n)).source||(l.source=d.join("string"==typeof t?t:""))),e!==r?(c?!p&&e[t]&&(f=!0):delete e[t],f?e[t]=n:i(e,t,n)):f?e[t]=n:s(t,n)})(Function.prototype,"toString",function(){return"function"==typeof this&&c(this).source||a(this)})},7651:function(e,t,n){var r=n(4326),i=n(2261);e.exports=function(e,t){var n=e.exec;if("function"==typeof n){var o=n.call(e,t);if("object"!=typeof o)throw TypeError("RegExp exec method returned something other than an Object or null");return o}if("RegExp"!==r(e))throw TypeError("RegExp#exec called on incompatible receiver");return i.call(e,t)}},2261:function(e,t,n){"use strict";var r,i,o=n(7066),s=n(2999),a=RegExp.prototype.exec,l=String.prototype.replace,c=a,u=(r=/a/,i=/b*/g,a.call(r,"a"),a.call(i,"a"),0!==r.lastIndex||0!==i.lastIndex),d=s.UNSUPPORTED_Y||s.BROKEN_CARET,f=void 0!==/()??/.exec("")[1];(u||f||d)&&(c=function(e){var t,n,r,i,s=this,c=d&&s.sticky,p=o.call(s),h=s.source,v=0,m=e;return c&&(-1===(p=p.replace("y","")).indexOf("g")&&(p+="g"),m=String(e).slice(s.lastIndex),s.lastIndex>0&&(!s.multiline||s.multiline&&"\n"!==e[s.lastIndex-1])&&(h="(?: "+h+")",m=" "+m,v++),n=new RegExp("^(?:"+h+")",p)),f&&(n=new RegExp("^"+h+"$(?!\\s)",p)),u&&(t=s.lastIndex),r=a.call(c?n:s,m),c?r?(r.input=r.input.slice(v),r[0]=r[0].slice(v),r.index=s.lastIndex,s.lastIndex+=r[0].length):s.lastIndex=0:u&&r&&(s.lastIndex=s.global?r.index+r[0].length:t),f&&r&&r.length>1&&l.call(r[0],n,function(){for(i=1;i=c?e?"":void 0:(o=a.charCodeAt(l))<55296||o>56319||l+1===c||(s=a.charCodeAt(l+1))<56320||s>57343?e?a.charAt(l):o:e?a.slice(l,l+2):s-56320+(o-55296<<10)+65536}};e.exports={codeAt:o(!1),charAt:o(!0)}},3197:function(e){"use strict";var t=2147483647,n=/[^\0-\u007E]/,r=/[.\u3002\uFF0E\uFF61]/g,i="Overflow: input needs wider integers to process",o=Math.floor,s=String.fromCharCode,a=function(e){return e+22+75*(e<26)},l=function(e,t,n){var r=0;for(e=n?o(e/700):e>>1,e+=o(e/t);e>455;r+=36)e=o(e/35);return o(r+36*e/(e+38))},c=function(e){var n=[];e=function(e){for(var t=[],n=0,r=e.length;n=55296&&i<=56319&&n=d&&co((t-f)/y))throw RangeError(i);for(f+=(m-d)*y,d=m,r=0;rt)throw RangeError(i);if(c==d){for(var g=f,b=36;;b+=36){var w=b<=p?1:b>=p+26?26:b-p;if(g0?n:t)(e)}},7466:function(e,t,n){var r=n(9958),i=Math.min;e.exports=function(e){return e>0?i(r(e),9007199254740991):0}},7908:function(e,t,n){var r=n(4488);e.exports=function(e){return Object(r(e))}},4590:function(e,t,n){var r=n(3002);e.exports=function(e,t){var n=r(e);if(n%t)throw RangeError("Wrong offset");return n}},3002:function(e,t,n){var r=n(9958);e.exports=function(e){var t=r(e);if(t<0)throw RangeError("The argument can't be less than 0");return t}},7593:function(e,t,n){var r=n(111);e.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},1694:function(e,t,n){var r={};r[n(5112)("toStringTag")]="z",e.exports="[object z]"===String(r)},9843:function(e,t,n){"use strict";var r=n(2109),i=n(7854),o=n(9781),s=n(3832),a=n(260),l=n(3331),c=n(5787),u=n(9114),d=n(8880),f=n(7466),p=n(7067),h=n(4590),v=n(7593),m=n(6656),y=n(648),g=n(111),b=n(30),w=n(7674),x=n(8006).f,E=n(7321),S=n(2092).forEach,k=n(6340),L=n(3070),A=n(1236),C=n(9909),_=n(9587),T=C.get,F=C.set,I=L.f,M=A.f,R=Math.round,z=i.RangeError,q=l.ArrayBuffer,U=l.DataView,j=a.NATIVE_ARRAY_BUFFER_VIEWS,O=a.TYPED_ARRAY_TAG,P=a.TypedArray,D=a.TypedArrayPrototype,N=a.aTypedArrayConstructor,B=a.isTypedArray,$="BYTES_PER_ELEMENT",W="Wrong length",H=function(e,t){for(var n=0,r=t.length,i=new(N(e))(r);r>n;)i[n]=t[n++];return i},Y=function(e,t){I(e,t,{get:function(){return T(this)[t]}})},G=function(e){var t;return e instanceof q||"ArrayBuffer"==(t=y(e))||"SharedArrayBuffer"==t},Q=function(e,t){return B(e)&&"symbol"!=typeof t&&t in e&&String(+t)==String(t)},X=function(e,t){return Q(e,t=v(t,!0))?u(2,e[t]):M(e,t)},V=function(e,t,n){return!(Q(e,t=v(t,!0))&&g(n)&&m(n,"value"))||m(n,"get")||m(n,"set")||n.configurable||m(n,"writable")&&!n.writable||m(n,"enumerable")&&!n.enumerable?I(e,t,n):(e[t]=n.value,e)};o?(j||(A.f=X,L.f=V,Y(D,"buffer"),Y(D,"byteOffset"),Y(D,"byteLength"),Y(D,"length")),r({target:"Object",stat:!0,forced:!j},{getOwnPropertyDescriptor:X,defineProperty:V}),e.exports=function(e,t,n){var o=e.match(/\d+$/)[0]/8,a=e+(n?"Clamped":"")+"Array",l="get"+e,u="set"+e,v=i[a],m=v,y=m&&m.prototype,L={},A=function(e,t){I(e,t,{get:function(){return function(e,t){var n=T(e);return n.view[l](t*o+n.byteOffset,!0)}(this,t)},set:function(e){return function(e,t,r){var i=T(e);n&&(r=(r=R(r))<0?0:r>255?255:255&r),i.view[u](t*o+i.byteOffset,r,!0)}(this,t,e)},enumerable:!0})};j?s&&(m=t(function(e,t,n,r){return c(e,m,a),_(g(t)?G(t)?void 0!==r?new v(t,h(n,o),r):void 0!==n?new v(t,h(n,o)):new v(t):B(t)?H(m,t):E.call(m,t):new v(p(t)),e,m)}),w&&w(m,P),S(x(v),function(e){e in m||d(m,e,v[e])}),m.prototype=y):(m=t(function(e,t,n,r){c(e,m,a);var i,s,l,u=0,d=0;if(g(t)){if(!G(t))return B(t)?H(m,t):E.call(m,t);i=t,d=h(n,o);var v=t.byteLength;if(void 0===r){if(v%o)throw z(W);if((s=v-d)<0)throw z(W)}else if((s=f(r)*o)+d>v)throw z(W);l=s/o}else l=p(t),i=new q(s=l*o);for(F(e,{buffer:i,byteOffset:d,byteLength:s,length:l,view:new U(i)});uo;)a[o]=t[o++];return a}},7321:function(e,t,n){var r=n(7908),i=n(7466),o=n(1246),s=n(7659),a=n(9974),l=n(260).aTypedArrayConstructor;e.exports=function(e){var t,n,c,u,d,f,p=r(e),h=arguments.length,v=h>1?arguments[1]:void 0,m=void 0!==v,y=o(p);if(null!=y&&!s(y))for(f=(d=y.call(p)).next,p=[];!(u=f.call(d)).done;)p.push(u.value);for(m&&h>2&&(v=a(v,arguments[2],2)),n=i(p.length),c=new(l(this))(n),t=0;n>t;t++)c[t]=m?v(p[t],t):p[t];return c}},9711:function(e){var t=0,n=Math.random();e.exports=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++t+n).toString(36)}},3307:function(e,t,n){var r=n(133);e.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},5112:function(e,t,n){var r=n(7854),i=n(2309),o=n(6656),s=n(9711),a=n(133),l=n(3307),c=i("wks"),u=r.Symbol,d=l?u:u&&u.withoutSetter||s;e.exports=function(e){return o(c,e)||(a&&o(u,e)?c[e]=u[e]:c[e]=d("Symbol."+e)),c[e]}},1361:function(e){e.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},8264:function(e,t,n){"use strict";var r=n(2109),i=n(7854),o=n(3331),s=n(6340),a="ArrayBuffer",l=o[a];r({global:!0,forced:i[a]!==l},{ArrayBuffer:l}),s(a)},2222:function(e,t,n){"use strict";var r=n(2109),i=n(7293),o=n(3157),s=n(111),a=n(7908),l=n(7466),c=n(6135),u=n(5417),d=n(1194),f=n(5112),p=n(7392),h=f("isConcatSpreadable"),v=9007199254740991,m="Maximum allowed index exceeded",y=p>=51||!i(function(){var e=[];return e[h]=!1,e.concat()[0]!==e}),g=d("concat"),b=function(e){if(!s(e))return!1;var t=e[h];return void 0!==t?!!t:o(e)};r({target:"Array",proto:!0,forced:!y||!g},{concat:function(e){var t,n,r,i,o,s=a(this),d=u(s,0),f=0;for(t=-1,r=arguments.length;tv)throw TypeError(m);for(n=0;n=v)throw TypeError(m);c(d,f++,o)}return d.length=f,d}})},7327:function(e,t,n){"use strict";var r=n(2109),i=n(2092).filter;r({target:"Array",proto:!0,forced:!n(1194)("filter")},{filter:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}})},2772:function(e,t,n){"use strict";var r=n(2109),i=n(1318).indexOf,o=n(9341),s=[].indexOf,a=!!s&&1/[1].indexOf(1,-0)<0,l=o("indexOf");r({target:"Array",proto:!0,forced:a||!l},{indexOf:function(e){return a?s.apply(this,arguments)||0:i(this,e,arguments.length>1?arguments[1]:void 0)}})},6992:function(e,t,n){"use strict";var r=n(5656),i=n(1223),o=n(7497),s=n(9909),a=n(654),l="Array Iterator",c=s.set,u=s.getterFor(l);e.exports=a(Array,"Array",function(e,t){c(this,{type:l,target:r(e),index:0,kind:t})},function(){var e=u(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}},"values"),o.Arguments=o.Array,i("keys"),i("values"),i("entries")},1249:function(e,t,n){"use strict";var r=n(2109),i=n(2092).map;r({target:"Array",proto:!0,forced:!n(1194)("map")},{map:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}})},7042:function(e,t,n){"use strict";var r=n(2109),i=n(111),o=n(3157),s=n(1400),a=n(7466),l=n(5656),c=n(6135),u=n(5112),d=n(1194)("slice"),f=u("species"),p=[].slice,h=Math.max;r({target:"Array",proto:!0,forced:!d},{slice:function(e,t){var n,r,u,d=l(this),v=a(d.length),m=s(e,v),y=s(void 0===t?v:t,v);if(o(d)&&("function"!=typeof(n=d.constructor)||n!==Array&&!o(n.prototype)?i(n)&&null===(n=n[f])&&(n=void 0):n=void 0,n===Array||void 0===n))return p.call(d,m,y);for(r=new(void 0===n?Array:n)(h(y-m,0)),u=0;m9007199254740991)throw TypeError("Maximum allowed length exceeded");for(u=l(m,r),p=0;py-r+n;p--)delete m[p-1]}else if(n>r)for(p=y-r;p>g;p--)v=p+n-1,(h=p+r-1)in m?m[v]=m[h]:delete m[v];for(p=0;p=n.length?{value:void 0,done:!0}:(e=r(n,i),t.index+=e.length,{value:e,done:!1})})},4723:function(e,t,n){"use strict";var r=n(7007),i=n(9670),o=n(7466),s=n(4488),a=n(1530),l=n(7651);r("match",1,function(e,t,n){return[function(t){var n=s(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var s=i(e),c=String(this);if(!s.global)return l(s,c);var u=s.unicode;s.lastIndex=0;for(var d,f=[],p=0;null!==(d=l(s,c));){var h=String(d[0]);f[p]=h,""===h&&(s.lastIndex=a(c,o(s.lastIndex),u)),p++}return 0===p?null:f}]})},5306:function(e,t,n){"use strict";var r=n(7007),i=n(9670),o=n(7466),s=n(9958),a=n(4488),l=n(1530),c=n(647),u=n(7651),d=Math.max,f=Math.min,p=function(e){return void 0===e?e:String(e)};r("replace",2,function(e,t,n,r){var h=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,v=r.REPLACE_KEEPS_$0,m=h?"$":"$0";return[function(n,r){var i=a(this),o=null==n?void 0:n[e];return void 0!==o?o.call(n,i,r):t.call(String(i),n,r)},function(e,r){if(!h&&v||"string"==typeof r&&-1===r.indexOf(m)){var a=n(t,e,this,r);if(a.done)return a.value}var y=i(e),g=String(this),b="function"==typeof r;b||(r=String(r));var w=y.global;if(w){var x=y.unicode;y.lastIndex=0}for(var E=[];;){var S=u(y,g);if(null===S)break;if(E.push(S),!w)break;""===String(S[0])&&(y.lastIndex=l(g,o(y.lastIndex),x))}for(var k="",L=0,A=0;A=L&&(k+=g.slice(L,_)+R,L=_+C.length)}return k+g.slice(L)}]})},3123:function(e,t,n){"use strict";var r=n(7007),i=n(7850),o=n(9670),s=n(4488),a=n(6707),l=n(1530),c=n(7466),u=n(7651),d=n(2261),f=n(7293),p=[].push,h=Math.min,v=4294967295,m=!f(function(){return!RegExp(v,"y")});r("split",2,function(e,t,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var r=String(s(this)),o=void 0===n?v:n>>>0;if(0===o)return[];if(void 0===e)return[r];if(!i(e))return t.call(r,e,o);for(var a,l,c,u=[],f=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),h=0,m=new RegExp(e.source,f+"g");(a=d.call(m,r))&&!((l=m.lastIndex)>h&&(u.push(r.slice(h,a.index)),a.length>1&&a.index=o));)m.lastIndex===a.index&&m.lastIndex++;return h===r.length?!c&&m.test("")||u.push(""):u.push(r.slice(h)),u.length>o?u.slice(0,o):u}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var i=s(this),o=null==t?void 0:t[e];return void 0!==o?o.call(t,i,n):r.call(String(i),t,n)},function(e,i){var s=n(r,e,this,i,r!==t);if(s.done)return s.value;var d=o(e),f=String(this),p=a(d,RegExp),y=d.unicode,g=(d.ignoreCase?"i":"")+(d.multiline?"m":"")+(d.unicode?"u":"")+(m?"y":"g"),b=new p(m?d:"^(?:"+d.source+")",g),w=void 0===i?v:i>>>0;if(0===w)return[];if(0===f.length)return null===u(b,f)?[f]:[];for(var x=0,E=0,S=[];E2?arguments[2]:void 0)})},8927:function(e,t,n){"use strict";var r=n(260),i=n(2092).every,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("every",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},3105:function(e,t,n){"use strict";var r=n(260),i=n(1285),o=r.aTypedArray;(0,r.exportTypedArrayMethod)("fill",function(e){return i.apply(o(this),arguments)})},5035:function(e,t,n){"use strict";var r=n(260),i=n(2092).filter,o=n(3074),s=r.aTypedArray;(0,r.exportTypedArrayMethod)("filter",function(e){var t=i(s(this),e,arguments.length>1?arguments[1]:void 0);return o(this,t)})},7174:function(e,t,n){"use strict";var r=n(260),i=n(2092).findIndex,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("findIndex",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},4345:function(e,t,n){"use strict";var r=n(260),i=n(2092).find,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("find",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},2846:function(e,t,n){"use strict";var r=n(260),i=n(2092).forEach,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("forEach",function(e){i(o(this),e,arguments.length>1?arguments[1]:void 0)})},4731:function(e,t,n){"use strict";var r=n(260),i=n(1318).includes,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("includes",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},7209:function(e,t,n){"use strict";var r=n(260),i=n(1318).indexOf,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("indexOf",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},6319:function(e,t,n){"use strict";var r=n(7854),i=n(260),o=n(6992),s=n(5112)("iterator"),a=r.Uint8Array,l=o.values,c=o.keys,u=o.entries,d=i.aTypedArray,f=i.exportTypedArrayMethod,p=a&&a.prototype[s],h=!!p&&("values"==p.name||null==p.name),v=function(){return l.call(d(this))};f("entries",function(){return u.call(d(this))}),f("keys",function(){return c.call(d(this))}),f("values",v,!h),f(s,v,!h)},8867:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=[].join;o("join",function(e){return s.apply(i(this),arguments)})},7789:function(e,t,n){"use strict";var r=n(260),i=n(6583),o=r.aTypedArray;(0,r.exportTypedArrayMethod)("lastIndexOf",function(e){return i.apply(o(this),arguments)})},3739:function(e,t,n){"use strict";var r=n(260),i=n(2092).map,o=n(6707),s=r.aTypedArray,a=r.aTypedArrayConstructor;(0,r.exportTypedArrayMethod)("map",function(e){return i(s(this),e,arguments.length>1?arguments[1]:void 0,function(e,t){return new(a(o(e,e.constructor)))(t)})})},4483:function(e,t,n){"use strict";var r=n(260),i=n(3671).right,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("reduceRight",function(e){return i(o(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)})},9368:function(e,t,n){"use strict";var r=n(260),i=n(3671).left,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("reduce",function(e){return i(o(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)})},2056:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=Math.floor;o("reverse",function(){for(var e,t=this,n=i(t).length,r=s(n/2),o=0;o1?arguments[1]:void 0,1),n=this.length,r=s(e),a=i(r.length),c=0;if(a+t>n)throw RangeError("Wrong length");for(;co;)u[o]=n[o++];return u},o(function(){new Int8Array(1).slice()}))},7462:function(e,t,n){"use strict";var r=n(260),i=n(2092).some,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("some",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},3824:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=[].sort;o("sort",function(e){return s.call(i(this),e)})},5021:function(e,t,n){"use strict";var r=n(260),i=n(7466),o=n(1400),s=n(6707),a=r.aTypedArray;(0,r.exportTypedArrayMethod)("subarray",function(e,t){var n=a(this),r=n.length,l=o(e,r);return new(s(n,n.constructor))(n.buffer,n.byteOffset+l*n.BYTES_PER_ELEMENT,i((void 0===t?r:o(t,r))-l))})},2974:function(e,t,n){"use strict";var r=n(7854),i=n(260),o=n(7293),s=r.Int8Array,a=i.aTypedArray,l=i.exportTypedArrayMethod,c=[].toLocaleString,u=[].slice,d=!!s&&o(function(){c.call(new s(1))});l("toLocaleString",function(){return c.apply(d?u.call(a(this)):a(this),arguments)},o(function(){return[1,2].toLocaleString()!=new s([1,2]).toLocaleString()})||!o(function(){s.prototype.toLocaleString.call([1,2])}))},5016:function(e,t,n){"use strict";var r=n(260).exportTypedArrayMethod,i=n(7293),o=n(7854).Uint8Array,s=o&&o.prototype||{},a=[].toString,l=[].join;i(function(){a.call({})})&&(a=function(){return l.call(this)});var c=s.toString!=a;r("toString",a,c)},2472:function(e,t,n){n(9843)("Uint8",function(e){return function(t,n,r){return e(this,t,n,r)}})},4747:function(e,t,n){var r=n(7854),i=n(8324),o=n(8533),s=n(8880);for(var a in i){var l=r[a],c=l&&l.prototype;if(c&&c.forEach!==o)try{s(c,"forEach",o)}catch(e){c.forEach=o}}},3948:function(e,t,n){var r=n(7854),i=n(8324),o=n(6992),s=n(8880),a=n(5112),l=a("iterator"),c=a("toStringTag"),u=o.values;for(var d in i){var f=r[d],p=f&&f.prototype;if(p){if(p[l]!==u)try{s(p,l,u)}catch(e){p[l]=u}if(p[c]||s(p,c,d),i[d])for(var h in o)if(p[h]!==o[h])try{s(p,h,o[h])}catch(e){p[h]=o[h]}}}},1637:function(e,t,n){"use strict";n(6992);var r=n(2109),i=n(5005),o=n(590),s=n(1320),a=n(2248),l=n(8003),c=n(4994),u=n(9909),d=n(5787),f=n(6656),p=n(9974),h=n(648),v=n(9670),m=n(111),y=n(30),g=n(9114),b=n(8554),w=n(1246),x=n(5112),E=i("fetch"),S=i("Headers"),k=x("iterator"),L="URLSearchParams",A=L+"Iterator",C=u.set,_=u.getterFor(L),T=u.getterFor(A),F=/\+/g,I=Array(4),M=function(e){return I[e-1]||(I[e-1]=RegExp("((?:%[\\da-f]{2}){"+e+"})","gi"))},R=function(e){try{return decodeURIComponent(e)}catch(t){return e}},z=function(e){var t=e.replace(F," "),n=4;try{return decodeURIComponent(t)}catch(e){for(;n;)t=t.replace(M(n--),R);return t}},q=/[!'()~]|%20/g,U={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},j=function(e){return U[e]},O=function(e){return encodeURIComponent(e).replace(q,j)},P=function(e,t){if(t)for(var n,r,i=t.split("&"),o=0;o0?arguments[0]:void 0,u=[];if(C(this,{type:L,entries:u,updateURL:function(){},updateSearchParams:D}),void 0!==c)if(m(c))if("function"==typeof(e=w(c)))for(n=(t=e.call(c)).next;!(r=n.call(t)).done;){if((s=(o=(i=b(v(r.value))).next).call(i)).done||(a=o.call(i)).done||!o.call(i).done)throw TypeError("Expected sequence with length 2");u.push({key:s.value+"",value:a.value+""})}else for(l in c)f(c,l)&&u.push({key:l,value:c[l]+""});else P(u,"string"==typeof c?"?"===c.charAt(0)?c.slice(1):c:c+"")},W=$.prototype;a(W,{append:function(e,t){N(arguments.length,2);var n=_(this);n.entries.push({key:e+"",value:t+""}),n.updateURL()},delete:function(e){N(arguments.length,1);for(var t=_(this),n=t.entries,r=e+"",i=0;ie.key){i.splice(t,0,e);break}t===n&&i.push(e)}r.updateURL()},forEach:function(e){for(var t,n=_(this).entries,r=p(e,arguments.length>1?arguments[1]:void 0,3),i=0;i1&&(m(t=arguments[1])&&(n=t.body,h(n)===L&&((r=t.headers?new S(t.headers):new S).has("content-type")||r.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),t=y(t,{body:g(0,String(n)),headers:g(0,r)}))),i.push(t)),E.apply(this,i)}}),e.exports={URLSearchParams:$,getState:_}},285:function(e,t,n){"use strict";n(8783);var r,i=n(2109),o=n(9781),s=n(590),a=n(7854),l=n(6048),c=n(1320),u=n(5787),d=n(6656),f=n(1574),p=n(8457),h=n(8710).codeAt,v=n(3197),m=n(8003),y=n(1637),g=n(9909),b=a.URL,w=y.URLSearchParams,x=y.getState,E=g.set,S=g.getterFor("URL"),k=Math.floor,L=Math.pow,A="Invalid scheme",C="Invalid host",_="Invalid port",T=/[A-Za-z]/,F=/[\d+-.A-Za-z]/,I=/\d/,M=/^(0x|0X)/,R=/^[0-7]+$/,z=/^\d+$/,q=/^[\dA-Fa-f]+$/,U=/[\u0000\t\u000A\u000D #%/:?@[\\]]/,j=/[\u0000\t\u000A\u000D #/:?@[\\]]/,O=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,P=/[\t\u000A\u000D]/g,D=function(e,t){var n,r,i;if("["==t.charAt(0)){if("]"!=t.charAt(t.length-1))return C;if(!(n=B(t.slice(1,-1))))return C;e.host=n}else if(V(e)){if(t=v(t),U.test(t))return C;if(null===(n=N(t)))return C;e.host=n}else{if(j.test(t))return C;for(n="",r=p(t),i=0;i4)return e;for(n=[],r=0;r1&&"0"==i.charAt(0)&&(o=M.test(i)?16:8,i=i.slice(8==o?1:2)),""===i)s=0;else{if(!(10==o?z:8==o?R:q).test(i))return e;s=parseInt(i,o)}n.push(s)}for(r=0;r=L(256,5-t))return null}else if(s>255)return null;for(a=n.pop(),r=0;r6)return;for(r=0;f();){if(i=null,r>0){if(!("."==f()&&r<4))return;d++}if(!I.test(f()))return;for(;I.test(f());){if(o=parseInt(f(),10),null===i)i=o;else{if(0==i)return;i=10*i+o}if(i>255)return;d++}l[c]=256*l[c]+i,2!=++r&&4!=r||c++}if(4!=r)return;break}if(":"==f()){if(d++,!f())return}else if(f())return;l[c++]=t}else{if(null!==u)return;d++,u=++c}}if(null!==u)for(s=c-u,c=7;0!=c&&s>0;)a=l[c],l[c--]=l[u+s-1],l[u+--s]=a;else if(8!=c)return;return l},$=function(e){var t,n,r,i;if("number"==typeof e){for(t=[],n=0;n<4;n++)t.unshift(e%256),e=k(e/256);return t.join(".")}if("object"==typeof e){for(t="",r=function(e){for(var t=null,n=1,r=null,i=0,o=0;o<8;o++)0!==e[o]?(i>n&&(t=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(t=r,n=i),t}(e),n=0;n<8;n++)i&&0===e[n]||(i&&(i=!1),r===n?(t+=n?":":"::",i=!0):(t+=e[n].toString(16),n<7&&(t+=":")));return"["+t+"]"}return e},W={},H=f({},W,{" ":1,'"':1,"<":1,">":1,"`":1}),Y=f({},H,{"#":1,"?":1,"{":1,"}":1}),G=f({},Y,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),Q=function(e,t){var n=h(e,0);return n>32&&n<127&&!d(t,e)?e:encodeURIComponent(e)},X={ftp:21,file:null,http:80,https:443,ws:80,wss:443},V=function(e){return d(X,e.scheme)},K=function(e){return""!=e.username||""!=e.password},Z=function(e){return!e.host||e.cannotBeABaseURL||"file"==e.scheme},J=function(e,t){var n;return 2==e.length&&T.test(e.charAt(0))&&(":"==(n=e.charAt(1))||!t&&"|"==n)},ee=function(e){var t;return e.length>1&&J(e.slice(0,2))&&(2==e.length||"/"===(t=e.charAt(2))||"\\"===t||"?"===t||"#"===t)},te=function(e){var t=e.path,n=t.length;!n||"file"==e.scheme&&1==n&&J(t[0],!0)||t.pop()},ne=function(e){return"."===e||"%2e"===e.toLowerCase()},re=function(e){return".."===(e=e.toLowerCase())||"%2e."===e||".%2e"===e||"%2e%2e"===e},ie={},oe={},se={},ae={},le={},ce={},ue={},de={},fe={},pe={},he={},ve={},me={},ye={},ge={},be={},we={},xe={},Ee={},Se={},ke={},Le=function(e,t,n,i){var o,s,a,l,c=n||ie,u=0,f="",h=!1,v=!1,m=!1;for(n||(e.scheme="",e.username="",e.password="",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,t=t.replace(O,"")),t=t.replace(P,""),o=p(t);u<=o.length;){switch(s=o[u],c){case ie:if(!s||!T.test(s)){if(n)return A;c=se;continue}f+=s.toLowerCase(),c=oe;break;case oe:if(s&&(F.test(s)||"+"==s||"-"==s||"."==s))f+=s.toLowerCase();else{if(":"!=s){if(n)return A;f="",c=se,u=0;continue}if(n&&(V(e)!=d(X,f)||"file"==f&&(K(e)||null!==e.port)||"file"==e.scheme&&!e.host))return;if(e.scheme=f,n)return void(V(e)&&X[e.scheme]==e.port&&(e.port=null));f="","file"==e.scheme?c=ye:V(e)&&i&&i.scheme==e.scheme?c=ae:V(e)?c=de:"/"==o[u+1]?(c=le,u++):(e.cannotBeABaseURL=!0,e.path.push(""),c=Ee)}break;case se:if(!i||i.cannotBeABaseURL&&"#"!=s)return A;if(i.cannotBeABaseURL&&"#"==s){e.scheme=i.scheme,e.path=i.path.slice(),e.query=i.query,e.fragment="",e.cannotBeABaseURL=!0,c=ke;break}c="file"==i.scheme?ye:ce;continue;case ae:if("/"!=s||"/"!=o[u+1]){c=ce;continue}c=fe,u++;break;case le:if("/"==s){c=pe;break}c=xe;continue;case ce:if(e.scheme=i.scheme,s==r)e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query=i.query;else if("/"==s||"\\"==s&&V(e))c=ue;else if("?"==s)e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query="",c=Se;else{if("#"!=s){e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.path.pop(),c=xe;continue}e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query=i.query,e.fragment="",c=ke}break;case ue:if(!V(e)||"/"!=s&&"\\"!=s){if("/"!=s){e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,c=xe;continue}c=pe}else c=fe;break;case de:if(c=fe,"/"!=s||"/"!=f.charAt(u+1))continue;u++;break;case fe:if("/"!=s&&"\\"!=s){c=pe;continue}break;case pe:if("@"==s){h&&(f="%40"+f),h=!0,a=p(f);for(var y=0;y65535)return _;e.port=V(e)&&w===X[e.scheme]?null:w,f=""}if(n)return;c=we;continue}return _}f+=s;break;case ye:if(e.scheme="file","/"==s||"\\"==s)c=ge;else{if(!i||"file"!=i.scheme){c=xe;continue}if(s==r)e.host=i.host,e.path=i.path.slice(),e.query=i.query;else if("?"==s)e.host=i.host,e.path=i.path.slice(),e.query="",c=Se;else{if("#"!=s){ee(o.slice(u).join(""))||(e.host=i.host,e.path=i.path.slice(),te(e)),c=xe;continue}e.host=i.host,e.path=i.path.slice(),e.query=i.query,e.fragment="",c=ke}}break;case ge:if("/"==s||"\\"==s){c=be;break}i&&"file"==i.scheme&&!ee(o.slice(u).join(""))&&(J(i.path[0],!0)?e.path.push(i.path[0]):e.host=i.host),c=xe;continue;case be:if(s==r||"/"==s||"\\"==s||"?"==s||"#"==s){if(!n&&J(f))c=xe;else if(""==f){if(e.host="",n)return;c=we}else{if(l=D(e,f))return l;if("localhost"==e.host&&(e.host=""),n)return;f="",c=we}continue}f+=s;break;case we:if(V(e)){if(c=xe,"/"!=s&&"\\"!=s)continue}else if(n||"?"!=s)if(n||"#"!=s){if(s!=r&&(c=xe,"/"!=s))continue}else e.fragment="",c=ke;else e.query="",c=Se;break;case xe:if(s==r||"/"==s||"\\"==s&&V(e)||!n&&("?"==s||"#"==s)){if(re(f)?(te(e),"/"==s||"\\"==s&&V(e)||e.path.push("")):ne(f)?"/"==s||"\\"==s&&V(e)||e.path.push(""):("file"==e.scheme&&!e.path.length&&J(f)&&(e.host&&(e.host=""),f=f.charAt(0)+":"),e.path.push(f)),f="","file"==e.scheme&&(s==r||"?"==s||"#"==s))for(;e.path.length>1&&""===e.path[0];)e.path.shift();"?"==s?(e.query="",c=Se):"#"==s&&(e.fragment="",c=ke)}else f+=Q(s,Y);break;case Ee:"?"==s?(e.query="",c=Se):"#"==s?(e.fragment="",c=ke):s!=r&&(e.path[0]+=Q(s,W));break;case Se:n||"#"!=s?s!=r&&("'"==s&&V(e)?e.query+="%27":e.query+="#"==s?"%23":Q(s,W)):(e.fragment="",c=ke);break;case ke:s!=r&&(e.fragment+=Q(s,H))}u++}},Ae=function(e){var t,n,r=u(this,Ae,"URL"),i=arguments.length>1?arguments[1]:void 0,s=String(e),a=E(r,{type:"URL"});if(void 0!==i)if(i instanceof Ae)t=S(i);else if(n=Le(t={},String(i)))throw TypeError(n);if(n=Le(a,s,null,t))throw TypeError(n);var l=a.searchParams=new w,c=x(l);c.updateSearchParams(a.query),c.updateURL=function(){a.query=String(l)||null},o||(r.href=_e.call(r),r.origin=Te.call(r),r.protocol=Fe.call(r),r.username=Ie.call(r),r.password=Me.call(r),r.host=Re.call(r),r.hostname=ze.call(r),r.port=qe.call(r),r.pathname=Ue.call(r),r.search=je.call(r),r.searchParams=Oe.call(r),r.hash=Pe.call(r))},Ce=Ae.prototype,_e=function(){var e=S(this),t=e.scheme,n=e.username,r=e.password,i=e.host,o=e.port,s=e.path,a=e.query,l=e.fragment,c=t+":";return null!==i?(c+="//",K(e)&&(c+=n+(r?":"+r:"")+"@"),c+=$(i),null!==o&&(c+=":"+o)):"file"==t&&(c+="//"),c+=e.cannotBeABaseURL?s[0]:s.length?"/"+s.join("/"):"",null!==a&&(c+="?"+a),null!==l&&(c+="#"+l),c},Te=function(){var e=S(this),t=e.scheme,n=e.port;if("blob"==t)try{return new URL(t.path[0]).origin}catch(e){return"null"}return"file"!=t&&V(e)?t+"://"+$(e.host)+(null!==n?":"+n:""):"null"},Fe=function(){return S(this).scheme+":"},Ie=function(){return S(this).username},Me=function(){return S(this).password},Re=function(){var e=S(this),t=e.host,n=e.port;return null===t?"":null===n?$(t):$(t)+":"+n},ze=function(){var e=S(this).host;return null===e?"":$(e)},qe=function(){var e=S(this).port;return null===e?"":String(e)},Ue=function(){var e=S(this),t=e.path;return e.cannotBeABaseURL?t[0]:t.length?"/"+t.join("/"):""},je=function(){var e=S(this).query;return e?"?"+e:""},Oe=function(){return S(this).searchParams},Pe=function(){var e=S(this).fragment;return e?"#"+e:""},De=function(e,t){return{get:e,set:t,configurable:!0,enumerable:!0}};if(o&&l(Ce,{href:De(_e,function(e){var t=S(this),n=String(e),r=Le(t,n);if(r)throw TypeError(r);x(t.searchParams).updateSearchParams(t.query)}),origin:De(Te),protocol:De(Fe,function(e){var t=S(this);Le(t,String(e)+":",ie)}),username:De(Ie,function(e){var t=S(this),n=p(String(e));if(!Z(t)){t.username="";for(var r=0;re.length)&&(t=e.length);for(var n=0,r=new Array(t);n1?r-1:0),o=1;o=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,a=!0,l=!1;return{s:function(){r=t[Symbol.iterator]()},n:function(){var e=r.next();return a=e.done,e},e:function(e){l=!0,s=e},f:function(){try{a||null==r.return||r.return()}finally{if(l)throw s}}}}(n,!0);try{for(a.s();!(s=a.n()).done;)s.value.apply(this,i)}catch(e){a.e(e)}finally{a.f()}}return this.element&&this.element.dispatchEvent(this.makeEvent("dropzone:"+t,{args:i})),this}},{key:"makeEvent",value:function(e,t){var n={bubbles:!0,cancelable:!0,detail:t};if("function"==typeof window.CustomEvent)return new CustomEvent(e,n);var r=document.createEvent("CustomEvent");return r.initCustomEvent(e,n.bubbles,n.cancelable,n.detail),r}},{key:"off",value:function(e,t){if(!this._callbacks||0===arguments.length)return this._callbacks={},this;var n=this._callbacks[e];if(!n)return this;if(1===arguments.length)return delete this._callbacks[e],this;for(var r=0;r=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,l=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return a=e.done,e},e:function(e){l=!0,o=e},f:function(){try{a||null==n.return||n.return()}finally{if(l)throw o}}}}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n'),this.element.appendChild(e));var i=e.getElementsByTagName("span")[0];return i&&(null!=i.textContent?i.textContent=this.options.dictFallbackMessage:null!=i.innerText&&(i.innerText=this.options.dictFallbackMessage)),this.element.appendChild(this.getFallbackForm())},resize:function(e,t,n,r){var i={srcX:0,srcY:0,srcWidth:e.width,srcHeight:e.height},o=e.width/e.height;null==t&&null==n?(t=i.srcWidth,n=i.srcHeight):null==t?t=n*o:null==n&&(n=t/o);var s=(t=Math.min(t,i.srcWidth))/(n=Math.min(n,i.srcHeight));if(i.srcWidth>t||i.srcHeight>n)if("crop"===r)o>s?(i.srcHeight=e.height,i.srcWidth=i.srcHeight*s):(i.srcWidth=e.width,i.srcHeight=i.srcWidth/s);else{if("contain"!==r)throw new Error("Unknown resizeMethod '".concat(r,"'"));o>s?n=t/o:t=n*o}return i.srcX=(e.width-i.srcWidth)/2,i.srcY=(e.height-i.srcHeight)/2,i.trgWidth=t,i.trgHeight=n,i},transformFile:function(e,t){return(this.options.resizeWidth||this.options.resizeHeight)&&e.type.match(/image.*/)?this.resizeImage(e,this.options.resizeWidth,this.options.resizeHeight,this.options.resizeMethod,t):t(e)},previewTemplate:'
    Check
    Error
    ',drop:function(e){return this.element.classList.remove("dz-drag-hover")},dragstart:function(e){},dragend:function(e){return this.element.classList.remove("dz-drag-hover")},dragenter:function(e){return this.element.classList.add("dz-drag-hover")},dragover:function(e){return this.element.classList.add("dz-drag-hover")},dragleave:function(e){return this.element.classList.remove("dz-drag-hover")},paste:function(e){},reset:function(){return this.element.classList.remove("dz-started")},addedfile:function(e){var t=this;if(this.element===this.previewsContainer&&this.element.classList.add("dz-started"),this.previewsContainer&&!this.options.disablePreviews){e.previewElement=g.createElement(this.options.previewTemplate.trim()),e.previewTemplate=e.previewElement,this.previewsContainer.appendChild(e.previewElement);var n,r=o(e.previewElement.querySelectorAll("[data-dz-name]"),!0);try{for(r.s();!(n=r.n()).done;){var i=n.value;i.textContent=e.name}}catch(e){r.e(e)}finally{r.f()}var s,a=o(e.previewElement.querySelectorAll("[data-dz-size]"),!0);try{for(a.s();!(s=a.n()).done;)(i=s.value).innerHTML=this.filesize(e.size)}catch(e){a.e(e)}finally{a.f()}this.options.addRemoveLinks&&(e._removeLink=g.createElement('
    '.concat(this.options.dictRemoveFile,"")),e.previewElement.appendChild(e._removeLink));var l,c=function(n){return n.preventDefault(),n.stopPropagation(),e.status===g.UPLOADING?g.confirm(t.options.dictCancelUploadConfirmation,function(){return t.removeFile(e)}):t.options.dictRemoveFileConfirmation?g.confirm(t.options.dictRemoveFileConfirmation,function(){return t.removeFile(e)}):t.removeFile(e)},u=o(e.previewElement.querySelectorAll("[data-dz-remove]"),!0);try{for(u.s();!(l=u.n()).done;)l.value.addEventListener("click",c)}catch(e){u.e(e)}finally{u.f()}}},removedfile:function(e){return null!=e.previewElement&&null!=e.previewElement.parentNode&&e.previewElement.parentNode.removeChild(e.previewElement),this._updateMaxFilesReachedClass()},thumbnail:function(e,t){if(e.previewElement){e.previewElement.classList.remove("dz-file-preview");var n,r=o(e.previewElement.querySelectorAll("[data-dz-thumbnail]"),!0);try{for(r.s();!(n=r.n()).done;){var i=n.value;i.alt=e.name,i.src=t}}catch(e){r.e(e)}finally{r.f()}return setTimeout(function(){return e.previewElement.classList.add("dz-image-preview")},1)}},error:function(e,t){if(e.previewElement){e.previewElement.classList.add("dz-error"),"string"!=typeof t&&t.error&&(t=t.error);var n,r=o(e.previewElement.querySelectorAll("[data-dz-errormessage]"),!0);try{for(r.s();!(n=r.n()).done;)n.value.textContent=t}catch(e){r.e(e)}finally{r.f()}}},errormultiple:function(){},processing:function(e){if(e.previewElement&&(e.previewElement.classList.add("dz-processing"),e._removeLink))return e._removeLink.innerHTML=this.options.dictCancelUpload},processingmultiple:function(){},uploadprogress:function(e,t,n){if(e.previewElement){var r,i=o(e.previewElement.querySelectorAll("[data-dz-uploadprogress]"),!0);try{for(i.s();!(r=i.n()).done;){var s=r.value;"PROGRESS"===s.nodeName?s.value=t:s.style.width="".concat(t,"%")}}catch(e){i.e(e)}finally{i.f()}}},totaluploadprogress:function(){},sending:function(){},sendingmultiple:function(){},success:function(e){if(e.previewElement)return e.previewElement.classList.add("dz-success")},successmultiple:function(){},canceled:function(e){return this.emit("error",e,this.options.dictUploadCanceled)},canceledmultiple:function(){},complete:function(e){if(e._removeLink&&(e._removeLink.innerHTML=this.options.dictRemoveFile),e.previewElement)return e.previewElement.classList.add("dz-complete")},completemultiple:function(){},maxfilesexceeded:function(){},maxfilesreached:function(){},queuecomplete:function(){},addedfiles:function(){}};function l(e){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l(e)}function c(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return u(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?u(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return s=e.done,e},e:function(e){a=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n"))),this.clickableElements.length&&function t(){e.hiddenFileInput&&e.hiddenFileInput.parentNode.removeChild(e.hiddenFileInput),e.hiddenFileInput=document.createElement("input"),e.hiddenFileInput.setAttribute("type","file"),(null===e.options.maxFiles||e.options.maxFiles>1)&&e.hiddenFileInput.setAttribute("multiple","multiple"),e.hiddenFileInput.className="dz-hidden-input",null!==e.options.acceptedFiles&&e.hiddenFileInput.setAttribute("accept",e.options.acceptedFiles),null!==e.options.capture&&e.hiddenFileInput.setAttribute("capture",e.options.capture),e.hiddenFileInput.setAttribute("tabindex","-1"),e.hiddenFileInput.style.visibility="hidden",e.hiddenFileInput.style.position="absolute",e.hiddenFileInput.style.top="0",e.hiddenFileInput.style.left="0",e.hiddenFileInput.style.height="0",e.hiddenFileInput.style.width="0",o.getElement(e.options.hiddenInputContainer,"hiddenInputContainer").appendChild(e.hiddenFileInput),e.hiddenFileInput.addEventListener("change",function(){var n=e.hiddenFileInput.files;if(n.length){var r,i=c(n,!0);try{for(i.s();!(r=i.n()).done;){var o=r.value;e.addFile(o)}}catch(e){i.e(e)}finally{i.f()}}e.emit("addedfiles",n),t()})}(),this.URL=null!==window.URL?window.URL:window.webkitURL;var t,n=c(this.events,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.on(r,this.options[r])}}catch(e){n.e(e)}finally{n.f()}this.on("uploadprogress",function(){return e.updateTotalUploadProgress()}),this.on("removedfile",function(){return e.updateTotalUploadProgress()}),this.on("canceled",function(t){return e.emit("complete",t)}),this.on("complete",function(t){if(0===e.getAddedFiles().length&&0===e.getUploadingFiles().length&&0===e.getQueuedFiles().length)return setTimeout(function(){return e.emit("queuecomplete")},0)});var i=function(e){if(function(e){if(e.dataTransfer.types)for(var t=0;t")),n+='');var r=o.createElement(n);return"FORM"!==this.element.tagName?(t=o.createElement('
    '))).appendChild(r):(this.element.setAttribute("enctype","multipart/form-data"),this.element.setAttribute("method",this.options.method)),null!=t?t:r}},{key:"getExistingFallback",value:function(){for(var e=function(e){var t,n=c(e,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;if(/(^| )fallback($| )/.test(r.className))return r}}catch(e){n.e(e)}finally{n.f()}},t=0,n=["div","form"];t0){for(var r=["tb","gb","mb","kb","b"],i=0;i=Math.pow(this.options.filesizeBase,4-i)/10){t=e/Math.pow(this.options.filesizeBase,4-i),n=o;break}}t=Math.round(10*t)/10}return"".concat(t," ").concat(this.options.dictFileSizeUnits[n])}},{key:"_updateMaxFilesReachedClass",value:function(){return null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(this.getAcceptedFiles().length===this.options.maxFiles&&this.emit("maxfilesreached",this.files),this.element.classList.add("dz-max-files-reached")):this.element.classList.remove("dz-max-files-reached")}},{key:"drop",value:function(e){if(e.dataTransfer){this.emit("drop",e);for(var t=[],n=0;n0){var i,o=c(r,!0);try{for(o.s();!(i=o.n()).done;){var s=i.value;s.isFile?s.file(function(e){if(!n.options.ignoreHiddenFiles||"."!==e.name.substring(0,1))return e.fullPath="".concat(t,"/").concat(e.name),n.addFile(e)}):s.isDirectory&&n._addFilesFromDirectory(s,"".concat(t,"/").concat(s.name))}}catch(e){o.e(e)}finally{o.f()}e()}return null},i)}()}},{key:"accept",value:function(e,t){this.options.maxFilesize&&e.size>1024*this.options.maxFilesize*1024?t(this.options.dictFileTooBig.replace("{{filesize}}",Math.round(e.size/1024/10.24)/100).replace("{{maxFilesize}}",this.options.maxFilesize)):o.isValidFile(e,this.options.acceptedFiles)?null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(t(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}",this.options.maxFiles)),this.emit("maxfilesexceeded",e)):this.options.accept.call(this,e,t):t(this.options.dictInvalidFileType)}},{key:"addFile",value:function(e){var t=this;e.upload={uuid:o.uuidv4(),progress:0,total:e.size,bytesSent:0,filename:this._renameFile(e)},this.files.push(e),e.status=o.ADDED,this.emit("addedfile",e),this._enqueueThumbnail(e),this.accept(e,function(n){n?(e.accepted=!1,t._errorProcessing([e],n)):(e.accepted=!0,t.options.autoQueue&&t.enqueueFile(e)),t._updateMaxFilesReachedClass()})}},{key:"enqueueFiles",value:function(e){var t,n=c(e,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.enqueueFile(r)}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"enqueueFile",value:function(e){var t=this;if(e.status!==o.ADDED||!0!==e.accepted)throw new Error("This file can't be queued because it has already been processed or was rejected.");if(e.status=o.QUEUED,this.options.autoProcessQueue)return setTimeout(function(){return t.processQueue()},0)}},{key:"_enqueueThumbnail",value:function(e){var t=this;if(this.options.createImageThumbnails&&e.type.match(/image.*/)&&e.size<=1024*this.options.maxThumbnailFilesize*1024)return this._thumbnailQueue.push(e),setTimeout(function(){return t._processThumbnailQueue()},0)}},{key:"_processThumbnailQueue",value:function(){var e=this;if(!this._processingThumbnail&&0!==this._thumbnailQueue.length){this._processingThumbnail=!0;var t=this._thumbnailQueue.shift();return this.createThumbnail(t,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,!0,function(n){return e.emit("thumbnail",t,n),e._processingThumbnail=!1,e._processThumbnailQueue()})}}},{key:"removeFile",value:function(e){if(e.status===o.UPLOADING&&this.cancelUpload(e),this.files=b(this.files,e),this.emit("removedfile",e),0===this.files.length)return this.emit("reset")}},{key:"removeAllFiles",value:function(e){null==e&&(e=!1);var t,n=c(this.files.slice(),!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;(r.status!==o.UPLOADING||e)&&this.removeFile(r)}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"resizeImage",value:function(e,t,n,r,i){var s=this;return this.createThumbnail(e,t,n,r,!0,function(t,n){if(null==n)return i(e);var r=s.options.resizeMimeType;null==r&&(r=e.type);var a=n.toDataURL(r,s.options.resizeQuality);return"image/jpeg"!==r&&"image/jpg"!==r||(a=E.restore(e.dataURL,a)),i(o.dataURItoBlob(a))})}},{key:"createThumbnail",value:function(e,t,n,r,i,o){var s=this,a=new FileReader;a.onload=function(){e.dataURL=a.result,"image/svg+xml"!==e.type?s.createThumbnailFromUrl(e,t,n,r,i,o):null!=o&&o(a.result)},a.readAsDataURL(e)}},{key:"displayExistingFile",value:function(e,t,n,r){var i=this,o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4];this.emit("addedfile",e),this.emit("complete",e),o?(e.dataURL=t,this.createThumbnailFromUrl(e,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,this.options.fixOrientation,function(t){i.emit("thumbnail",e,t),n&&n()},r)):(this.emit("thumbnail",e,t),n&&n())}},{key:"createThumbnailFromUrl",value:function(e,t,n,r,i,o,s){var a=this,l=document.createElement("img");return s&&(l.crossOrigin=s),i="from-image"!=getComputedStyle(document.body).imageOrientation&&i,l.onload=function(){var s=function(e){return e(1)};return"undefined"!=typeof EXIF&&null!==EXIF&&i&&(s=function(e){return EXIF.getData(l,function(){return e(EXIF.getTag(this,"Orientation"))})}),s(function(i){e.width=l.width,e.height=l.height;var s=a.options.resize.call(a,e,t,n,r),c=document.createElement("canvas"),u=c.getContext("2d");switch(c.width=s.trgWidth,c.height=s.trgHeight,i>4&&(c.width=s.trgHeight,c.height=s.trgWidth),i){case 2:u.translate(c.width,0),u.scale(-1,1);break;case 3:u.translate(c.width,c.height),u.rotate(Math.PI);break;case 4:u.translate(0,c.height),u.scale(1,-1);break;case 5:u.rotate(.5*Math.PI),u.scale(1,-1);break;case 6:u.rotate(.5*Math.PI),u.translate(0,-c.width);break;case 7:u.rotate(.5*Math.PI),u.translate(c.height,-c.width),u.scale(-1,1);break;case 8:u.rotate(-.5*Math.PI),u.translate(-c.height,0)}x(u,l,null!=s.srcX?s.srcX:0,null!=s.srcY?s.srcY:0,s.srcWidth,s.srcHeight,null!=s.trgX?s.trgX:0,null!=s.trgY?s.trgY:0,s.trgWidth,s.trgHeight);var d=c.toDataURL("image/png");if(null!=o)return o(d,c)})},null!=o&&(l.onerror=o),l.src=e.dataURL}},{key:"processQueue",value:function(){var e=this.options.parallelUploads,t=this.getUploadingFiles().length,n=t;if(!(t>=e)){var r=this.getQueuedFiles();if(r.length>0){if(this.options.uploadMultiple)return this.processFiles(r.slice(0,e-t));for(;n1?t-1:0),r=1;rt.options.chunkSize),e[0].upload.totalChunkCount=Math.ceil(r.size/t.options.chunkSize)}if(e[0].upload.chunked){var i=e[0],s=n[0];i.upload.chunks=[];var a=function(){for(var n=0;void 0!==i.upload.chunks[n];)n++;if(!(n>=i.upload.totalChunkCount)){var r=n*t.options.chunkSize,a=Math.min(r+t.options.chunkSize,s.size),l={name:t._getParamName(0),data:s.webkitSlice?s.webkitSlice(r,a):s.slice(r,a),filename:i.upload.filename,chunkIndex:n};i.upload.chunks[n]={file:i,index:n,dataBlock:l,status:o.UPLOADING,progress:0,retries:0},t._uploadData(e,[l])}};if(i.upload.finishedChunkUpload=function(n,r){var s=!0;n.status=o.SUCCESS,n.dataBlock=null,n.xhr=null;for(var l=0;l1?t-1:0),r=1;r=s;a?o++:o--)i[o]=t.charCodeAt(o);return new Blob([r],{type:n})};var b=function(e,t){return e.filter(function(e){return e!==t}).map(function(e){return e})},w=function(e){return e.replace(/[\-_](\w)/g,function(e){return e.charAt(1).toUpperCase()})};g.createElement=function(e){var t=document.createElement("div");return t.innerHTML=e,t.childNodes[0]},g.elementInside=function(e,t){if(e===t)return!0;for(;e=e.parentNode;)if(e===t)return!0;return!1},g.getElement=function(e,t){var n;if("string"==typeof e?n=document.querySelector(e):null!=e.nodeType&&(n=e),null==n)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector or a plain HTML element."));return n},g.getElements=function(e,t){var n,r;if(e instanceof Array){r=[];try{var i,o=c(e,!0);try{for(o.s();!(i=o.n()).done;)n=i.value,r.push(this.getElement(n,t))}catch(e){o.e(e)}finally{o.f()}}catch(e){r=null}}else if("string"==typeof e){r=[];var s,a=c(document.querySelectorAll(e),!0);try{for(a.s();!(s=a.n()).done;)n=s.value,r.push(n)}catch(e){a.e(e)}finally{a.f()}}else null!=e.nodeType&&(r=[e]);if(null==r||!r.length)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector, a plain HTML element or a list of those."));return r},g.confirm=function(e,t,n){return window.confirm(e)?t():null!=n?n():void 0},g.isValidFile=function(e,t){if(!t)return!0;t=t.split(",");var n,r=e.type,i=r.replace(/\/.*$/,""),o=c(t,!0);try{for(o.s();!(n=o.n()).done;){var s=n.value;if("."===(s=s.trim()).charAt(0)){if(-1!==e.name.toLowerCase().indexOf(s.toLowerCase(),e.name.length-s.length))return!0}else if(/\/\*$/.test(s)){if(i===s.replace(/\/.*$/,""))return!0}else if(r===s)return!0}}catch(e){o.e(e)}finally{o.f()}return!1},"undefined"!=typeof jQuery&&null!==jQuery&&(jQuery.fn.dropzone=function(e){return this.each(function(){return new g(this,e)})}),g.ADDED="added",g.QUEUED="queued",g.ACCEPTED=g.QUEUED,g.UPLOADING="uploading",g.PROCESSING=g.UPLOADING,g.CANCELED="canceled",g.ERROR="error",g.SUCCESS="success";var x=function(e,t,n,r,i,o,s,a,l,c){var u=function(e){e.naturalWidth;var t=e.naturalHeight,n=document.createElement("canvas");n.width=1,n.height=t;var r=n.getContext("2d");r.drawImage(e,0,0);for(var i=r.getImageData(1,0,1,t).data,o=0,s=t,a=t;a>o;)0===i[4*(a-1)+3]?s=a:o=a,a=s+o>>1;var l=a/t;return 0===l?1:l}(t);return e.drawImage(t,n,r,i,o,s,a,l,c/u)},E=function(){function e(){d(this,e)}return p(e,null,[{key:"initClass",value:function(){this.KEY_STR="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}},{key:"encode64",value:function(e){for(var t="",n=void 0,r=void 0,i="",o=void 0,s=void 0,a=void 0,l="",c=0;o=(n=e[c++])>>2,s=(3&n)<<4|(r=e[c++])>>4,a=(15&r)<<2|(i=e[c++])>>6,l=63&i,isNaN(r)?a=l=64:isNaN(i)&&(l=64),t=t+this.KEY_STR.charAt(o)+this.KEY_STR.charAt(s)+this.KEY_STR.charAt(a)+this.KEY_STR.charAt(l),n=r=i="",o=s=a=l="",ce.length)break}return n}},{key:"decode64",value:function(e){var t=void 0,n=void 0,r="",i=void 0,o=void 0,s="",a=0,l=[];for(/[^A-Za-z0-9\+\/\=]/g.exec(e)&&console.warn("There were invalid base64 characters in the input text.\nValid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\nExpect errors in decoding."),e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");t=this.KEY_STR.indexOf(e.charAt(a++))<<2|(i=this.KEY_STR.indexOf(e.charAt(a++)))>>4,n=(15&i)<<4|(o=this.KEY_STR.indexOf(e.charAt(a++)))>>2,r=(3&o)<<6|(s=this.KEY_STR.indexOf(e.charAt(a++))),l.push(t),64!==o&&l.push(n),64!==s&&l.push(r),t=n=r="",i=o=s="",at.options.priority?-1:e.options.priority=0;n--)this._subscribers[n].fn!==e&&this._subscribers[n].id!==e||(this._subscribers[n].channel=null,this._subscribers.splice(n,1));else this._subscribers=[];if(t&&this.autoCleanChannel(),n=this._subscribers.length-1,e)for(;n>=0;n--)this._subscribers[n].fn!==e&&this._subscribers[n].id!==e||(this._subscribers[n].channel=null,this._subscribers.splice(n,1));else this._subscribers=[]},t.prototype.autoCleanChannel=function(){if(0===this._subscribers.length){for(var e in this._channels)if(this._channels.hasOwnProperty(e))return;if(null!=this._parent){var t=this.namespace.split(":"),n=t[t.length-1];this._parent.removeChannel(n)}}},t.prototype.removeChannel=function(e){this.hasChannel(e)&&(this._channels[e]=null,delete this._channels[e],this.autoCleanChannel())},t.prototype.publish=function(e){for(var t,n,r,i=0,o=this._subscribers.length,s=!1;i0)for(;i{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";var e=n(295),t=n.n(e),r=n(216);window.Cl=window.Cl||{};class i{constructor(e={}){this.options={linksSelector:".js-toggler-link",dataHeaderSelector:"toggler-header-selector",dataContentSelector:"toggler-content-selector",collapsedClass:"js-collapsed",expandedClass:"js-expanded",hiddenClass:"hidden",...e},this.togglerInstances=[],document.querySelectorAll(this.options.linksSelector).forEach(e=>{const t=new o(e,this.options);this.togglerInstances.push(t)})}destroy(){this.links=null,this.togglerInstances.forEach(e=>e.destroy()),this.togglerInstances=[]}}class o{constructor(e,t={}){this.options={...t},this.link=e,this.headerSelector=this.link.dataset[this.options.dataHeaderSelector],this.contentSelector=this.link.dataset[this.options.dataContentSelector],this.header=document.querySelector(this.headerSelector),this.header=this.header||this.link,this.content=document.querySelector(this.contentSelector),this.content&&this._initLink()}_updateClasses(){this.content.classList.contains(this.options.hiddenClass)?(this.header.classList.remove(this.options.expandedClass),this.header.classList.add(this.options.collapsedClass)):(this.header.classList.add(this.options.expandedClass),this.header.classList.remove(this.options.collapsedClass))}_onTogglerClick(e){this.content.classList.toggle(this.options.hiddenClass),this._updateClasses(),e.preventDefault()}_initLink(){this._updateClasses(),this.link.addEventListener("click",e=>this._onTogglerClick(e))}destroy(){this.options=null,this.link=null}}Cl.Toggler=i,Cl.TogglerConstructor=o;const s=i;n(413);var a=n(628),l=n.n(a);document.addEventListener("DOMContentLoaded",()=>{let e=0,t=1;const n=document.querySelector(".js-upload-button");if(!n)return;const r=document.querySelector(".js-upload-button-disabled"),i=n.dataset.url;if(!i)return;const o=document.querySelector(".js-filer-dropzone-upload-welcome"),s=document.querySelector(".js-filer-dropzone-upload-info-container"),a=document.querySelector(".js-filer-dropzone-upload-info"),c=document.querySelector(".js-filer-dropzone-upload-number"),u=".js-filer-dropzone-progress",d=document.querySelector(".js-filer-dropzone-upload-success"),f=document.querySelector(".js-filer-dropzone-upload-canceled"),p=document.querySelector(".js-filer-dropzone-cancel"),h=document.querySelector(".js-filer-dropzone-info-message"),v="hidden",m=parseInt(n.dataset.maxUploaderConnections||3,10),y=parseInt(n.dataset.maxFilesize||0,10);let g=!1;const b=()=>{c&&(c.textContent=`${t-e}/${t}`)},w=()=>{n&&n.remove()},x=()=>{const e=window.location.toString();window.location.replace(((e,t,n)=>{const r=new RegExp(`([?&])${t}=.*?(&|$)`,"i"),i=-1!==e.indexOf("?")?"&":"?",o=window.location.hash;return(e=e.replace(/#.*$/,"")).match(r)?e.replace(r,`$1${t}=${n}$2`)+o:e+i+t+"="+n+o})(e,"order_by","-modified_at"))};let E;Cl.mediator.subscribe("filer-upload-in-progress",w),n.addEventListener("click",e=>{e.preventDefault()}),l().autoDiscover=!1;try{E=new(l())(n,{url:i,paramName:"file",maxFilesize:y,parallelUploads:m,clickable:n,previewTemplate:"
    ",addRemoveLinks:!1,autoProcessQueue:!0})}catch(e){return void console.error("[Filer Upload] Failed to create Dropzone instance:",e)}E.on("addedfile",n=>{Cl.mediator.remove("filer-upload-in-progress",w),Cl.mediator.publish("filer-upload-in-progress"),e++,t=E.files.length,h&&h.classList.remove(v),o&&o.classList.add(v),d&&d.classList.add(v),s&&s.classList.remove(v),p&&p.classList.remove(v),f&&f.classList.add(v),b()}),E.on("uploadprogress",(e,t)=>{const n=Math.round(t),r=`file-${encodeURIComponent(e.name)}${e.size}${e.lastModified}`,i=document.getElementById(r);let o;if(i){const e=i.querySelector(u);e&&(e.style.width=`${n}%`)}else if(a){o=a.cloneNode(!0);const t=o.querySelector(".js-filer-dropzone-file-name");t&&(t.textContent=e.name);const i=o.querySelector(u);i&&(i.style.width=`${n}%`),o.classList.remove(v),o.setAttribute("id",r),s&&s.appendChild(o)}}),E.on("success",(n,r)=>{const i=`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}`,s=document.getElementById(i);s&&s.remove(),r.error&&(g=!0,window.filerShowError(`${n.name}: ${r.error}`)),e--,b(),0===e&&(t=1,o&&o.classList.add(v),c&&c.classList.add(v),f&&f.classList.add(v),p&&p.classList.add(v),d&&d.classList.remove(v),g?setTimeout(x,1e3):x())}),E.on("error",(n,r)=>{const i=`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}`,s=document.getElementById(i);s&&s.remove(),g=!0,window.filerShowError(`${n.name}: ${r}`),e--,b(),0===e&&(t=1,o&&o.classList.add(v),c&&c.classList.add(v),f&&f.classList.add(v),p&&p.classList.add(v),d&&d.classList.remove(v),setTimeout(x,1e3))}),p&&p.addEventListener("click",e=>{e.preventDefault(),p.classList.add(v),c&&c.classList.add(v),s&&s.classList.add(v),f&&f.classList.remove(v),setTimeout(()=>{window.location.reload()},1e3)}),r&&Cl.filerTooltip&&Cl.filerTooltip(),document.dispatchEvent(new Event("filer-upload-scripts-executed"))}),l()&&(l().autoDiscover=!1),document.addEventListener("DOMContentLoaded",()=>{const e=".js-img-preview",t=".js-filer-dropzone",n=document.querySelectorAll(t),r=".js-filer-dropzone-progress",i=".js-img-wrapper",o="hidden",s="filer-dropzone-mobile",a="js-object-attached",c=e=>{e.offsetWidth<500?e.classList.add(s):e.classList.remove(s)},u=e=>{try{window.parent.CMS.API.Messages.open({message:e})}catch{window.filerShowError?window.filerShowError(e):alert(e)}},d=function(t){const n=t.dataset.url,s=t.querySelector(".vForeignKeyRawIdAdminField"),d="image"===s?.getAttribute("name"),f=t.querySelector(".js-related-lookup"),p=t.querySelector(".js-related-edit"),h=t.querySelector(".js-filer-dropzone-message"),v=t.querySelector(".filerClearer"),m=t.querySelector(".js-file-selector");t.dropzone||(window.addEventListener("resize",()=>{c(t)}),new(l())(t,{url:n,paramName:"file",maxFiles:1,maxFilesize:t.dataset.maxFilesize,previewTemplate:document.querySelector(".js-filer-dropzone-template")?.innerHTML||"
    ",clickable:!1,addRemoveLinks:!1,init:function(){c(t),this.on("removedfile",()=>{m&&(m.style.display=""),t.classList.remove(a),this.removeAllFiles(),v?.click()}),this.element.querySelectorAll("img").forEach(e=>{e.addEventListener("dragstart",e=>{e.preventDefault()})}),v&&v.addEventListener("click",()=>{t.classList.remove(a)})},maxfilesexceeded:function(){this.removeAllFiles(!0)},drop:function(){this.removeAllFiles(!0),v?.click();const e=t.querySelector(r);e&&e.classList.remove(o),m&&(m.style.display="block"),f?.classList.add("related-lookup-change"),p?.classList.add("related-lookup-change"),h?.classList.add(o),t.classList.remove("dz-drag-hover"),t.classList.add(a)},success:function(n,a){const l=t.querySelector(r);if(l&&l.classList.add(o),n&&"success"===n.status&&a){if(a.file_id&&s){s.value=a.file_id;const e=new Event("change",{bubbles:!0});s.dispatchEvent(e)}if(a.thumbnail_180&&d){const n=t.querySelector(e);n&&(n.style.backgroundImage=`url(${a.thumbnail_180})`);const r=t.querySelector(i);r&&r.classList.remove(o)}}else a&&a.error&&u(`${n.name}: ${a.error}`),this.removeAllFiles(!0);this.element.querySelectorAll("img").forEach(e=>{e.addEventListener("dragstart",e=>{e.preventDefault()})})},error:function(e,t,n){n&&n.error&&(t+=` ; ${n.error}`),u(`${e.name}: ${t}`),this.removeAllFiles(!0)},reset:function(){if(d){const n=t.querySelector(i);n&&n.classList.add(o);const r=t.querySelector(e);r&&(r.style.backgroundImage="none")}if(t.classList.remove(a),s&&(s.value=""),f?.classList.remove("related-lookup-change"),p?.classList.remove("related-lookup-change"),h?.classList.remove(o),s){const e=new Event("change",{bubbles:!0});s.dispatchEvent(e)}}}))};n.length&&l()&&(window.filerDropzoneInitialized||(window.filerDropzoneInitialized=!0,l().autoDiscover=!1),n.forEach(d),document.addEventListener("formset:added",e=>{let n,r,i;e.detail&&e.detail.formsetName?(r=parseInt(document.getElementById(`id_${e.detail.formsetName}-TOTAL_FORMS`).value,10)-1,i=document.getElementById(`${e.detail.formsetName}-${r}`),n=i?.querySelectorAll(t)||[]):(i=e.target,n=i?.querySelectorAll(t)||[]),n?.forEach(d)}))}),document.addEventListener("DOMContentLoaded",()=>{let e=0,t=0;const n=[],r=document.querySelector(".js-filer-dropzone-base"),i=".js-filer-dropzone";let o;const s=document.querySelector(".js-filer-dropzone-info-message"),a=document.querySelector(".js-filer-dropzone-folder-name"),c=document.querySelector(".js-filer-dropzone-upload-info-container"),u=document.querySelector(".js-filer-dropzone-upload-info"),d=document.querySelector(".js-filer-dropzone-upload-welcome"),f=document.querySelector(".js-filer-dropzone-upload-number"),p=document.querySelector(".js-filer-upload-count"),h=document.querySelector(".js-filer-upload-text"),v=".js-filer-dropzone-progress",m=document.querySelector(".js-filer-dropzone-upload-success"),y=document.querySelector(".js-filer-dropzone-upload-canceled"),g=document.querySelector(".js-filer-dropzone-cancel"),b="dz-drag-hover",w=document.querySelector(".drag-hover-border"),x="hidden";let E,S,k,L=!1;const A=()=>{f&&(f.textContent=`${t-e}/${t}`),h&&h.classList.remove("hidden"),p&&p.classList.remove("hidden")},C=()=>{n.forEach(e=>{e.destroy()})},_=(e,t)=>document.getElementById(`file-${encodeURIComponent(e.name)}${e.size}${e.lastModified}${t}`);if(r){S=r.dataset.url,k=r.dataset.folderName;const e=document.body;e.dataset.url=S,e.dataset.folderName=k,e.dataset.maxFiles=r.dataset.maxFiles,e.dataset.maxFilesize=r.dataset.maxFiles,e.classList.add("js-filer-dropzone")}Cl.mediator.subscribe("filer-upload-in-progress",C),o=document.querySelectorAll(i),o.length&&l()&&(l().autoDiscover=!1,o.forEach(r=>{if(r.dropzone)return;const p=r.dataset.url,h=new(l())(r,{url:p,paramName:"file",maxFiles:parseInt(r.dataset.maxFiles)||100,maxFilesize:parseInt(r.dataset.maxFilesize),previewTemplate:"
    ",clickable:!1,addRemoveLinks:!1,parallelUploads:r.dataset["max-uploader-connections"]||3,accept:(n,r)=>{let i;if(Cl.mediator.remove("filer-upload-in-progress",C),Cl.mediator.publish("filer-upload-in-progress"),clearTimeout(E),clearTimeout(E),d&&d.classList.add(x),g&&g.classList.remove(x),_(n,p))r("duplicate");else{i=u.cloneNode(!0);const o=i.querySelector(".js-filer-dropzone-file-name");o&&(o.textContent=n.name);const s=i.querySelector(v);s&&(s.style.width="0"),i.setAttribute("id",`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}${p}`),c&&c.appendChild(i),e++,t++,A(),r()}o.forEach(e=>e.classList.remove("reset-hover")),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b))},dragover:e=>{const t=e.target.closest(i),n=t?.dataset.folderName,l=r.classList.contains("js-filer-dropzone-folder"),c=r.getBoundingClientRect(),u=w?window.getComputedStyle(w):null,d=u?u.borderTopWidth:"0px",f=u?u.borderLeftWidth:"0px",p={top:`${c.top}px`,bottom:`${c.bottom}px`,left:`${c.left}px`,right:`${c.right}px`,width:c.width-2*parseInt(f,10)+"px",height:c.height-2*parseInt(d,10)+"px",display:"block"};l&&w&&Object.assign(w.style,p),o.forEach(e=>e.classList.add("reset-hover")),m&&m.classList.add(x),s&&s.classList.remove(x),r.classList.add(b),r.classList.remove("reset-hover"),a&&n&&(a.textContent=n)},dragend:()=>{clearTimeout(E),E=setTimeout(()=>{s&&s.classList.add(x)},1e3),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b)),w&&Object.assign(w.style,{top:"0",bottom:"0",width:"0",height:"0"})},dragleave:()=>{clearTimeout(E),E=setTimeout(()=>{s&&s.classList.add(x)},1e3),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b)),w&&Object.assign(w.style,{top:"0",bottom:"0",width:"0",height:"0"})},sending:e=>{const t=_(e,p);t&&t.classList.remove(x)},uploadprogress:(e,t)=>{const n=_(e,p);if(n){const e=n.querySelector(v);e&&(e.style.width=`${t}%`)}},success:t=>{e--,A();const n=_(t,p);n&&n.remove()},queuecomplete:()=>{0===e&&(A(),g&&g.classList.add(x),u&&u.classList.add(x),L?(f&&f.classList.add(x),setTimeout(()=>{window.location.reload()},1e3)):(m&&m.classList.remove(x),window.location.reload()))},error:(e,t)=>{A(),"duplicate"!==t&&(L=!0,window.filerShowError&&window.filerShowError(`${e.name}: ${t.message}`))}});n.push(h),g&&g.addEventListener("click",e=>{e.preventDefault(),g.classList.add(x),y&&y.classList.remove(x),h.removeAllFiles(!0)})}))}),n(117),n(221),n(472),n(902),n(577),window.Cl=window.Cl||{},Cl.mediator=new(t()),Cl.FocalPoint=r.A,Cl.Toggler=s,document.addEventListener("DOMContentLoaded",()=>{let e;window.filerShowError=t=>{const n=document.querySelector(".messagelist"),r=document.querySelector("#header"),i="js-filer-error",o=`
    • {msg}
    `.replace("{msg}",t);n?n.outerHTML=o:r&&r.insertAdjacentHTML("afterend",o),e&&clearTimeout(e),e=setTimeout(()=>{const e=document.querySelector(`.${i}`);e&&e.remove()},5e3)};const t=document.querySelector(".js-filter-files");t&&(t.addEventListener("focus",e=>{const t=e.target.closest(".navigator-top-nav");t&&t.classList.add("search-is-focused")}),t.addEventListener("blur",e=>{const t=e.target.closest(".navigator-top-nav");if(t){const n=t.querySelector(".dropdown-container a");n&&e.relatedTarget===n||t.classList.remove("search-is-focused")}}));const n=document.querySelector(".js-filter-files-container");n&&n.addEventListener("submit",e=>{}),(()=>{const e=document.querySelector(".js-filter-files"),t=".navigator-top-nav",n=document.querySelector(t),r=n?.querySelector(".filter-search-wrapper .filer-dropdown-container");e&&(e.addEventListener("keydown",function(e){e.key;const n=this.closest(t);n&&n.classList.add("search-is-focused")}),r&&(r.addEventListener("show.bs.filer-dropdown",()=>{n&&n.classList.add("search-is-focused")}),r.addEventListener("hide.bs.filer-dropdown",()=>{n&&n.classList.remove("search-is-focused")})))})(),(()=>{const e=document.querySelectorAll(".navigator-table tr, .navigator-list .list-item"),t=document.querySelector(".actions-wrapper"),n=document.querySelectorAll(".action-select, #action-toggle, #files-action-toggle, #folders-action-toggle, .actions .clear a");setTimeout(()=>{n.forEach(e=>{if(e.checked){const t=e.closest(".list-item");t&&t.classList.add("selected")}}),Array.from(e).some(e=>e.classList.contains("selected"))&&t&&t.classList.add("action-selected")},100),n.forEach(n=>{n.addEventListener("change",function(){const n=this.closest(".list-item");n&&(this.checked?n.classList.add("selected"):n.classList.remove("selected")),setTimeout(()=>{const n=Array.from(e).some(e=>e.classList.contains("selected"));t&&(n?t.classList.add("action-selected"):t.classList.remove("action-selected"))},0)})})})(),(()=>{const e=document.querySelector(".js-actions-menu");if(!e)return;const t=e.querySelector(".filer-dropdown-menu"),n=document.querySelector('.actions select[name="action"]'),r=n?.querySelectorAll("option")||[],i=document.querySelector('.actions button[type="submit"]'),o=document.querySelector(".js-action-delete"),s=document.querySelector(".js-action-copy"),a=document.querySelector(".js-action-move"),l="delete_files_or_folders",c="copy_files_and_folders",u="move_files_and_folders",d=document.querySelectorAll(".navigator-table tr, .navigator-list .list-item"),f=(e,t)=>{t&&r.forEach(r=>{r.value===e&&(t.style.display="",t.addEventListener("click",t=>{if(t.preventDefault(),Array.from(d).some(e=>e.classList.contains("selected"))&&n&&i){n.value=e;const t=n.querySelector(`option[value="${e}"]`);t&&(t.selected=!0),i.click()}}))})};f(l,o),f(c,s),f(u,a),r.forEach((e,n)=>{if(0!==n){const n=document.createElement("li"),r=document.createElement("a");r.href="#",r.textContent=e.textContent,e.value!==l&&e.value!==c&&e.value!==u||r.classList.add("hidden"),n.appendChild(r),t&&t.appendChild(n)}}),t&&t.addEventListener("click",e=>{if("A"===e.target.tagName){const r=e.target.closest("li"),o=Array.from(t.querySelectorAll("li")).indexOf(r)+1;if(e.preventDefault(),n&&i){const e=n.querySelectorAll("option");e[o]&&(n.value=e[o].value,e[o].selected=!0),i.click()}}}),e.addEventListener("click",e=>{Array.from(d).some(e=>e.classList.contains("selected"))||(e.preventDefault(),e.stopPropagation())})})(),(()=>{const e=document.querySelector(".navigator-top-nav");if(!e)return;const t=document.querySelector(".breadcrumbs-container");if(!t)return;const n=t.querySelector(".navigator-breadcrumbs"),r=t.querySelector(".filer-dropdown-container"),i=document.querySelector(".filter-files-container"),o=document.querySelector(".actions-wrapper"),s=document.querySelector(".navigator-button-wrapper"),a=n?.offsetWidth||0,l=r?.offsetWidth||0,c=i?.offsetWidth||0,u=o?.offsetWidth||0,d=s?.offsetWidth||0,f=window.getComputedStyle(e),p=parseInt(f.paddingLeft,10)+parseInt(f.paddingRight,10);let h=e.offsetWidth;const v=80+a+l+c+u+d+p,m="breadcrumb-min-width",y=()=>{h{h=e.offsetWidth,y()})})(),(()=>{const e=document.querySelectorAll(".navigator-list .list-item input.action-select"),t=".navigator-list .navigator-folders-body .list-item input.action-select",n=".navigator-list .navigator-files-body .list-item input.action-select",r=document.querySelector("#files-action-toggle"),i=document.querySelector("#folders-action-toggle");i&&i.addEventListener("click",function(){const e=document.querySelectorAll(t);this.checked?e.forEach(e=>{e.checked||e.click()}):e.forEach(e=>{e.checked&&e.click()})}),r&&r.addEventListener("click",function(){const e=document.querySelectorAll(n);this.checked?e.forEach(e=>{e.checked||e.click()}):e.forEach(e=>{e.checked&&e.click()})}),e.forEach(e=>{e.addEventListener("click",function(){const e=document.querySelectorAll(n),o=document.querySelectorAll(t);if(this.checked){const t=Array.from(e).every(e=>e.checked),n=Array.from(o).every(e=>e.checked);t&&r&&(r.checked=!0),n&&i&&(i.checked=!0)}else{const t=Array.from(e).some(e=>!e.checked),n=Array.from(o).some(e=>!e.checked);t&&r&&(r.checked=!1),n&&i&&(i.checked=!1)}})});const o=document.querySelector(".navigator .actions .clear a");o&&o.addEventListener("click",()=>{i&&(i.checked=!1),r&&(r.checked=!1)})})(),document.querySelectorAll(".js-copy-url").forEach(e=>{e.addEventListener("click",function(e){const t=new URL(this.dataset.url,document.location.href),n=this.dataset.msg||"URL copied to clipboard",r=document.createElement("template");e.preventDefault(),document.querySelectorAll(".info.filer-tooltip").forEach(e=>{e.remove()}),navigator.clipboard.writeText(t.href),r.innerHTML=`
    ${n}
    `,this.classList.add("filer-tooltip-wrapper"),this.appendChild(r.content.firstChild);const i=this;setTimeout(()=>{const e=i.querySelector(".info");e&&e.remove()},1200)})}),(new r.A).initialize(),new s})})()})(); \ No newline at end of file +(()=>{var e={117(){"use strict";document.addEventListener("DOMContentLoaded",()=>{const e=document.getElementById("destination");if(!e)return;const t=e.querySelectorAll("option"),n=t.length,r=document.querySelector(".js-submit-copy-move"),i=document.querySelector(".js-disabled-btn-tooltip");1===n&&t[0].disabled&&(r&&(r.style.display="none"),i&&(i.style.display="inline-block")),Cl.filerTooltip&&Cl.filerTooltip()})},413(){"use strict";(()=>{const e="filer-dropdown-backdrop",t='[data-toggle="filer-dropdown"]';class n{constructor(e){this.element=e,e.addEventListener("click",()=>this.toggle())}toggle(){const t=this.element,n=r(t),o=n.classList.contains("open"),s={relatedTarget:t};if(t.disabled||t.classList.contains("disabled"))return!1;if(i(),!o){if("ontouchstart"in document.documentElement&&!n.closest(".navbar-nav")){const n=document.createElement("div");n.className=e,t.parentNode.insertBefore(n,t.nextSibling),n.addEventListener("click",i)}const r=new CustomEvent("show.bs.filer-dropdown",{bubbles:!0,cancelable:!0,detail:s});if(n.dispatchEvent(r),r.defaultPrevented)return!1;t.focus(),t.setAttribute("aria-expanded","true"),n.classList.add("open");const o=new CustomEvent("shown.bs.filer-dropdown",{bubbles:!0,detail:s});n.dispatchEvent(o)}return!1}keydown(e){const n=this.element,i=r(n),o=i.classList.contains("open"),s=Array.from(i.querySelectorAll(".filer-dropdown-menu li:not(.disabled):visible a")).filter(e=>null!==e.offsetParent),a=s.indexOf(e.target);if(!/(38|40|27|32)/.test(e.which)||/input|textarea/i.test(e.target.tagName))return;if(e.preventDefault(),e.stopPropagation(),n.disabled||n.classList.contains("disabled"))return;if(!o&&27!==e.which||o&&27===e.which)return 27===e.which&&i.querySelector(t)?.focus(),n.click();if(!s.length)return;let l=a;38===e.which&&a>0&&l--,40===e.which&&ae.remove()),document.querySelectorAll(t).forEach(e=>{const t=r(e),i={relatedTarget:e};if(!t.classList.contains("open"))return;if(n&&"click"===n.type&&/input|textarea/i.test(n.target.tagName)&&t.contains(n.target))return;const o=new CustomEvent("hide.bs.filer-dropdown",{bubbles:!0,cancelable:!0,detail:i});if(t.dispatchEvent(o),o.defaultPrevented)return;e.setAttribute("aria-expanded","false"),t.classList.remove("open");const s=new CustomEvent("hidden.bs.filer-dropdown",{bubbles:!0,detail:i});t.dispatchEvent(s)}))}function o(e){return this.forEach(t=>{let r=t._filerDropdownInstance;r||(r=new n(t),t._filerDropdownInstance=r),"string"==typeof e&&r[e].call(t)}),this}NodeList.prototype.dropdown||(NodeList.prototype.dropdown=function(e){return o.call(this,e)}),HTMLCollection.prototype.dropdown||(HTMLCollection.prototype.dropdown=function(e){return o.call(this,e)}),document.addEventListener("click",i),document.addEventListener("click",e=>{e.target.closest(".filer-dropdown form")&&e.stopPropagation()}),document.addEventListener("click",e=>{const r=e.target.closest(t);if(r){const t=r._filerDropdownInstance||new n(r);r._filerDropdownInstance||(r._filerDropdownInstance=t),t.toggle(e)}}),document.addEventListener("keydown",e=>{const r=e.target.closest(t);if(r){const t=r._filerDropdownInstance||new n(r);r._filerDropdownInstance||(r._filerDropdownInstance=t),t.keydown(e)}}),document.addEventListener("keydown",e=>{const r=e.target.closest(".filer-dropdown-menu");if(r){const i=r.parentNode.querySelector(t);if(i){const t=i._filerDropdownInstance||new n(i);i._filerDropdownInstance||(i._filerDropdownInstance=t),t.keydown(e)}}}),window.FilerDropdown=n})()},577(){!function(){"use strict";const e=document.getElementById("django-admin-popup-response-constants");let t;if(e)switch(t=JSON.parse(e.dataset.popupResponse),t.action){case"change":opener.dismissRelatedImageLookupPopup(window,t.new_value,null,t.obj,null);break;case"delete":opener.dismissDeleteRelatedObjectPopup(window,t.value);break;default:opener.dismissAddRelatedObjectPopup(window,t.value,t.obj)}}()},216(e,t,n){"use strict";n.d(t,{A:()=>r}),e=n.hmd(e),window.Cl=window.Cl||{},(()=>{class t{constructor(e={}){this.options={containerSelector:".js-focal-point",imageSelector:".js-focal-point-image",circleSelector:".js-focal-point-circle",locationSelector:".js-focal-point-location",draggableClass:"draggable",hiddenClass:"hidden",dataLocation:"locationSelector",...e},this.focalPointInstances=[],this._init=this._init.bind(this)}_init(e){const t=new n(e,this.options);this.focalPointInstances.push(t)}initialize(){document.querySelectorAll(this.options.containerSelector).forEach(e=>{this._init(e)}),window.Cl.mediator&&window.Cl.mediator.subscribe("focal-point:init",this._init)}destroy(){window.Cl.mediator&&window.Cl.mediator.remove("focal-point:init",this._init),this.focalPointInstances.forEach(e=>{e.destroy()}),this.focalPointInstances=[]}}class n{constructor(e,t={}){this.options={imageSelector:".js-focal-point-image",circleSelector:".js-focal-point-circle",locationSelector:".js-focal-point-location",draggableClass:"draggable",hiddenClass:"hidden",dataLocation:"locationSelector",...t},this.container=e,this.image=this.container.querySelector(this.options.imageSelector),this.circle=this.container.querySelector(this.options.circleSelector),this.ratio=parseFloat(this.image?.dataset.ratio||1),this.location=this._getLocation(),this.isDragging=!1,this.dragStartX=0,this.dragStartY=0,this.circleStartX=0,this.circleStartY=0,this._onImageLoaded=this._onImageLoaded.bind(this),this._onMouseDown=this._onMouseDown.bind(this),this._onMouseMove=this._onMouseMove.bind(this),this._onMouseUp=this._onMouseUp.bind(this),this.image?.complete?this._onImageLoaded():this.image&&this.image.addEventListener("load",this._onImageLoaded)}_updateLocationValue(e,t){const n=`${Math.round(e*this.ratio)},${Math.round(t*this.ratio)}`;this.location&&(this.location.value=n)}_getLocation(){const e=this.container.dataset[this.options.dataLocation];if(e){const t=document.querySelector(e);if(t)return t}return this.container.querySelector(this.options.locationSelector)}_makeDraggable(){this.circle&&(this.circle.classList.add(this.options.draggableClass),this.circle.addEventListener("mousedown",this._onMouseDown),this.circle.addEventListener("touchstart",this._onMouseDown,{passive:!1}))}_onMouseDown(e){e.preventDefault(),this.isDragging=!0;const t="touchstart"===e.type?e.touches[0]:e,n=this.container.getBoundingClientRect();this.dragStartX=t.clientX-n.left,this.dragStartY=t.clientY-n.top;const r=this.circle.getBoundingClientRect();this.circleStartX=r.left-n.left+r.width/2,this.circleStartY=r.top-n.top+r.height/2,document.addEventListener("mousemove",this._onMouseMove),document.addEventListener("mouseup",this._onMouseUp),document.addEventListener("touchmove",this._onMouseMove,{passive:!1}),document.addEventListener("touchend",this._onMouseUp)}_onMouseMove(e){if(!this.isDragging)return;e.preventDefault();const t="touchmove"===e.type?e.touches[0]:e,n=this.container.getBoundingClientRect(),r=t.clientX-n.left,i=t.clientY-n.top,o=r-this.dragStartX,s=i-this.dragStartY;let a=this.circleStartX+o,l=this.circleStartY+s;a=Math.max(0,Math.min(n.width-1,a)),l=Math.max(0,Math.min(n.height-1,l)),this.circle.style.left=`${a}px`,this.circle.style.top=`${l}px`,this._updateLocationValue(a,l)}_onMouseUp(){this.isDragging=!1,document.removeEventListener("mousemove",this._onMouseMove),document.removeEventListener("mouseup",this._onMouseUp),document.removeEventListener("touchmove",this._onMouseMove),document.removeEventListener("touchend",this._onMouseUp)}_onImageLoaded(){if(!this.image||0===this.image.naturalWidth)return;this.circle?.classList.remove(this.options.hiddenClass);const e=this.location?.value||"",t=this.image.offsetWidth,n=this.image.offsetHeight;let r,i;if(e.length){const t=e.split(",");r=Math.round(Number(t[0])/this.ratio),i=Math.round(Number(t[1])/this.ratio)}else r=t/2,i=n/2;isNaN(r)||isNaN(i)||(this.circle&&(this.circle.style.left=`${r}px`,this.circle.style.top=`${i}px`),this._makeDraggable(),this._updateLocationValue(r,i))}destroy(){this.circle?.classList.contains(this.options.draggableClass)&&(this.circle.removeEventListener("mousedown",this._onMouseDown),this.circle.removeEventListener("touchstart",this._onMouseDown)),document.removeEventListener("mousemove",this._onMouseMove),document.removeEventListener("mouseup",this._onMouseUp),document.removeEventListener("touchmove",this._onMouseMove),document.removeEventListener("touchend",this._onMouseUp),this.image&&this.image.removeEventListener("load",this._onImageLoaded),this.options=null,this.container=null,this.image=null,this.circle=null,this.location=null,this.ratio=null}}window.Cl.FocalPoint=t,window.Cl.FocalPointConstructor=n,e.exports&&(e.exports=t)})();const r=window.Cl.FocalPoint},902(){"use strict";const e=e=>{const t=(e=(e=e.replace(/__dot__/g,".")).replace(/__dash__/g,"-")).lastIndexOf("__");return-1===t?e:e.substring(0,t)};window.dismissPopupAndReload=e=>{document.location.reload(),e.close()},window.dismissRelatedImageLookupPopup=(t,n,r,i,o)=>{const s=e(t.name),a=document.getElementById(s);if(!a)return;const l=a.closest(".filerFile");if(!l)return;const c=l.querySelector(".edit"),u=l.querySelector(".thumbnail_img"),d=l.querySelector(".description_text"),f=l.querySelector(".filerClearer"),p=l.parentElement.querySelector(".dz-message"),h=l.querySelector("input"),v=h.value;h.value=n;const m=h.closest(".js-filer-dropzone");m&&m.classList.add("js-object-attached"),r&&u&&(u.src=r,u.classList.remove("hidden"),u.removeAttribute("srcset")),d&&(d.textContent=i),f&&f.classList.remove("hidden"),a.classList.add("related-lookup-change"),c&&c.classList.add("related-lookup-change"),o&&c&&c.setAttribute("href",`${o}?_edit_from_widget=1`),p&&p.classList.add("hidden"),v!==n&&h.dispatchEvent(new Event("change",{bubbles:!0})),t.close()},window.dismissRelatedFolderLookupPopup=(t,n,r)=>{const i=e(t.name),o=document.getElementById(i);if(!o)return;const s=o.closest(".filerFile");if(!s)return;const a=s.querySelector(".thumbnail_img"),l=document.getElementById(`id_${i}_clear`),c=document.getElementById(`id_${i}`),u=s.querySelector(".description_text"),d=document.getElementById(i);c&&(c.value=n),a&&a.classList.remove("hidden"),u&&(u.textContent=r),l&&l.classList.remove("hidden"),d&&d.classList.add("hidden"),t.close()},document.addEventListener("DOMContentLoaded",()=>{document.querySelectorAll(".js-dismiss-popup").forEach(e=>{e.addEventListener("click",function(e){e.preventDefault();const t=this.dataset.fileId,n=this.dataset.iconUrl,r=this.dataset.label;if(this.classList.contains("js-dismiss-image")){const e=this.dataset.changeUrl||"";window.opener.dismissRelatedImageLookupPopup(window,t,n,r,e)}else this.classList.contains("js-dismiss-folder")&&window.opener.dismissRelatedFolderLookupPopup(window,t,r)})});const e=document.getElementById("popup-dismiss-data");if(e&&window.opener){const t=e.dataset.pk,n=e.dataset.label;window.opener.dismissRelatedPopup(window,t,n)}})},221(){"use strict";window.Cl=window.Cl||{},Cl.filerTooltip=()=>{const e=".js-filer-tooltip";document.querySelectorAll(e).forEach(t=>{t.addEventListener("mouseover",function(){const t=this.getAttribute("title");if(!t)return;this.dataset.filerTooltip=t,this.removeAttribute("title");const n=document.createElement("p");n.className="filer-tooltip",n.textContent=t;const r=document.querySelector(e);r&&r.appendChild(n)}),t.addEventListener("mouseout",function(){const e=this.dataset.filerTooltip;e&&this.setAttribute("title",e),document.querySelectorAll(".filer-tooltip").forEach(e=>{e.remove()})})})}},472(){"use strict";document.addEventListener("DOMContentLoaded",()=>{const e=e=>{e.preventDefault();const t=e.currentTarget,n=t.closest(".filerFile");if(!n)return;const r=n.querySelector("input"),i=n.querySelector(".thumbnail_img"),o=n.querySelector(".description_text"),s=n.querySelector(".lookup"),a=n.querySelector(".edit"),l=n.parentElement.querySelector(".dz-message"),c="hidden";if(t.classList.add(c),r&&(r.value=""),i){i.classList.add(c);var u=i.parentElement;"A"===u.tagName&&u.removeAttribute("href")}s&&s.classList.remove("related-lookup-change"),a&&a.classList.remove("related-lookup-change"),l&&l.classList.remove(c),o&&(o.textContent="")};document.querySelectorAll(".filerFile .vForeignKeyRawIdAdminField").forEach(e=>{e.setAttribute("type","hidden")}),document.querySelectorAll(".filerFile .filerClearer").forEach(t=>{t.addEventListener("click",e)})})},628(e){var t;self,t=function(){return function(){var e={3099:function(e){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},6077:function(e,t,n){var r=n(111);e.exports=function(e){if(!r(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},1223:function(e,t,n){var r=n(5112),i=n(30),o=n(3070),s=r("unscopables"),a=Array.prototype;null==a[s]&&o.f(a,s,{configurable:!0,value:i(null)}),e.exports=function(e){a[s][e]=!0}},1530:function(e,t,n){"use strict";var r=n(8710).charAt;e.exports=function(e,t,n){return t+(n?r(e,t).length:1)}},5787:function(e){e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e}},9670:function(e,t,n){var r=n(111);e.exports=function(e){if(!r(e))throw TypeError(String(e)+" is not an object");return e}},4019:function(e){e.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},260:function(e,t,n){"use strict";var r,i=n(4019),o=n(9781),s=n(7854),a=n(111),l=n(6656),c=n(648),u=n(8880),d=n(1320),f=n(3070).f,p=n(9518),h=n(7674),v=n(5112),m=n(9711),y=s.Int8Array,g=y&&y.prototype,b=s.Uint8ClampedArray,w=b&&b.prototype,x=y&&p(y),E=g&&p(g),S=Object.prototype,k=S.isPrototypeOf,L=v("toStringTag"),A=m("TYPED_ARRAY_TAG"),C=i&&!!h&&"Opera"!==c(s.opera),_=!1,T={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},F={BigInt64Array:8,BigUint64Array:8},I=function(e){if(!a(e))return!1;var t=c(e);return l(T,t)||l(F,t)};for(r in T)s[r]||(C=!1);if((!C||"function"!=typeof x||x===Function.prototype)&&(x=function(){throw TypeError("Incorrect invocation")},C))for(r in T)s[r]&&h(s[r],x);if((!C||!E||E===S)&&(E=x.prototype,C))for(r in T)s[r]&&h(s[r].prototype,E);if(C&&p(w)!==E&&h(w,E),o&&!l(E,L))for(r in _=!0,f(E,L,{get:function(){return a(this)?this[A]:void 0}}),T)s[r]&&u(s[r],A,r);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:C,TYPED_ARRAY_TAG:_&&A,aTypedArray:function(e){if(I(e))return e;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(e){if(h){if(k.call(x,e))return e}else for(var t in T)if(l(T,r)){var n=s[t];if(n&&(e===n||k.call(n,e)))return e}throw TypeError("Target is not a typed array constructor")},exportTypedArrayMethod:function(e,t,n){if(o){if(n)for(var r in T){var i=s[r];i&&l(i.prototype,e)&&delete i.prototype[e]}E[e]&&!n||d(E,e,n?t:C&&g[e]||t)}},exportTypedArrayStaticMethod:function(e,t,n){var r,i;if(o){if(h){if(n)for(r in T)(i=s[r])&&l(i,e)&&delete i[e];if(x[e]&&!n)return;try{return d(x,e,n?t:C&&y[e]||t)}catch(e){}}for(r in T)!(i=s[r])||i[e]&&!n||d(i,e,t)}},isView:function(e){if(!a(e))return!1;var t=c(e);return"DataView"===t||l(T,t)||l(F,t)},isTypedArray:I,TypedArray:x,TypedArrayPrototype:E}},3331:function(e,t,n){"use strict";var r=n(7854),i=n(9781),o=n(4019),s=n(8880),a=n(2248),l=n(7293),c=n(5787),u=n(9958),d=n(7466),f=n(7067),p=n(1179),h=n(9518),v=n(7674),m=n(8006).f,y=n(3070).f,g=n(1285),b=n(8003),w=n(9909),x=w.get,E=w.set,S="ArrayBuffer",k="DataView",L="prototype",A="Wrong index",C=r[S],_=C,T=r[k],F=T&&T[L],I=Object.prototype,M=r.RangeError,R=p.pack,z=p.unpack,q=function(e){return[255&e]},U=function(e){return[255&e,e>>8&255]},O=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},j=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},P=function(e){return R(e,23,4)},D=function(e){return R(e,52,8)},N=function(e,t){y(e[L],t,{get:function(){return x(this)[t]}})},$=function(e,t,n,r){var i=f(n),o=x(e);if(i+t>o.byteLength)throw M(A);var s=x(o.buffer).bytes,a=i+o.byteOffset,l=s.slice(a,a+t);return r?l:l.reverse()},B=function(e,t,n,r,i,o){var s=f(n),a=x(e);if(s+t>a.byteLength)throw M(A);for(var l=x(a.buffer).bytes,c=s+a.byteOffset,u=r(+i),d=0;dG;)(W=Y[G++])in _||s(_,W,C[W]);H.constructor=_}v&&h(F)!==I&&v(F,I);var Q=new T(new _(2)),X=F.setInt8;Q.setInt8(0,2147483648),Q.setInt8(1,2147483649),!Q.getInt8(0)&&Q.getInt8(1)||a(F,{setInt8:function(e,t){X.call(this,e,t<<24>>24)},setUint8:function(e,t){X.call(this,e,t<<24>>24)}},{unsafe:!0})}else _=function(e){c(this,_,S);var t=f(e);E(this,{bytes:g.call(new Array(t),0),byteLength:t}),i||(this.byteLength=t)},T=function(e,t,n){c(this,T,k),c(e,_,k);var r=x(e).byteLength,o=u(t);if(o<0||o>r)throw M("Wrong offset");if(o+(n=void 0===n?r-o:d(n))>r)throw M("Wrong length");E(this,{buffer:e,byteLength:n,byteOffset:o}),i||(this.buffer=e,this.byteLength=n,this.byteOffset=o)},i&&(N(_,"byteLength"),N(T,"buffer"),N(T,"byteLength"),N(T,"byteOffset")),a(T[L],{getInt8:function(e){return $(this,1,e)[0]<<24>>24},getUint8:function(e){return $(this,1,e)[0]},getInt16:function(e){var t=$(this,2,e,arguments.length>1?arguments[1]:void 0);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=$(this,2,e,arguments.length>1?arguments[1]:void 0);return t[1]<<8|t[0]},getInt32:function(e){return j($(this,4,e,arguments.length>1?arguments[1]:void 0))},getUint32:function(e){return j($(this,4,e,arguments.length>1?arguments[1]:void 0))>>>0},getFloat32:function(e){return z($(this,4,e,arguments.length>1?arguments[1]:void 0),23)},getFloat64:function(e){return z($(this,8,e,arguments.length>1?arguments[1]:void 0),52)},setInt8:function(e,t){B(this,1,e,q,t)},setUint8:function(e,t){B(this,1,e,q,t)},setInt16:function(e,t){B(this,2,e,U,t,arguments.length>2?arguments[2]:void 0)},setUint16:function(e,t){B(this,2,e,U,t,arguments.length>2?arguments[2]:void 0)},setInt32:function(e,t){B(this,4,e,O,t,arguments.length>2?arguments[2]:void 0)},setUint32:function(e,t){B(this,4,e,O,t,arguments.length>2?arguments[2]:void 0)},setFloat32:function(e,t){B(this,4,e,P,t,arguments.length>2?arguments[2]:void 0)},setFloat64:function(e,t){B(this,8,e,D,t,arguments.length>2?arguments[2]:void 0)}});b(_,S),b(T,k),e.exports={ArrayBuffer:_,DataView:T}},1048:function(e,t,n){"use strict";var r=n(7908),i=n(1400),o=n(7466),s=Math.min;e.exports=[].copyWithin||function(e,t){var n=r(this),a=o(n.length),l=i(e,a),c=i(t,a),u=arguments.length>2?arguments[2]:void 0,d=s((void 0===u?a:i(u,a))-c,a-l),f=1;for(c0;)c in n?n[l]=n[c]:delete n[l],l+=f,c+=f;return n}},1285:function(e,t,n){"use strict";var r=n(7908),i=n(1400),o=n(7466);e.exports=function(e){for(var t=r(this),n=o(t.length),s=arguments.length,a=i(s>1?arguments[1]:void 0,n),l=s>2?arguments[2]:void 0,c=void 0===l?n:i(l,n);c>a;)t[a++]=e;return t}},8533:function(e,t,n){"use strict";var r=n(2092).forEach,i=n(9341)("forEach");e.exports=i?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}},8457:function(e,t,n){"use strict";var r=n(9974),i=n(7908),o=n(3411),s=n(7659),a=n(7466),l=n(6135),c=n(1246);e.exports=function(e){var t,n,u,d,f,p,h=i(e),v="function"==typeof this?this:Array,m=arguments.length,y=m>1?arguments[1]:void 0,g=void 0!==y,b=c(h),w=0;if(g&&(y=r(y,m>2?arguments[2]:void 0,2)),null==b||v==Array&&s(b))for(n=new v(t=a(h.length));t>w;w++)p=g?y(h[w],w):h[w],l(n,w,p);else for(f=(d=b.call(h)).next,n=new v;!(u=f.call(d)).done;w++)p=g?o(d,y,[u.value,w],!0):u.value,l(n,w,p);return n.length=w,n}},1318:function(e,t,n){var r=n(5656),i=n(7466),o=n(1400),s=function(e){return function(t,n,s){var a,l=r(t),c=i(l.length),u=o(s,c);if(e&&n!=n){for(;c>u;)if((a=l[u++])!=a)return!0}else for(;c>u;u++)if((e||u in l)&&l[u]===n)return e||u||0;return!e&&-1}};e.exports={includes:s(!0),indexOf:s(!1)}},2092:function(e,t,n){var r=n(9974),i=n(8361),o=n(7908),s=n(7466),a=n(5417),l=[].push,c=function(e){var t=1==e,n=2==e,c=3==e,u=4==e,d=6==e,f=7==e,p=5==e||d;return function(h,v,m,y){for(var g,b,w=o(h),x=i(w),E=r(v,m,3),S=s(x.length),k=0,L=y||a,A=t?L(h,S):n||f?L(h,0):void 0;S>k;k++)if((p||k in x)&&(b=E(g=x[k],k,w),e))if(t)A[k]=b;else if(b)switch(e){case 3:return!0;case 5:return g;case 6:return k;case 2:l.call(A,g)}else switch(e){case 4:return!1;case 7:l.call(A,g)}return d?-1:c||u?u:A}};e.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterOut:c(7)}},6583:function(e,t,n){"use strict";var r=n(5656),i=n(9958),o=n(7466),s=n(9341),a=Math.min,l=[].lastIndexOf,c=!!l&&1/[1].lastIndexOf(1,-0)<0,u=s("lastIndexOf"),d=c||!u;e.exports=d?function(e){if(c)return l.apply(this,arguments)||0;var t=r(this),n=o(t.length),s=n-1;for(arguments.length>1&&(s=a(s,i(arguments[1]))),s<0&&(s=n+s);s>=0;s--)if(s in t&&t[s]===e)return s||0;return-1}:l},1194:function(e,t,n){var r=n(7293),i=n(5112),o=n(7392),s=i("species");e.exports=function(e){return o>=51||!r(function(){var t=[];return(t.constructor={})[s]=function(){return{foo:1}},1!==t[e](Boolean).foo})}},9341:function(e,t,n){"use strict";var r=n(7293);e.exports=function(e,t){var n=[][e];return!!n&&r(function(){n.call(null,t||function(){throw 1},1)})}},3671:function(e,t,n){var r=n(3099),i=n(7908),o=n(8361),s=n(7466),a=function(e){return function(t,n,a,l){r(n);var c=i(t),u=o(c),d=s(c.length),f=e?d-1:0,p=e?-1:1;if(a<2)for(;;){if(f in u){l=u[f],f+=p;break}if(f+=p,e?f<0:d<=f)throw TypeError("Reduce of empty array with no initial value")}for(;e?f>=0:d>f;f+=p)f in u&&(l=n(l,u[f],f,c));return l}};e.exports={left:a(!1),right:a(!0)}},5417:function(e,t,n){var r=n(111),i=n(3157),o=n(5112)("species");e.exports=function(e,t){var n;return i(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!i(n.prototype)?r(n)&&null===(n=n[o])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)}},3411:function(e,t,n){var r=n(9670),i=n(9212);e.exports=function(e,t,n,o){try{return o?t(r(n)[0],n[1]):t(n)}catch(t){throw i(e),t}}},7072:function(e,t,n){var r=n(5112)("iterator"),i=!1;try{var o=0,s={next:function(){return{done:!!o++}},return:function(){i=!0}};s[r]=function(){return this},Array.from(s,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var n=!1;try{var o={};o[r]=function(){return{next:function(){return{done:n=!0}}}},e(o)}catch(e){}return n}},4326:function(e){var t={}.toString;e.exports=function(e){return t.call(e).slice(8,-1)}},648:function(e,t,n){var r=n(1694),i=n(4326),o=n(5112)("toStringTag"),s="Arguments"==i(function(){return arguments}());e.exports=r?i:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),o))?n:s?i(t):"Object"==(r=i(t))&&"function"==typeof t.callee?"Arguments":r}},9920:function(e,t,n){var r=n(6656),i=n(3887),o=n(1236),s=n(3070);e.exports=function(e,t){for(var n=i(t),a=s.f,l=o.f,c=0;c=74)&&(r=s.match(/Chrome\/(\d+)/))&&(i=r[1]),e.exports=i&&+i},748:function(e){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},2109:function(e,t,n){var r=n(7854),i=n(1236).f,o=n(8880),s=n(1320),a=n(3505),l=n(9920),c=n(4705);e.exports=function(e,t){var n,u,d,f,p,h=e.target,v=e.global,m=e.stat;if(n=v?r:m?r[h]||a(h,{}):(r[h]||{}).prototype)for(u in t){if(f=t[u],d=e.noTargetGet?(p=i(n,u))&&p.value:n[u],!c(v?u:h+(m?".":"#")+u,e.forced)&&void 0!==d){if(typeof f==typeof d)continue;l(f,d)}(e.sham||d&&d.sham)&&o(f,"sham",!0),s(n,u,f,e)}}},7293:function(e){e.exports=function(e){try{return!!e()}catch(e){return!0}}},7007:function(e,t,n){"use strict";n(4916);var r=n(1320),i=n(7293),o=n(5112),s=n(2261),a=n(8880),l=o("species"),c=!i(function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")}),u="$0"==="a".replace(/./,"$0"),d=o("replace"),f=!!/./[d]&&""===/./[d]("a","$0"),p=!i(function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]});e.exports=function(e,t,n,d){var h=o(e),v=!i(function(){var t={};return t[h]=function(){return 7},7!=""[e](t)}),m=v&&!i(function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[l]=function(){return n},n.flags="",n[h]=/./[h]),n.exec=function(){return t=!0,null},n[h](""),!t});if(!v||!m||"replace"===e&&(!c||!u||f)||"split"===e&&!p){var y=/./[h],g=n(h,""[e],function(e,t,n,r,i){return t.exec===s?v&&!i?{done:!0,value:y.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}},{REPLACE_KEEPS_$0:u,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:f}),b=g[0],w=g[1];r(String.prototype,e,b),r(RegExp.prototype,h,2==t?function(e,t){return w.call(e,this,t)}:function(e){return w.call(e,this)})}d&&a(RegExp.prototype[h],"sham",!0)}},9974:function(e,t,n){var r=n(3099);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}}},5005:function(e,t,n){var r=n(857),i=n(7854),o=function(e){return"function"==typeof e?e:void 0};e.exports=function(e,t){return arguments.length<2?o(r[e])||o(i[e]):r[e]&&r[e][t]||i[e]&&i[e][t]}},1246:function(e,t,n){var r=n(648),i=n(7497),o=n(5112)("iterator");e.exports=function(e){if(null!=e)return e[o]||e["@@iterator"]||i[r(e)]}},8554:function(e,t,n){var r=n(9670),i=n(1246);e.exports=function(e){var t=i(e);if("function"!=typeof t)throw TypeError(String(e)+" is not iterable");return r(t.call(e))}},647:function(e,t,n){var r=n(7908),i=Math.floor,o="".replace,s=/\$([$&'`]|\d\d?|<[^>]*>)/g,a=/\$([$&'`]|\d\d?)/g;e.exports=function(e,t,n,l,c,u){var d=n+e.length,f=l.length,p=a;return void 0!==c&&(c=r(c),p=s),o.call(u,p,function(r,o){var s;switch(o.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,n);case"'":return t.slice(d);case"<":s=c[o.slice(1,-1)];break;default:var a=+o;if(0===a)return r;if(a>f){var u=i(a/10);return 0===u?r:u<=f?void 0===l[u-1]?o.charAt(1):l[u-1]+o.charAt(1):r}s=l[a-1]}return void 0===s?"":s})}},7854:function(e,t,n){var r=function(e){return e&&e.Math==Math&&e};e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},6656:function(e){var t={}.hasOwnProperty;e.exports=function(e,n){return t.call(e,n)}},3501:function(e){e.exports={}},490:function(e,t,n){var r=n(5005);e.exports=r("document","documentElement")},4664:function(e,t,n){var r=n(9781),i=n(7293),o=n(317);e.exports=!r&&!i(function(){return 7!=Object.defineProperty(o("div"),"a",{get:function(){return 7}}).a})},1179:function(e){var t=Math.abs,n=Math.pow,r=Math.floor,i=Math.log,o=Math.LN2;e.exports={pack:function(e,s,a){var l,c,u,d=new Array(a),f=8*a-s-1,p=(1<>1,v=23===s?n(2,-24)-n(2,-77):0,m=e<0||0===e&&1/e<0?1:0,y=0;for((e=t(e))!=e||e===1/0?(c=e!=e?1:0,l=p):(l=r(i(e)/o),e*(u=n(2,-l))<1&&(l--,u*=2),(e+=l+h>=1?v/u:v*n(2,1-h))*u>=2&&(l++,u/=2),l+h>=p?(c=0,l=p):l+h>=1?(c=(e*u-1)*n(2,s),l+=h):(c=e*n(2,h-1)*n(2,s),l=0));s>=8;d[y++]=255&c,c/=256,s-=8);for(l=l<0;d[y++]=255&l,l/=256,f-=8);return d[--y]|=128*m,d},unpack:function(e,t){var r,i=e.length,o=8*i-t-1,s=(1<>1,l=o-7,c=i-1,u=e[c--],d=127&u;for(u>>=7;l>0;d=256*d+e[c],c--,l-=8);for(r=d&(1<<-l)-1,d>>=-l,l+=t;l>0;r=256*r+e[c],c--,l-=8);if(0===d)d=1-a;else{if(d===s)return r?NaN:u?-1/0:1/0;r+=n(2,t),d-=a}return(u?-1:1)*r*n(2,d-t)}}},8361:function(e,t,n){var r=n(7293),i=n(4326),o="".split;e.exports=r(function(){return!Object("z").propertyIsEnumerable(0)})?function(e){return"String"==i(e)?o.call(e,""):Object(e)}:Object},9587:function(e,t,n){var r=n(111),i=n(7674);e.exports=function(e,t,n){var o,s;return i&&"function"==typeof(o=t.constructor)&&o!==n&&r(s=o.prototype)&&s!==n.prototype&&i(e,s),e}},2788:function(e,t,n){var r=n(5465),i=Function.toString;"function"!=typeof r.inspectSource&&(r.inspectSource=function(e){return i.call(e)}),e.exports=r.inspectSource},9909:function(e,t,n){var r,i,o,s=n(8536),a=n(7854),l=n(111),c=n(8880),u=n(6656),d=n(5465),f=n(6200),p=n(3501),h=a.WeakMap;if(s){var v=d.state||(d.state=new h),m=v.get,y=v.has,g=v.set;r=function(e,t){return t.facade=e,g.call(v,e,t),t},i=function(e){return m.call(v,e)||{}},o=function(e){return y.call(v,e)}}else{var b=f("state");p[b]=!0,r=function(e,t){return t.facade=e,c(e,b,t),t},i=function(e){return u(e,b)?e[b]:{}},o=function(e){return u(e,b)}}e.exports={set:r,get:i,has:o,enforce:function(e){return o(e)?i(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!l(t)||(n=i(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}}},7659:function(e,t,n){var r=n(5112),i=n(7497),o=r("iterator"),s=Array.prototype;e.exports=function(e){return void 0!==e&&(i.Array===e||s[o]===e)}},3157:function(e,t,n){var r=n(4326);e.exports=Array.isArray||function(e){return"Array"==r(e)}},4705:function(e,t,n){var r=n(7293),i=/#|\.prototype\./,o=function(e,t){var n=a[s(e)];return n==c||n!=l&&("function"==typeof t?r(t):!!t)},s=o.normalize=function(e){return String(e).replace(i,".").toLowerCase()},a=o.data={},l=o.NATIVE="N",c=o.POLYFILL="P";e.exports=o},111:function(e){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},1913:function(e){e.exports=!1},7850:function(e,t,n){var r=n(111),i=n(4326),o=n(5112)("match");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[o])?!!t:"RegExp"==i(e))}},9212:function(e,t,n){var r=n(9670);e.exports=function(e){var t=e.return;if(void 0!==t)return r(t.call(e)).value}},3383:function(e,t,n){"use strict";var r,i,o,s=n(7293),a=n(9518),l=n(8880),c=n(6656),u=n(5112),d=n(1913),f=u("iterator"),p=!1;[].keys&&("next"in(o=[].keys())?(i=a(a(o)))!==Object.prototype&&(r=i):p=!0);var h=null==r||s(function(){var e={};return r[f].call(e)!==e});h&&(r={}),d&&!h||c(r,f)||l(r,f,function(){return this}),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:p}},7497:function(e){e.exports={}},133:function(e,t,n){var r=n(7293);e.exports=!!Object.getOwnPropertySymbols&&!r(function(){return!String(Symbol())})},590:function(e,t,n){var r=n(7293),i=n(5112),o=n(1913),s=i("iterator");e.exports=!r(function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,n="";return e.pathname="c%20d",t.forEach(function(e,r){t.delete("b"),n+=r+e}),o&&!e.toJSON||!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[s]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==n||"x"!==new URL("http://x",void 0).host})},8536:function(e,t,n){var r=n(7854),i=n(2788),o=r.WeakMap;e.exports="function"==typeof o&&/native code/.test(i(o))},1574:function(e,t,n){"use strict";var r=n(9781),i=n(7293),o=n(1956),s=n(5181),a=n(5296),l=n(7908),c=n(8361),u=Object.assign,d=Object.defineProperty;e.exports=!u||i(function(){if(r&&1!==u({b:1},u(d({},"a",{enumerable:!0,get:function(){d(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach(function(e){t[e]=e}),7!=u({},e)[n]||o(u({},t)).join("")!=i})?function(e,t){for(var n=l(e),i=arguments.length,u=1,d=s.f,f=a.f;i>u;)for(var p,h=c(arguments[u++]),v=d?o(h).concat(d(h)):o(h),m=v.length,y=0;m>y;)p=v[y++],r&&!f.call(h,p)||(n[p]=h[p]);return n}:u},30:function(e,t,n){var r,i=n(9670),o=n(6048),s=n(748),a=n(3501),l=n(490),c=n(317),u=n(6200),d="prototype",f="script",p=u("IE_PROTO"),h=function(){},v=function(e){return"<"+f+">"+e+""},m=function(){try{r=document.domain&&new ActiveXObject("htmlfile")}catch(e){}var e,t,n;m=r?function(e){e.write(v("")),e.close();var t=e.parentWindow.Object;return e=null,t}(r):(t=c("iframe"),n="java"+f+":",t.style.display="none",l.appendChild(t),t.src=String(n),(e=t.contentWindow.document).open(),e.write(v("document.F=Object")),e.close(),e.F);for(var i=s.length;i--;)delete m[d][s[i]];return m()};a[p]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(h[d]=i(e),n=new h,h[d]=null,n[p]=e):n=m(),void 0===t?n:o(n,t)}},6048:function(e,t,n){var r=n(9781),i=n(3070),o=n(9670),s=n(1956);e.exports=r?Object.defineProperties:function(e,t){o(e);for(var n,r=s(t),a=r.length,l=0;a>l;)i.f(e,n=r[l++],t[n]);return e}},3070:function(e,t,n){var r=n(9781),i=n(4664),o=n(9670),s=n(7593),a=Object.defineProperty;t.f=r?a:function(e,t,n){if(o(e),t=s(t,!0),o(n),i)try{return a(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},1236:function(e,t,n){var r=n(9781),i=n(5296),o=n(9114),s=n(5656),a=n(7593),l=n(6656),c=n(4664),u=Object.getOwnPropertyDescriptor;t.f=r?u:function(e,t){if(e=s(e),t=a(t,!0),c)try{return u(e,t)}catch(e){}if(l(e,t))return o(!i.f.call(e,t),e[t])}},8006:function(e,t,n){var r=n(6324),i=n(748).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,i)}},5181:function(e,t){t.f=Object.getOwnPropertySymbols},9518:function(e,t,n){var r=n(6656),i=n(7908),o=n(6200),s=n(8544),a=o("IE_PROTO"),l=Object.prototype;e.exports=s?Object.getPrototypeOf:function(e){return e=i(e),r(e,a)?e[a]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?l:null}},6324:function(e,t,n){var r=n(6656),i=n(5656),o=n(1318).indexOf,s=n(3501);e.exports=function(e,t){var n,a=i(e),l=0,c=[];for(n in a)!r(s,n)&&r(a,n)&&c.push(n);for(;t.length>l;)r(a,n=t[l++])&&(~o(c,n)||c.push(n));return c}},1956:function(e,t,n){var r=n(6324),i=n(748);e.exports=Object.keys||function(e){return r(e,i)}},5296:function(e,t){"use strict";var n={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,i=r&&!n.call({1:2},1);t.f=i?function(e){var t=r(this,e);return!!t&&t.enumerable}:n},7674:function(e,t,n){var r=n(9670),i=n(6077);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,o){return r(n),i(o),t?e.call(n,o):n.__proto__=o,n}}():void 0)},288:function(e,t,n){"use strict";var r=n(1694),i=n(648);e.exports=r?{}.toString:function(){return"[object "+i(this)+"]"}},3887:function(e,t,n){var r=n(5005),i=n(8006),o=n(5181),s=n(9670);e.exports=r("Reflect","ownKeys")||function(e){var t=i.f(s(e)),n=o.f;return n?t.concat(n(e)):t}},857:function(e,t,n){var r=n(7854);e.exports=r},2248:function(e,t,n){var r=n(1320);e.exports=function(e,t,n){for(var i in t)r(e,i,t[i],n);return e}},1320:function(e,t,n){var r=n(7854),i=n(8880),o=n(6656),s=n(3505),a=n(2788),l=n(9909),c=l.get,u=l.enforce,d=String(String).split("String");(e.exports=function(e,t,n,a){var l,c=!!a&&!!a.unsafe,f=!!a&&!!a.enumerable,p=!!a&&!!a.noTargetGet;"function"==typeof n&&("string"!=typeof t||o(n,"name")||i(n,"name",t),(l=u(n)).source||(l.source=d.join("string"==typeof t?t:""))),e!==r?(c?!p&&e[t]&&(f=!0):delete e[t],f?e[t]=n:i(e,t,n)):f?e[t]=n:s(t,n)})(Function.prototype,"toString",function(){return"function"==typeof this&&c(this).source||a(this)})},7651:function(e,t,n){var r=n(4326),i=n(2261);e.exports=function(e,t){var n=e.exec;if("function"==typeof n){var o=n.call(e,t);if("object"!=typeof o)throw TypeError("RegExp exec method returned something other than an Object or null");return o}if("RegExp"!==r(e))throw TypeError("RegExp#exec called on incompatible receiver");return i.call(e,t)}},2261:function(e,t,n){"use strict";var r,i,o=n(7066),s=n(2999),a=RegExp.prototype.exec,l=String.prototype.replace,c=a,u=(r=/a/,i=/b*/g,a.call(r,"a"),a.call(i,"a"),0!==r.lastIndex||0!==i.lastIndex),d=s.UNSUPPORTED_Y||s.BROKEN_CARET,f=void 0!==/()??/.exec("")[1];(u||f||d)&&(c=function(e){var t,n,r,i,s=this,c=d&&s.sticky,p=o.call(s),h=s.source,v=0,m=e;return c&&(-1===(p=p.replace("y","")).indexOf("g")&&(p+="g"),m=String(e).slice(s.lastIndex),s.lastIndex>0&&(!s.multiline||s.multiline&&"\n"!==e[s.lastIndex-1])&&(h="(?: "+h+")",m=" "+m,v++),n=new RegExp("^(?:"+h+")",p)),f&&(n=new RegExp("^"+h+"$(?!\\s)",p)),u&&(t=s.lastIndex),r=a.call(c?n:s,m),c?r?(r.input=r.input.slice(v),r[0]=r[0].slice(v),r.index=s.lastIndex,s.lastIndex+=r[0].length):s.lastIndex=0:u&&r&&(s.lastIndex=s.global?r.index+r[0].length:t),f&&r&&r.length>1&&l.call(r[0],n,function(){for(i=1;i=c?e?"":void 0:(o=a.charCodeAt(l))<55296||o>56319||l+1===c||(s=a.charCodeAt(l+1))<56320||s>57343?e?a.charAt(l):o:e?a.slice(l,l+2):s-56320+(o-55296<<10)+65536}};e.exports={codeAt:o(!1),charAt:o(!0)}},3197:function(e){"use strict";var t=2147483647,n=/[^\0-\u007E]/,r=/[.\u3002\uFF0E\uFF61]/g,i="Overflow: input needs wider integers to process",o=Math.floor,s=String.fromCharCode,a=function(e){return e+22+75*(e<26)},l=function(e,t,n){var r=0;for(e=n?o(e/700):e>>1,e+=o(e/t);e>455;r+=36)e=o(e/35);return o(r+36*e/(e+38))},c=function(e){var n=[];e=function(e){for(var t=[],n=0,r=e.length;n=55296&&i<=56319&&n=d&&co((t-f)/y))throw RangeError(i);for(f+=(m-d)*y,d=m,r=0;rt)throw RangeError(i);if(c==d){for(var g=f,b=36;;b+=36){var w=b<=p?1:b>=p+26?26:b-p;if(g0?n:t)(e)}},7466:function(e,t,n){var r=n(9958),i=Math.min;e.exports=function(e){return e>0?i(r(e),9007199254740991):0}},7908:function(e,t,n){var r=n(4488);e.exports=function(e){return Object(r(e))}},4590:function(e,t,n){var r=n(3002);e.exports=function(e,t){var n=r(e);if(n%t)throw RangeError("Wrong offset");return n}},3002:function(e,t,n){var r=n(9958);e.exports=function(e){var t=r(e);if(t<0)throw RangeError("The argument can't be less than 0");return t}},7593:function(e,t,n){var r=n(111);e.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},1694:function(e,t,n){var r={};r[n(5112)("toStringTag")]="z",e.exports="[object z]"===String(r)},9843:function(e,t,n){"use strict";var r=n(2109),i=n(7854),o=n(9781),s=n(3832),a=n(260),l=n(3331),c=n(5787),u=n(9114),d=n(8880),f=n(7466),p=n(7067),h=n(4590),v=n(7593),m=n(6656),y=n(648),g=n(111),b=n(30),w=n(7674),x=n(8006).f,E=n(7321),S=n(2092).forEach,k=n(6340),L=n(3070),A=n(1236),C=n(9909),_=n(9587),T=C.get,F=C.set,I=L.f,M=A.f,R=Math.round,z=i.RangeError,q=l.ArrayBuffer,U=l.DataView,O=a.NATIVE_ARRAY_BUFFER_VIEWS,j=a.TYPED_ARRAY_TAG,P=a.TypedArray,D=a.TypedArrayPrototype,N=a.aTypedArrayConstructor,$=a.isTypedArray,B="BYTES_PER_ELEMENT",W="Wrong length",H=function(e,t){for(var n=0,r=t.length,i=new(N(e))(r);r>n;)i[n]=t[n++];return i},Y=function(e,t){I(e,t,{get:function(){return T(this)[t]}})},G=function(e){var t;return e instanceof q||"ArrayBuffer"==(t=y(e))||"SharedArrayBuffer"==t},Q=function(e,t){return $(e)&&"symbol"!=typeof t&&t in e&&String(+t)==String(t)},X=function(e,t){return Q(e,t=v(t,!0))?u(2,e[t]):M(e,t)},V=function(e,t,n){return!(Q(e,t=v(t,!0))&&g(n)&&m(n,"value"))||m(n,"get")||m(n,"set")||n.configurable||m(n,"writable")&&!n.writable||m(n,"enumerable")&&!n.enumerable?I(e,t,n):(e[t]=n.value,e)};o?(O||(A.f=X,L.f=V,Y(D,"buffer"),Y(D,"byteOffset"),Y(D,"byteLength"),Y(D,"length")),r({target:"Object",stat:!0,forced:!O},{getOwnPropertyDescriptor:X,defineProperty:V}),e.exports=function(e,t,n){var o=e.match(/\d+$/)[0]/8,a=e+(n?"Clamped":"")+"Array",l="get"+e,u="set"+e,v=i[a],m=v,y=m&&m.prototype,L={},A=function(e,t){I(e,t,{get:function(){return function(e,t){var n=T(e);return n.view[l](t*o+n.byteOffset,!0)}(this,t)},set:function(e){return function(e,t,r){var i=T(e);n&&(r=(r=R(r))<0?0:r>255?255:255&r),i.view[u](t*o+i.byteOffset,r,!0)}(this,t,e)},enumerable:!0})};O?s&&(m=t(function(e,t,n,r){return c(e,m,a),_(g(t)?G(t)?void 0!==r?new v(t,h(n,o),r):void 0!==n?new v(t,h(n,o)):new v(t):$(t)?H(m,t):E.call(m,t):new v(p(t)),e,m)}),w&&w(m,P),S(x(v),function(e){e in m||d(m,e,v[e])}),m.prototype=y):(m=t(function(e,t,n,r){c(e,m,a);var i,s,l,u=0,d=0;if(g(t)){if(!G(t))return $(t)?H(m,t):E.call(m,t);i=t,d=h(n,o);var v=t.byteLength;if(void 0===r){if(v%o)throw z(W);if((s=v-d)<0)throw z(W)}else if((s=f(r)*o)+d>v)throw z(W);l=s/o}else l=p(t),i=new q(s=l*o);for(F(e,{buffer:i,byteOffset:d,byteLength:s,length:l,view:new U(i)});uo;)a[o]=t[o++];return a}},7321:function(e,t,n){var r=n(7908),i=n(7466),o=n(1246),s=n(7659),a=n(9974),l=n(260).aTypedArrayConstructor;e.exports=function(e){var t,n,c,u,d,f,p=r(e),h=arguments.length,v=h>1?arguments[1]:void 0,m=void 0!==v,y=o(p);if(null!=y&&!s(y))for(f=(d=y.call(p)).next,p=[];!(u=f.call(d)).done;)p.push(u.value);for(m&&h>2&&(v=a(v,arguments[2],2)),n=i(p.length),c=new(l(this))(n),t=0;n>t;t++)c[t]=m?v(p[t],t):p[t];return c}},9711:function(e){var t=0,n=Math.random();e.exports=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++t+n).toString(36)}},3307:function(e,t,n){var r=n(133);e.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},5112:function(e,t,n){var r=n(7854),i=n(2309),o=n(6656),s=n(9711),a=n(133),l=n(3307),c=i("wks"),u=r.Symbol,d=l?u:u&&u.withoutSetter||s;e.exports=function(e){return o(c,e)||(a&&o(u,e)?c[e]=u[e]:c[e]=d("Symbol."+e)),c[e]}},1361:function(e){e.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},8264:function(e,t,n){"use strict";var r=n(2109),i=n(7854),o=n(3331),s=n(6340),a="ArrayBuffer",l=o[a];r({global:!0,forced:i[a]!==l},{ArrayBuffer:l}),s(a)},2222:function(e,t,n){"use strict";var r=n(2109),i=n(7293),o=n(3157),s=n(111),a=n(7908),l=n(7466),c=n(6135),u=n(5417),d=n(1194),f=n(5112),p=n(7392),h=f("isConcatSpreadable"),v=9007199254740991,m="Maximum allowed index exceeded",y=p>=51||!i(function(){var e=[];return e[h]=!1,e.concat()[0]!==e}),g=d("concat"),b=function(e){if(!s(e))return!1;var t=e[h];return void 0!==t?!!t:o(e)};r({target:"Array",proto:!0,forced:!y||!g},{concat:function(e){var t,n,r,i,o,s=a(this),d=u(s,0),f=0;for(t=-1,r=arguments.length;tv)throw TypeError(m);for(n=0;n=v)throw TypeError(m);c(d,f++,o)}return d.length=f,d}})},7327:function(e,t,n){"use strict";var r=n(2109),i=n(2092).filter;r({target:"Array",proto:!0,forced:!n(1194)("filter")},{filter:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}})},2772:function(e,t,n){"use strict";var r=n(2109),i=n(1318).indexOf,o=n(9341),s=[].indexOf,a=!!s&&1/[1].indexOf(1,-0)<0,l=o("indexOf");r({target:"Array",proto:!0,forced:a||!l},{indexOf:function(e){return a?s.apply(this,arguments)||0:i(this,e,arguments.length>1?arguments[1]:void 0)}})},6992:function(e,t,n){"use strict";var r=n(5656),i=n(1223),o=n(7497),s=n(9909),a=n(654),l="Array Iterator",c=s.set,u=s.getterFor(l);e.exports=a(Array,"Array",function(e,t){c(this,{type:l,target:r(e),index:0,kind:t})},function(){var e=u(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}},"values"),o.Arguments=o.Array,i("keys"),i("values"),i("entries")},1249:function(e,t,n){"use strict";var r=n(2109),i=n(2092).map;r({target:"Array",proto:!0,forced:!n(1194)("map")},{map:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}})},7042:function(e,t,n){"use strict";var r=n(2109),i=n(111),o=n(3157),s=n(1400),a=n(7466),l=n(5656),c=n(6135),u=n(5112),d=n(1194)("slice"),f=u("species"),p=[].slice,h=Math.max;r({target:"Array",proto:!0,forced:!d},{slice:function(e,t){var n,r,u,d=l(this),v=a(d.length),m=s(e,v),y=s(void 0===t?v:t,v);if(o(d)&&("function"!=typeof(n=d.constructor)||n!==Array&&!o(n.prototype)?i(n)&&null===(n=n[f])&&(n=void 0):n=void 0,n===Array||void 0===n))return p.call(d,m,y);for(r=new(void 0===n?Array:n)(h(y-m,0)),u=0;m9007199254740991)throw TypeError("Maximum allowed length exceeded");for(u=l(m,r),p=0;py-r+n;p--)delete m[p-1]}else if(n>r)for(p=y-r;p>g;p--)v=p+n-1,(h=p+r-1)in m?m[v]=m[h]:delete m[v];for(p=0;p=n.length?{value:void 0,done:!0}:(e=r(n,i),t.index+=e.length,{value:e,done:!1})})},4723:function(e,t,n){"use strict";var r=n(7007),i=n(9670),o=n(7466),s=n(4488),a=n(1530),l=n(7651);r("match",1,function(e,t,n){return[function(t){var n=s(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var s=i(e),c=String(this);if(!s.global)return l(s,c);var u=s.unicode;s.lastIndex=0;for(var d,f=[],p=0;null!==(d=l(s,c));){var h=String(d[0]);f[p]=h,""===h&&(s.lastIndex=a(c,o(s.lastIndex),u)),p++}return 0===p?null:f}]})},5306:function(e,t,n){"use strict";var r=n(7007),i=n(9670),o=n(7466),s=n(9958),a=n(4488),l=n(1530),c=n(647),u=n(7651),d=Math.max,f=Math.min,p=function(e){return void 0===e?e:String(e)};r("replace",2,function(e,t,n,r){var h=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,v=r.REPLACE_KEEPS_$0,m=h?"$":"$0";return[function(n,r){var i=a(this),o=null==n?void 0:n[e];return void 0!==o?o.call(n,i,r):t.call(String(i),n,r)},function(e,r){if(!h&&v||"string"==typeof r&&-1===r.indexOf(m)){var a=n(t,e,this,r);if(a.done)return a.value}var y=i(e),g=String(this),b="function"==typeof r;b||(r=String(r));var w=y.global;if(w){var x=y.unicode;y.lastIndex=0}for(var E=[];;){var S=u(y,g);if(null===S)break;if(E.push(S),!w)break;""===String(S[0])&&(y.lastIndex=l(g,o(y.lastIndex),x))}for(var k="",L=0,A=0;A=L&&(k+=g.slice(L,_)+R,L=_+C.length)}return k+g.slice(L)}]})},3123:function(e,t,n){"use strict";var r=n(7007),i=n(7850),o=n(9670),s=n(4488),a=n(6707),l=n(1530),c=n(7466),u=n(7651),d=n(2261),f=n(7293),p=[].push,h=Math.min,v=4294967295,m=!f(function(){return!RegExp(v,"y")});r("split",2,function(e,t,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var r=String(s(this)),o=void 0===n?v:n>>>0;if(0===o)return[];if(void 0===e)return[r];if(!i(e))return t.call(r,e,o);for(var a,l,c,u=[],f=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),h=0,m=new RegExp(e.source,f+"g");(a=d.call(m,r))&&!((l=m.lastIndex)>h&&(u.push(r.slice(h,a.index)),a.length>1&&a.index=o));)m.lastIndex===a.index&&m.lastIndex++;return h===r.length?!c&&m.test("")||u.push(""):u.push(r.slice(h)),u.length>o?u.slice(0,o):u}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var i=s(this),o=null==t?void 0:t[e];return void 0!==o?o.call(t,i,n):r.call(String(i),t,n)},function(e,i){var s=n(r,e,this,i,r!==t);if(s.done)return s.value;var d=o(e),f=String(this),p=a(d,RegExp),y=d.unicode,g=(d.ignoreCase?"i":"")+(d.multiline?"m":"")+(d.unicode?"u":"")+(m?"y":"g"),b=new p(m?d:"^(?:"+d.source+")",g),w=void 0===i?v:i>>>0;if(0===w)return[];if(0===f.length)return null===u(b,f)?[f]:[];for(var x=0,E=0,S=[];E2?arguments[2]:void 0)})},8927:function(e,t,n){"use strict";var r=n(260),i=n(2092).every,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("every",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},3105:function(e,t,n){"use strict";var r=n(260),i=n(1285),o=r.aTypedArray;(0,r.exportTypedArrayMethod)("fill",function(e){return i.apply(o(this),arguments)})},5035:function(e,t,n){"use strict";var r=n(260),i=n(2092).filter,o=n(3074),s=r.aTypedArray;(0,r.exportTypedArrayMethod)("filter",function(e){var t=i(s(this),e,arguments.length>1?arguments[1]:void 0);return o(this,t)})},7174:function(e,t,n){"use strict";var r=n(260),i=n(2092).findIndex,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("findIndex",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},4345:function(e,t,n){"use strict";var r=n(260),i=n(2092).find,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("find",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},2846:function(e,t,n){"use strict";var r=n(260),i=n(2092).forEach,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("forEach",function(e){i(o(this),e,arguments.length>1?arguments[1]:void 0)})},4731:function(e,t,n){"use strict";var r=n(260),i=n(1318).includes,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("includes",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},7209:function(e,t,n){"use strict";var r=n(260),i=n(1318).indexOf,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("indexOf",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},6319:function(e,t,n){"use strict";var r=n(7854),i=n(260),o=n(6992),s=n(5112)("iterator"),a=r.Uint8Array,l=o.values,c=o.keys,u=o.entries,d=i.aTypedArray,f=i.exportTypedArrayMethod,p=a&&a.prototype[s],h=!!p&&("values"==p.name||null==p.name),v=function(){return l.call(d(this))};f("entries",function(){return u.call(d(this))}),f("keys",function(){return c.call(d(this))}),f("values",v,!h),f(s,v,!h)},8867:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=[].join;o("join",function(e){return s.apply(i(this),arguments)})},7789:function(e,t,n){"use strict";var r=n(260),i=n(6583),o=r.aTypedArray;(0,r.exportTypedArrayMethod)("lastIndexOf",function(e){return i.apply(o(this),arguments)})},3739:function(e,t,n){"use strict";var r=n(260),i=n(2092).map,o=n(6707),s=r.aTypedArray,a=r.aTypedArrayConstructor;(0,r.exportTypedArrayMethod)("map",function(e){return i(s(this),e,arguments.length>1?arguments[1]:void 0,function(e,t){return new(a(o(e,e.constructor)))(t)})})},4483:function(e,t,n){"use strict";var r=n(260),i=n(3671).right,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("reduceRight",function(e){return i(o(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)})},9368:function(e,t,n){"use strict";var r=n(260),i=n(3671).left,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("reduce",function(e){return i(o(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)})},2056:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=Math.floor;o("reverse",function(){for(var e,t=this,n=i(t).length,r=s(n/2),o=0;o1?arguments[1]:void 0,1),n=this.length,r=s(e),a=i(r.length),c=0;if(a+t>n)throw RangeError("Wrong length");for(;co;)u[o]=n[o++];return u},o(function(){new Int8Array(1).slice()}))},7462:function(e,t,n){"use strict";var r=n(260),i=n(2092).some,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("some",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},3824:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=[].sort;o("sort",function(e){return s.call(i(this),e)})},5021:function(e,t,n){"use strict";var r=n(260),i=n(7466),o=n(1400),s=n(6707),a=r.aTypedArray;(0,r.exportTypedArrayMethod)("subarray",function(e,t){var n=a(this),r=n.length,l=o(e,r);return new(s(n,n.constructor))(n.buffer,n.byteOffset+l*n.BYTES_PER_ELEMENT,i((void 0===t?r:o(t,r))-l))})},2974:function(e,t,n){"use strict";var r=n(7854),i=n(260),o=n(7293),s=r.Int8Array,a=i.aTypedArray,l=i.exportTypedArrayMethod,c=[].toLocaleString,u=[].slice,d=!!s&&o(function(){c.call(new s(1))});l("toLocaleString",function(){return c.apply(d?u.call(a(this)):a(this),arguments)},o(function(){return[1,2].toLocaleString()!=new s([1,2]).toLocaleString()})||!o(function(){s.prototype.toLocaleString.call([1,2])}))},5016:function(e,t,n){"use strict";var r=n(260).exportTypedArrayMethod,i=n(7293),o=n(7854).Uint8Array,s=o&&o.prototype||{},a=[].toString,l=[].join;i(function(){a.call({})})&&(a=function(){return l.call(this)});var c=s.toString!=a;r("toString",a,c)},2472:function(e,t,n){n(9843)("Uint8",function(e){return function(t,n,r){return e(this,t,n,r)}})},4747:function(e,t,n){var r=n(7854),i=n(8324),o=n(8533),s=n(8880);for(var a in i){var l=r[a],c=l&&l.prototype;if(c&&c.forEach!==o)try{s(c,"forEach",o)}catch(e){c.forEach=o}}},3948:function(e,t,n){var r=n(7854),i=n(8324),o=n(6992),s=n(8880),a=n(5112),l=a("iterator"),c=a("toStringTag"),u=o.values;for(var d in i){var f=r[d],p=f&&f.prototype;if(p){if(p[l]!==u)try{s(p,l,u)}catch(e){p[l]=u}if(p[c]||s(p,c,d),i[d])for(var h in o)if(p[h]!==o[h])try{s(p,h,o[h])}catch(e){p[h]=o[h]}}}},1637:function(e,t,n){"use strict";n(6992);var r=n(2109),i=n(5005),o=n(590),s=n(1320),a=n(2248),l=n(8003),c=n(4994),u=n(9909),d=n(5787),f=n(6656),p=n(9974),h=n(648),v=n(9670),m=n(111),y=n(30),g=n(9114),b=n(8554),w=n(1246),x=n(5112),E=i("fetch"),S=i("Headers"),k=x("iterator"),L="URLSearchParams",A=L+"Iterator",C=u.set,_=u.getterFor(L),T=u.getterFor(A),F=/\+/g,I=Array(4),M=function(e){return I[e-1]||(I[e-1]=RegExp("((?:%[\\da-f]{2}){"+e+"})","gi"))},R=function(e){try{return decodeURIComponent(e)}catch(t){return e}},z=function(e){var t=e.replace(F," "),n=4;try{return decodeURIComponent(t)}catch(e){for(;n;)t=t.replace(M(n--),R);return t}},q=/[!'()~]|%20/g,U={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},O=function(e){return U[e]},j=function(e){return encodeURIComponent(e).replace(q,O)},P=function(e,t){if(t)for(var n,r,i=t.split("&"),o=0;o0?arguments[0]:void 0,u=[];if(C(this,{type:L,entries:u,updateURL:function(){},updateSearchParams:D}),void 0!==c)if(m(c))if("function"==typeof(e=w(c)))for(n=(t=e.call(c)).next;!(r=n.call(t)).done;){if((s=(o=(i=b(v(r.value))).next).call(i)).done||(a=o.call(i)).done||!o.call(i).done)throw TypeError("Expected sequence with length 2");u.push({key:s.value+"",value:a.value+""})}else for(l in c)f(c,l)&&u.push({key:l,value:c[l]+""});else P(u,"string"==typeof c?"?"===c.charAt(0)?c.slice(1):c:c+"")},W=B.prototype;a(W,{append:function(e,t){N(arguments.length,2);var n=_(this);n.entries.push({key:e+"",value:t+""}),n.updateURL()},delete:function(e){N(arguments.length,1);for(var t=_(this),n=t.entries,r=e+"",i=0;ie.key){i.splice(t,0,e);break}t===n&&i.push(e)}r.updateURL()},forEach:function(e){for(var t,n=_(this).entries,r=p(e,arguments.length>1?arguments[1]:void 0,3),i=0;i1&&(m(t=arguments[1])&&(n=t.body,h(n)===L&&((r=t.headers?new S(t.headers):new S).has("content-type")||r.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),t=y(t,{body:g(0,String(n)),headers:g(0,r)}))),i.push(t)),E.apply(this,i)}}),e.exports={URLSearchParams:B,getState:_}},285:function(e,t,n){"use strict";n(8783);var r,i=n(2109),o=n(9781),s=n(590),a=n(7854),l=n(6048),c=n(1320),u=n(5787),d=n(6656),f=n(1574),p=n(8457),h=n(8710).codeAt,v=n(3197),m=n(8003),y=n(1637),g=n(9909),b=a.URL,w=y.URLSearchParams,x=y.getState,E=g.set,S=g.getterFor("URL"),k=Math.floor,L=Math.pow,A="Invalid scheme",C="Invalid host",_="Invalid port",T=/[A-Za-z]/,F=/[\d+-.A-Za-z]/,I=/\d/,M=/^(0x|0X)/,R=/^[0-7]+$/,z=/^\d+$/,q=/^[\dA-Fa-f]+$/,U=/[\u0000\t\u000A\u000D #%/:?@[\\]]/,O=/[\u0000\t\u000A\u000D #/:?@[\\]]/,j=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,P=/[\t\u000A\u000D]/g,D=function(e,t){var n,r,i;if("["==t.charAt(0)){if("]"!=t.charAt(t.length-1))return C;if(!(n=$(t.slice(1,-1))))return C;e.host=n}else if(V(e)){if(t=v(t),U.test(t))return C;if(null===(n=N(t)))return C;e.host=n}else{if(O.test(t))return C;for(n="",r=p(t),i=0;i4)return e;for(n=[],r=0;r1&&"0"==i.charAt(0)&&(o=M.test(i)?16:8,i=i.slice(8==o?1:2)),""===i)s=0;else{if(!(10==o?z:8==o?R:q).test(i))return e;s=parseInt(i,o)}n.push(s)}for(r=0;r=L(256,5-t))return null}else if(s>255)return null;for(a=n.pop(),r=0;r6)return;for(r=0;f();){if(i=null,r>0){if(!("."==f()&&r<4))return;d++}if(!I.test(f()))return;for(;I.test(f());){if(o=parseInt(f(),10),null===i)i=o;else{if(0==i)return;i=10*i+o}if(i>255)return;d++}l[c]=256*l[c]+i,2!=++r&&4!=r||c++}if(4!=r)return;break}if(":"==f()){if(d++,!f())return}else if(f())return;l[c++]=t}else{if(null!==u)return;d++,u=++c}}if(null!==u)for(s=c-u,c=7;0!=c&&s>0;)a=l[c],l[c--]=l[u+s-1],l[u+--s]=a;else if(8!=c)return;return l},B=function(e){var t,n,r,i;if("number"==typeof e){for(t=[],n=0;n<4;n++)t.unshift(e%256),e=k(e/256);return t.join(".")}if("object"==typeof e){for(t="",r=function(e){for(var t=null,n=1,r=null,i=0,o=0;o<8;o++)0!==e[o]?(i>n&&(t=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(t=r,n=i),t}(e),n=0;n<8;n++)i&&0===e[n]||(i&&(i=!1),r===n?(t+=n?":":"::",i=!0):(t+=e[n].toString(16),n<7&&(t+=":")));return"["+t+"]"}return e},W={},H=f({},W,{" ":1,'"':1,"<":1,">":1,"`":1}),Y=f({},H,{"#":1,"?":1,"{":1,"}":1}),G=f({},Y,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),Q=function(e,t){var n=h(e,0);return n>32&&n<127&&!d(t,e)?e:encodeURIComponent(e)},X={ftp:21,file:null,http:80,https:443,ws:80,wss:443},V=function(e){return d(X,e.scheme)},K=function(e){return""!=e.username||""!=e.password},Z=function(e){return!e.host||e.cannotBeABaseURL||"file"==e.scheme},J=function(e,t){var n;return 2==e.length&&T.test(e.charAt(0))&&(":"==(n=e.charAt(1))||!t&&"|"==n)},ee=function(e){var t;return e.length>1&&J(e.slice(0,2))&&(2==e.length||"/"===(t=e.charAt(2))||"\\"===t||"?"===t||"#"===t)},te=function(e){var t=e.path,n=t.length;!n||"file"==e.scheme&&1==n&&J(t[0],!0)||t.pop()},ne=function(e){return"."===e||"%2e"===e.toLowerCase()},re=function(e){return".."===(e=e.toLowerCase())||"%2e."===e||".%2e"===e||"%2e%2e"===e},ie={},oe={},se={},ae={},le={},ce={},ue={},de={},fe={},pe={},he={},ve={},me={},ye={},ge={},be={},we={},xe={},Ee={},Se={},ke={},Le=function(e,t,n,i){var o,s,a,l,c=n||ie,u=0,f="",h=!1,v=!1,m=!1;for(n||(e.scheme="",e.username="",e.password="",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,t=t.replace(j,"")),t=t.replace(P,""),o=p(t);u<=o.length;){switch(s=o[u],c){case ie:if(!s||!T.test(s)){if(n)return A;c=se;continue}f+=s.toLowerCase(),c=oe;break;case oe:if(s&&(F.test(s)||"+"==s||"-"==s||"."==s))f+=s.toLowerCase();else{if(":"!=s){if(n)return A;f="",c=se,u=0;continue}if(n&&(V(e)!=d(X,f)||"file"==f&&(K(e)||null!==e.port)||"file"==e.scheme&&!e.host))return;if(e.scheme=f,n)return void(V(e)&&X[e.scheme]==e.port&&(e.port=null));f="","file"==e.scheme?c=ye:V(e)&&i&&i.scheme==e.scheme?c=ae:V(e)?c=de:"/"==o[u+1]?(c=le,u++):(e.cannotBeABaseURL=!0,e.path.push(""),c=Ee)}break;case se:if(!i||i.cannotBeABaseURL&&"#"!=s)return A;if(i.cannotBeABaseURL&&"#"==s){e.scheme=i.scheme,e.path=i.path.slice(),e.query=i.query,e.fragment="",e.cannotBeABaseURL=!0,c=ke;break}c="file"==i.scheme?ye:ce;continue;case ae:if("/"!=s||"/"!=o[u+1]){c=ce;continue}c=fe,u++;break;case le:if("/"==s){c=pe;break}c=xe;continue;case ce:if(e.scheme=i.scheme,s==r)e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query=i.query;else if("/"==s||"\\"==s&&V(e))c=ue;else if("?"==s)e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query="",c=Se;else{if("#"!=s){e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.path.pop(),c=xe;continue}e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query=i.query,e.fragment="",c=ke}break;case ue:if(!V(e)||"/"!=s&&"\\"!=s){if("/"!=s){e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,c=xe;continue}c=pe}else c=fe;break;case de:if(c=fe,"/"!=s||"/"!=f.charAt(u+1))continue;u++;break;case fe:if("/"!=s&&"\\"!=s){c=pe;continue}break;case pe:if("@"==s){h&&(f="%40"+f),h=!0,a=p(f);for(var y=0;y65535)return _;e.port=V(e)&&w===X[e.scheme]?null:w,f=""}if(n)return;c=we;continue}return _}f+=s;break;case ye:if(e.scheme="file","/"==s||"\\"==s)c=ge;else{if(!i||"file"!=i.scheme){c=xe;continue}if(s==r)e.host=i.host,e.path=i.path.slice(),e.query=i.query;else if("?"==s)e.host=i.host,e.path=i.path.slice(),e.query="",c=Se;else{if("#"!=s){ee(o.slice(u).join(""))||(e.host=i.host,e.path=i.path.slice(),te(e)),c=xe;continue}e.host=i.host,e.path=i.path.slice(),e.query=i.query,e.fragment="",c=ke}}break;case ge:if("/"==s||"\\"==s){c=be;break}i&&"file"==i.scheme&&!ee(o.slice(u).join(""))&&(J(i.path[0],!0)?e.path.push(i.path[0]):e.host=i.host),c=xe;continue;case be:if(s==r||"/"==s||"\\"==s||"?"==s||"#"==s){if(!n&&J(f))c=xe;else if(""==f){if(e.host="",n)return;c=we}else{if(l=D(e,f))return l;if("localhost"==e.host&&(e.host=""),n)return;f="",c=we}continue}f+=s;break;case we:if(V(e)){if(c=xe,"/"!=s&&"\\"!=s)continue}else if(n||"?"!=s)if(n||"#"!=s){if(s!=r&&(c=xe,"/"!=s))continue}else e.fragment="",c=ke;else e.query="",c=Se;break;case xe:if(s==r||"/"==s||"\\"==s&&V(e)||!n&&("?"==s||"#"==s)){if(re(f)?(te(e),"/"==s||"\\"==s&&V(e)||e.path.push("")):ne(f)?"/"==s||"\\"==s&&V(e)||e.path.push(""):("file"==e.scheme&&!e.path.length&&J(f)&&(e.host&&(e.host=""),f=f.charAt(0)+":"),e.path.push(f)),f="","file"==e.scheme&&(s==r||"?"==s||"#"==s))for(;e.path.length>1&&""===e.path[0];)e.path.shift();"?"==s?(e.query="",c=Se):"#"==s&&(e.fragment="",c=ke)}else f+=Q(s,Y);break;case Ee:"?"==s?(e.query="",c=Se):"#"==s?(e.fragment="",c=ke):s!=r&&(e.path[0]+=Q(s,W));break;case Se:n||"#"!=s?s!=r&&("'"==s&&V(e)?e.query+="%27":e.query+="#"==s?"%23":Q(s,W)):(e.fragment="",c=ke);break;case ke:s!=r&&(e.fragment+=Q(s,H))}u++}},Ae=function(e){var t,n,r=u(this,Ae,"URL"),i=arguments.length>1?arguments[1]:void 0,s=String(e),a=E(r,{type:"URL"});if(void 0!==i)if(i instanceof Ae)t=S(i);else if(n=Le(t={},String(i)))throw TypeError(n);if(n=Le(a,s,null,t))throw TypeError(n);var l=a.searchParams=new w,c=x(l);c.updateSearchParams(a.query),c.updateURL=function(){a.query=String(l)||null},o||(r.href=_e.call(r),r.origin=Te.call(r),r.protocol=Fe.call(r),r.username=Ie.call(r),r.password=Me.call(r),r.host=Re.call(r),r.hostname=ze.call(r),r.port=qe.call(r),r.pathname=Ue.call(r),r.search=Oe.call(r),r.searchParams=je.call(r),r.hash=Pe.call(r))},Ce=Ae.prototype,_e=function(){var e=S(this),t=e.scheme,n=e.username,r=e.password,i=e.host,o=e.port,s=e.path,a=e.query,l=e.fragment,c=t+":";return null!==i?(c+="//",K(e)&&(c+=n+(r?":"+r:"")+"@"),c+=B(i),null!==o&&(c+=":"+o)):"file"==t&&(c+="//"),c+=e.cannotBeABaseURL?s[0]:s.length?"/"+s.join("/"):"",null!==a&&(c+="?"+a),null!==l&&(c+="#"+l),c},Te=function(){var e=S(this),t=e.scheme,n=e.port;if("blob"==t)try{return new URL(t.path[0]).origin}catch(e){return"null"}return"file"!=t&&V(e)?t+"://"+B(e.host)+(null!==n?":"+n:""):"null"},Fe=function(){return S(this).scheme+":"},Ie=function(){return S(this).username},Me=function(){return S(this).password},Re=function(){var e=S(this),t=e.host,n=e.port;return null===t?"":null===n?B(t):B(t)+":"+n},ze=function(){var e=S(this).host;return null===e?"":B(e)},qe=function(){var e=S(this).port;return null===e?"":String(e)},Ue=function(){var e=S(this),t=e.path;return e.cannotBeABaseURL?t[0]:t.length?"/"+t.join("/"):""},Oe=function(){var e=S(this).query;return e?"?"+e:""},je=function(){return S(this).searchParams},Pe=function(){var e=S(this).fragment;return e?"#"+e:""},De=function(e,t){return{get:e,set:t,configurable:!0,enumerable:!0}};if(o&&l(Ce,{href:De(_e,function(e){var t=S(this),n=String(e),r=Le(t,n);if(r)throw TypeError(r);x(t.searchParams).updateSearchParams(t.query)}),origin:De(Te),protocol:De(Fe,function(e){var t=S(this);Le(t,String(e)+":",ie)}),username:De(Ie,function(e){var t=S(this),n=p(String(e));if(!Z(t)){t.username="";for(var r=0;re.length)&&(t=e.length);for(var n=0,r=new Array(t);n1?r-1:0),o=1;o=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,a=!0,l=!1;return{s:function(){r=t[Symbol.iterator]()},n:function(){var e=r.next();return a=e.done,e},e:function(e){l=!0,s=e},f:function(){try{a||null==r.return||r.return()}finally{if(l)throw s}}}}(n,!0);try{for(a.s();!(s=a.n()).done;)s.value.apply(this,i)}catch(e){a.e(e)}finally{a.f()}}return this.element&&this.element.dispatchEvent(this.makeEvent("dropzone:"+t,{args:i})),this}},{key:"makeEvent",value:function(e,t){var n={bubbles:!0,cancelable:!0,detail:t};if("function"==typeof window.CustomEvent)return new CustomEvent(e,n);var r=document.createEvent("CustomEvent");return r.initCustomEvent(e,n.bubbles,n.cancelable,n.detail),r}},{key:"off",value:function(e,t){if(!this._callbacks||0===arguments.length)return this._callbacks={},this;var n=this._callbacks[e];if(!n)return this;if(1===arguments.length)return delete this._callbacks[e],this;for(var r=0;r=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,l=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return a=e.done,e},e:function(e){l=!0,o=e},f:function(){try{a||null==n.return||n.return()}finally{if(l)throw o}}}}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n'),this.element.appendChild(e));var i=e.getElementsByTagName("span")[0];return i&&(null!=i.textContent?i.textContent=this.options.dictFallbackMessage:null!=i.innerText&&(i.innerText=this.options.dictFallbackMessage)),this.element.appendChild(this.getFallbackForm())},resize:function(e,t,n,r){var i={srcX:0,srcY:0,srcWidth:e.width,srcHeight:e.height},o=e.width/e.height;null==t&&null==n?(t=i.srcWidth,n=i.srcHeight):null==t?t=n*o:null==n&&(n=t/o);var s=(t=Math.min(t,i.srcWidth))/(n=Math.min(n,i.srcHeight));if(i.srcWidth>t||i.srcHeight>n)if("crop"===r)o>s?(i.srcHeight=e.height,i.srcWidth=i.srcHeight*s):(i.srcWidth=e.width,i.srcHeight=i.srcWidth/s);else{if("contain"!==r)throw new Error("Unknown resizeMethod '".concat(r,"'"));o>s?n=t/o:t=n*o}return i.srcX=(e.width-i.srcWidth)/2,i.srcY=(e.height-i.srcHeight)/2,i.trgWidth=t,i.trgHeight=n,i},transformFile:function(e,t){return(this.options.resizeWidth||this.options.resizeHeight)&&e.type.match(/image.*/)?this.resizeImage(e,this.options.resizeWidth,this.options.resizeHeight,this.options.resizeMethod,t):t(e)},previewTemplate:'
    Check
    Error
    ',drop:function(e){return this.element.classList.remove("dz-drag-hover")},dragstart:function(e){},dragend:function(e){return this.element.classList.remove("dz-drag-hover")},dragenter:function(e){return this.element.classList.add("dz-drag-hover")},dragover:function(e){return this.element.classList.add("dz-drag-hover")},dragleave:function(e){return this.element.classList.remove("dz-drag-hover")},paste:function(e){},reset:function(){return this.element.classList.remove("dz-started")},addedfile:function(e){var t=this;if(this.element===this.previewsContainer&&this.element.classList.add("dz-started"),this.previewsContainer&&!this.options.disablePreviews){e.previewElement=g.createElement(this.options.previewTemplate.trim()),e.previewTemplate=e.previewElement,this.previewsContainer.appendChild(e.previewElement);var n,r=o(e.previewElement.querySelectorAll("[data-dz-name]"),!0);try{for(r.s();!(n=r.n()).done;){var i=n.value;i.textContent=e.name}}catch(e){r.e(e)}finally{r.f()}var s,a=o(e.previewElement.querySelectorAll("[data-dz-size]"),!0);try{for(a.s();!(s=a.n()).done;)(i=s.value).innerHTML=this.filesize(e.size)}catch(e){a.e(e)}finally{a.f()}this.options.addRemoveLinks&&(e._removeLink=g.createElement('
    '.concat(this.options.dictRemoveFile,"")),e.previewElement.appendChild(e._removeLink));var l,c=function(n){return n.preventDefault(),n.stopPropagation(),e.status===g.UPLOADING?g.confirm(t.options.dictCancelUploadConfirmation,function(){return t.removeFile(e)}):t.options.dictRemoveFileConfirmation?g.confirm(t.options.dictRemoveFileConfirmation,function(){return t.removeFile(e)}):t.removeFile(e)},u=o(e.previewElement.querySelectorAll("[data-dz-remove]"),!0);try{for(u.s();!(l=u.n()).done;)l.value.addEventListener("click",c)}catch(e){u.e(e)}finally{u.f()}}},removedfile:function(e){return null!=e.previewElement&&null!=e.previewElement.parentNode&&e.previewElement.parentNode.removeChild(e.previewElement),this._updateMaxFilesReachedClass()},thumbnail:function(e,t){if(e.previewElement){e.previewElement.classList.remove("dz-file-preview");var n,r=o(e.previewElement.querySelectorAll("[data-dz-thumbnail]"),!0);try{for(r.s();!(n=r.n()).done;){var i=n.value;i.alt=e.name,i.src=t}}catch(e){r.e(e)}finally{r.f()}return setTimeout(function(){return e.previewElement.classList.add("dz-image-preview")},1)}},error:function(e,t){if(e.previewElement){e.previewElement.classList.add("dz-error"),"string"!=typeof t&&t.error&&(t=t.error);var n,r=o(e.previewElement.querySelectorAll("[data-dz-errormessage]"),!0);try{for(r.s();!(n=r.n()).done;)n.value.textContent=t}catch(e){r.e(e)}finally{r.f()}}},errormultiple:function(){},processing:function(e){if(e.previewElement&&(e.previewElement.classList.add("dz-processing"),e._removeLink))return e._removeLink.innerHTML=this.options.dictCancelUpload},processingmultiple:function(){},uploadprogress:function(e,t,n){if(e.previewElement){var r,i=o(e.previewElement.querySelectorAll("[data-dz-uploadprogress]"),!0);try{for(i.s();!(r=i.n()).done;){var s=r.value;"PROGRESS"===s.nodeName?s.value=t:s.style.width="".concat(t,"%")}}catch(e){i.e(e)}finally{i.f()}}},totaluploadprogress:function(){},sending:function(){},sendingmultiple:function(){},success:function(e){if(e.previewElement)return e.previewElement.classList.add("dz-success")},successmultiple:function(){},canceled:function(e){return this.emit("error",e,this.options.dictUploadCanceled)},canceledmultiple:function(){},complete:function(e){if(e._removeLink&&(e._removeLink.innerHTML=this.options.dictRemoveFile),e.previewElement)return e.previewElement.classList.add("dz-complete")},completemultiple:function(){},maxfilesexceeded:function(){},maxfilesreached:function(){},queuecomplete:function(){},addedfiles:function(){}};function l(e){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l(e)}function c(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return u(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?u(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return s=e.done,e},e:function(e){a=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n"))),this.clickableElements.length&&function t(){e.hiddenFileInput&&e.hiddenFileInput.parentNode.removeChild(e.hiddenFileInput),e.hiddenFileInput=document.createElement("input"),e.hiddenFileInput.setAttribute("type","file"),(null===e.options.maxFiles||e.options.maxFiles>1)&&e.hiddenFileInput.setAttribute("multiple","multiple"),e.hiddenFileInput.className="dz-hidden-input",null!==e.options.acceptedFiles&&e.hiddenFileInput.setAttribute("accept",e.options.acceptedFiles),null!==e.options.capture&&e.hiddenFileInput.setAttribute("capture",e.options.capture),e.hiddenFileInput.setAttribute("tabindex","-1"),e.hiddenFileInput.style.visibility="hidden",e.hiddenFileInput.style.position="absolute",e.hiddenFileInput.style.top="0",e.hiddenFileInput.style.left="0",e.hiddenFileInput.style.height="0",e.hiddenFileInput.style.width="0",o.getElement(e.options.hiddenInputContainer,"hiddenInputContainer").appendChild(e.hiddenFileInput),e.hiddenFileInput.addEventListener("change",function(){var n=e.hiddenFileInput.files;if(n.length){var r,i=c(n,!0);try{for(i.s();!(r=i.n()).done;){var o=r.value;e.addFile(o)}}catch(e){i.e(e)}finally{i.f()}}e.emit("addedfiles",n),t()})}(),this.URL=null!==window.URL?window.URL:window.webkitURL;var t,n=c(this.events,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.on(r,this.options[r])}}catch(e){n.e(e)}finally{n.f()}this.on("uploadprogress",function(){return e.updateTotalUploadProgress()}),this.on("removedfile",function(){return e.updateTotalUploadProgress()}),this.on("canceled",function(t){return e.emit("complete",t)}),this.on("complete",function(t){if(0===e.getAddedFiles().length&&0===e.getUploadingFiles().length&&0===e.getQueuedFiles().length)return setTimeout(function(){return e.emit("queuecomplete")},0)});var i=function(e){if(function(e){if(e.dataTransfer.types)for(var t=0;t")),n+='');var r=o.createElement(n);return"FORM"!==this.element.tagName?(t=o.createElement('
    '))).appendChild(r):(this.element.setAttribute("enctype","multipart/form-data"),this.element.setAttribute("method",this.options.method)),null!=t?t:r}},{key:"getExistingFallback",value:function(){for(var e=function(e){var t,n=c(e,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;if(/(^| )fallback($| )/.test(r.className))return r}}catch(e){n.e(e)}finally{n.f()}},t=0,n=["div","form"];t0){for(var r=["tb","gb","mb","kb","b"],i=0;i=Math.pow(this.options.filesizeBase,4-i)/10){t=e/Math.pow(this.options.filesizeBase,4-i),n=o;break}}t=Math.round(10*t)/10}return"".concat(t," ").concat(this.options.dictFileSizeUnits[n])}},{key:"_updateMaxFilesReachedClass",value:function(){return null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(this.getAcceptedFiles().length===this.options.maxFiles&&this.emit("maxfilesreached",this.files),this.element.classList.add("dz-max-files-reached")):this.element.classList.remove("dz-max-files-reached")}},{key:"drop",value:function(e){if(e.dataTransfer){this.emit("drop",e);for(var t=[],n=0;n0){var i,o=c(r,!0);try{for(o.s();!(i=o.n()).done;){var s=i.value;s.isFile?s.file(function(e){if(!n.options.ignoreHiddenFiles||"."!==e.name.substring(0,1))return e.fullPath="".concat(t,"/").concat(e.name),n.addFile(e)}):s.isDirectory&&n._addFilesFromDirectory(s,"".concat(t,"/").concat(s.name))}}catch(e){o.e(e)}finally{o.f()}e()}return null},i)}()}},{key:"accept",value:function(e,t){this.options.maxFilesize&&e.size>1024*this.options.maxFilesize*1024?t(this.options.dictFileTooBig.replace("{{filesize}}",Math.round(e.size/1024/10.24)/100).replace("{{maxFilesize}}",this.options.maxFilesize)):o.isValidFile(e,this.options.acceptedFiles)?null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(t(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}",this.options.maxFiles)),this.emit("maxfilesexceeded",e)):this.options.accept.call(this,e,t):t(this.options.dictInvalidFileType)}},{key:"addFile",value:function(e){var t=this;e.upload={uuid:o.uuidv4(),progress:0,total:e.size,bytesSent:0,filename:this._renameFile(e)},this.files.push(e),e.status=o.ADDED,this.emit("addedfile",e),this._enqueueThumbnail(e),this.accept(e,function(n){n?(e.accepted=!1,t._errorProcessing([e],n)):(e.accepted=!0,t.options.autoQueue&&t.enqueueFile(e)),t._updateMaxFilesReachedClass()})}},{key:"enqueueFiles",value:function(e){var t,n=c(e,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.enqueueFile(r)}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"enqueueFile",value:function(e){var t=this;if(e.status!==o.ADDED||!0!==e.accepted)throw new Error("This file can't be queued because it has already been processed or was rejected.");if(e.status=o.QUEUED,this.options.autoProcessQueue)return setTimeout(function(){return t.processQueue()},0)}},{key:"_enqueueThumbnail",value:function(e){var t=this;if(this.options.createImageThumbnails&&e.type.match(/image.*/)&&e.size<=1024*this.options.maxThumbnailFilesize*1024)return this._thumbnailQueue.push(e),setTimeout(function(){return t._processThumbnailQueue()},0)}},{key:"_processThumbnailQueue",value:function(){var e=this;if(!this._processingThumbnail&&0!==this._thumbnailQueue.length){this._processingThumbnail=!0;var t=this._thumbnailQueue.shift();return this.createThumbnail(t,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,!0,function(n){return e.emit("thumbnail",t,n),e._processingThumbnail=!1,e._processThumbnailQueue()})}}},{key:"removeFile",value:function(e){if(e.status===o.UPLOADING&&this.cancelUpload(e),this.files=b(this.files,e),this.emit("removedfile",e),0===this.files.length)return this.emit("reset")}},{key:"removeAllFiles",value:function(e){null==e&&(e=!1);var t,n=c(this.files.slice(),!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;(r.status!==o.UPLOADING||e)&&this.removeFile(r)}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"resizeImage",value:function(e,t,n,r,i){var s=this;return this.createThumbnail(e,t,n,r,!0,function(t,n){if(null==n)return i(e);var r=s.options.resizeMimeType;null==r&&(r=e.type);var a=n.toDataURL(r,s.options.resizeQuality);return"image/jpeg"!==r&&"image/jpg"!==r||(a=E.restore(e.dataURL,a)),i(o.dataURItoBlob(a))})}},{key:"createThumbnail",value:function(e,t,n,r,i,o){var s=this,a=new FileReader;a.onload=function(){e.dataURL=a.result,"image/svg+xml"!==e.type?s.createThumbnailFromUrl(e,t,n,r,i,o):null!=o&&o(a.result)},a.readAsDataURL(e)}},{key:"displayExistingFile",value:function(e,t,n,r){var i=this,o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4];this.emit("addedfile",e),this.emit("complete",e),o?(e.dataURL=t,this.createThumbnailFromUrl(e,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,this.options.fixOrientation,function(t){i.emit("thumbnail",e,t),n&&n()},r)):(this.emit("thumbnail",e,t),n&&n())}},{key:"createThumbnailFromUrl",value:function(e,t,n,r,i,o,s){var a=this,l=document.createElement("img");return s&&(l.crossOrigin=s),i="from-image"!=getComputedStyle(document.body).imageOrientation&&i,l.onload=function(){var s=function(e){return e(1)};return"undefined"!=typeof EXIF&&null!==EXIF&&i&&(s=function(e){return EXIF.getData(l,function(){return e(EXIF.getTag(this,"Orientation"))})}),s(function(i){e.width=l.width,e.height=l.height;var s=a.options.resize.call(a,e,t,n,r),c=document.createElement("canvas"),u=c.getContext("2d");switch(c.width=s.trgWidth,c.height=s.trgHeight,i>4&&(c.width=s.trgHeight,c.height=s.trgWidth),i){case 2:u.translate(c.width,0),u.scale(-1,1);break;case 3:u.translate(c.width,c.height),u.rotate(Math.PI);break;case 4:u.translate(0,c.height),u.scale(1,-1);break;case 5:u.rotate(.5*Math.PI),u.scale(1,-1);break;case 6:u.rotate(.5*Math.PI),u.translate(0,-c.width);break;case 7:u.rotate(.5*Math.PI),u.translate(c.height,-c.width),u.scale(-1,1);break;case 8:u.rotate(-.5*Math.PI),u.translate(-c.height,0)}x(u,l,null!=s.srcX?s.srcX:0,null!=s.srcY?s.srcY:0,s.srcWidth,s.srcHeight,null!=s.trgX?s.trgX:0,null!=s.trgY?s.trgY:0,s.trgWidth,s.trgHeight);var d=c.toDataURL("image/png");if(null!=o)return o(d,c)})},null!=o&&(l.onerror=o),l.src=e.dataURL}},{key:"processQueue",value:function(){var e=this.options.parallelUploads,t=this.getUploadingFiles().length,n=t;if(!(t>=e)){var r=this.getQueuedFiles();if(r.length>0){if(this.options.uploadMultiple)return this.processFiles(r.slice(0,e-t));for(;n1?t-1:0),r=1;rt.options.chunkSize),e[0].upload.totalChunkCount=Math.ceil(r.size/t.options.chunkSize)}if(e[0].upload.chunked){var i=e[0],s=n[0];i.upload.chunks=[];var a=function(){for(var n=0;void 0!==i.upload.chunks[n];)n++;if(!(n>=i.upload.totalChunkCount)){var r=n*t.options.chunkSize,a=Math.min(r+t.options.chunkSize,s.size),l={name:t._getParamName(0),data:s.webkitSlice?s.webkitSlice(r,a):s.slice(r,a),filename:i.upload.filename,chunkIndex:n};i.upload.chunks[n]={file:i,index:n,dataBlock:l,status:o.UPLOADING,progress:0,retries:0},t._uploadData(e,[l])}};if(i.upload.finishedChunkUpload=function(n,r){var s=!0;n.status=o.SUCCESS,n.dataBlock=null,n.xhr=null;for(var l=0;l1?t-1:0),r=1;r=s;a?o++:o--)i[o]=t.charCodeAt(o);return new Blob([r],{type:n})};var b=function(e,t){return e.filter(function(e){return e!==t}).map(function(e){return e})},w=function(e){return e.replace(/[\-_](\w)/g,function(e){return e.charAt(1).toUpperCase()})};g.createElement=function(e){var t=document.createElement("div");return t.innerHTML=e,t.childNodes[0]},g.elementInside=function(e,t){if(e===t)return!0;for(;e=e.parentNode;)if(e===t)return!0;return!1},g.getElement=function(e,t){var n;if("string"==typeof e?n=document.querySelector(e):null!=e.nodeType&&(n=e),null==n)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector or a plain HTML element."));return n},g.getElements=function(e,t){var n,r;if(e instanceof Array){r=[];try{var i,o=c(e,!0);try{for(o.s();!(i=o.n()).done;)n=i.value,r.push(this.getElement(n,t))}catch(e){o.e(e)}finally{o.f()}}catch(e){r=null}}else if("string"==typeof e){r=[];var s,a=c(document.querySelectorAll(e),!0);try{for(a.s();!(s=a.n()).done;)n=s.value,r.push(n)}catch(e){a.e(e)}finally{a.f()}}else null!=e.nodeType&&(r=[e]);if(null==r||!r.length)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector, a plain HTML element or a list of those."));return r},g.confirm=function(e,t,n){return window.confirm(e)?t():null!=n?n():void 0},g.isValidFile=function(e,t){if(!t)return!0;t=t.split(",");var n,r=e.type,i=r.replace(/\/.*$/,""),o=c(t,!0);try{for(o.s();!(n=o.n()).done;){var s=n.value;if("."===(s=s.trim()).charAt(0)){if(-1!==e.name.toLowerCase().indexOf(s.toLowerCase(),e.name.length-s.length))return!0}else if(/\/\*$/.test(s)){if(i===s.replace(/\/.*$/,""))return!0}else if(r===s)return!0}}catch(e){o.e(e)}finally{o.f()}return!1},"undefined"!=typeof jQuery&&null!==jQuery&&(jQuery.fn.dropzone=function(e){return this.each(function(){return new g(this,e)})}),g.ADDED="added",g.QUEUED="queued",g.ACCEPTED=g.QUEUED,g.UPLOADING="uploading",g.PROCESSING=g.UPLOADING,g.CANCELED="canceled",g.ERROR="error",g.SUCCESS="success";var x=function(e,t,n,r,i,o,s,a,l,c){var u=function(e){e.naturalWidth;var t=e.naturalHeight,n=document.createElement("canvas");n.width=1,n.height=t;var r=n.getContext("2d");r.drawImage(e,0,0);for(var i=r.getImageData(1,0,1,t).data,o=0,s=t,a=t;a>o;)0===i[4*(a-1)+3]?s=a:o=a,a=s+o>>1;var l=a/t;return 0===l?1:l}(t);return e.drawImage(t,n,r,i,o,s,a,l,c/u)},E=function(){function e(){d(this,e)}return p(e,null,[{key:"initClass",value:function(){this.KEY_STR="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}},{key:"encode64",value:function(e){for(var t="",n=void 0,r=void 0,i="",o=void 0,s=void 0,a=void 0,l="",c=0;o=(n=e[c++])>>2,s=(3&n)<<4|(r=e[c++])>>4,a=(15&r)<<2|(i=e[c++])>>6,l=63&i,isNaN(r)?a=l=64:isNaN(i)&&(l=64),t=t+this.KEY_STR.charAt(o)+this.KEY_STR.charAt(s)+this.KEY_STR.charAt(a)+this.KEY_STR.charAt(l),n=r=i="",o=s=a=l="",ce.length)break}return n}},{key:"decode64",value:function(e){var t=void 0,n=void 0,r="",i=void 0,o=void 0,s="",a=0,l=[];for(/[^A-Za-z0-9\+\/\=]/g.exec(e)&&console.warn("There were invalid base64 characters in the input text.\nValid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\nExpect errors in decoding."),e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");t=this.KEY_STR.indexOf(e.charAt(a++))<<2|(i=this.KEY_STR.indexOf(e.charAt(a++)))>>4,n=(15&i)<<4|(o=this.KEY_STR.indexOf(e.charAt(a++)))>>2,r=(3&o)<<6|(s=this.KEY_STR.indexOf(e.charAt(a++))),l.push(t),64!==o&&l.push(n),64!==s&&l.push(r),t=n=r="",i=o=s="",at.options.priority?-1:e.options.priority=0;n--)this._subscribers[n].fn!==e&&this._subscribers[n].id!==e||(this._subscribers[n].channel=null,this._subscribers.splice(n,1));else this._subscribers=[];if(t&&this.autoCleanChannel(),n=this._subscribers.length-1,e)for(;n>=0;n--)this._subscribers[n].fn!==e&&this._subscribers[n].id!==e||(this._subscribers[n].channel=null,this._subscribers.splice(n,1));else this._subscribers=[]},t.prototype.autoCleanChannel=function(){if(0===this._subscribers.length){for(var e in this._channels)if(this._channels.hasOwnProperty(e))return;if(null!=this._parent){var t=this.namespace.split(":"),n=t[t.length-1];this._parent.removeChannel(n)}}},t.prototype.removeChannel=function(e){this.hasChannel(e)&&(this._channels[e]=null,delete this._channels[e],this.autoCleanChannel())},t.prototype.publish=function(e){for(var t,n,r,i=0,o=this._subscribers.length,s=!1;i0)for(;i{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";var e=n(295),t=n.n(e),r=n(216);window.Cl=window.Cl||{};class i{constructor(e={}){this.options={linksSelector:".js-toggler-link",dataHeaderSelector:"toggler-header-selector",dataContentSelector:"toggler-content-selector",collapsedClass:"js-collapsed",expandedClass:"js-expanded",hiddenClass:"hidden",...e},this.togglerInstances=[],document.querySelectorAll(this.options.linksSelector).forEach(e=>{const t=new o(e,this.options);this.togglerInstances.push(t)})}destroy(){this.links=null,this.togglerInstances.forEach(e=>e.destroy()),this.togglerInstances=[]}}class o{constructor(e,t={}){this.options={...t},this.link=e,this.headerSelector=this.link.dataset[this.options.dataHeaderSelector],this.contentSelector=this.link.dataset[this.options.dataContentSelector],this.header=document.querySelector(this.headerSelector),this.header=this.header||this.link,this.content=document.querySelector(this.contentSelector),this.content&&this._initLink()}_updateClasses(){this.content.classList.contains(this.options.hiddenClass)?(this.header.classList.remove(this.options.expandedClass),this.header.classList.add(this.options.collapsedClass)):(this.header.classList.add(this.options.expandedClass),this.header.classList.remove(this.options.collapsedClass))}_onTogglerClick(e){this.content.classList.toggle(this.options.hiddenClass),this._updateClasses(),e.preventDefault()}_initLink(){this._updateClasses(),this.link.addEventListener("click",e=>this._onTogglerClick(e))}destroy(){this.options=null,this.link=null}}Cl.Toggler=i,Cl.TogglerConstructor=o;const s=i;n(413);var a=n(628),l=n.n(a);document.addEventListener("DOMContentLoaded",()=>{let e=0,t=1;const n=document.querySelector(".js-upload-button");if(!n)return;const r=document.querySelector(".js-upload-button-disabled"),i=n.dataset.url;if(!i)return;const o=document.querySelector(".js-filer-dropzone-upload-welcome"),s=document.querySelector(".js-filer-dropzone-upload-info-container"),a=document.querySelector(".js-filer-dropzone-upload-info"),c=document.querySelector(".js-filer-dropzone-upload-number"),u=".js-filer-dropzone-progress",d=document.querySelector(".js-filer-dropzone-upload-success"),f=document.querySelector(".js-filer-dropzone-upload-canceled"),p=document.querySelector(".js-filer-dropzone-cancel"),h=document.querySelector(".js-filer-dropzone-info-message"),v="hidden",m=parseInt(n.dataset.maxUploaderConnections||3,10),y=parseInt(n.dataset.maxFilesize||0,10);let g=!1;const b=()=>{c&&(c.textContent=`${t-e}/${t}`)},w=()=>{n&&n.remove()},x=()=>{const e=window.location.toString();window.location.replace(((e,t,n)=>{const r=new RegExp(`([?&])${t}=.*?(&|$)`,"i"),i=-1!==e.indexOf("?")?"&":"?",o=window.location.hash;return(e=e.replace(/#.*$/,"")).match(r)?e.replace(r,`$1${t}=${n}$2`)+o:e+i+t+"="+n+o})(e,"order_by","-modified_at"))};let E;Cl.mediator.subscribe("filer-upload-in-progress",w),n.addEventListener("click",e=>{e.preventDefault()}),l().autoDiscover=!1;try{E=new(l())(n,{url:i,paramName:"file",maxFilesize:y,parallelUploads:m,clickable:n,previewTemplate:"
    ",addRemoveLinks:!1,autoProcessQueue:!0})}catch(e){return void console.error("[Filer Upload] Failed to create Dropzone instance:",e)}E.on("addedfile",n=>{Cl.mediator.remove("filer-upload-in-progress",w),Cl.mediator.publish("filer-upload-in-progress"),e++,t=E.files.length,h&&h.classList.remove(v),o&&o.classList.add(v),d&&d.classList.add(v),s&&s.classList.remove(v),p&&p.classList.remove(v),f&&f.classList.add(v),b()}),E.on("uploadprogress",(e,t)=>{const n=Math.round(t),r=`file-${encodeURIComponent(e.name)}${e.size}${e.lastModified}`,i=document.getElementById(r);let o;if(i){const e=i.querySelector(u);e&&(e.style.width=`${n}%`)}else if(a){o=a.cloneNode(!0);const t=o.querySelector(".js-filer-dropzone-file-name");t&&(t.textContent=e.name);const i=o.querySelector(u);i&&(i.style.width=`${n}%`),o.classList.remove(v),o.setAttribute("id",r),s&&s.appendChild(o)}}),E.on("success",(n,r)=>{const i=`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}`,s=document.getElementById(i);s&&s.remove(),r.error&&(g=!0,window.filerShowError(`${n.name}: ${r.error}`)),e--,b(),0===e&&(t=1,o&&o.classList.add(v),c&&c.classList.add(v),f&&f.classList.add(v),p&&p.classList.add(v),d&&d.classList.remove(v),g?setTimeout(x,1e3):x())}),E.on("error",(n,r)=>{const i=`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}`,s=document.getElementById(i);s&&s.remove(),g=!0,window.filerShowError(`${n.name}: ${r}`),e--,b(),0===e&&(t=1,o&&o.classList.add(v),c&&c.classList.add(v),f&&f.classList.add(v),p&&p.classList.add(v),d&&d.classList.remove(v),setTimeout(x,1e3))}),p&&p.addEventListener("click",e=>{e.preventDefault(),p.classList.add(v),c&&c.classList.add(v),s&&s.classList.add(v),f&&f.classList.remove(v),setTimeout(()=>{window.location.reload()},1e3)}),r&&Cl.filerTooltip&&Cl.filerTooltip(),document.dispatchEvent(new Event("filer-upload-scripts-executed"))}),l()&&(l().autoDiscover=!1),document.addEventListener("DOMContentLoaded",()=>{const e=".js-img-preview",t=".js-filer-dropzone",n=document.querySelectorAll(t),r=".js-filer-dropzone-progress",i=".js-img-wrapper",o="hidden",s="filer-dropzone-mobile",a="js-object-attached",c=e=>{e.offsetWidth<500?e.classList.add(s):e.classList.remove(s)},u=e=>{try{window.parent.CMS.API.Messages.open({message:e})}catch{window.filerShowError?window.filerShowError(e):alert(e)}},d=function(t){const n=t.dataset.url,s=t.querySelector(".vForeignKeyRawIdAdminField"),d="image"===s?.getAttribute("name"),f=t.querySelector(".js-related-lookup"),p=t.querySelector(".js-related-edit"),h=t.querySelector(".js-filer-dropzone-message"),v=t.querySelector(".filerClearer"),m=t.querySelector(".js-file-selector");t.dropzone||(window.addEventListener("resize",()=>{c(t)}),new(l())(t,{url:n,paramName:"file",maxFiles:1,maxFilesize:t.dataset.maxFilesize,previewTemplate:document.querySelector(".js-filer-dropzone-template")?.innerHTML||"
    ",clickable:!1,addRemoveLinks:!1,init:function(){c(t),this.on("removedfile",()=>{m&&(m.style.display=""),t.classList.remove(a),this.removeAllFiles(),v?.click()}),this.element.querySelectorAll("img").forEach(e=>{e.addEventListener("dragstart",e=>{e.preventDefault()})}),v&&v.addEventListener("click",()=>{t.classList.remove(a)})},maxfilesexceeded:function(){this.removeAllFiles(!0)},drop:function(){this.removeAllFiles(!0),v?.click();const e=t.querySelector(r);e&&e.classList.remove(o),m&&(m.style.display="block"),f?.classList.add("related-lookup-change"),p?.classList.add("related-lookup-change"),h?.classList.add(o),t.classList.remove("dz-drag-hover"),t.classList.add(a)},success:function(n,a){const l=t.querySelector(r);if(l&&l.classList.add(o),n&&"success"===n.status&&a){if(a.file_id&&s){s.value=a.file_id;const e=new Event("change",{bubbles:!0});s.dispatchEvent(e)}if(a.thumbnail_180&&d){const n=t.querySelector(e);n&&(n.style.backgroundImage=`url(${a.thumbnail_180})`);const r=t.querySelector(i);r&&r.classList.remove(o)}}else a&&a.error&&u(`${n.name}: ${a.error}`),this.removeAllFiles(!0);this.element.querySelectorAll("img").forEach(e=>{e.addEventListener("dragstart",e=>{e.preventDefault()})})},error:function(e,t,n){n&&n.error&&(t+=` ; ${n.error}`),u(`${e.name}: ${t}`),this.removeAllFiles(!0)},reset:function(){if(d){const n=t.querySelector(i);n&&n.classList.add(o);const r=t.querySelector(e);r&&(r.style.backgroundImage="none")}if(t.classList.remove(a),s&&(s.value=""),f?.classList.remove("related-lookup-change"),p?.classList.remove("related-lookup-change"),h?.classList.remove(o),s){const e=new Event("change",{bubbles:!0});s.dispatchEvent(e)}}}))};n.length&&l()&&(window.filerDropzoneInitialized||(window.filerDropzoneInitialized=!0,l().autoDiscover=!1),n.forEach(d),document.addEventListener("formset:added",e=>{let n,r,i;e.detail&&e.detail.formsetName?(r=parseInt(document.getElementById(`id_${e.detail.formsetName}-TOTAL_FORMS`).value,10)-1,i=document.getElementById(`${e.detail.formsetName}-${r}`),n=i?.querySelectorAll(t)||[]):(i=e.target,n=i?.querySelectorAll(t)||[]),n?.forEach(d)}))}),document.addEventListener("DOMContentLoaded",()=>{let e=0,t=0;const n=[],r=document.querySelector(".js-filer-dropzone-base"),i=".js-filer-dropzone";let o;const s=document.querySelector(".js-filer-dropzone-info-message"),a=document.querySelector(".js-filer-dropzone-folder-name"),c=document.querySelector(".js-filer-dropzone-upload-info-container"),u=document.querySelector(".js-filer-dropzone-upload-info"),d=document.querySelector(".js-filer-dropzone-upload-welcome"),f=document.querySelector(".js-filer-dropzone-upload-number"),p=document.querySelector(".js-filer-upload-count"),h=document.querySelector(".js-filer-upload-text"),v=".js-filer-dropzone-progress",m=document.querySelector(".js-filer-dropzone-upload-success"),y=document.querySelector(".js-filer-dropzone-upload-canceled"),g=document.querySelector(".js-filer-dropzone-cancel"),b="dz-drag-hover",w=document.querySelector(".drag-hover-border"),x="hidden";let E,S,k,L=!1;const A=()=>{const e=window.location.toString();window.location.replace(((e,t,n)=>{const r=new RegExp(`([?&])${t}=.*?(&|$)`,"i"),i=-1!==e.indexOf("?")?"&":"?",o=window.location.hash;return(e=e.replace(/#.*$/,"")).match(r)?e.replace(r,`$1${t}=${n}$2`)+o:e+i+t+"="+n+o})(e,"order_by","-modified_at"))},C=()=>{f&&(f.textContent=`${t-e}/${t}`),h&&h.classList.remove("hidden"),p&&p.classList.remove("hidden")},_=()=>{n.forEach(e=>{e.destroy()})},T=(e,t)=>document.getElementById(`file-${encodeURIComponent(e.name)}${e.size}${e.lastModified}${t}`);if(r){S=r.dataset.url,k=r.dataset.folderName;const e=document.body;e.dataset.url=S,e.dataset.folderName=k,e.dataset.maxFiles=r.dataset.maxFiles,e.dataset.maxFilesize=r.dataset.maxFiles,e.classList.add("js-filer-dropzone")}Cl.mediator.subscribe("filer-upload-in-progress",_),o=document.querySelectorAll(i),o.length&&l()&&(l().autoDiscover=!1,o.forEach(r=>{if(r.dropzone)return;const p=r.dataset.url,h=new(l())(r,{url:p,paramName:"file",maxFiles:parseInt(r.dataset.maxFiles)||100,maxFilesize:parseInt(r.dataset.maxFilesize),previewTemplate:"
    ",clickable:!1,addRemoveLinks:!1,parallelUploads:r.dataset["max-uploader-connections"]||3,accept:(n,r)=>{let i;if(Cl.mediator.remove("filer-upload-in-progress",_),Cl.mediator.publish("filer-upload-in-progress"),clearTimeout(E),clearTimeout(E),d&&d.classList.add(x),g&&g.classList.remove(x),T(n,p))r("duplicate");else{i=u.cloneNode(!0);const o=i.querySelector(".js-filer-dropzone-file-name");o&&(o.textContent=n.name);const s=i.querySelector(v);s&&(s.style.width="0"),i.setAttribute("id",`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}${p}`),c&&c.appendChild(i),e++,t++,C(),r()}o.forEach(e=>e.classList.remove("reset-hover")),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b))},dragover:e=>{const t=e.target.closest(i),n=t?.dataset.folderName,l=r.classList.contains("js-filer-dropzone-folder"),c=r.getBoundingClientRect(),u=w?window.getComputedStyle(w):null,d=u?u.borderTopWidth:"0px",f=u?u.borderLeftWidth:"0px",p={top:`${c.top}px`,bottom:`${c.bottom}px`,left:`${c.left}px`,right:`${c.right}px`,width:c.width-2*parseInt(f,10)+"px",height:c.height-2*parseInt(d,10)+"px",display:"block"};l&&w&&Object.assign(w.style,p),o.forEach(e=>e.classList.add("reset-hover")),m&&m.classList.add(x),s&&s.classList.remove(x),r.classList.add(b),r.classList.remove("reset-hover"),a&&n&&(a.textContent=n)},dragend:()=>{clearTimeout(E),E=setTimeout(()=>{s&&s.classList.add(x)},1e3),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b)),w&&Object.assign(w.style,{top:"0",bottom:"0",width:"0",height:"0"})},dragleave:()=>{clearTimeout(E),E=setTimeout(()=>{s&&s.classList.add(x)},1e3),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b)),w&&Object.assign(w.style,{top:"0",bottom:"0",width:"0",height:"0"})},sending:e=>{const t=T(e,p);t&&t.classList.remove(x)},uploadprogress:(e,t)=>{const n=T(e,p);if(n){const e=n.querySelector(v);e&&(e.style.width=`${t}%`)}},success:t=>{e--,C();const n=T(t,p);n&&n.remove()},queuecomplete:()=>{0===e&&(C(),g&&g.classList.add(x),u&&u.classList.add(x),L?(f&&f.classList.add(x),setTimeout(()=>{A()},1e3)):(m&&m.classList.remove(x),A()))},error:(t,n)=>{if("duplicate"===n)return;e--,C();const r=T(t,p);r&&r.remove(),L=!0,window.filerShowError&&window.filerShowError(`${t.name}: ${n.message||n}`)}});n.push(h),g&&g.addEventListener("click",e=>{e.preventDefault(),g.classList.add(x),y&&y.classList.remove(x),h.removeAllFiles(!0)})}))}),n(117),n(221),n(472),n(902),n(577),window.Cl=window.Cl||{},Cl.mediator=new(t()),Cl.FocalPoint=r.A,Cl.Toggler=s,document.addEventListener("DOMContentLoaded",()=>{let e;window.filerShowError=t=>{const n=document.querySelector(".messagelist"),r=document.querySelector("#header"),i="js-filer-error",o=`
    • {msg}
    `.replace("{msg}",t);n?n.outerHTML=o:r&&r.insertAdjacentHTML("afterend",o),e&&clearTimeout(e),e=setTimeout(()=>{const e=document.querySelector(`.${i}`);e&&e.remove()},5e3)};const t=document.querySelector(".js-filter-files");t&&(t.addEventListener("focus",e=>{const t=e.target.closest(".navigator-top-nav");t&&t.classList.add("search-is-focused")}),t.addEventListener("blur",e=>{const t=e.target.closest(".navigator-top-nav");if(t){const n=t.querySelector(".dropdown-container a");n&&e.relatedTarget===n||t.classList.remove("search-is-focused")}}));const n=document.querySelector(".js-filter-files-container");n&&n.addEventListener("submit",e=>{}),(()=>{const e=document.querySelector(".js-filter-files"),t=".navigator-top-nav",n=document.querySelector(t),r=n?.querySelector(".filter-search-wrapper .filer-dropdown-container");e&&(e.addEventListener("keydown",function(e){e.key;const n=this.closest(t);n&&n.classList.add("search-is-focused")}),r&&(r.addEventListener("show.bs.filer-dropdown",()=>{n&&n.classList.add("search-is-focused")}),r.addEventListener("hide.bs.filer-dropdown",()=>{n&&n.classList.remove("search-is-focused")})))})(),(()=>{const e=document.querySelectorAll(".navigator-table tr, .navigator-list .list-item"),t=document.querySelector(".actions-wrapper"),n=document.querySelectorAll(".action-select, #action-toggle, #files-action-toggle, #folders-action-toggle, .actions .clear a");setTimeout(()=>{n.forEach(e=>{if(e.checked){const t=e.closest(".list-item");t&&t.classList.add("selected")}}),Array.from(e).some(e=>e.classList.contains("selected"))&&t&&t.classList.add("action-selected")},100),n.forEach(n=>{n.addEventListener("change",function(){const n=this.closest(".list-item");n&&(this.checked?n.classList.add("selected"):n.classList.remove("selected")),setTimeout(()=>{const n=Array.from(e).some(e=>e.classList.contains("selected"));t&&(n?t.classList.add("action-selected"):t.classList.remove("action-selected"))},0)})})})(),(()=>{const e=document.querySelector(".js-actions-menu");if(!e)return;const t=e.querySelector(".filer-dropdown-menu"),n=document.querySelector('.actions select[name="action"]'),r=n?.querySelectorAll("option")||[],i=document.querySelector('.actions button[type="submit"]'),o=document.querySelector(".js-action-delete"),s=document.querySelector(".js-action-copy"),a=document.querySelector(".js-action-move"),l="delete_files_or_folders",c="copy_files_and_folders",u="move_files_and_folders",d=document.querySelectorAll(".navigator-table tr, .navigator-list .list-item"),f=(e,t)=>{t&&r.forEach(r=>{r.value===e&&(t.style.display="",t.addEventListener("click",t=>{if(t.preventDefault(),Array.from(d).some(e=>e.classList.contains("selected"))&&n&&i){n.value=e;const t=n.querySelector(`option[value="${e}"]`);t&&(t.selected=!0),i.click()}}))})};f(l,o),f(c,s),f(u,a),r.forEach((e,n)=>{if(0!==n){const n=document.createElement("li"),r=document.createElement("a");r.href="#",r.textContent=e.textContent,e.value!==l&&e.value!==c&&e.value!==u||r.classList.add("hidden"),n.appendChild(r),t&&t.appendChild(n)}}),t&&t.addEventListener("click",e=>{if("A"===e.target.tagName){const r=e.target.closest("li"),o=Array.from(t.querySelectorAll("li")).indexOf(r)+1;if(e.preventDefault(),n&&i){const e=n.querySelectorAll("option");e[o]&&(n.value=e[o].value,e[o].selected=!0),i.click()}}}),e.addEventListener("click",e=>{Array.from(d).some(e=>e.classList.contains("selected"))||(e.preventDefault(),e.stopPropagation())})})(),(()=>{const e=document.querySelector(".navigator-top-nav");if(!e)return;const t=document.querySelector(".breadcrumbs-container");if(!t)return;const n=t.querySelector(".navigator-breadcrumbs"),r=t.querySelector(".filer-dropdown-container"),i=document.querySelector(".filter-files-container"),o=document.querySelector(".actions-wrapper"),s=document.querySelector(".navigator-button-wrapper"),a=n?.offsetWidth||0,l=r?.offsetWidth||0,c=i?.offsetWidth||0,u=o?.offsetWidth||0,d=s?.offsetWidth||0,f=window.getComputedStyle(e),p=parseInt(f.paddingLeft,10)+parseInt(f.paddingRight,10);let h=e.offsetWidth;const v=80+a+l+c+u+d+p,m="breadcrumb-min-width",y=()=>{h{h=e.offsetWidth,y()})})(),(()=>{const e=document.querySelectorAll(".navigator-list .list-item input.action-select"),t=".navigator-list .navigator-folders-body .list-item input.action-select",n=".navigator-list .navigator-files-body .list-item input.action-select",r=document.querySelector("#files-action-toggle"),i=document.querySelector("#folders-action-toggle");i&&i.addEventListener("click",function(){const e=document.querySelectorAll(t);this.checked?e.forEach(e=>{e.checked||e.click()}):e.forEach(e=>{e.checked&&e.click()})}),r&&r.addEventListener("click",function(){const e=document.querySelectorAll(n);this.checked?e.forEach(e=>{e.checked||e.click()}):e.forEach(e=>{e.checked&&e.click()})}),e.forEach(e=>{e.addEventListener("click",function(){const e=document.querySelectorAll(n),o=document.querySelectorAll(t);if(this.checked){const t=Array.from(e).every(e=>e.checked),n=Array.from(o).every(e=>e.checked);t&&r&&(r.checked=!0),n&&i&&(i.checked=!0)}else{const t=Array.from(e).some(e=>!e.checked),n=Array.from(o).some(e=>!e.checked);t&&r&&(r.checked=!1),n&&i&&(i.checked=!1)}})});const o=document.querySelector(".navigator .actions .clear a");o&&o.addEventListener("click",()=>{i&&(i.checked=!1),r&&(r.checked=!1)})})(),document.querySelectorAll(".js-copy-url").forEach(e=>{e.addEventListener("click",function(e){const t=new URL(this.dataset.url,document.location.href),n=this.dataset.msg||"URL copied to clipboard",r=document.createElement("template");e.preventDefault(),document.querySelectorAll(".info.filer-tooltip").forEach(e=>{e.remove()}),navigator.clipboard.writeText(t.href),r.innerHTML=`
    ${n}
    `,this.classList.add("filer-tooltip-wrapper"),this.appendChild(r.content.firstChild);const i=this;setTimeout(()=>{const e=i.querySelector(".info");e&&e.remove()},1200)})}),(new r.A).initialize(),new s})})()})(); \ No newline at end of file From 45a4d022486d01d063b66e093373ac5fd731a5d3 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Tue, 9 Jun 2026 15:16:25 +0300 Subject: [PATCH 690/715] BEN-2954: debug logs added --- filer/admin/folderadmin.py | 52 ++++++++++++++++--- .../static/filer/js/addons/table-dropzone.js | 12 ++++- .../static/filer/js/dist/filer-base.bundle.js | 2 +- 3 files changed, 56 insertions(+), 10 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index ff3392ef6..422757cc3 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -703,6 +703,7 @@ def response_action(self, request, files_queryset, folders_queryset): action = action_form.cleaned_data['action'] select_across = action_form.cleaned_data['select_across'] func, name, description = self.get_actions(request)[action] + logger.debug("[Action] Dispatching action=%s, func=%s", action, func.__name__) # Get the list of selected PKs. If nothing's selected, we can't # perform an action on it, so bail. Except we want to perform @@ -730,7 +731,11 @@ def response_action(self, request, files_queryset, folders_queryset): files_queryset = files_queryset.filter(pk__in=selected_files) folders_queryset = folders_queryset.filter( pk__in=selected_folders) + logger.debug("[Action] selected_files=%s, selected_folders=%s", + selected_files, selected_folders) + logger.debug("[Action] Calling %s with files_qs count=%d, folders_qs count=%d", + name, files_queryset.count(), folders_queryset.count()) response = func(self, request, files_queryset, folders_queryset) # Actions may return an HttpResponse, which will be used as the @@ -1246,11 +1251,19 @@ def rename_files(self, request, files_queryset, folders_queryset): def extract_files(self, request, files_queryset, folders_queryset): if request.method != 'POST': + logger.debug("[Extract] Skipping: request.method=%s (not POST)", request.method) return None from ..models import Archive success_format = "Successfully extracted archive {}." + logger.debug("[Extract] Starting extract_files action") + logger.debug("[Extract] files_queryset count=%d, pks=%s", + files_queryset.count(), + list(files_queryset.values_list('pk', flat=True))) + logger.debug("[Extract] files in queryset: %s", + list(files_queryset.values_list('pk', 'original_filename', 'file', 'polymorphic_ctype_id'))) + # Filter by zip file extension rather than polymorphic_ctype, # because zip files may have been uploaded as plain File instances zip_extensions = Archive._filename_extensions # ['.zip'] @@ -1261,22 +1274,35 @@ def extract_files(self, request, files_queryset, folders_queryset): extension_filter |= Q(file__iendswith=ext) files_queryset = files_queryset.filter(extension_filter) + logger.debug("[Extract] After extension filter: count=%d, pks=%s", + files_queryset.count(), + list(files_queryset.values_list('pk', 'original_filename', 'file'))) + if not files_queryset.exists(): + logger.warning("[Extract] No archive files found after filtering. " + "Extension filter used: %s", zip_extensions) self.message_user(request, _("No archive files were selected.")) return None # cannot extract in unfiled files folder if files_queryset.filter(folder__isnull=True).exists(): + logger.warning("[Extract] Cannot extract in unfiled files folder") raise PermissionDenied if not has_multi_file_action_permission(request, files_queryset, Folder.objects.none()): + logger.warning("[Extract] Permission denied for multi file action") raise PermissionDenied def _as_archive(filer_file): """Convert a File instance to Archive so extract methods work.""" if isinstance(filer_file, Archive): + logger.debug("[Extract] File pk=%s is already an Archive instance", filer_file.pk) return filer_file + logger.debug("[Extract] Converting File pk=%s (%s) to Archive instance " + "(polymorphic_ctype=%s)", + filer_file.pk, filer_file.original_filename, + filer_file.polymorphic_ctype) archive = Archive() archive.__dict__.update(filer_file.__dict__) archive.extract_errors = [] @@ -1284,6 +1310,7 @@ def _as_archive(filer_file): def is_valid_archive(filer_file): is_valid = filer_file.is_valid() + logger.debug("[Extract] is_valid_archive pk=%s: %s", filer_file.pk, is_valid) if not is_valid: error_format = "{} is not a valid zip file" message = error_format.format(filer_file.clean_actual_name) @@ -1292,6 +1319,7 @@ def is_valid_archive(filer_file): def has_collisions(filer_file): collisions = filer_file.collisions() + logger.debug("[Extract] has_collisions pk=%s: %s", filer_file.pk, collisions) if collisions: error_format = "Files/Folders from {archive} with names:" error_format += "{names} already exist." @@ -1307,15 +1335,23 @@ def has_collisions(filer_file): for f in files_queryset: f = _as_archive(f) if not is_valid_archive(f) or has_collisions(f): + logger.debug("[Extract] Skipping file pk=%s (invalid or collisions)", f.pk) continue - f.extract() - message = success_format.format(f.actual_name) - self.message_user(request, _(message)) - for err_msg in f.extract_errors: - messages.warning( - request, - _("%s: %s" % (f.actual_name, err_msg)) - ) + logger.debug("[Extract] Extracting file pk=%s (%s)", f.pk, f.original_filename) + try: + f.extract() + message = success_format.format(f.actual_name) + logger.info("[Extract] Success: %s", message) + self.message_user(request, _(message)) + for err_msg in f.extract_errors: + logger.warning("[Extract] Extract warning for %s: %s", f.actual_name, err_msg) + messages.warning( + request, + _("%s: %s" % (f.actual_name, err_msg)) + ) + except Exception as e: + logger.exception("[Extract] Exception extracting file pk=%s: %s", f.pk, e) + messages.error(request, _("Error extracting %s: %s" % (f.actual_name, str(e)))) return None extract_files.short_description = _("Extract selected zip files") diff --git a/filer/static/filer/js/addons/table-dropzone.js b/filer/static/filer/js/addons/table-dropzone.js index cf7e3868d..d2ffc7ba4 100644 --- a/filer/static/filer/js/addons/table-dropzone.js +++ b/filer/static/filer/js/addons/table-dropzone.js @@ -112,6 +112,7 @@ document.addEventListener('DOMContentLoaded', () => { parallelUploads: dropzoneElement.dataset[dataUploaderConnections] || 3, accept: (file, done) => { let uploadInfoClone; + console.log('[Filer DnD] accept:', file.name, 'url:', dropzoneUrl); Cl.mediator.remove('filer-upload-in-progress', destroyDropzones); Cl.mediator.publish('filer-upload-in-progress'); @@ -148,6 +149,7 @@ document.addEventListener('DOMContentLoaded', () => { submitNum++; maxSubmitNum++; + console.log('[Filer DnD] file accepted, submitNum:', submitNum, 'maxSubmitNum:', maxSubmitNum); updateUploadNumber(); done(); } @@ -240,8 +242,9 @@ document.addEventListener('DOMContentLoaded', () => { } } }, - success: (file) => { + success: (file, response) => { submitNum--; + console.log('[Filer DnD] success:', file.name, 'submitNum:', submitNum, 'response:', response); updateUploadNumber(); const fileEl = getElementByFile(file, dropzoneUrl); if (fileEl) { @@ -249,7 +252,9 @@ document.addEventListener('DOMContentLoaded', () => { } }, queuecomplete: () => { + console.log('[Filer DnD] queuecomplete: submitNum:', submitNum, 'hasErrors:', hasErrors); if (submitNum !== 0) { + console.warn('[Filer DnD] queuecomplete: submitNum is not 0, skipping reload'); return; } @@ -266,6 +271,7 @@ document.addEventListener('DOMContentLoaded', () => { if (uploadNumber) { uploadNumber.classList.add(hiddenClass); } + console.log('[Filer DnD] reloading after errors (1s delay)'); setTimeout(() => { reloadOrdered(); }, 1000); @@ -273,15 +279,19 @@ document.addEventListener('DOMContentLoaded', () => { if (uploadSuccess) { uploadSuccess.classList.remove(hiddenClass); } + console.log('[Filer DnD] reloading now via reloadOrdered'); reloadOrdered(); } }, error: (file, error) => { + console.error('[Filer DnD] error:', file.name, 'error:', error, 'submitNum:', submitNum); if (error === 'duplicate') { // submitNum was never incremented for duplicates + console.log('[Filer DnD] duplicate file, ignoring'); return; } submitNum--; + console.log('[Filer DnD] after error decrement, submitNum:', submitNum); updateUploadNumber(); const fileEl = getElementByFile(file, dropzoneUrl); if (fileEl) { diff --git a/filer/static/filer/js/dist/filer-base.bundle.js b/filer/static/filer/js/dist/filer-base.bundle.js index 9a614eab2..ba08a6131 100644 --- a/filer/static/filer/js/dist/filer-base.bundle.js +++ b/filer/static/filer/js/dist/filer-base.bundle.js @@ -1,2 +1,2 @@ /*! For license information please see filer-base.bundle.js.LICENSE.txt */ -(()=>{var e={117(){"use strict";document.addEventListener("DOMContentLoaded",()=>{const e=document.getElementById("destination");if(!e)return;const t=e.querySelectorAll("option"),n=t.length,r=document.querySelector(".js-submit-copy-move"),i=document.querySelector(".js-disabled-btn-tooltip");1===n&&t[0].disabled&&(r&&(r.style.display="none"),i&&(i.style.display="inline-block")),Cl.filerTooltip&&Cl.filerTooltip()})},413(){"use strict";(()=>{const e="filer-dropdown-backdrop",t='[data-toggle="filer-dropdown"]';class n{constructor(e){this.element=e,e.addEventListener("click",()=>this.toggle())}toggle(){const t=this.element,n=r(t),o=n.classList.contains("open"),s={relatedTarget:t};if(t.disabled||t.classList.contains("disabled"))return!1;if(i(),!o){if("ontouchstart"in document.documentElement&&!n.closest(".navbar-nav")){const n=document.createElement("div");n.className=e,t.parentNode.insertBefore(n,t.nextSibling),n.addEventListener("click",i)}const r=new CustomEvent("show.bs.filer-dropdown",{bubbles:!0,cancelable:!0,detail:s});if(n.dispatchEvent(r),r.defaultPrevented)return!1;t.focus(),t.setAttribute("aria-expanded","true"),n.classList.add("open");const o=new CustomEvent("shown.bs.filer-dropdown",{bubbles:!0,detail:s});n.dispatchEvent(o)}return!1}keydown(e){const n=this.element,i=r(n),o=i.classList.contains("open"),s=Array.from(i.querySelectorAll(".filer-dropdown-menu li:not(.disabled):visible a")).filter(e=>null!==e.offsetParent),a=s.indexOf(e.target);if(!/(38|40|27|32)/.test(e.which)||/input|textarea/i.test(e.target.tagName))return;if(e.preventDefault(),e.stopPropagation(),n.disabled||n.classList.contains("disabled"))return;if(!o&&27!==e.which||o&&27===e.which)return 27===e.which&&i.querySelector(t)?.focus(),n.click();if(!s.length)return;let l=a;38===e.which&&a>0&&l--,40===e.which&&ae.remove()),document.querySelectorAll(t).forEach(e=>{const t=r(e),i={relatedTarget:e};if(!t.classList.contains("open"))return;if(n&&"click"===n.type&&/input|textarea/i.test(n.target.tagName)&&t.contains(n.target))return;const o=new CustomEvent("hide.bs.filer-dropdown",{bubbles:!0,cancelable:!0,detail:i});if(t.dispatchEvent(o),o.defaultPrevented)return;e.setAttribute("aria-expanded","false"),t.classList.remove("open");const s=new CustomEvent("hidden.bs.filer-dropdown",{bubbles:!0,detail:i});t.dispatchEvent(s)}))}function o(e){return this.forEach(t=>{let r=t._filerDropdownInstance;r||(r=new n(t),t._filerDropdownInstance=r),"string"==typeof e&&r[e].call(t)}),this}NodeList.prototype.dropdown||(NodeList.prototype.dropdown=function(e){return o.call(this,e)}),HTMLCollection.prototype.dropdown||(HTMLCollection.prototype.dropdown=function(e){return o.call(this,e)}),document.addEventListener("click",i),document.addEventListener("click",e=>{e.target.closest(".filer-dropdown form")&&e.stopPropagation()}),document.addEventListener("click",e=>{const r=e.target.closest(t);if(r){const t=r._filerDropdownInstance||new n(r);r._filerDropdownInstance||(r._filerDropdownInstance=t),t.toggle(e)}}),document.addEventListener("keydown",e=>{const r=e.target.closest(t);if(r){const t=r._filerDropdownInstance||new n(r);r._filerDropdownInstance||(r._filerDropdownInstance=t),t.keydown(e)}}),document.addEventListener("keydown",e=>{const r=e.target.closest(".filer-dropdown-menu");if(r){const i=r.parentNode.querySelector(t);if(i){const t=i._filerDropdownInstance||new n(i);i._filerDropdownInstance||(i._filerDropdownInstance=t),t.keydown(e)}}}),window.FilerDropdown=n})()},577(){!function(){"use strict";const e=document.getElementById("django-admin-popup-response-constants");let t;if(e)switch(t=JSON.parse(e.dataset.popupResponse),t.action){case"change":opener.dismissRelatedImageLookupPopup(window,t.new_value,null,t.obj,null);break;case"delete":opener.dismissDeleteRelatedObjectPopup(window,t.value);break;default:opener.dismissAddRelatedObjectPopup(window,t.value,t.obj)}}()},216(e,t,n){"use strict";n.d(t,{A:()=>r}),e=n.hmd(e),window.Cl=window.Cl||{},(()=>{class t{constructor(e={}){this.options={containerSelector:".js-focal-point",imageSelector:".js-focal-point-image",circleSelector:".js-focal-point-circle",locationSelector:".js-focal-point-location",draggableClass:"draggable",hiddenClass:"hidden",dataLocation:"locationSelector",...e},this.focalPointInstances=[],this._init=this._init.bind(this)}_init(e){const t=new n(e,this.options);this.focalPointInstances.push(t)}initialize(){document.querySelectorAll(this.options.containerSelector).forEach(e=>{this._init(e)}),window.Cl.mediator&&window.Cl.mediator.subscribe("focal-point:init",this._init)}destroy(){window.Cl.mediator&&window.Cl.mediator.remove("focal-point:init",this._init),this.focalPointInstances.forEach(e=>{e.destroy()}),this.focalPointInstances=[]}}class n{constructor(e,t={}){this.options={imageSelector:".js-focal-point-image",circleSelector:".js-focal-point-circle",locationSelector:".js-focal-point-location",draggableClass:"draggable",hiddenClass:"hidden",dataLocation:"locationSelector",...t},this.container=e,this.image=this.container.querySelector(this.options.imageSelector),this.circle=this.container.querySelector(this.options.circleSelector),this.ratio=parseFloat(this.image?.dataset.ratio||1),this.location=this._getLocation(),this.isDragging=!1,this.dragStartX=0,this.dragStartY=0,this.circleStartX=0,this.circleStartY=0,this._onImageLoaded=this._onImageLoaded.bind(this),this._onMouseDown=this._onMouseDown.bind(this),this._onMouseMove=this._onMouseMove.bind(this),this._onMouseUp=this._onMouseUp.bind(this),this.image?.complete?this._onImageLoaded():this.image&&this.image.addEventListener("load",this._onImageLoaded)}_updateLocationValue(e,t){const n=`${Math.round(e*this.ratio)},${Math.round(t*this.ratio)}`;this.location&&(this.location.value=n)}_getLocation(){const e=this.container.dataset[this.options.dataLocation];if(e){const t=document.querySelector(e);if(t)return t}return this.container.querySelector(this.options.locationSelector)}_makeDraggable(){this.circle&&(this.circle.classList.add(this.options.draggableClass),this.circle.addEventListener("mousedown",this._onMouseDown),this.circle.addEventListener("touchstart",this._onMouseDown,{passive:!1}))}_onMouseDown(e){e.preventDefault(),this.isDragging=!0;const t="touchstart"===e.type?e.touches[0]:e,n=this.container.getBoundingClientRect();this.dragStartX=t.clientX-n.left,this.dragStartY=t.clientY-n.top;const r=this.circle.getBoundingClientRect();this.circleStartX=r.left-n.left+r.width/2,this.circleStartY=r.top-n.top+r.height/2,document.addEventListener("mousemove",this._onMouseMove),document.addEventListener("mouseup",this._onMouseUp),document.addEventListener("touchmove",this._onMouseMove,{passive:!1}),document.addEventListener("touchend",this._onMouseUp)}_onMouseMove(e){if(!this.isDragging)return;e.preventDefault();const t="touchmove"===e.type?e.touches[0]:e,n=this.container.getBoundingClientRect(),r=t.clientX-n.left,i=t.clientY-n.top,o=r-this.dragStartX,s=i-this.dragStartY;let a=this.circleStartX+o,l=this.circleStartY+s;a=Math.max(0,Math.min(n.width-1,a)),l=Math.max(0,Math.min(n.height-1,l)),this.circle.style.left=`${a}px`,this.circle.style.top=`${l}px`,this._updateLocationValue(a,l)}_onMouseUp(){this.isDragging=!1,document.removeEventListener("mousemove",this._onMouseMove),document.removeEventListener("mouseup",this._onMouseUp),document.removeEventListener("touchmove",this._onMouseMove),document.removeEventListener("touchend",this._onMouseUp)}_onImageLoaded(){if(!this.image||0===this.image.naturalWidth)return;this.circle?.classList.remove(this.options.hiddenClass);const e=this.location?.value||"",t=this.image.offsetWidth,n=this.image.offsetHeight;let r,i;if(e.length){const t=e.split(",");r=Math.round(Number(t[0])/this.ratio),i=Math.round(Number(t[1])/this.ratio)}else r=t/2,i=n/2;isNaN(r)||isNaN(i)||(this.circle&&(this.circle.style.left=`${r}px`,this.circle.style.top=`${i}px`),this._makeDraggable(),this._updateLocationValue(r,i))}destroy(){this.circle?.classList.contains(this.options.draggableClass)&&(this.circle.removeEventListener("mousedown",this._onMouseDown),this.circle.removeEventListener("touchstart",this._onMouseDown)),document.removeEventListener("mousemove",this._onMouseMove),document.removeEventListener("mouseup",this._onMouseUp),document.removeEventListener("touchmove",this._onMouseMove),document.removeEventListener("touchend",this._onMouseUp),this.image&&this.image.removeEventListener("load",this._onImageLoaded),this.options=null,this.container=null,this.image=null,this.circle=null,this.location=null,this.ratio=null}}window.Cl.FocalPoint=t,window.Cl.FocalPointConstructor=n,e.exports&&(e.exports=t)})();const r=window.Cl.FocalPoint},902(){"use strict";const e=e=>{const t=(e=(e=e.replace(/__dot__/g,".")).replace(/__dash__/g,"-")).lastIndexOf("__");return-1===t?e:e.substring(0,t)};window.dismissPopupAndReload=e=>{document.location.reload(),e.close()},window.dismissRelatedImageLookupPopup=(t,n,r,i,o)=>{const s=e(t.name),a=document.getElementById(s);if(!a)return;const l=a.closest(".filerFile");if(!l)return;const c=l.querySelector(".edit"),u=l.querySelector(".thumbnail_img"),d=l.querySelector(".description_text"),f=l.querySelector(".filerClearer"),p=l.parentElement.querySelector(".dz-message"),h=l.querySelector("input"),v=h.value;h.value=n;const m=h.closest(".js-filer-dropzone");m&&m.classList.add("js-object-attached"),r&&u&&(u.src=r,u.classList.remove("hidden"),u.removeAttribute("srcset")),d&&(d.textContent=i),f&&f.classList.remove("hidden"),a.classList.add("related-lookup-change"),c&&c.classList.add("related-lookup-change"),o&&c&&c.setAttribute("href",`${o}?_edit_from_widget=1`),p&&p.classList.add("hidden"),v!==n&&h.dispatchEvent(new Event("change",{bubbles:!0})),t.close()},window.dismissRelatedFolderLookupPopup=(t,n,r)=>{const i=e(t.name),o=document.getElementById(i);if(!o)return;const s=o.closest(".filerFile");if(!s)return;const a=s.querySelector(".thumbnail_img"),l=document.getElementById(`id_${i}_clear`),c=document.getElementById(`id_${i}`),u=s.querySelector(".description_text"),d=document.getElementById(i);c&&(c.value=n),a&&a.classList.remove("hidden"),u&&(u.textContent=r),l&&l.classList.remove("hidden"),d&&d.classList.add("hidden"),t.close()},document.addEventListener("DOMContentLoaded",()=>{document.querySelectorAll(".js-dismiss-popup").forEach(e=>{e.addEventListener("click",function(e){e.preventDefault();const t=this.dataset.fileId,n=this.dataset.iconUrl,r=this.dataset.label;if(this.classList.contains("js-dismiss-image")){const e=this.dataset.changeUrl||"";window.opener.dismissRelatedImageLookupPopup(window,t,n,r,e)}else this.classList.contains("js-dismiss-folder")&&window.opener.dismissRelatedFolderLookupPopup(window,t,r)})});const e=document.getElementById("popup-dismiss-data");if(e&&window.opener){const t=e.dataset.pk,n=e.dataset.label;window.opener.dismissRelatedPopup(window,t,n)}})},221(){"use strict";window.Cl=window.Cl||{},Cl.filerTooltip=()=>{const e=".js-filer-tooltip";document.querySelectorAll(e).forEach(t=>{t.addEventListener("mouseover",function(){const t=this.getAttribute("title");if(!t)return;this.dataset.filerTooltip=t,this.removeAttribute("title");const n=document.createElement("p");n.className="filer-tooltip",n.textContent=t;const r=document.querySelector(e);r&&r.appendChild(n)}),t.addEventListener("mouseout",function(){const e=this.dataset.filerTooltip;e&&this.setAttribute("title",e),document.querySelectorAll(".filer-tooltip").forEach(e=>{e.remove()})})})}},472(){"use strict";document.addEventListener("DOMContentLoaded",()=>{const e=e=>{e.preventDefault();const t=e.currentTarget,n=t.closest(".filerFile");if(!n)return;const r=n.querySelector("input"),i=n.querySelector(".thumbnail_img"),o=n.querySelector(".description_text"),s=n.querySelector(".lookup"),a=n.querySelector(".edit"),l=n.parentElement.querySelector(".dz-message"),c="hidden";if(t.classList.add(c),r&&(r.value=""),i){i.classList.add(c);var u=i.parentElement;"A"===u.tagName&&u.removeAttribute("href")}s&&s.classList.remove("related-lookup-change"),a&&a.classList.remove("related-lookup-change"),l&&l.classList.remove(c),o&&(o.textContent="")};document.querySelectorAll(".filerFile .vForeignKeyRawIdAdminField").forEach(e=>{e.setAttribute("type","hidden")}),document.querySelectorAll(".filerFile .filerClearer").forEach(t=>{t.addEventListener("click",e)})})},628(e){var t;self,t=function(){return function(){var e={3099:function(e){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},6077:function(e,t,n){var r=n(111);e.exports=function(e){if(!r(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},1223:function(e,t,n){var r=n(5112),i=n(30),o=n(3070),s=r("unscopables"),a=Array.prototype;null==a[s]&&o.f(a,s,{configurable:!0,value:i(null)}),e.exports=function(e){a[s][e]=!0}},1530:function(e,t,n){"use strict";var r=n(8710).charAt;e.exports=function(e,t,n){return t+(n?r(e,t).length:1)}},5787:function(e){e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e}},9670:function(e,t,n){var r=n(111);e.exports=function(e){if(!r(e))throw TypeError(String(e)+" is not an object");return e}},4019:function(e){e.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},260:function(e,t,n){"use strict";var r,i=n(4019),o=n(9781),s=n(7854),a=n(111),l=n(6656),c=n(648),u=n(8880),d=n(1320),f=n(3070).f,p=n(9518),h=n(7674),v=n(5112),m=n(9711),y=s.Int8Array,g=y&&y.prototype,b=s.Uint8ClampedArray,w=b&&b.prototype,x=y&&p(y),E=g&&p(g),S=Object.prototype,k=S.isPrototypeOf,L=v("toStringTag"),A=m("TYPED_ARRAY_TAG"),C=i&&!!h&&"Opera"!==c(s.opera),_=!1,T={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},F={BigInt64Array:8,BigUint64Array:8},I=function(e){if(!a(e))return!1;var t=c(e);return l(T,t)||l(F,t)};for(r in T)s[r]||(C=!1);if((!C||"function"!=typeof x||x===Function.prototype)&&(x=function(){throw TypeError("Incorrect invocation")},C))for(r in T)s[r]&&h(s[r],x);if((!C||!E||E===S)&&(E=x.prototype,C))for(r in T)s[r]&&h(s[r].prototype,E);if(C&&p(w)!==E&&h(w,E),o&&!l(E,L))for(r in _=!0,f(E,L,{get:function(){return a(this)?this[A]:void 0}}),T)s[r]&&u(s[r],A,r);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:C,TYPED_ARRAY_TAG:_&&A,aTypedArray:function(e){if(I(e))return e;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(e){if(h){if(k.call(x,e))return e}else for(var t in T)if(l(T,r)){var n=s[t];if(n&&(e===n||k.call(n,e)))return e}throw TypeError("Target is not a typed array constructor")},exportTypedArrayMethod:function(e,t,n){if(o){if(n)for(var r in T){var i=s[r];i&&l(i.prototype,e)&&delete i.prototype[e]}E[e]&&!n||d(E,e,n?t:C&&g[e]||t)}},exportTypedArrayStaticMethod:function(e,t,n){var r,i;if(o){if(h){if(n)for(r in T)(i=s[r])&&l(i,e)&&delete i[e];if(x[e]&&!n)return;try{return d(x,e,n?t:C&&y[e]||t)}catch(e){}}for(r in T)!(i=s[r])||i[e]&&!n||d(i,e,t)}},isView:function(e){if(!a(e))return!1;var t=c(e);return"DataView"===t||l(T,t)||l(F,t)},isTypedArray:I,TypedArray:x,TypedArrayPrototype:E}},3331:function(e,t,n){"use strict";var r=n(7854),i=n(9781),o=n(4019),s=n(8880),a=n(2248),l=n(7293),c=n(5787),u=n(9958),d=n(7466),f=n(7067),p=n(1179),h=n(9518),v=n(7674),m=n(8006).f,y=n(3070).f,g=n(1285),b=n(8003),w=n(9909),x=w.get,E=w.set,S="ArrayBuffer",k="DataView",L="prototype",A="Wrong index",C=r[S],_=C,T=r[k],F=T&&T[L],I=Object.prototype,M=r.RangeError,R=p.pack,z=p.unpack,q=function(e){return[255&e]},U=function(e){return[255&e,e>>8&255]},O=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},j=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},P=function(e){return R(e,23,4)},D=function(e){return R(e,52,8)},N=function(e,t){y(e[L],t,{get:function(){return x(this)[t]}})},$=function(e,t,n,r){var i=f(n),o=x(e);if(i+t>o.byteLength)throw M(A);var s=x(o.buffer).bytes,a=i+o.byteOffset,l=s.slice(a,a+t);return r?l:l.reverse()},B=function(e,t,n,r,i,o){var s=f(n),a=x(e);if(s+t>a.byteLength)throw M(A);for(var l=x(a.buffer).bytes,c=s+a.byteOffset,u=r(+i),d=0;dG;)(W=Y[G++])in _||s(_,W,C[W]);H.constructor=_}v&&h(F)!==I&&v(F,I);var Q=new T(new _(2)),X=F.setInt8;Q.setInt8(0,2147483648),Q.setInt8(1,2147483649),!Q.getInt8(0)&&Q.getInt8(1)||a(F,{setInt8:function(e,t){X.call(this,e,t<<24>>24)},setUint8:function(e,t){X.call(this,e,t<<24>>24)}},{unsafe:!0})}else _=function(e){c(this,_,S);var t=f(e);E(this,{bytes:g.call(new Array(t),0),byteLength:t}),i||(this.byteLength=t)},T=function(e,t,n){c(this,T,k),c(e,_,k);var r=x(e).byteLength,o=u(t);if(o<0||o>r)throw M("Wrong offset");if(o+(n=void 0===n?r-o:d(n))>r)throw M("Wrong length");E(this,{buffer:e,byteLength:n,byteOffset:o}),i||(this.buffer=e,this.byteLength=n,this.byteOffset=o)},i&&(N(_,"byteLength"),N(T,"buffer"),N(T,"byteLength"),N(T,"byteOffset")),a(T[L],{getInt8:function(e){return $(this,1,e)[0]<<24>>24},getUint8:function(e){return $(this,1,e)[0]},getInt16:function(e){var t=$(this,2,e,arguments.length>1?arguments[1]:void 0);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=$(this,2,e,arguments.length>1?arguments[1]:void 0);return t[1]<<8|t[0]},getInt32:function(e){return j($(this,4,e,arguments.length>1?arguments[1]:void 0))},getUint32:function(e){return j($(this,4,e,arguments.length>1?arguments[1]:void 0))>>>0},getFloat32:function(e){return z($(this,4,e,arguments.length>1?arguments[1]:void 0),23)},getFloat64:function(e){return z($(this,8,e,arguments.length>1?arguments[1]:void 0),52)},setInt8:function(e,t){B(this,1,e,q,t)},setUint8:function(e,t){B(this,1,e,q,t)},setInt16:function(e,t){B(this,2,e,U,t,arguments.length>2?arguments[2]:void 0)},setUint16:function(e,t){B(this,2,e,U,t,arguments.length>2?arguments[2]:void 0)},setInt32:function(e,t){B(this,4,e,O,t,arguments.length>2?arguments[2]:void 0)},setUint32:function(e,t){B(this,4,e,O,t,arguments.length>2?arguments[2]:void 0)},setFloat32:function(e,t){B(this,4,e,P,t,arguments.length>2?arguments[2]:void 0)},setFloat64:function(e,t){B(this,8,e,D,t,arguments.length>2?arguments[2]:void 0)}});b(_,S),b(T,k),e.exports={ArrayBuffer:_,DataView:T}},1048:function(e,t,n){"use strict";var r=n(7908),i=n(1400),o=n(7466),s=Math.min;e.exports=[].copyWithin||function(e,t){var n=r(this),a=o(n.length),l=i(e,a),c=i(t,a),u=arguments.length>2?arguments[2]:void 0,d=s((void 0===u?a:i(u,a))-c,a-l),f=1;for(c0;)c in n?n[l]=n[c]:delete n[l],l+=f,c+=f;return n}},1285:function(e,t,n){"use strict";var r=n(7908),i=n(1400),o=n(7466);e.exports=function(e){for(var t=r(this),n=o(t.length),s=arguments.length,a=i(s>1?arguments[1]:void 0,n),l=s>2?arguments[2]:void 0,c=void 0===l?n:i(l,n);c>a;)t[a++]=e;return t}},8533:function(e,t,n){"use strict";var r=n(2092).forEach,i=n(9341)("forEach");e.exports=i?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}},8457:function(e,t,n){"use strict";var r=n(9974),i=n(7908),o=n(3411),s=n(7659),a=n(7466),l=n(6135),c=n(1246);e.exports=function(e){var t,n,u,d,f,p,h=i(e),v="function"==typeof this?this:Array,m=arguments.length,y=m>1?arguments[1]:void 0,g=void 0!==y,b=c(h),w=0;if(g&&(y=r(y,m>2?arguments[2]:void 0,2)),null==b||v==Array&&s(b))for(n=new v(t=a(h.length));t>w;w++)p=g?y(h[w],w):h[w],l(n,w,p);else for(f=(d=b.call(h)).next,n=new v;!(u=f.call(d)).done;w++)p=g?o(d,y,[u.value,w],!0):u.value,l(n,w,p);return n.length=w,n}},1318:function(e,t,n){var r=n(5656),i=n(7466),o=n(1400),s=function(e){return function(t,n,s){var a,l=r(t),c=i(l.length),u=o(s,c);if(e&&n!=n){for(;c>u;)if((a=l[u++])!=a)return!0}else for(;c>u;u++)if((e||u in l)&&l[u]===n)return e||u||0;return!e&&-1}};e.exports={includes:s(!0),indexOf:s(!1)}},2092:function(e,t,n){var r=n(9974),i=n(8361),o=n(7908),s=n(7466),a=n(5417),l=[].push,c=function(e){var t=1==e,n=2==e,c=3==e,u=4==e,d=6==e,f=7==e,p=5==e||d;return function(h,v,m,y){for(var g,b,w=o(h),x=i(w),E=r(v,m,3),S=s(x.length),k=0,L=y||a,A=t?L(h,S):n||f?L(h,0):void 0;S>k;k++)if((p||k in x)&&(b=E(g=x[k],k,w),e))if(t)A[k]=b;else if(b)switch(e){case 3:return!0;case 5:return g;case 6:return k;case 2:l.call(A,g)}else switch(e){case 4:return!1;case 7:l.call(A,g)}return d?-1:c||u?u:A}};e.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterOut:c(7)}},6583:function(e,t,n){"use strict";var r=n(5656),i=n(9958),o=n(7466),s=n(9341),a=Math.min,l=[].lastIndexOf,c=!!l&&1/[1].lastIndexOf(1,-0)<0,u=s("lastIndexOf"),d=c||!u;e.exports=d?function(e){if(c)return l.apply(this,arguments)||0;var t=r(this),n=o(t.length),s=n-1;for(arguments.length>1&&(s=a(s,i(arguments[1]))),s<0&&(s=n+s);s>=0;s--)if(s in t&&t[s]===e)return s||0;return-1}:l},1194:function(e,t,n){var r=n(7293),i=n(5112),o=n(7392),s=i("species");e.exports=function(e){return o>=51||!r(function(){var t=[];return(t.constructor={})[s]=function(){return{foo:1}},1!==t[e](Boolean).foo})}},9341:function(e,t,n){"use strict";var r=n(7293);e.exports=function(e,t){var n=[][e];return!!n&&r(function(){n.call(null,t||function(){throw 1},1)})}},3671:function(e,t,n){var r=n(3099),i=n(7908),o=n(8361),s=n(7466),a=function(e){return function(t,n,a,l){r(n);var c=i(t),u=o(c),d=s(c.length),f=e?d-1:0,p=e?-1:1;if(a<2)for(;;){if(f in u){l=u[f],f+=p;break}if(f+=p,e?f<0:d<=f)throw TypeError("Reduce of empty array with no initial value")}for(;e?f>=0:d>f;f+=p)f in u&&(l=n(l,u[f],f,c));return l}};e.exports={left:a(!1),right:a(!0)}},5417:function(e,t,n){var r=n(111),i=n(3157),o=n(5112)("species");e.exports=function(e,t){var n;return i(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!i(n.prototype)?r(n)&&null===(n=n[o])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)}},3411:function(e,t,n){var r=n(9670),i=n(9212);e.exports=function(e,t,n,o){try{return o?t(r(n)[0],n[1]):t(n)}catch(t){throw i(e),t}}},7072:function(e,t,n){var r=n(5112)("iterator"),i=!1;try{var o=0,s={next:function(){return{done:!!o++}},return:function(){i=!0}};s[r]=function(){return this},Array.from(s,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var n=!1;try{var o={};o[r]=function(){return{next:function(){return{done:n=!0}}}},e(o)}catch(e){}return n}},4326:function(e){var t={}.toString;e.exports=function(e){return t.call(e).slice(8,-1)}},648:function(e,t,n){var r=n(1694),i=n(4326),o=n(5112)("toStringTag"),s="Arguments"==i(function(){return arguments}());e.exports=r?i:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),o))?n:s?i(t):"Object"==(r=i(t))&&"function"==typeof t.callee?"Arguments":r}},9920:function(e,t,n){var r=n(6656),i=n(3887),o=n(1236),s=n(3070);e.exports=function(e,t){for(var n=i(t),a=s.f,l=o.f,c=0;c=74)&&(r=s.match(/Chrome\/(\d+)/))&&(i=r[1]),e.exports=i&&+i},748:function(e){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},2109:function(e,t,n){var r=n(7854),i=n(1236).f,o=n(8880),s=n(1320),a=n(3505),l=n(9920),c=n(4705);e.exports=function(e,t){var n,u,d,f,p,h=e.target,v=e.global,m=e.stat;if(n=v?r:m?r[h]||a(h,{}):(r[h]||{}).prototype)for(u in t){if(f=t[u],d=e.noTargetGet?(p=i(n,u))&&p.value:n[u],!c(v?u:h+(m?".":"#")+u,e.forced)&&void 0!==d){if(typeof f==typeof d)continue;l(f,d)}(e.sham||d&&d.sham)&&o(f,"sham",!0),s(n,u,f,e)}}},7293:function(e){e.exports=function(e){try{return!!e()}catch(e){return!0}}},7007:function(e,t,n){"use strict";n(4916);var r=n(1320),i=n(7293),o=n(5112),s=n(2261),a=n(8880),l=o("species"),c=!i(function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")}),u="$0"==="a".replace(/./,"$0"),d=o("replace"),f=!!/./[d]&&""===/./[d]("a","$0"),p=!i(function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]});e.exports=function(e,t,n,d){var h=o(e),v=!i(function(){var t={};return t[h]=function(){return 7},7!=""[e](t)}),m=v&&!i(function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[l]=function(){return n},n.flags="",n[h]=/./[h]),n.exec=function(){return t=!0,null},n[h](""),!t});if(!v||!m||"replace"===e&&(!c||!u||f)||"split"===e&&!p){var y=/./[h],g=n(h,""[e],function(e,t,n,r,i){return t.exec===s?v&&!i?{done:!0,value:y.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}},{REPLACE_KEEPS_$0:u,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:f}),b=g[0],w=g[1];r(String.prototype,e,b),r(RegExp.prototype,h,2==t?function(e,t){return w.call(e,this,t)}:function(e){return w.call(e,this)})}d&&a(RegExp.prototype[h],"sham",!0)}},9974:function(e,t,n){var r=n(3099);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}}},5005:function(e,t,n){var r=n(857),i=n(7854),o=function(e){return"function"==typeof e?e:void 0};e.exports=function(e,t){return arguments.length<2?o(r[e])||o(i[e]):r[e]&&r[e][t]||i[e]&&i[e][t]}},1246:function(e,t,n){var r=n(648),i=n(7497),o=n(5112)("iterator");e.exports=function(e){if(null!=e)return e[o]||e["@@iterator"]||i[r(e)]}},8554:function(e,t,n){var r=n(9670),i=n(1246);e.exports=function(e){var t=i(e);if("function"!=typeof t)throw TypeError(String(e)+" is not iterable");return r(t.call(e))}},647:function(e,t,n){var r=n(7908),i=Math.floor,o="".replace,s=/\$([$&'`]|\d\d?|<[^>]*>)/g,a=/\$([$&'`]|\d\d?)/g;e.exports=function(e,t,n,l,c,u){var d=n+e.length,f=l.length,p=a;return void 0!==c&&(c=r(c),p=s),o.call(u,p,function(r,o){var s;switch(o.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,n);case"'":return t.slice(d);case"<":s=c[o.slice(1,-1)];break;default:var a=+o;if(0===a)return r;if(a>f){var u=i(a/10);return 0===u?r:u<=f?void 0===l[u-1]?o.charAt(1):l[u-1]+o.charAt(1):r}s=l[a-1]}return void 0===s?"":s})}},7854:function(e,t,n){var r=function(e){return e&&e.Math==Math&&e};e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},6656:function(e){var t={}.hasOwnProperty;e.exports=function(e,n){return t.call(e,n)}},3501:function(e){e.exports={}},490:function(e,t,n){var r=n(5005);e.exports=r("document","documentElement")},4664:function(e,t,n){var r=n(9781),i=n(7293),o=n(317);e.exports=!r&&!i(function(){return 7!=Object.defineProperty(o("div"),"a",{get:function(){return 7}}).a})},1179:function(e){var t=Math.abs,n=Math.pow,r=Math.floor,i=Math.log,o=Math.LN2;e.exports={pack:function(e,s,a){var l,c,u,d=new Array(a),f=8*a-s-1,p=(1<>1,v=23===s?n(2,-24)-n(2,-77):0,m=e<0||0===e&&1/e<0?1:0,y=0;for((e=t(e))!=e||e===1/0?(c=e!=e?1:0,l=p):(l=r(i(e)/o),e*(u=n(2,-l))<1&&(l--,u*=2),(e+=l+h>=1?v/u:v*n(2,1-h))*u>=2&&(l++,u/=2),l+h>=p?(c=0,l=p):l+h>=1?(c=(e*u-1)*n(2,s),l+=h):(c=e*n(2,h-1)*n(2,s),l=0));s>=8;d[y++]=255&c,c/=256,s-=8);for(l=l<0;d[y++]=255&l,l/=256,f-=8);return d[--y]|=128*m,d},unpack:function(e,t){var r,i=e.length,o=8*i-t-1,s=(1<>1,l=o-7,c=i-1,u=e[c--],d=127&u;for(u>>=7;l>0;d=256*d+e[c],c--,l-=8);for(r=d&(1<<-l)-1,d>>=-l,l+=t;l>0;r=256*r+e[c],c--,l-=8);if(0===d)d=1-a;else{if(d===s)return r?NaN:u?-1/0:1/0;r+=n(2,t),d-=a}return(u?-1:1)*r*n(2,d-t)}}},8361:function(e,t,n){var r=n(7293),i=n(4326),o="".split;e.exports=r(function(){return!Object("z").propertyIsEnumerable(0)})?function(e){return"String"==i(e)?o.call(e,""):Object(e)}:Object},9587:function(e,t,n){var r=n(111),i=n(7674);e.exports=function(e,t,n){var o,s;return i&&"function"==typeof(o=t.constructor)&&o!==n&&r(s=o.prototype)&&s!==n.prototype&&i(e,s),e}},2788:function(e,t,n){var r=n(5465),i=Function.toString;"function"!=typeof r.inspectSource&&(r.inspectSource=function(e){return i.call(e)}),e.exports=r.inspectSource},9909:function(e,t,n){var r,i,o,s=n(8536),a=n(7854),l=n(111),c=n(8880),u=n(6656),d=n(5465),f=n(6200),p=n(3501),h=a.WeakMap;if(s){var v=d.state||(d.state=new h),m=v.get,y=v.has,g=v.set;r=function(e,t){return t.facade=e,g.call(v,e,t),t},i=function(e){return m.call(v,e)||{}},o=function(e){return y.call(v,e)}}else{var b=f("state");p[b]=!0,r=function(e,t){return t.facade=e,c(e,b,t),t},i=function(e){return u(e,b)?e[b]:{}},o=function(e){return u(e,b)}}e.exports={set:r,get:i,has:o,enforce:function(e){return o(e)?i(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!l(t)||(n=i(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}}},7659:function(e,t,n){var r=n(5112),i=n(7497),o=r("iterator"),s=Array.prototype;e.exports=function(e){return void 0!==e&&(i.Array===e||s[o]===e)}},3157:function(e,t,n){var r=n(4326);e.exports=Array.isArray||function(e){return"Array"==r(e)}},4705:function(e,t,n){var r=n(7293),i=/#|\.prototype\./,o=function(e,t){var n=a[s(e)];return n==c||n!=l&&("function"==typeof t?r(t):!!t)},s=o.normalize=function(e){return String(e).replace(i,".").toLowerCase()},a=o.data={},l=o.NATIVE="N",c=o.POLYFILL="P";e.exports=o},111:function(e){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},1913:function(e){e.exports=!1},7850:function(e,t,n){var r=n(111),i=n(4326),o=n(5112)("match");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[o])?!!t:"RegExp"==i(e))}},9212:function(e,t,n){var r=n(9670);e.exports=function(e){var t=e.return;if(void 0!==t)return r(t.call(e)).value}},3383:function(e,t,n){"use strict";var r,i,o,s=n(7293),a=n(9518),l=n(8880),c=n(6656),u=n(5112),d=n(1913),f=u("iterator"),p=!1;[].keys&&("next"in(o=[].keys())?(i=a(a(o)))!==Object.prototype&&(r=i):p=!0);var h=null==r||s(function(){var e={};return r[f].call(e)!==e});h&&(r={}),d&&!h||c(r,f)||l(r,f,function(){return this}),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:p}},7497:function(e){e.exports={}},133:function(e,t,n){var r=n(7293);e.exports=!!Object.getOwnPropertySymbols&&!r(function(){return!String(Symbol())})},590:function(e,t,n){var r=n(7293),i=n(5112),o=n(1913),s=i("iterator");e.exports=!r(function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,n="";return e.pathname="c%20d",t.forEach(function(e,r){t.delete("b"),n+=r+e}),o&&!e.toJSON||!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[s]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==n||"x"!==new URL("http://x",void 0).host})},8536:function(e,t,n){var r=n(7854),i=n(2788),o=r.WeakMap;e.exports="function"==typeof o&&/native code/.test(i(o))},1574:function(e,t,n){"use strict";var r=n(9781),i=n(7293),o=n(1956),s=n(5181),a=n(5296),l=n(7908),c=n(8361),u=Object.assign,d=Object.defineProperty;e.exports=!u||i(function(){if(r&&1!==u({b:1},u(d({},"a",{enumerable:!0,get:function(){d(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach(function(e){t[e]=e}),7!=u({},e)[n]||o(u({},t)).join("")!=i})?function(e,t){for(var n=l(e),i=arguments.length,u=1,d=s.f,f=a.f;i>u;)for(var p,h=c(arguments[u++]),v=d?o(h).concat(d(h)):o(h),m=v.length,y=0;m>y;)p=v[y++],r&&!f.call(h,p)||(n[p]=h[p]);return n}:u},30:function(e,t,n){var r,i=n(9670),o=n(6048),s=n(748),a=n(3501),l=n(490),c=n(317),u=n(6200),d="prototype",f="script",p=u("IE_PROTO"),h=function(){},v=function(e){return"<"+f+">"+e+""},m=function(){try{r=document.domain&&new ActiveXObject("htmlfile")}catch(e){}var e,t,n;m=r?function(e){e.write(v("")),e.close();var t=e.parentWindow.Object;return e=null,t}(r):(t=c("iframe"),n="java"+f+":",t.style.display="none",l.appendChild(t),t.src=String(n),(e=t.contentWindow.document).open(),e.write(v("document.F=Object")),e.close(),e.F);for(var i=s.length;i--;)delete m[d][s[i]];return m()};a[p]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(h[d]=i(e),n=new h,h[d]=null,n[p]=e):n=m(),void 0===t?n:o(n,t)}},6048:function(e,t,n){var r=n(9781),i=n(3070),o=n(9670),s=n(1956);e.exports=r?Object.defineProperties:function(e,t){o(e);for(var n,r=s(t),a=r.length,l=0;a>l;)i.f(e,n=r[l++],t[n]);return e}},3070:function(e,t,n){var r=n(9781),i=n(4664),o=n(9670),s=n(7593),a=Object.defineProperty;t.f=r?a:function(e,t,n){if(o(e),t=s(t,!0),o(n),i)try{return a(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},1236:function(e,t,n){var r=n(9781),i=n(5296),o=n(9114),s=n(5656),a=n(7593),l=n(6656),c=n(4664),u=Object.getOwnPropertyDescriptor;t.f=r?u:function(e,t){if(e=s(e),t=a(t,!0),c)try{return u(e,t)}catch(e){}if(l(e,t))return o(!i.f.call(e,t),e[t])}},8006:function(e,t,n){var r=n(6324),i=n(748).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,i)}},5181:function(e,t){t.f=Object.getOwnPropertySymbols},9518:function(e,t,n){var r=n(6656),i=n(7908),o=n(6200),s=n(8544),a=o("IE_PROTO"),l=Object.prototype;e.exports=s?Object.getPrototypeOf:function(e){return e=i(e),r(e,a)?e[a]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?l:null}},6324:function(e,t,n){var r=n(6656),i=n(5656),o=n(1318).indexOf,s=n(3501);e.exports=function(e,t){var n,a=i(e),l=0,c=[];for(n in a)!r(s,n)&&r(a,n)&&c.push(n);for(;t.length>l;)r(a,n=t[l++])&&(~o(c,n)||c.push(n));return c}},1956:function(e,t,n){var r=n(6324),i=n(748);e.exports=Object.keys||function(e){return r(e,i)}},5296:function(e,t){"use strict";var n={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,i=r&&!n.call({1:2},1);t.f=i?function(e){var t=r(this,e);return!!t&&t.enumerable}:n},7674:function(e,t,n){var r=n(9670),i=n(6077);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,o){return r(n),i(o),t?e.call(n,o):n.__proto__=o,n}}():void 0)},288:function(e,t,n){"use strict";var r=n(1694),i=n(648);e.exports=r?{}.toString:function(){return"[object "+i(this)+"]"}},3887:function(e,t,n){var r=n(5005),i=n(8006),o=n(5181),s=n(9670);e.exports=r("Reflect","ownKeys")||function(e){var t=i.f(s(e)),n=o.f;return n?t.concat(n(e)):t}},857:function(e,t,n){var r=n(7854);e.exports=r},2248:function(e,t,n){var r=n(1320);e.exports=function(e,t,n){for(var i in t)r(e,i,t[i],n);return e}},1320:function(e,t,n){var r=n(7854),i=n(8880),o=n(6656),s=n(3505),a=n(2788),l=n(9909),c=l.get,u=l.enforce,d=String(String).split("String");(e.exports=function(e,t,n,a){var l,c=!!a&&!!a.unsafe,f=!!a&&!!a.enumerable,p=!!a&&!!a.noTargetGet;"function"==typeof n&&("string"!=typeof t||o(n,"name")||i(n,"name",t),(l=u(n)).source||(l.source=d.join("string"==typeof t?t:""))),e!==r?(c?!p&&e[t]&&(f=!0):delete e[t],f?e[t]=n:i(e,t,n)):f?e[t]=n:s(t,n)})(Function.prototype,"toString",function(){return"function"==typeof this&&c(this).source||a(this)})},7651:function(e,t,n){var r=n(4326),i=n(2261);e.exports=function(e,t){var n=e.exec;if("function"==typeof n){var o=n.call(e,t);if("object"!=typeof o)throw TypeError("RegExp exec method returned something other than an Object or null");return o}if("RegExp"!==r(e))throw TypeError("RegExp#exec called on incompatible receiver");return i.call(e,t)}},2261:function(e,t,n){"use strict";var r,i,o=n(7066),s=n(2999),a=RegExp.prototype.exec,l=String.prototype.replace,c=a,u=(r=/a/,i=/b*/g,a.call(r,"a"),a.call(i,"a"),0!==r.lastIndex||0!==i.lastIndex),d=s.UNSUPPORTED_Y||s.BROKEN_CARET,f=void 0!==/()??/.exec("")[1];(u||f||d)&&(c=function(e){var t,n,r,i,s=this,c=d&&s.sticky,p=o.call(s),h=s.source,v=0,m=e;return c&&(-1===(p=p.replace("y","")).indexOf("g")&&(p+="g"),m=String(e).slice(s.lastIndex),s.lastIndex>0&&(!s.multiline||s.multiline&&"\n"!==e[s.lastIndex-1])&&(h="(?: "+h+")",m=" "+m,v++),n=new RegExp("^(?:"+h+")",p)),f&&(n=new RegExp("^"+h+"$(?!\\s)",p)),u&&(t=s.lastIndex),r=a.call(c?n:s,m),c?r?(r.input=r.input.slice(v),r[0]=r[0].slice(v),r.index=s.lastIndex,s.lastIndex+=r[0].length):s.lastIndex=0:u&&r&&(s.lastIndex=s.global?r.index+r[0].length:t),f&&r&&r.length>1&&l.call(r[0],n,function(){for(i=1;i=c?e?"":void 0:(o=a.charCodeAt(l))<55296||o>56319||l+1===c||(s=a.charCodeAt(l+1))<56320||s>57343?e?a.charAt(l):o:e?a.slice(l,l+2):s-56320+(o-55296<<10)+65536}};e.exports={codeAt:o(!1),charAt:o(!0)}},3197:function(e){"use strict";var t=2147483647,n=/[^\0-\u007E]/,r=/[.\u3002\uFF0E\uFF61]/g,i="Overflow: input needs wider integers to process",o=Math.floor,s=String.fromCharCode,a=function(e){return e+22+75*(e<26)},l=function(e,t,n){var r=0;for(e=n?o(e/700):e>>1,e+=o(e/t);e>455;r+=36)e=o(e/35);return o(r+36*e/(e+38))},c=function(e){var n=[];e=function(e){for(var t=[],n=0,r=e.length;n=55296&&i<=56319&&n=d&&co((t-f)/y))throw RangeError(i);for(f+=(m-d)*y,d=m,r=0;rt)throw RangeError(i);if(c==d){for(var g=f,b=36;;b+=36){var w=b<=p?1:b>=p+26?26:b-p;if(g0?n:t)(e)}},7466:function(e,t,n){var r=n(9958),i=Math.min;e.exports=function(e){return e>0?i(r(e),9007199254740991):0}},7908:function(e,t,n){var r=n(4488);e.exports=function(e){return Object(r(e))}},4590:function(e,t,n){var r=n(3002);e.exports=function(e,t){var n=r(e);if(n%t)throw RangeError("Wrong offset");return n}},3002:function(e,t,n){var r=n(9958);e.exports=function(e){var t=r(e);if(t<0)throw RangeError("The argument can't be less than 0");return t}},7593:function(e,t,n){var r=n(111);e.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},1694:function(e,t,n){var r={};r[n(5112)("toStringTag")]="z",e.exports="[object z]"===String(r)},9843:function(e,t,n){"use strict";var r=n(2109),i=n(7854),o=n(9781),s=n(3832),a=n(260),l=n(3331),c=n(5787),u=n(9114),d=n(8880),f=n(7466),p=n(7067),h=n(4590),v=n(7593),m=n(6656),y=n(648),g=n(111),b=n(30),w=n(7674),x=n(8006).f,E=n(7321),S=n(2092).forEach,k=n(6340),L=n(3070),A=n(1236),C=n(9909),_=n(9587),T=C.get,F=C.set,I=L.f,M=A.f,R=Math.round,z=i.RangeError,q=l.ArrayBuffer,U=l.DataView,O=a.NATIVE_ARRAY_BUFFER_VIEWS,j=a.TYPED_ARRAY_TAG,P=a.TypedArray,D=a.TypedArrayPrototype,N=a.aTypedArrayConstructor,$=a.isTypedArray,B="BYTES_PER_ELEMENT",W="Wrong length",H=function(e,t){for(var n=0,r=t.length,i=new(N(e))(r);r>n;)i[n]=t[n++];return i},Y=function(e,t){I(e,t,{get:function(){return T(this)[t]}})},G=function(e){var t;return e instanceof q||"ArrayBuffer"==(t=y(e))||"SharedArrayBuffer"==t},Q=function(e,t){return $(e)&&"symbol"!=typeof t&&t in e&&String(+t)==String(t)},X=function(e,t){return Q(e,t=v(t,!0))?u(2,e[t]):M(e,t)},V=function(e,t,n){return!(Q(e,t=v(t,!0))&&g(n)&&m(n,"value"))||m(n,"get")||m(n,"set")||n.configurable||m(n,"writable")&&!n.writable||m(n,"enumerable")&&!n.enumerable?I(e,t,n):(e[t]=n.value,e)};o?(O||(A.f=X,L.f=V,Y(D,"buffer"),Y(D,"byteOffset"),Y(D,"byteLength"),Y(D,"length")),r({target:"Object",stat:!0,forced:!O},{getOwnPropertyDescriptor:X,defineProperty:V}),e.exports=function(e,t,n){var o=e.match(/\d+$/)[0]/8,a=e+(n?"Clamped":"")+"Array",l="get"+e,u="set"+e,v=i[a],m=v,y=m&&m.prototype,L={},A=function(e,t){I(e,t,{get:function(){return function(e,t){var n=T(e);return n.view[l](t*o+n.byteOffset,!0)}(this,t)},set:function(e){return function(e,t,r){var i=T(e);n&&(r=(r=R(r))<0?0:r>255?255:255&r),i.view[u](t*o+i.byteOffset,r,!0)}(this,t,e)},enumerable:!0})};O?s&&(m=t(function(e,t,n,r){return c(e,m,a),_(g(t)?G(t)?void 0!==r?new v(t,h(n,o),r):void 0!==n?new v(t,h(n,o)):new v(t):$(t)?H(m,t):E.call(m,t):new v(p(t)),e,m)}),w&&w(m,P),S(x(v),function(e){e in m||d(m,e,v[e])}),m.prototype=y):(m=t(function(e,t,n,r){c(e,m,a);var i,s,l,u=0,d=0;if(g(t)){if(!G(t))return $(t)?H(m,t):E.call(m,t);i=t,d=h(n,o);var v=t.byteLength;if(void 0===r){if(v%o)throw z(W);if((s=v-d)<0)throw z(W)}else if((s=f(r)*o)+d>v)throw z(W);l=s/o}else l=p(t),i=new q(s=l*o);for(F(e,{buffer:i,byteOffset:d,byteLength:s,length:l,view:new U(i)});uo;)a[o]=t[o++];return a}},7321:function(e,t,n){var r=n(7908),i=n(7466),o=n(1246),s=n(7659),a=n(9974),l=n(260).aTypedArrayConstructor;e.exports=function(e){var t,n,c,u,d,f,p=r(e),h=arguments.length,v=h>1?arguments[1]:void 0,m=void 0!==v,y=o(p);if(null!=y&&!s(y))for(f=(d=y.call(p)).next,p=[];!(u=f.call(d)).done;)p.push(u.value);for(m&&h>2&&(v=a(v,arguments[2],2)),n=i(p.length),c=new(l(this))(n),t=0;n>t;t++)c[t]=m?v(p[t],t):p[t];return c}},9711:function(e){var t=0,n=Math.random();e.exports=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++t+n).toString(36)}},3307:function(e,t,n){var r=n(133);e.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},5112:function(e,t,n){var r=n(7854),i=n(2309),o=n(6656),s=n(9711),a=n(133),l=n(3307),c=i("wks"),u=r.Symbol,d=l?u:u&&u.withoutSetter||s;e.exports=function(e){return o(c,e)||(a&&o(u,e)?c[e]=u[e]:c[e]=d("Symbol."+e)),c[e]}},1361:function(e){e.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},8264:function(e,t,n){"use strict";var r=n(2109),i=n(7854),o=n(3331),s=n(6340),a="ArrayBuffer",l=o[a];r({global:!0,forced:i[a]!==l},{ArrayBuffer:l}),s(a)},2222:function(e,t,n){"use strict";var r=n(2109),i=n(7293),o=n(3157),s=n(111),a=n(7908),l=n(7466),c=n(6135),u=n(5417),d=n(1194),f=n(5112),p=n(7392),h=f("isConcatSpreadable"),v=9007199254740991,m="Maximum allowed index exceeded",y=p>=51||!i(function(){var e=[];return e[h]=!1,e.concat()[0]!==e}),g=d("concat"),b=function(e){if(!s(e))return!1;var t=e[h];return void 0!==t?!!t:o(e)};r({target:"Array",proto:!0,forced:!y||!g},{concat:function(e){var t,n,r,i,o,s=a(this),d=u(s,0),f=0;for(t=-1,r=arguments.length;tv)throw TypeError(m);for(n=0;n=v)throw TypeError(m);c(d,f++,o)}return d.length=f,d}})},7327:function(e,t,n){"use strict";var r=n(2109),i=n(2092).filter;r({target:"Array",proto:!0,forced:!n(1194)("filter")},{filter:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}})},2772:function(e,t,n){"use strict";var r=n(2109),i=n(1318).indexOf,o=n(9341),s=[].indexOf,a=!!s&&1/[1].indexOf(1,-0)<0,l=o("indexOf");r({target:"Array",proto:!0,forced:a||!l},{indexOf:function(e){return a?s.apply(this,arguments)||0:i(this,e,arguments.length>1?arguments[1]:void 0)}})},6992:function(e,t,n){"use strict";var r=n(5656),i=n(1223),o=n(7497),s=n(9909),a=n(654),l="Array Iterator",c=s.set,u=s.getterFor(l);e.exports=a(Array,"Array",function(e,t){c(this,{type:l,target:r(e),index:0,kind:t})},function(){var e=u(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}},"values"),o.Arguments=o.Array,i("keys"),i("values"),i("entries")},1249:function(e,t,n){"use strict";var r=n(2109),i=n(2092).map;r({target:"Array",proto:!0,forced:!n(1194)("map")},{map:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}})},7042:function(e,t,n){"use strict";var r=n(2109),i=n(111),o=n(3157),s=n(1400),a=n(7466),l=n(5656),c=n(6135),u=n(5112),d=n(1194)("slice"),f=u("species"),p=[].slice,h=Math.max;r({target:"Array",proto:!0,forced:!d},{slice:function(e,t){var n,r,u,d=l(this),v=a(d.length),m=s(e,v),y=s(void 0===t?v:t,v);if(o(d)&&("function"!=typeof(n=d.constructor)||n!==Array&&!o(n.prototype)?i(n)&&null===(n=n[f])&&(n=void 0):n=void 0,n===Array||void 0===n))return p.call(d,m,y);for(r=new(void 0===n?Array:n)(h(y-m,0)),u=0;m9007199254740991)throw TypeError("Maximum allowed length exceeded");for(u=l(m,r),p=0;py-r+n;p--)delete m[p-1]}else if(n>r)for(p=y-r;p>g;p--)v=p+n-1,(h=p+r-1)in m?m[v]=m[h]:delete m[v];for(p=0;p=n.length?{value:void 0,done:!0}:(e=r(n,i),t.index+=e.length,{value:e,done:!1})})},4723:function(e,t,n){"use strict";var r=n(7007),i=n(9670),o=n(7466),s=n(4488),a=n(1530),l=n(7651);r("match",1,function(e,t,n){return[function(t){var n=s(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var s=i(e),c=String(this);if(!s.global)return l(s,c);var u=s.unicode;s.lastIndex=0;for(var d,f=[],p=0;null!==(d=l(s,c));){var h=String(d[0]);f[p]=h,""===h&&(s.lastIndex=a(c,o(s.lastIndex),u)),p++}return 0===p?null:f}]})},5306:function(e,t,n){"use strict";var r=n(7007),i=n(9670),o=n(7466),s=n(9958),a=n(4488),l=n(1530),c=n(647),u=n(7651),d=Math.max,f=Math.min,p=function(e){return void 0===e?e:String(e)};r("replace",2,function(e,t,n,r){var h=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,v=r.REPLACE_KEEPS_$0,m=h?"$":"$0";return[function(n,r){var i=a(this),o=null==n?void 0:n[e];return void 0!==o?o.call(n,i,r):t.call(String(i),n,r)},function(e,r){if(!h&&v||"string"==typeof r&&-1===r.indexOf(m)){var a=n(t,e,this,r);if(a.done)return a.value}var y=i(e),g=String(this),b="function"==typeof r;b||(r=String(r));var w=y.global;if(w){var x=y.unicode;y.lastIndex=0}for(var E=[];;){var S=u(y,g);if(null===S)break;if(E.push(S),!w)break;""===String(S[0])&&(y.lastIndex=l(g,o(y.lastIndex),x))}for(var k="",L=0,A=0;A=L&&(k+=g.slice(L,_)+R,L=_+C.length)}return k+g.slice(L)}]})},3123:function(e,t,n){"use strict";var r=n(7007),i=n(7850),o=n(9670),s=n(4488),a=n(6707),l=n(1530),c=n(7466),u=n(7651),d=n(2261),f=n(7293),p=[].push,h=Math.min,v=4294967295,m=!f(function(){return!RegExp(v,"y")});r("split",2,function(e,t,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var r=String(s(this)),o=void 0===n?v:n>>>0;if(0===o)return[];if(void 0===e)return[r];if(!i(e))return t.call(r,e,o);for(var a,l,c,u=[],f=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),h=0,m=new RegExp(e.source,f+"g");(a=d.call(m,r))&&!((l=m.lastIndex)>h&&(u.push(r.slice(h,a.index)),a.length>1&&a.index=o));)m.lastIndex===a.index&&m.lastIndex++;return h===r.length?!c&&m.test("")||u.push(""):u.push(r.slice(h)),u.length>o?u.slice(0,o):u}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var i=s(this),o=null==t?void 0:t[e];return void 0!==o?o.call(t,i,n):r.call(String(i),t,n)},function(e,i){var s=n(r,e,this,i,r!==t);if(s.done)return s.value;var d=o(e),f=String(this),p=a(d,RegExp),y=d.unicode,g=(d.ignoreCase?"i":"")+(d.multiline?"m":"")+(d.unicode?"u":"")+(m?"y":"g"),b=new p(m?d:"^(?:"+d.source+")",g),w=void 0===i?v:i>>>0;if(0===w)return[];if(0===f.length)return null===u(b,f)?[f]:[];for(var x=0,E=0,S=[];E2?arguments[2]:void 0)})},8927:function(e,t,n){"use strict";var r=n(260),i=n(2092).every,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("every",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},3105:function(e,t,n){"use strict";var r=n(260),i=n(1285),o=r.aTypedArray;(0,r.exportTypedArrayMethod)("fill",function(e){return i.apply(o(this),arguments)})},5035:function(e,t,n){"use strict";var r=n(260),i=n(2092).filter,o=n(3074),s=r.aTypedArray;(0,r.exportTypedArrayMethod)("filter",function(e){var t=i(s(this),e,arguments.length>1?arguments[1]:void 0);return o(this,t)})},7174:function(e,t,n){"use strict";var r=n(260),i=n(2092).findIndex,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("findIndex",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},4345:function(e,t,n){"use strict";var r=n(260),i=n(2092).find,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("find",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},2846:function(e,t,n){"use strict";var r=n(260),i=n(2092).forEach,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("forEach",function(e){i(o(this),e,arguments.length>1?arguments[1]:void 0)})},4731:function(e,t,n){"use strict";var r=n(260),i=n(1318).includes,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("includes",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},7209:function(e,t,n){"use strict";var r=n(260),i=n(1318).indexOf,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("indexOf",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},6319:function(e,t,n){"use strict";var r=n(7854),i=n(260),o=n(6992),s=n(5112)("iterator"),a=r.Uint8Array,l=o.values,c=o.keys,u=o.entries,d=i.aTypedArray,f=i.exportTypedArrayMethod,p=a&&a.prototype[s],h=!!p&&("values"==p.name||null==p.name),v=function(){return l.call(d(this))};f("entries",function(){return u.call(d(this))}),f("keys",function(){return c.call(d(this))}),f("values",v,!h),f(s,v,!h)},8867:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=[].join;o("join",function(e){return s.apply(i(this),arguments)})},7789:function(e,t,n){"use strict";var r=n(260),i=n(6583),o=r.aTypedArray;(0,r.exportTypedArrayMethod)("lastIndexOf",function(e){return i.apply(o(this),arguments)})},3739:function(e,t,n){"use strict";var r=n(260),i=n(2092).map,o=n(6707),s=r.aTypedArray,a=r.aTypedArrayConstructor;(0,r.exportTypedArrayMethod)("map",function(e){return i(s(this),e,arguments.length>1?arguments[1]:void 0,function(e,t){return new(a(o(e,e.constructor)))(t)})})},4483:function(e,t,n){"use strict";var r=n(260),i=n(3671).right,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("reduceRight",function(e){return i(o(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)})},9368:function(e,t,n){"use strict";var r=n(260),i=n(3671).left,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("reduce",function(e){return i(o(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)})},2056:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=Math.floor;o("reverse",function(){for(var e,t=this,n=i(t).length,r=s(n/2),o=0;o1?arguments[1]:void 0,1),n=this.length,r=s(e),a=i(r.length),c=0;if(a+t>n)throw RangeError("Wrong length");for(;co;)u[o]=n[o++];return u},o(function(){new Int8Array(1).slice()}))},7462:function(e,t,n){"use strict";var r=n(260),i=n(2092).some,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("some",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},3824:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=[].sort;o("sort",function(e){return s.call(i(this),e)})},5021:function(e,t,n){"use strict";var r=n(260),i=n(7466),o=n(1400),s=n(6707),a=r.aTypedArray;(0,r.exportTypedArrayMethod)("subarray",function(e,t){var n=a(this),r=n.length,l=o(e,r);return new(s(n,n.constructor))(n.buffer,n.byteOffset+l*n.BYTES_PER_ELEMENT,i((void 0===t?r:o(t,r))-l))})},2974:function(e,t,n){"use strict";var r=n(7854),i=n(260),o=n(7293),s=r.Int8Array,a=i.aTypedArray,l=i.exportTypedArrayMethod,c=[].toLocaleString,u=[].slice,d=!!s&&o(function(){c.call(new s(1))});l("toLocaleString",function(){return c.apply(d?u.call(a(this)):a(this),arguments)},o(function(){return[1,2].toLocaleString()!=new s([1,2]).toLocaleString()})||!o(function(){s.prototype.toLocaleString.call([1,2])}))},5016:function(e,t,n){"use strict";var r=n(260).exportTypedArrayMethod,i=n(7293),o=n(7854).Uint8Array,s=o&&o.prototype||{},a=[].toString,l=[].join;i(function(){a.call({})})&&(a=function(){return l.call(this)});var c=s.toString!=a;r("toString",a,c)},2472:function(e,t,n){n(9843)("Uint8",function(e){return function(t,n,r){return e(this,t,n,r)}})},4747:function(e,t,n){var r=n(7854),i=n(8324),o=n(8533),s=n(8880);for(var a in i){var l=r[a],c=l&&l.prototype;if(c&&c.forEach!==o)try{s(c,"forEach",o)}catch(e){c.forEach=o}}},3948:function(e,t,n){var r=n(7854),i=n(8324),o=n(6992),s=n(8880),a=n(5112),l=a("iterator"),c=a("toStringTag"),u=o.values;for(var d in i){var f=r[d],p=f&&f.prototype;if(p){if(p[l]!==u)try{s(p,l,u)}catch(e){p[l]=u}if(p[c]||s(p,c,d),i[d])for(var h in o)if(p[h]!==o[h])try{s(p,h,o[h])}catch(e){p[h]=o[h]}}}},1637:function(e,t,n){"use strict";n(6992);var r=n(2109),i=n(5005),o=n(590),s=n(1320),a=n(2248),l=n(8003),c=n(4994),u=n(9909),d=n(5787),f=n(6656),p=n(9974),h=n(648),v=n(9670),m=n(111),y=n(30),g=n(9114),b=n(8554),w=n(1246),x=n(5112),E=i("fetch"),S=i("Headers"),k=x("iterator"),L="URLSearchParams",A=L+"Iterator",C=u.set,_=u.getterFor(L),T=u.getterFor(A),F=/\+/g,I=Array(4),M=function(e){return I[e-1]||(I[e-1]=RegExp("((?:%[\\da-f]{2}){"+e+"})","gi"))},R=function(e){try{return decodeURIComponent(e)}catch(t){return e}},z=function(e){var t=e.replace(F," "),n=4;try{return decodeURIComponent(t)}catch(e){for(;n;)t=t.replace(M(n--),R);return t}},q=/[!'()~]|%20/g,U={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},O=function(e){return U[e]},j=function(e){return encodeURIComponent(e).replace(q,O)},P=function(e,t){if(t)for(var n,r,i=t.split("&"),o=0;o0?arguments[0]:void 0,u=[];if(C(this,{type:L,entries:u,updateURL:function(){},updateSearchParams:D}),void 0!==c)if(m(c))if("function"==typeof(e=w(c)))for(n=(t=e.call(c)).next;!(r=n.call(t)).done;){if((s=(o=(i=b(v(r.value))).next).call(i)).done||(a=o.call(i)).done||!o.call(i).done)throw TypeError("Expected sequence with length 2");u.push({key:s.value+"",value:a.value+""})}else for(l in c)f(c,l)&&u.push({key:l,value:c[l]+""});else P(u,"string"==typeof c?"?"===c.charAt(0)?c.slice(1):c:c+"")},W=B.prototype;a(W,{append:function(e,t){N(arguments.length,2);var n=_(this);n.entries.push({key:e+"",value:t+""}),n.updateURL()},delete:function(e){N(arguments.length,1);for(var t=_(this),n=t.entries,r=e+"",i=0;ie.key){i.splice(t,0,e);break}t===n&&i.push(e)}r.updateURL()},forEach:function(e){for(var t,n=_(this).entries,r=p(e,arguments.length>1?arguments[1]:void 0,3),i=0;i1&&(m(t=arguments[1])&&(n=t.body,h(n)===L&&((r=t.headers?new S(t.headers):new S).has("content-type")||r.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),t=y(t,{body:g(0,String(n)),headers:g(0,r)}))),i.push(t)),E.apply(this,i)}}),e.exports={URLSearchParams:B,getState:_}},285:function(e,t,n){"use strict";n(8783);var r,i=n(2109),o=n(9781),s=n(590),a=n(7854),l=n(6048),c=n(1320),u=n(5787),d=n(6656),f=n(1574),p=n(8457),h=n(8710).codeAt,v=n(3197),m=n(8003),y=n(1637),g=n(9909),b=a.URL,w=y.URLSearchParams,x=y.getState,E=g.set,S=g.getterFor("URL"),k=Math.floor,L=Math.pow,A="Invalid scheme",C="Invalid host",_="Invalid port",T=/[A-Za-z]/,F=/[\d+-.A-Za-z]/,I=/\d/,M=/^(0x|0X)/,R=/^[0-7]+$/,z=/^\d+$/,q=/^[\dA-Fa-f]+$/,U=/[\u0000\t\u000A\u000D #%/:?@[\\]]/,O=/[\u0000\t\u000A\u000D #/:?@[\\]]/,j=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,P=/[\t\u000A\u000D]/g,D=function(e,t){var n,r,i;if("["==t.charAt(0)){if("]"!=t.charAt(t.length-1))return C;if(!(n=$(t.slice(1,-1))))return C;e.host=n}else if(V(e)){if(t=v(t),U.test(t))return C;if(null===(n=N(t)))return C;e.host=n}else{if(O.test(t))return C;for(n="",r=p(t),i=0;i4)return e;for(n=[],r=0;r1&&"0"==i.charAt(0)&&(o=M.test(i)?16:8,i=i.slice(8==o?1:2)),""===i)s=0;else{if(!(10==o?z:8==o?R:q).test(i))return e;s=parseInt(i,o)}n.push(s)}for(r=0;r=L(256,5-t))return null}else if(s>255)return null;for(a=n.pop(),r=0;r6)return;for(r=0;f();){if(i=null,r>0){if(!("."==f()&&r<4))return;d++}if(!I.test(f()))return;for(;I.test(f());){if(o=parseInt(f(),10),null===i)i=o;else{if(0==i)return;i=10*i+o}if(i>255)return;d++}l[c]=256*l[c]+i,2!=++r&&4!=r||c++}if(4!=r)return;break}if(":"==f()){if(d++,!f())return}else if(f())return;l[c++]=t}else{if(null!==u)return;d++,u=++c}}if(null!==u)for(s=c-u,c=7;0!=c&&s>0;)a=l[c],l[c--]=l[u+s-1],l[u+--s]=a;else if(8!=c)return;return l},B=function(e){var t,n,r,i;if("number"==typeof e){for(t=[],n=0;n<4;n++)t.unshift(e%256),e=k(e/256);return t.join(".")}if("object"==typeof e){for(t="",r=function(e){for(var t=null,n=1,r=null,i=0,o=0;o<8;o++)0!==e[o]?(i>n&&(t=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(t=r,n=i),t}(e),n=0;n<8;n++)i&&0===e[n]||(i&&(i=!1),r===n?(t+=n?":":"::",i=!0):(t+=e[n].toString(16),n<7&&(t+=":")));return"["+t+"]"}return e},W={},H=f({},W,{" ":1,'"':1,"<":1,">":1,"`":1}),Y=f({},H,{"#":1,"?":1,"{":1,"}":1}),G=f({},Y,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),Q=function(e,t){var n=h(e,0);return n>32&&n<127&&!d(t,e)?e:encodeURIComponent(e)},X={ftp:21,file:null,http:80,https:443,ws:80,wss:443},V=function(e){return d(X,e.scheme)},K=function(e){return""!=e.username||""!=e.password},Z=function(e){return!e.host||e.cannotBeABaseURL||"file"==e.scheme},J=function(e,t){var n;return 2==e.length&&T.test(e.charAt(0))&&(":"==(n=e.charAt(1))||!t&&"|"==n)},ee=function(e){var t;return e.length>1&&J(e.slice(0,2))&&(2==e.length||"/"===(t=e.charAt(2))||"\\"===t||"?"===t||"#"===t)},te=function(e){var t=e.path,n=t.length;!n||"file"==e.scheme&&1==n&&J(t[0],!0)||t.pop()},ne=function(e){return"."===e||"%2e"===e.toLowerCase()},re=function(e){return".."===(e=e.toLowerCase())||"%2e."===e||".%2e"===e||"%2e%2e"===e},ie={},oe={},se={},ae={},le={},ce={},ue={},de={},fe={},pe={},he={},ve={},me={},ye={},ge={},be={},we={},xe={},Ee={},Se={},ke={},Le=function(e,t,n,i){var o,s,a,l,c=n||ie,u=0,f="",h=!1,v=!1,m=!1;for(n||(e.scheme="",e.username="",e.password="",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,t=t.replace(j,"")),t=t.replace(P,""),o=p(t);u<=o.length;){switch(s=o[u],c){case ie:if(!s||!T.test(s)){if(n)return A;c=se;continue}f+=s.toLowerCase(),c=oe;break;case oe:if(s&&(F.test(s)||"+"==s||"-"==s||"."==s))f+=s.toLowerCase();else{if(":"!=s){if(n)return A;f="",c=se,u=0;continue}if(n&&(V(e)!=d(X,f)||"file"==f&&(K(e)||null!==e.port)||"file"==e.scheme&&!e.host))return;if(e.scheme=f,n)return void(V(e)&&X[e.scheme]==e.port&&(e.port=null));f="","file"==e.scheme?c=ye:V(e)&&i&&i.scheme==e.scheme?c=ae:V(e)?c=de:"/"==o[u+1]?(c=le,u++):(e.cannotBeABaseURL=!0,e.path.push(""),c=Ee)}break;case se:if(!i||i.cannotBeABaseURL&&"#"!=s)return A;if(i.cannotBeABaseURL&&"#"==s){e.scheme=i.scheme,e.path=i.path.slice(),e.query=i.query,e.fragment="",e.cannotBeABaseURL=!0,c=ke;break}c="file"==i.scheme?ye:ce;continue;case ae:if("/"!=s||"/"!=o[u+1]){c=ce;continue}c=fe,u++;break;case le:if("/"==s){c=pe;break}c=xe;continue;case ce:if(e.scheme=i.scheme,s==r)e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query=i.query;else if("/"==s||"\\"==s&&V(e))c=ue;else if("?"==s)e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query="",c=Se;else{if("#"!=s){e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.path.pop(),c=xe;continue}e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query=i.query,e.fragment="",c=ke}break;case ue:if(!V(e)||"/"!=s&&"\\"!=s){if("/"!=s){e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,c=xe;continue}c=pe}else c=fe;break;case de:if(c=fe,"/"!=s||"/"!=f.charAt(u+1))continue;u++;break;case fe:if("/"!=s&&"\\"!=s){c=pe;continue}break;case pe:if("@"==s){h&&(f="%40"+f),h=!0,a=p(f);for(var y=0;y65535)return _;e.port=V(e)&&w===X[e.scheme]?null:w,f=""}if(n)return;c=we;continue}return _}f+=s;break;case ye:if(e.scheme="file","/"==s||"\\"==s)c=ge;else{if(!i||"file"!=i.scheme){c=xe;continue}if(s==r)e.host=i.host,e.path=i.path.slice(),e.query=i.query;else if("?"==s)e.host=i.host,e.path=i.path.slice(),e.query="",c=Se;else{if("#"!=s){ee(o.slice(u).join(""))||(e.host=i.host,e.path=i.path.slice(),te(e)),c=xe;continue}e.host=i.host,e.path=i.path.slice(),e.query=i.query,e.fragment="",c=ke}}break;case ge:if("/"==s||"\\"==s){c=be;break}i&&"file"==i.scheme&&!ee(o.slice(u).join(""))&&(J(i.path[0],!0)?e.path.push(i.path[0]):e.host=i.host),c=xe;continue;case be:if(s==r||"/"==s||"\\"==s||"?"==s||"#"==s){if(!n&&J(f))c=xe;else if(""==f){if(e.host="",n)return;c=we}else{if(l=D(e,f))return l;if("localhost"==e.host&&(e.host=""),n)return;f="",c=we}continue}f+=s;break;case we:if(V(e)){if(c=xe,"/"!=s&&"\\"!=s)continue}else if(n||"?"!=s)if(n||"#"!=s){if(s!=r&&(c=xe,"/"!=s))continue}else e.fragment="",c=ke;else e.query="",c=Se;break;case xe:if(s==r||"/"==s||"\\"==s&&V(e)||!n&&("?"==s||"#"==s)){if(re(f)?(te(e),"/"==s||"\\"==s&&V(e)||e.path.push("")):ne(f)?"/"==s||"\\"==s&&V(e)||e.path.push(""):("file"==e.scheme&&!e.path.length&&J(f)&&(e.host&&(e.host=""),f=f.charAt(0)+":"),e.path.push(f)),f="","file"==e.scheme&&(s==r||"?"==s||"#"==s))for(;e.path.length>1&&""===e.path[0];)e.path.shift();"?"==s?(e.query="",c=Se):"#"==s&&(e.fragment="",c=ke)}else f+=Q(s,Y);break;case Ee:"?"==s?(e.query="",c=Se):"#"==s?(e.fragment="",c=ke):s!=r&&(e.path[0]+=Q(s,W));break;case Se:n||"#"!=s?s!=r&&("'"==s&&V(e)?e.query+="%27":e.query+="#"==s?"%23":Q(s,W)):(e.fragment="",c=ke);break;case ke:s!=r&&(e.fragment+=Q(s,H))}u++}},Ae=function(e){var t,n,r=u(this,Ae,"URL"),i=arguments.length>1?arguments[1]:void 0,s=String(e),a=E(r,{type:"URL"});if(void 0!==i)if(i instanceof Ae)t=S(i);else if(n=Le(t={},String(i)))throw TypeError(n);if(n=Le(a,s,null,t))throw TypeError(n);var l=a.searchParams=new w,c=x(l);c.updateSearchParams(a.query),c.updateURL=function(){a.query=String(l)||null},o||(r.href=_e.call(r),r.origin=Te.call(r),r.protocol=Fe.call(r),r.username=Ie.call(r),r.password=Me.call(r),r.host=Re.call(r),r.hostname=ze.call(r),r.port=qe.call(r),r.pathname=Ue.call(r),r.search=Oe.call(r),r.searchParams=je.call(r),r.hash=Pe.call(r))},Ce=Ae.prototype,_e=function(){var e=S(this),t=e.scheme,n=e.username,r=e.password,i=e.host,o=e.port,s=e.path,a=e.query,l=e.fragment,c=t+":";return null!==i?(c+="//",K(e)&&(c+=n+(r?":"+r:"")+"@"),c+=B(i),null!==o&&(c+=":"+o)):"file"==t&&(c+="//"),c+=e.cannotBeABaseURL?s[0]:s.length?"/"+s.join("/"):"",null!==a&&(c+="?"+a),null!==l&&(c+="#"+l),c},Te=function(){var e=S(this),t=e.scheme,n=e.port;if("blob"==t)try{return new URL(t.path[0]).origin}catch(e){return"null"}return"file"!=t&&V(e)?t+"://"+B(e.host)+(null!==n?":"+n:""):"null"},Fe=function(){return S(this).scheme+":"},Ie=function(){return S(this).username},Me=function(){return S(this).password},Re=function(){var e=S(this),t=e.host,n=e.port;return null===t?"":null===n?B(t):B(t)+":"+n},ze=function(){var e=S(this).host;return null===e?"":B(e)},qe=function(){var e=S(this).port;return null===e?"":String(e)},Ue=function(){var e=S(this),t=e.path;return e.cannotBeABaseURL?t[0]:t.length?"/"+t.join("/"):""},Oe=function(){var e=S(this).query;return e?"?"+e:""},je=function(){return S(this).searchParams},Pe=function(){var e=S(this).fragment;return e?"#"+e:""},De=function(e,t){return{get:e,set:t,configurable:!0,enumerable:!0}};if(o&&l(Ce,{href:De(_e,function(e){var t=S(this),n=String(e),r=Le(t,n);if(r)throw TypeError(r);x(t.searchParams).updateSearchParams(t.query)}),origin:De(Te),protocol:De(Fe,function(e){var t=S(this);Le(t,String(e)+":",ie)}),username:De(Ie,function(e){var t=S(this),n=p(String(e));if(!Z(t)){t.username="";for(var r=0;re.length)&&(t=e.length);for(var n=0,r=new Array(t);n1?r-1:0),o=1;o=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,a=!0,l=!1;return{s:function(){r=t[Symbol.iterator]()},n:function(){var e=r.next();return a=e.done,e},e:function(e){l=!0,s=e},f:function(){try{a||null==r.return||r.return()}finally{if(l)throw s}}}}(n,!0);try{for(a.s();!(s=a.n()).done;)s.value.apply(this,i)}catch(e){a.e(e)}finally{a.f()}}return this.element&&this.element.dispatchEvent(this.makeEvent("dropzone:"+t,{args:i})),this}},{key:"makeEvent",value:function(e,t){var n={bubbles:!0,cancelable:!0,detail:t};if("function"==typeof window.CustomEvent)return new CustomEvent(e,n);var r=document.createEvent("CustomEvent");return r.initCustomEvent(e,n.bubbles,n.cancelable,n.detail),r}},{key:"off",value:function(e,t){if(!this._callbacks||0===arguments.length)return this._callbacks={},this;var n=this._callbacks[e];if(!n)return this;if(1===arguments.length)return delete this._callbacks[e],this;for(var r=0;r=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,l=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return a=e.done,e},e:function(e){l=!0,o=e},f:function(){try{a||null==n.return||n.return()}finally{if(l)throw o}}}}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n'),this.element.appendChild(e));var i=e.getElementsByTagName("span")[0];return i&&(null!=i.textContent?i.textContent=this.options.dictFallbackMessage:null!=i.innerText&&(i.innerText=this.options.dictFallbackMessage)),this.element.appendChild(this.getFallbackForm())},resize:function(e,t,n,r){var i={srcX:0,srcY:0,srcWidth:e.width,srcHeight:e.height},o=e.width/e.height;null==t&&null==n?(t=i.srcWidth,n=i.srcHeight):null==t?t=n*o:null==n&&(n=t/o);var s=(t=Math.min(t,i.srcWidth))/(n=Math.min(n,i.srcHeight));if(i.srcWidth>t||i.srcHeight>n)if("crop"===r)o>s?(i.srcHeight=e.height,i.srcWidth=i.srcHeight*s):(i.srcWidth=e.width,i.srcHeight=i.srcWidth/s);else{if("contain"!==r)throw new Error("Unknown resizeMethod '".concat(r,"'"));o>s?n=t/o:t=n*o}return i.srcX=(e.width-i.srcWidth)/2,i.srcY=(e.height-i.srcHeight)/2,i.trgWidth=t,i.trgHeight=n,i},transformFile:function(e,t){return(this.options.resizeWidth||this.options.resizeHeight)&&e.type.match(/image.*/)?this.resizeImage(e,this.options.resizeWidth,this.options.resizeHeight,this.options.resizeMethod,t):t(e)},previewTemplate:'
    Check
    Error
    ',drop:function(e){return this.element.classList.remove("dz-drag-hover")},dragstart:function(e){},dragend:function(e){return this.element.classList.remove("dz-drag-hover")},dragenter:function(e){return this.element.classList.add("dz-drag-hover")},dragover:function(e){return this.element.classList.add("dz-drag-hover")},dragleave:function(e){return this.element.classList.remove("dz-drag-hover")},paste:function(e){},reset:function(){return this.element.classList.remove("dz-started")},addedfile:function(e){var t=this;if(this.element===this.previewsContainer&&this.element.classList.add("dz-started"),this.previewsContainer&&!this.options.disablePreviews){e.previewElement=g.createElement(this.options.previewTemplate.trim()),e.previewTemplate=e.previewElement,this.previewsContainer.appendChild(e.previewElement);var n,r=o(e.previewElement.querySelectorAll("[data-dz-name]"),!0);try{for(r.s();!(n=r.n()).done;){var i=n.value;i.textContent=e.name}}catch(e){r.e(e)}finally{r.f()}var s,a=o(e.previewElement.querySelectorAll("[data-dz-size]"),!0);try{for(a.s();!(s=a.n()).done;)(i=s.value).innerHTML=this.filesize(e.size)}catch(e){a.e(e)}finally{a.f()}this.options.addRemoveLinks&&(e._removeLink=g.createElement('
    '.concat(this.options.dictRemoveFile,"")),e.previewElement.appendChild(e._removeLink));var l,c=function(n){return n.preventDefault(),n.stopPropagation(),e.status===g.UPLOADING?g.confirm(t.options.dictCancelUploadConfirmation,function(){return t.removeFile(e)}):t.options.dictRemoveFileConfirmation?g.confirm(t.options.dictRemoveFileConfirmation,function(){return t.removeFile(e)}):t.removeFile(e)},u=o(e.previewElement.querySelectorAll("[data-dz-remove]"),!0);try{for(u.s();!(l=u.n()).done;)l.value.addEventListener("click",c)}catch(e){u.e(e)}finally{u.f()}}},removedfile:function(e){return null!=e.previewElement&&null!=e.previewElement.parentNode&&e.previewElement.parentNode.removeChild(e.previewElement),this._updateMaxFilesReachedClass()},thumbnail:function(e,t){if(e.previewElement){e.previewElement.classList.remove("dz-file-preview");var n,r=o(e.previewElement.querySelectorAll("[data-dz-thumbnail]"),!0);try{for(r.s();!(n=r.n()).done;){var i=n.value;i.alt=e.name,i.src=t}}catch(e){r.e(e)}finally{r.f()}return setTimeout(function(){return e.previewElement.classList.add("dz-image-preview")},1)}},error:function(e,t){if(e.previewElement){e.previewElement.classList.add("dz-error"),"string"!=typeof t&&t.error&&(t=t.error);var n,r=o(e.previewElement.querySelectorAll("[data-dz-errormessage]"),!0);try{for(r.s();!(n=r.n()).done;)n.value.textContent=t}catch(e){r.e(e)}finally{r.f()}}},errormultiple:function(){},processing:function(e){if(e.previewElement&&(e.previewElement.classList.add("dz-processing"),e._removeLink))return e._removeLink.innerHTML=this.options.dictCancelUpload},processingmultiple:function(){},uploadprogress:function(e,t,n){if(e.previewElement){var r,i=o(e.previewElement.querySelectorAll("[data-dz-uploadprogress]"),!0);try{for(i.s();!(r=i.n()).done;){var s=r.value;"PROGRESS"===s.nodeName?s.value=t:s.style.width="".concat(t,"%")}}catch(e){i.e(e)}finally{i.f()}}},totaluploadprogress:function(){},sending:function(){},sendingmultiple:function(){},success:function(e){if(e.previewElement)return e.previewElement.classList.add("dz-success")},successmultiple:function(){},canceled:function(e){return this.emit("error",e,this.options.dictUploadCanceled)},canceledmultiple:function(){},complete:function(e){if(e._removeLink&&(e._removeLink.innerHTML=this.options.dictRemoveFile),e.previewElement)return e.previewElement.classList.add("dz-complete")},completemultiple:function(){},maxfilesexceeded:function(){},maxfilesreached:function(){},queuecomplete:function(){},addedfiles:function(){}};function l(e){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l(e)}function c(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return u(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?u(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return s=e.done,e},e:function(e){a=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n"))),this.clickableElements.length&&function t(){e.hiddenFileInput&&e.hiddenFileInput.parentNode.removeChild(e.hiddenFileInput),e.hiddenFileInput=document.createElement("input"),e.hiddenFileInput.setAttribute("type","file"),(null===e.options.maxFiles||e.options.maxFiles>1)&&e.hiddenFileInput.setAttribute("multiple","multiple"),e.hiddenFileInput.className="dz-hidden-input",null!==e.options.acceptedFiles&&e.hiddenFileInput.setAttribute("accept",e.options.acceptedFiles),null!==e.options.capture&&e.hiddenFileInput.setAttribute("capture",e.options.capture),e.hiddenFileInput.setAttribute("tabindex","-1"),e.hiddenFileInput.style.visibility="hidden",e.hiddenFileInput.style.position="absolute",e.hiddenFileInput.style.top="0",e.hiddenFileInput.style.left="0",e.hiddenFileInput.style.height="0",e.hiddenFileInput.style.width="0",o.getElement(e.options.hiddenInputContainer,"hiddenInputContainer").appendChild(e.hiddenFileInput),e.hiddenFileInput.addEventListener("change",function(){var n=e.hiddenFileInput.files;if(n.length){var r,i=c(n,!0);try{for(i.s();!(r=i.n()).done;){var o=r.value;e.addFile(o)}}catch(e){i.e(e)}finally{i.f()}}e.emit("addedfiles",n),t()})}(),this.URL=null!==window.URL?window.URL:window.webkitURL;var t,n=c(this.events,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.on(r,this.options[r])}}catch(e){n.e(e)}finally{n.f()}this.on("uploadprogress",function(){return e.updateTotalUploadProgress()}),this.on("removedfile",function(){return e.updateTotalUploadProgress()}),this.on("canceled",function(t){return e.emit("complete",t)}),this.on("complete",function(t){if(0===e.getAddedFiles().length&&0===e.getUploadingFiles().length&&0===e.getQueuedFiles().length)return setTimeout(function(){return e.emit("queuecomplete")},0)});var i=function(e){if(function(e){if(e.dataTransfer.types)for(var t=0;t")),n+='');var r=o.createElement(n);return"FORM"!==this.element.tagName?(t=o.createElement('
    '))).appendChild(r):(this.element.setAttribute("enctype","multipart/form-data"),this.element.setAttribute("method",this.options.method)),null!=t?t:r}},{key:"getExistingFallback",value:function(){for(var e=function(e){var t,n=c(e,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;if(/(^| )fallback($| )/.test(r.className))return r}}catch(e){n.e(e)}finally{n.f()}},t=0,n=["div","form"];t0){for(var r=["tb","gb","mb","kb","b"],i=0;i=Math.pow(this.options.filesizeBase,4-i)/10){t=e/Math.pow(this.options.filesizeBase,4-i),n=o;break}}t=Math.round(10*t)/10}return"".concat(t," ").concat(this.options.dictFileSizeUnits[n])}},{key:"_updateMaxFilesReachedClass",value:function(){return null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(this.getAcceptedFiles().length===this.options.maxFiles&&this.emit("maxfilesreached",this.files),this.element.classList.add("dz-max-files-reached")):this.element.classList.remove("dz-max-files-reached")}},{key:"drop",value:function(e){if(e.dataTransfer){this.emit("drop",e);for(var t=[],n=0;n0){var i,o=c(r,!0);try{for(o.s();!(i=o.n()).done;){var s=i.value;s.isFile?s.file(function(e){if(!n.options.ignoreHiddenFiles||"."!==e.name.substring(0,1))return e.fullPath="".concat(t,"/").concat(e.name),n.addFile(e)}):s.isDirectory&&n._addFilesFromDirectory(s,"".concat(t,"/").concat(s.name))}}catch(e){o.e(e)}finally{o.f()}e()}return null},i)}()}},{key:"accept",value:function(e,t){this.options.maxFilesize&&e.size>1024*this.options.maxFilesize*1024?t(this.options.dictFileTooBig.replace("{{filesize}}",Math.round(e.size/1024/10.24)/100).replace("{{maxFilesize}}",this.options.maxFilesize)):o.isValidFile(e,this.options.acceptedFiles)?null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(t(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}",this.options.maxFiles)),this.emit("maxfilesexceeded",e)):this.options.accept.call(this,e,t):t(this.options.dictInvalidFileType)}},{key:"addFile",value:function(e){var t=this;e.upload={uuid:o.uuidv4(),progress:0,total:e.size,bytesSent:0,filename:this._renameFile(e)},this.files.push(e),e.status=o.ADDED,this.emit("addedfile",e),this._enqueueThumbnail(e),this.accept(e,function(n){n?(e.accepted=!1,t._errorProcessing([e],n)):(e.accepted=!0,t.options.autoQueue&&t.enqueueFile(e)),t._updateMaxFilesReachedClass()})}},{key:"enqueueFiles",value:function(e){var t,n=c(e,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.enqueueFile(r)}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"enqueueFile",value:function(e){var t=this;if(e.status!==o.ADDED||!0!==e.accepted)throw new Error("This file can't be queued because it has already been processed or was rejected.");if(e.status=o.QUEUED,this.options.autoProcessQueue)return setTimeout(function(){return t.processQueue()},0)}},{key:"_enqueueThumbnail",value:function(e){var t=this;if(this.options.createImageThumbnails&&e.type.match(/image.*/)&&e.size<=1024*this.options.maxThumbnailFilesize*1024)return this._thumbnailQueue.push(e),setTimeout(function(){return t._processThumbnailQueue()},0)}},{key:"_processThumbnailQueue",value:function(){var e=this;if(!this._processingThumbnail&&0!==this._thumbnailQueue.length){this._processingThumbnail=!0;var t=this._thumbnailQueue.shift();return this.createThumbnail(t,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,!0,function(n){return e.emit("thumbnail",t,n),e._processingThumbnail=!1,e._processThumbnailQueue()})}}},{key:"removeFile",value:function(e){if(e.status===o.UPLOADING&&this.cancelUpload(e),this.files=b(this.files,e),this.emit("removedfile",e),0===this.files.length)return this.emit("reset")}},{key:"removeAllFiles",value:function(e){null==e&&(e=!1);var t,n=c(this.files.slice(),!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;(r.status!==o.UPLOADING||e)&&this.removeFile(r)}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"resizeImage",value:function(e,t,n,r,i){var s=this;return this.createThumbnail(e,t,n,r,!0,function(t,n){if(null==n)return i(e);var r=s.options.resizeMimeType;null==r&&(r=e.type);var a=n.toDataURL(r,s.options.resizeQuality);return"image/jpeg"!==r&&"image/jpg"!==r||(a=E.restore(e.dataURL,a)),i(o.dataURItoBlob(a))})}},{key:"createThumbnail",value:function(e,t,n,r,i,o){var s=this,a=new FileReader;a.onload=function(){e.dataURL=a.result,"image/svg+xml"!==e.type?s.createThumbnailFromUrl(e,t,n,r,i,o):null!=o&&o(a.result)},a.readAsDataURL(e)}},{key:"displayExistingFile",value:function(e,t,n,r){var i=this,o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4];this.emit("addedfile",e),this.emit("complete",e),o?(e.dataURL=t,this.createThumbnailFromUrl(e,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,this.options.fixOrientation,function(t){i.emit("thumbnail",e,t),n&&n()},r)):(this.emit("thumbnail",e,t),n&&n())}},{key:"createThumbnailFromUrl",value:function(e,t,n,r,i,o,s){var a=this,l=document.createElement("img");return s&&(l.crossOrigin=s),i="from-image"!=getComputedStyle(document.body).imageOrientation&&i,l.onload=function(){var s=function(e){return e(1)};return"undefined"!=typeof EXIF&&null!==EXIF&&i&&(s=function(e){return EXIF.getData(l,function(){return e(EXIF.getTag(this,"Orientation"))})}),s(function(i){e.width=l.width,e.height=l.height;var s=a.options.resize.call(a,e,t,n,r),c=document.createElement("canvas"),u=c.getContext("2d");switch(c.width=s.trgWidth,c.height=s.trgHeight,i>4&&(c.width=s.trgHeight,c.height=s.trgWidth),i){case 2:u.translate(c.width,0),u.scale(-1,1);break;case 3:u.translate(c.width,c.height),u.rotate(Math.PI);break;case 4:u.translate(0,c.height),u.scale(1,-1);break;case 5:u.rotate(.5*Math.PI),u.scale(1,-1);break;case 6:u.rotate(.5*Math.PI),u.translate(0,-c.width);break;case 7:u.rotate(.5*Math.PI),u.translate(c.height,-c.width),u.scale(-1,1);break;case 8:u.rotate(-.5*Math.PI),u.translate(-c.height,0)}x(u,l,null!=s.srcX?s.srcX:0,null!=s.srcY?s.srcY:0,s.srcWidth,s.srcHeight,null!=s.trgX?s.trgX:0,null!=s.trgY?s.trgY:0,s.trgWidth,s.trgHeight);var d=c.toDataURL("image/png");if(null!=o)return o(d,c)})},null!=o&&(l.onerror=o),l.src=e.dataURL}},{key:"processQueue",value:function(){var e=this.options.parallelUploads,t=this.getUploadingFiles().length,n=t;if(!(t>=e)){var r=this.getQueuedFiles();if(r.length>0){if(this.options.uploadMultiple)return this.processFiles(r.slice(0,e-t));for(;n1?t-1:0),r=1;rt.options.chunkSize),e[0].upload.totalChunkCount=Math.ceil(r.size/t.options.chunkSize)}if(e[0].upload.chunked){var i=e[0],s=n[0];i.upload.chunks=[];var a=function(){for(var n=0;void 0!==i.upload.chunks[n];)n++;if(!(n>=i.upload.totalChunkCount)){var r=n*t.options.chunkSize,a=Math.min(r+t.options.chunkSize,s.size),l={name:t._getParamName(0),data:s.webkitSlice?s.webkitSlice(r,a):s.slice(r,a),filename:i.upload.filename,chunkIndex:n};i.upload.chunks[n]={file:i,index:n,dataBlock:l,status:o.UPLOADING,progress:0,retries:0},t._uploadData(e,[l])}};if(i.upload.finishedChunkUpload=function(n,r){var s=!0;n.status=o.SUCCESS,n.dataBlock=null,n.xhr=null;for(var l=0;l1?t-1:0),r=1;r=s;a?o++:o--)i[o]=t.charCodeAt(o);return new Blob([r],{type:n})};var b=function(e,t){return e.filter(function(e){return e!==t}).map(function(e){return e})},w=function(e){return e.replace(/[\-_](\w)/g,function(e){return e.charAt(1).toUpperCase()})};g.createElement=function(e){var t=document.createElement("div");return t.innerHTML=e,t.childNodes[0]},g.elementInside=function(e,t){if(e===t)return!0;for(;e=e.parentNode;)if(e===t)return!0;return!1},g.getElement=function(e,t){var n;if("string"==typeof e?n=document.querySelector(e):null!=e.nodeType&&(n=e),null==n)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector or a plain HTML element."));return n},g.getElements=function(e,t){var n,r;if(e instanceof Array){r=[];try{var i,o=c(e,!0);try{for(o.s();!(i=o.n()).done;)n=i.value,r.push(this.getElement(n,t))}catch(e){o.e(e)}finally{o.f()}}catch(e){r=null}}else if("string"==typeof e){r=[];var s,a=c(document.querySelectorAll(e),!0);try{for(a.s();!(s=a.n()).done;)n=s.value,r.push(n)}catch(e){a.e(e)}finally{a.f()}}else null!=e.nodeType&&(r=[e]);if(null==r||!r.length)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector, a plain HTML element or a list of those."));return r},g.confirm=function(e,t,n){return window.confirm(e)?t():null!=n?n():void 0},g.isValidFile=function(e,t){if(!t)return!0;t=t.split(",");var n,r=e.type,i=r.replace(/\/.*$/,""),o=c(t,!0);try{for(o.s();!(n=o.n()).done;){var s=n.value;if("."===(s=s.trim()).charAt(0)){if(-1!==e.name.toLowerCase().indexOf(s.toLowerCase(),e.name.length-s.length))return!0}else if(/\/\*$/.test(s)){if(i===s.replace(/\/.*$/,""))return!0}else if(r===s)return!0}}catch(e){o.e(e)}finally{o.f()}return!1},"undefined"!=typeof jQuery&&null!==jQuery&&(jQuery.fn.dropzone=function(e){return this.each(function(){return new g(this,e)})}),g.ADDED="added",g.QUEUED="queued",g.ACCEPTED=g.QUEUED,g.UPLOADING="uploading",g.PROCESSING=g.UPLOADING,g.CANCELED="canceled",g.ERROR="error",g.SUCCESS="success";var x=function(e,t,n,r,i,o,s,a,l,c){var u=function(e){e.naturalWidth;var t=e.naturalHeight,n=document.createElement("canvas");n.width=1,n.height=t;var r=n.getContext("2d");r.drawImage(e,0,0);for(var i=r.getImageData(1,0,1,t).data,o=0,s=t,a=t;a>o;)0===i[4*(a-1)+3]?s=a:o=a,a=s+o>>1;var l=a/t;return 0===l?1:l}(t);return e.drawImage(t,n,r,i,o,s,a,l,c/u)},E=function(){function e(){d(this,e)}return p(e,null,[{key:"initClass",value:function(){this.KEY_STR="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}},{key:"encode64",value:function(e){for(var t="",n=void 0,r=void 0,i="",o=void 0,s=void 0,a=void 0,l="",c=0;o=(n=e[c++])>>2,s=(3&n)<<4|(r=e[c++])>>4,a=(15&r)<<2|(i=e[c++])>>6,l=63&i,isNaN(r)?a=l=64:isNaN(i)&&(l=64),t=t+this.KEY_STR.charAt(o)+this.KEY_STR.charAt(s)+this.KEY_STR.charAt(a)+this.KEY_STR.charAt(l),n=r=i="",o=s=a=l="",ce.length)break}return n}},{key:"decode64",value:function(e){var t=void 0,n=void 0,r="",i=void 0,o=void 0,s="",a=0,l=[];for(/[^A-Za-z0-9\+\/\=]/g.exec(e)&&console.warn("There were invalid base64 characters in the input text.\nValid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\nExpect errors in decoding."),e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");t=this.KEY_STR.indexOf(e.charAt(a++))<<2|(i=this.KEY_STR.indexOf(e.charAt(a++)))>>4,n=(15&i)<<4|(o=this.KEY_STR.indexOf(e.charAt(a++)))>>2,r=(3&o)<<6|(s=this.KEY_STR.indexOf(e.charAt(a++))),l.push(t),64!==o&&l.push(n),64!==s&&l.push(r),t=n=r="",i=o=s="",at.options.priority?-1:e.options.priority=0;n--)this._subscribers[n].fn!==e&&this._subscribers[n].id!==e||(this._subscribers[n].channel=null,this._subscribers.splice(n,1));else this._subscribers=[];if(t&&this.autoCleanChannel(),n=this._subscribers.length-1,e)for(;n>=0;n--)this._subscribers[n].fn!==e&&this._subscribers[n].id!==e||(this._subscribers[n].channel=null,this._subscribers.splice(n,1));else this._subscribers=[]},t.prototype.autoCleanChannel=function(){if(0===this._subscribers.length){for(var e in this._channels)if(this._channels.hasOwnProperty(e))return;if(null!=this._parent){var t=this.namespace.split(":"),n=t[t.length-1];this._parent.removeChannel(n)}}},t.prototype.removeChannel=function(e){this.hasChannel(e)&&(this._channels[e]=null,delete this._channels[e],this.autoCleanChannel())},t.prototype.publish=function(e){for(var t,n,r,i=0,o=this._subscribers.length,s=!1;i0)for(;i{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";var e=n(295),t=n.n(e),r=n(216);window.Cl=window.Cl||{};class i{constructor(e={}){this.options={linksSelector:".js-toggler-link",dataHeaderSelector:"toggler-header-selector",dataContentSelector:"toggler-content-selector",collapsedClass:"js-collapsed",expandedClass:"js-expanded",hiddenClass:"hidden",...e},this.togglerInstances=[],document.querySelectorAll(this.options.linksSelector).forEach(e=>{const t=new o(e,this.options);this.togglerInstances.push(t)})}destroy(){this.links=null,this.togglerInstances.forEach(e=>e.destroy()),this.togglerInstances=[]}}class o{constructor(e,t={}){this.options={...t},this.link=e,this.headerSelector=this.link.dataset[this.options.dataHeaderSelector],this.contentSelector=this.link.dataset[this.options.dataContentSelector],this.header=document.querySelector(this.headerSelector),this.header=this.header||this.link,this.content=document.querySelector(this.contentSelector),this.content&&this._initLink()}_updateClasses(){this.content.classList.contains(this.options.hiddenClass)?(this.header.classList.remove(this.options.expandedClass),this.header.classList.add(this.options.collapsedClass)):(this.header.classList.add(this.options.expandedClass),this.header.classList.remove(this.options.collapsedClass))}_onTogglerClick(e){this.content.classList.toggle(this.options.hiddenClass),this._updateClasses(),e.preventDefault()}_initLink(){this._updateClasses(),this.link.addEventListener("click",e=>this._onTogglerClick(e))}destroy(){this.options=null,this.link=null}}Cl.Toggler=i,Cl.TogglerConstructor=o;const s=i;n(413);var a=n(628),l=n.n(a);document.addEventListener("DOMContentLoaded",()=>{let e=0,t=1;const n=document.querySelector(".js-upload-button");if(!n)return;const r=document.querySelector(".js-upload-button-disabled"),i=n.dataset.url;if(!i)return;const o=document.querySelector(".js-filer-dropzone-upload-welcome"),s=document.querySelector(".js-filer-dropzone-upload-info-container"),a=document.querySelector(".js-filer-dropzone-upload-info"),c=document.querySelector(".js-filer-dropzone-upload-number"),u=".js-filer-dropzone-progress",d=document.querySelector(".js-filer-dropzone-upload-success"),f=document.querySelector(".js-filer-dropzone-upload-canceled"),p=document.querySelector(".js-filer-dropzone-cancel"),h=document.querySelector(".js-filer-dropzone-info-message"),v="hidden",m=parseInt(n.dataset.maxUploaderConnections||3,10),y=parseInt(n.dataset.maxFilesize||0,10);let g=!1;const b=()=>{c&&(c.textContent=`${t-e}/${t}`)},w=()=>{n&&n.remove()},x=()=>{const e=window.location.toString();window.location.replace(((e,t,n)=>{const r=new RegExp(`([?&])${t}=.*?(&|$)`,"i"),i=-1!==e.indexOf("?")?"&":"?",o=window.location.hash;return(e=e.replace(/#.*$/,"")).match(r)?e.replace(r,`$1${t}=${n}$2`)+o:e+i+t+"="+n+o})(e,"order_by","-modified_at"))};let E;Cl.mediator.subscribe("filer-upload-in-progress",w),n.addEventListener("click",e=>{e.preventDefault()}),l().autoDiscover=!1;try{E=new(l())(n,{url:i,paramName:"file",maxFilesize:y,parallelUploads:m,clickable:n,previewTemplate:"
    ",addRemoveLinks:!1,autoProcessQueue:!0})}catch(e){return void console.error("[Filer Upload] Failed to create Dropzone instance:",e)}E.on("addedfile",n=>{Cl.mediator.remove("filer-upload-in-progress",w),Cl.mediator.publish("filer-upload-in-progress"),e++,t=E.files.length,h&&h.classList.remove(v),o&&o.classList.add(v),d&&d.classList.add(v),s&&s.classList.remove(v),p&&p.classList.remove(v),f&&f.classList.add(v),b()}),E.on("uploadprogress",(e,t)=>{const n=Math.round(t),r=`file-${encodeURIComponent(e.name)}${e.size}${e.lastModified}`,i=document.getElementById(r);let o;if(i){const e=i.querySelector(u);e&&(e.style.width=`${n}%`)}else if(a){o=a.cloneNode(!0);const t=o.querySelector(".js-filer-dropzone-file-name");t&&(t.textContent=e.name);const i=o.querySelector(u);i&&(i.style.width=`${n}%`),o.classList.remove(v),o.setAttribute("id",r),s&&s.appendChild(o)}}),E.on("success",(n,r)=>{const i=`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}`,s=document.getElementById(i);s&&s.remove(),r.error&&(g=!0,window.filerShowError(`${n.name}: ${r.error}`)),e--,b(),0===e&&(t=1,o&&o.classList.add(v),c&&c.classList.add(v),f&&f.classList.add(v),p&&p.classList.add(v),d&&d.classList.remove(v),g?setTimeout(x,1e3):x())}),E.on("error",(n,r)=>{const i=`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}`,s=document.getElementById(i);s&&s.remove(),g=!0,window.filerShowError(`${n.name}: ${r}`),e--,b(),0===e&&(t=1,o&&o.classList.add(v),c&&c.classList.add(v),f&&f.classList.add(v),p&&p.classList.add(v),d&&d.classList.remove(v),setTimeout(x,1e3))}),p&&p.addEventListener("click",e=>{e.preventDefault(),p.classList.add(v),c&&c.classList.add(v),s&&s.classList.add(v),f&&f.classList.remove(v),setTimeout(()=>{window.location.reload()},1e3)}),r&&Cl.filerTooltip&&Cl.filerTooltip(),document.dispatchEvent(new Event("filer-upload-scripts-executed"))}),l()&&(l().autoDiscover=!1),document.addEventListener("DOMContentLoaded",()=>{const e=".js-img-preview",t=".js-filer-dropzone",n=document.querySelectorAll(t),r=".js-filer-dropzone-progress",i=".js-img-wrapper",o="hidden",s="filer-dropzone-mobile",a="js-object-attached",c=e=>{e.offsetWidth<500?e.classList.add(s):e.classList.remove(s)},u=e=>{try{window.parent.CMS.API.Messages.open({message:e})}catch{window.filerShowError?window.filerShowError(e):alert(e)}},d=function(t){const n=t.dataset.url,s=t.querySelector(".vForeignKeyRawIdAdminField"),d="image"===s?.getAttribute("name"),f=t.querySelector(".js-related-lookup"),p=t.querySelector(".js-related-edit"),h=t.querySelector(".js-filer-dropzone-message"),v=t.querySelector(".filerClearer"),m=t.querySelector(".js-file-selector");t.dropzone||(window.addEventListener("resize",()=>{c(t)}),new(l())(t,{url:n,paramName:"file",maxFiles:1,maxFilesize:t.dataset.maxFilesize,previewTemplate:document.querySelector(".js-filer-dropzone-template")?.innerHTML||"
    ",clickable:!1,addRemoveLinks:!1,init:function(){c(t),this.on("removedfile",()=>{m&&(m.style.display=""),t.classList.remove(a),this.removeAllFiles(),v?.click()}),this.element.querySelectorAll("img").forEach(e=>{e.addEventListener("dragstart",e=>{e.preventDefault()})}),v&&v.addEventListener("click",()=>{t.classList.remove(a)})},maxfilesexceeded:function(){this.removeAllFiles(!0)},drop:function(){this.removeAllFiles(!0),v?.click();const e=t.querySelector(r);e&&e.classList.remove(o),m&&(m.style.display="block"),f?.classList.add("related-lookup-change"),p?.classList.add("related-lookup-change"),h?.classList.add(o),t.classList.remove("dz-drag-hover"),t.classList.add(a)},success:function(n,a){const l=t.querySelector(r);if(l&&l.classList.add(o),n&&"success"===n.status&&a){if(a.file_id&&s){s.value=a.file_id;const e=new Event("change",{bubbles:!0});s.dispatchEvent(e)}if(a.thumbnail_180&&d){const n=t.querySelector(e);n&&(n.style.backgroundImage=`url(${a.thumbnail_180})`);const r=t.querySelector(i);r&&r.classList.remove(o)}}else a&&a.error&&u(`${n.name}: ${a.error}`),this.removeAllFiles(!0);this.element.querySelectorAll("img").forEach(e=>{e.addEventListener("dragstart",e=>{e.preventDefault()})})},error:function(e,t,n){n&&n.error&&(t+=` ; ${n.error}`),u(`${e.name}: ${t}`),this.removeAllFiles(!0)},reset:function(){if(d){const n=t.querySelector(i);n&&n.classList.add(o);const r=t.querySelector(e);r&&(r.style.backgroundImage="none")}if(t.classList.remove(a),s&&(s.value=""),f?.classList.remove("related-lookup-change"),p?.classList.remove("related-lookup-change"),h?.classList.remove(o),s){const e=new Event("change",{bubbles:!0});s.dispatchEvent(e)}}}))};n.length&&l()&&(window.filerDropzoneInitialized||(window.filerDropzoneInitialized=!0,l().autoDiscover=!1),n.forEach(d),document.addEventListener("formset:added",e=>{let n,r,i;e.detail&&e.detail.formsetName?(r=parseInt(document.getElementById(`id_${e.detail.formsetName}-TOTAL_FORMS`).value,10)-1,i=document.getElementById(`${e.detail.formsetName}-${r}`),n=i?.querySelectorAll(t)||[]):(i=e.target,n=i?.querySelectorAll(t)||[]),n?.forEach(d)}))}),document.addEventListener("DOMContentLoaded",()=>{let e=0,t=0;const n=[],r=document.querySelector(".js-filer-dropzone-base"),i=".js-filer-dropzone";let o;const s=document.querySelector(".js-filer-dropzone-info-message"),a=document.querySelector(".js-filer-dropzone-folder-name"),c=document.querySelector(".js-filer-dropzone-upload-info-container"),u=document.querySelector(".js-filer-dropzone-upload-info"),d=document.querySelector(".js-filer-dropzone-upload-welcome"),f=document.querySelector(".js-filer-dropzone-upload-number"),p=document.querySelector(".js-filer-upload-count"),h=document.querySelector(".js-filer-upload-text"),v=".js-filer-dropzone-progress",m=document.querySelector(".js-filer-dropzone-upload-success"),y=document.querySelector(".js-filer-dropzone-upload-canceled"),g=document.querySelector(".js-filer-dropzone-cancel"),b="dz-drag-hover",w=document.querySelector(".drag-hover-border"),x="hidden";let E,S,k,L=!1;const A=()=>{const e=window.location.toString();window.location.replace(((e,t,n)=>{const r=new RegExp(`([?&])${t}=.*?(&|$)`,"i"),i=-1!==e.indexOf("?")?"&":"?",o=window.location.hash;return(e=e.replace(/#.*$/,"")).match(r)?e.replace(r,`$1${t}=${n}$2`)+o:e+i+t+"="+n+o})(e,"order_by","-modified_at"))},C=()=>{f&&(f.textContent=`${t-e}/${t}`),h&&h.classList.remove("hidden"),p&&p.classList.remove("hidden")},_=()=>{n.forEach(e=>{e.destroy()})},T=(e,t)=>document.getElementById(`file-${encodeURIComponent(e.name)}${e.size}${e.lastModified}${t}`);if(r){S=r.dataset.url,k=r.dataset.folderName;const e=document.body;e.dataset.url=S,e.dataset.folderName=k,e.dataset.maxFiles=r.dataset.maxFiles,e.dataset.maxFilesize=r.dataset.maxFiles,e.classList.add("js-filer-dropzone")}Cl.mediator.subscribe("filer-upload-in-progress",_),o=document.querySelectorAll(i),o.length&&l()&&(l().autoDiscover=!1,o.forEach(r=>{if(r.dropzone)return;const p=r.dataset.url,h=new(l())(r,{url:p,paramName:"file",maxFiles:parseInt(r.dataset.maxFiles)||100,maxFilesize:parseInt(r.dataset.maxFilesize),previewTemplate:"
    ",clickable:!1,addRemoveLinks:!1,parallelUploads:r.dataset["max-uploader-connections"]||3,accept:(n,r)=>{let i;if(Cl.mediator.remove("filer-upload-in-progress",_),Cl.mediator.publish("filer-upload-in-progress"),clearTimeout(E),clearTimeout(E),d&&d.classList.add(x),g&&g.classList.remove(x),T(n,p))r("duplicate");else{i=u.cloneNode(!0);const o=i.querySelector(".js-filer-dropzone-file-name");o&&(o.textContent=n.name);const s=i.querySelector(v);s&&(s.style.width="0"),i.setAttribute("id",`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}${p}`),c&&c.appendChild(i),e++,t++,C(),r()}o.forEach(e=>e.classList.remove("reset-hover")),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b))},dragover:e=>{const t=e.target.closest(i),n=t?.dataset.folderName,l=r.classList.contains("js-filer-dropzone-folder"),c=r.getBoundingClientRect(),u=w?window.getComputedStyle(w):null,d=u?u.borderTopWidth:"0px",f=u?u.borderLeftWidth:"0px",p={top:`${c.top}px`,bottom:`${c.bottom}px`,left:`${c.left}px`,right:`${c.right}px`,width:c.width-2*parseInt(f,10)+"px",height:c.height-2*parseInt(d,10)+"px",display:"block"};l&&w&&Object.assign(w.style,p),o.forEach(e=>e.classList.add("reset-hover")),m&&m.classList.add(x),s&&s.classList.remove(x),r.classList.add(b),r.classList.remove("reset-hover"),a&&n&&(a.textContent=n)},dragend:()=>{clearTimeout(E),E=setTimeout(()=>{s&&s.classList.add(x)},1e3),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b)),w&&Object.assign(w.style,{top:"0",bottom:"0",width:"0",height:"0"})},dragleave:()=>{clearTimeout(E),E=setTimeout(()=>{s&&s.classList.add(x)},1e3),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b)),w&&Object.assign(w.style,{top:"0",bottom:"0",width:"0",height:"0"})},sending:e=>{const t=T(e,p);t&&t.classList.remove(x)},uploadprogress:(e,t)=>{const n=T(e,p);if(n){const e=n.querySelector(v);e&&(e.style.width=`${t}%`)}},success:t=>{e--,C();const n=T(t,p);n&&n.remove()},queuecomplete:()=>{0===e&&(C(),g&&g.classList.add(x),u&&u.classList.add(x),L?(f&&f.classList.add(x),setTimeout(()=>{A()},1e3)):(m&&m.classList.remove(x),A()))},error:(t,n)=>{if("duplicate"===n)return;e--,C();const r=T(t,p);r&&r.remove(),L=!0,window.filerShowError&&window.filerShowError(`${t.name}: ${n.message||n}`)}});n.push(h),g&&g.addEventListener("click",e=>{e.preventDefault(),g.classList.add(x),y&&y.classList.remove(x),h.removeAllFiles(!0)})}))}),n(117),n(221),n(472),n(902),n(577),window.Cl=window.Cl||{},Cl.mediator=new(t()),Cl.FocalPoint=r.A,Cl.Toggler=s,document.addEventListener("DOMContentLoaded",()=>{let e;window.filerShowError=t=>{const n=document.querySelector(".messagelist"),r=document.querySelector("#header"),i="js-filer-error",o=`
    • {msg}
    `.replace("{msg}",t);n?n.outerHTML=o:r&&r.insertAdjacentHTML("afterend",o),e&&clearTimeout(e),e=setTimeout(()=>{const e=document.querySelector(`.${i}`);e&&e.remove()},5e3)};const t=document.querySelector(".js-filter-files");t&&(t.addEventListener("focus",e=>{const t=e.target.closest(".navigator-top-nav");t&&t.classList.add("search-is-focused")}),t.addEventListener("blur",e=>{const t=e.target.closest(".navigator-top-nav");if(t){const n=t.querySelector(".dropdown-container a");n&&e.relatedTarget===n||t.classList.remove("search-is-focused")}}));const n=document.querySelector(".js-filter-files-container");n&&n.addEventListener("submit",e=>{}),(()=>{const e=document.querySelector(".js-filter-files"),t=".navigator-top-nav",n=document.querySelector(t),r=n?.querySelector(".filter-search-wrapper .filer-dropdown-container");e&&(e.addEventListener("keydown",function(e){e.key;const n=this.closest(t);n&&n.classList.add("search-is-focused")}),r&&(r.addEventListener("show.bs.filer-dropdown",()=>{n&&n.classList.add("search-is-focused")}),r.addEventListener("hide.bs.filer-dropdown",()=>{n&&n.classList.remove("search-is-focused")})))})(),(()=>{const e=document.querySelectorAll(".navigator-table tr, .navigator-list .list-item"),t=document.querySelector(".actions-wrapper"),n=document.querySelectorAll(".action-select, #action-toggle, #files-action-toggle, #folders-action-toggle, .actions .clear a");setTimeout(()=>{n.forEach(e=>{if(e.checked){const t=e.closest(".list-item");t&&t.classList.add("selected")}}),Array.from(e).some(e=>e.classList.contains("selected"))&&t&&t.classList.add("action-selected")},100),n.forEach(n=>{n.addEventListener("change",function(){const n=this.closest(".list-item");n&&(this.checked?n.classList.add("selected"):n.classList.remove("selected")),setTimeout(()=>{const n=Array.from(e).some(e=>e.classList.contains("selected"));t&&(n?t.classList.add("action-selected"):t.classList.remove("action-selected"))},0)})})})(),(()=>{const e=document.querySelector(".js-actions-menu");if(!e)return;const t=e.querySelector(".filer-dropdown-menu"),n=document.querySelector('.actions select[name="action"]'),r=n?.querySelectorAll("option")||[],i=document.querySelector('.actions button[type="submit"]'),o=document.querySelector(".js-action-delete"),s=document.querySelector(".js-action-copy"),a=document.querySelector(".js-action-move"),l="delete_files_or_folders",c="copy_files_and_folders",u="move_files_and_folders",d=document.querySelectorAll(".navigator-table tr, .navigator-list .list-item"),f=(e,t)=>{t&&r.forEach(r=>{r.value===e&&(t.style.display="",t.addEventListener("click",t=>{if(t.preventDefault(),Array.from(d).some(e=>e.classList.contains("selected"))&&n&&i){n.value=e;const t=n.querySelector(`option[value="${e}"]`);t&&(t.selected=!0),i.click()}}))})};f(l,o),f(c,s),f(u,a),r.forEach((e,n)=>{if(0!==n){const n=document.createElement("li"),r=document.createElement("a");r.href="#",r.textContent=e.textContent,e.value!==l&&e.value!==c&&e.value!==u||r.classList.add("hidden"),n.appendChild(r),t&&t.appendChild(n)}}),t&&t.addEventListener("click",e=>{if("A"===e.target.tagName){const r=e.target.closest("li"),o=Array.from(t.querySelectorAll("li")).indexOf(r)+1;if(e.preventDefault(),n&&i){const e=n.querySelectorAll("option");e[o]&&(n.value=e[o].value,e[o].selected=!0),i.click()}}}),e.addEventListener("click",e=>{Array.from(d).some(e=>e.classList.contains("selected"))||(e.preventDefault(),e.stopPropagation())})})(),(()=>{const e=document.querySelector(".navigator-top-nav");if(!e)return;const t=document.querySelector(".breadcrumbs-container");if(!t)return;const n=t.querySelector(".navigator-breadcrumbs"),r=t.querySelector(".filer-dropdown-container"),i=document.querySelector(".filter-files-container"),o=document.querySelector(".actions-wrapper"),s=document.querySelector(".navigator-button-wrapper"),a=n?.offsetWidth||0,l=r?.offsetWidth||0,c=i?.offsetWidth||0,u=o?.offsetWidth||0,d=s?.offsetWidth||0,f=window.getComputedStyle(e),p=parseInt(f.paddingLeft,10)+parseInt(f.paddingRight,10);let h=e.offsetWidth;const v=80+a+l+c+u+d+p,m="breadcrumb-min-width",y=()=>{h{h=e.offsetWidth,y()})})(),(()=>{const e=document.querySelectorAll(".navigator-list .list-item input.action-select"),t=".navigator-list .navigator-folders-body .list-item input.action-select",n=".navigator-list .navigator-files-body .list-item input.action-select",r=document.querySelector("#files-action-toggle"),i=document.querySelector("#folders-action-toggle");i&&i.addEventListener("click",function(){const e=document.querySelectorAll(t);this.checked?e.forEach(e=>{e.checked||e.click()}):e.forEach(e=>{e.checked&&e.click()})}),r&&r.addEventListener("click",function(){const e=document.querySelectorAll(n);this.checked?e.forEach(e=>{e.checked||e.click()}):e.forEach(e=>{e.checked&&e.click()})}),e.forEach(e=>{e.addEventListener("click",function(){const e=document.querySelectorAll(n),o=document.querySelectorAll(t);if(this.checked){const t=Array.from(e).every(e=>e.checked),n=Array.from(o).every(e=>e.checked);t&&r&&(r.checked=!0),n&&i&&(i.checked=!0)}else{const t=Array.from(e).some(e=>!e.checked),n=Array.from(o).some(e=>!e.checked);t&&r&&(r.checked=!1),n&&i&&(i.checked=!1)}})});const o=document.querySelector(".navigator .actions .clear a");o&&o.addEventListener("click",()=>{i&&(i.checked=!1),r&&(r.checked=!1)})})(),document.querySelectorAll(".js-copy-url").forEach(e=>{e.addEventListener("click",function(e){const t=new URL(this.dataset.url,document.location.href),n=this.dataset.msg||"URL copied to clipboard",r=document.createElement("template");e.preventDefault(),document.querySelectorAll(".info.filer-tooltip").forEach(e=>{e.remove()}),navigator.clipboard.writeText(t.href),r.innerHTML=`
    ${n}
    `,this.classList.add("filer-tooltip-wrapper"),this.appendChild(r.content.firstChild);const i=this;setTimeout(()=>{const e=i.querySelector(".info");e&&e.remove()},1200)})}),(new r.A).initialize(),new s})})()})(); \ No newline at end of file +(()=>{var e={117(){"use strict";document.addEventListener("DOMContentLoaded",()=>{const e=document.getElementById("destination");if(!e)return;const t=e.querySelectorAll("option"),n=t.length,r=document.querySelector(".js-submit-copy-move"),i=document.querySelector(".js-disabled-btn-tooltip");1===n&&t[0].disabled&&(r&&(r.style.display="none"),i&&(i.style.display="inline-block")),Cl.filerTooltip&&Cl.filerTooltip()})},413(){"use strict";(()=>{const e="filer-dropdown-backdrop",t='[data-toggle="filer-dropdown"]';class n{constructor(e){this.element=e,e.addEventListener("click",()=>this.toggle())}toggle(){const t=this.element,n=r(t),o=n.classList.contains("open"),s={relatedTarget:t};if(t.disabled||t.classList.contains("disabled"))return!1;if(i(),!o){if("ontouchstart"in document.documentElement&&!n.closest(".navbar-nav")){const n=document.createElement("div");n.className=e,t.parentNode.insertBefore(n,t.nextSibling),n.addEventListener("click",i)}const r=new CustomEvent("show.bs.filer-dropdown",{bubbles:!0,cancelable:!0,detail:s});if(n.dispatchEvent(r),r.defaultPrevented)return!1;t.focus(),t.setAttribute("aria-expanded","true"),n.classList.add("open");const o=new CustomEvent("shown.bs.filer-dropdown",{bubbles:!0,detail:s});n.dispatchEvent(o)}return!1}keydown(e){const n=this.element,i=r(n),o=i.classList.contains("open"),s=Array.from(i.querySelectorAll(".filer-dropdown-menu li:not(.disabled):visible a")).filter(e=>null!==e.offsetParent),a=s.indexOf(e.target);if(!/(38|40|27|32)/.test(e.which)||/input|textarea/i.test(e.target.tagName))return;if(e.preventDefault(),e.stopPropagation(),n.disabled||n.classList.contains("disabled"))return;if(!o&&27!==e.which||o&&27===e.which)return 27===e.which&&i.querySelector(t)?.focus(),n.click();if(!s.length)return;let l=a;38===e.which&&a>0&&l--,40===e.which&&ae.remove()),document.querySelectorAll(t).forEach(e=>{const t=r(e),i={relatedTarget:e};if(!t.classList.contains("open"))return;if(n&&"click"===n.type&&/input|textarea/i.test(n.target.tagName)&&t.contains(n.target))return;const o=new CustomEvent("hide.bs.filer-dropdown",{bubbles:!0,cancelable:!0,detail:i});if(t.dispatchEvent(o),o.defaultPrevented)return;e.setAttribute("aria-expanded","false"),t.classList.remove("open");const s=new CustomEvent("hidden.bs.filer-dropdown",{bubbles:!0,detail:i});t.dispatchEvent(s)}))}function o(e){return this.forEach(t=>{let r=t._filerDropdownInstance;r||(r=new n(t),t._filerDropdownInstance=r),"string"==typeof e&&r[e].call(t)}),this}NodeList.prototype.dropdown||(NodeList.prototype.dropdown=function(e){return o.call(this,e)}),HTMLCollection.prototype.dropdown||(HTMLCollection.prototype.dropdown=function(e){return o.call(this,e)}),document.addEventListener("click",i),document.addEventListener("click",e=>{e.target.closest(".filer-dropdown form")&&e.stopPropagation()}),document.addEventListener("click",e=>{const r=e.target.closest(t);if(r){const t=r._filerDropdownInstance||new n(r);r._filerDropdownInstance||(r._filerDropdownInstance=t),t.toggle(e)}}),document.addEventListener("keydown",e=>{const r=e.target.closest(t);if(r){const t=r._filerDropdownInstance||new n(r);r._filerDropdownInstance||(r._filerDropdownInstance=t),t.keydown(e)}}),document.addEventListener("keydown",e=>{const r=e.target.closest(".filer-dropdown-menu");if(r){const i=r.parentNode.querySelector(t);if(i){const t=i._filerDropdownInstance||new n(i);i._filerDropdownInstance||(i._filerDropdownInstance=t),t.keydown(e)}}}),window.FilerDropdown=n})()},577(){!function(){"use strict";const e=document.getElementById("django-admin-popup-response-constants");let t;if(e)switch(t=JSON.parse(e.dataset.popupResponse),t.action){case"change":opener.dismissRelatedImageLookupPopup(window,t.new_value,null,t.obj,null);break;case"delete":opener.dismissDeleteRelatedObjectPopup(window,t.value);break;default:opener.dismissAddRelatedObjectPopup(window,t.value,t.obj)}}()},216(e,t,n){"use strict";n.d(t,{A:()=>r}),e=n.hmd(e),window.Cl=window.Cl||{},(()=>{class t{constructor(e={}){this.options={containerSelector:".js-focal-point",imageSelector:".js-focal-point-image",circleSelector:".js-focal-point-circle",locationSelector:".js-focal-point-location",draggableClass:"draggable",hiddenClass:"hidden",dataLocation:"locationSelector",...e},this.focalPointInstances=[],this._init=this._init.bind(this)}_init(e){const t=new n(e,this.options);this.focalPointInstances.push(t)}initialize(){document.querySelectorAll(this.options.containerSelector).forEach(e=>{this._init(e)}),window.Cl.mediator&&window.Cl.mediator.subscribe("focal-point:init",this._init)}destroy(){window.Cl.mediator&&window.Cl.mediator.remove("focal-point:init",this._init),this.focalPointInstances.forEach(e=>{e.destroy()}),this.focalPointInstances=[]}}class n{constructor(e,t={}){this.options={imageSelector:".js-focal-point-image",circleSelector:".js-focal-point-circle",locationSelector:".js-focal-point-location",draggableClass:"draggable",hiddenClass:"hidden",dataLocation:"locationSelector",...t},this.container=e,this.image=this.container.querySelector(this.options.imageSelector),this.circle=this.container.querySelector(this.options.circleSelector),this.ratio=parseFloat(this.image?.dataset.ratio||1),this.location=this._getLocation(),this.isDragging=!1,this.dragStartX=0,this.dragStartY=0,this.circleStartX=0,this.circleStartY=0,this._onImageLoaded=this._onImageLoaded.bind(this),this._onMouseDown=this._onMouseDown.bind(this),this._onMouseMove=this._onMouseMove.bind(this),this._onMouseUp=this._onMouseUp.bind(this),this.image?.complete?this._onImageLoaded():this.image&&this.image.addEventListener("load",this._onImageLoaded)}_updateLocationValue(e,t){const n=`${Math.round(e*this.ratio)},${Math.round(t*this.ratio)}`;this.location&&(this.location.value=n)}_getLocation(){const e=this.container.dataset[this.options.dataLocation];if(e){const t=document.querySelector(e);if(t)return t}return this.container.querySelector(this.options.locationSelector)}_makeDraggable(){this.circle&&(this.circle.classList.add(this.options.draggableClass),this.circle.addEventListener("mousedown",this._onMouseDown),this.circle.addEventListener("touchstart",this._onMouseDown,{passive:!1}))}_onMouseDown(e){e.preventDefault(),this.isDragging=!0;const t="touchstart"===e.type?e.touches[0]:e,n=this.container.getBoundingClientRect();this.dragStartX=t.clientX-n.left,this.dragStartY=t.clientY-n.top;const r=this.circle.getBoundingClientRect();this.circleStartX=r.left-n.left+r.width/2,this.circleStartY=r.top-n.top+r.height/2,document.addEventListener("mousemove",this._onMouseMove),document.addEventListener("mouseup",this._onMouseUp),document.addEventListener("touchmove",this._onMouseMove,{passive:!1}),document.addEventListener("touchend",this._onMouseUp)}_onMouseMove(e){if(!this.isDragging)return;e.preventDefault();const t="touchmove"===e.type?e.touches[0]:e,n=this.container.getBoundingClientRect(),r=t.clientX-n.left,i=t.clientY-n.top,o=r-this.dragStartX,s=i-this.dragStartY;let a=this.circleStartX+o,l=this.circleStartY+s;a=Math.max(0,Math.min(n.width-1,a)),l=Math.max(0,Math.min(n.height-1,l)),this.circle.style.left=`${a}px`,this.circle.style.top=`${l}px`,this._updateLocationValue(a,l)}_onMouseUp(){this.isDragging=!1,document.removeEventListener("mousemove",this._onMouseMove),document.removeEventListener("mouseup",this._onMouseUp),document.removeEventListener("touchmove",this._onMouseMove),document.removeEventListener("touchend",this._onMouseUp)}_onImageLoaded(){if(!this.image||0===this.image.naturalWidth)return;this.circle?.classList.remove(this.options.hiddenClass);const e=this.location?.value||"",t=this.image.offsetWidth,n=this.image.offsetHeight;let r,i;if(e.length){const t=e.split(",");r=Math.round(Number(t[0])/this.ratio),i=Math.round(Number(t[1])/this.ratio)}else r=t/2,i=n/2;isNaN(r)||isNaN(i)||(this.circle&&(this.circle.style.left=`${r}px`,this.circle.style.top=`${i}px`),this._makeDraggable(),this._updateLocationValue(r,i))}destroy(){this.circle?.classList.contains(this.options.draggableClass)&&(this.circle.removeEventListener("mousedown",this._onMouseDown),this.circle.removeEventListener("touchstart",this._onMouseDown)),document.removeEventListener("mousemove",this._onMouseMove),document.removeEventListener("mouseup",this._onMouseUp),document.removeEventListener("touchmove",this._onMouseMove),document.removeEventListener("touchend",this._onMouseUp),this.image&&this.image.removeEventListener("load",this._onImageLoaded),this.options=null,this.container=null,this.image=null,this.circle=null,this.location=null,this.ratio=null}}window.Cl.FocalPoint=t,window.Cl.FocalPointConstructor=n,e.exports&&(e.exports=t)})();const r=window.Cl.FocalPoint},902(){"use strict";const e=e=>{const t=(e=(e=e.replace(/__dot__/g,".")).replace(/__dash__/g,"-")).lastIndexOf("__");return-1===t?e:e.substring(0,t)};window.dismissPopupAndReload=e=>{document.location.reload(),e.close()},window.dismissRelatedImageLookupPopup=(t,n,r,i,o)=>{const s=e(t.name),a=document.getElementById(s);if(!a)return;const l=a.closest(".filerFile");if(!l)return;const c=l.querySelector(".edit"),u=l.querySelector(".thumbnail_img"),d=l.querySelector(".description_text"),f=l.querySelector(".filerClearer"),p=l.parentElement.querySelector(".dz-message"),h=l.querySelector("input"),v=h.value;h.value=n;const m=h.closest(".js-filer-dropzone");m&&m.classList.add("js-object-attached"),r&&u&&(u.src=r,u.classList.remove("hidden"),u.removeAttribute("srcset")),d&&(d.textContent=i),f&&f.classList.remove("hidden"),a.classList.add("related-lookup-change"),c&&c.classList.add("related-lookup-change"),o&&c&&c.setAttribute("href",`${o}?_edit_from_widget=1`),p&&p.classList.add("hidden"),v!==n&&h.dispatchEvent(new Event("change",{bubbles:!0})),t.close()},window.dismissRelatedFolderLookupPopup=(t,n,r)=>{const i=e(t.name),o=document.getElementById(i);if(!o)return;const s=o.closest(".filerFile");if(!s)return;const a=s.querySelector(".thumbnail_img"),l=document.getElementById(`id_${i}_clear`),c=document.getElementById(`id_${i}`),u=s.querySelector(".description_text"),d=document.getElementById(i);c&&(c.value=n),a&&a.classList.remove("hidden"),u&&(u.textContent=r),l&&l.classList.remove("hidden"),d&&d.classList.add("hidden"),t.close()},document.addEventListener("DOMContentLoaded",()=>{document.querySelectorAll(".js-dismiss-popup").forEach(e=>{e.addEventListener("click",function(e){e.preventDefault();const t=this.dataset.fileId,n=this.dataset.iconUrl,r=this.dataset.label;if(this.classList.contains("js-dismiss-image")){const e=this.dataset.changeUrl||"";window.opener.dismissRelatedImageLookupPopup(window,t,n,r,e)}else this.classList.contains("js-dismiss-folder")&&window.opener.dismissRelatedFolderLookupPopup(window,t,r)})});const e=document.getElementById("popup-dismiss-data");if(e&&window.opener){const t=e.dataset.pk,n=e.dataset.label;window.opener.dismissRelatedPopup(window,t,n)}})},221(){"use strict";window.Cl=window.Cl||{},Cl.filerTooltip=()=>{const e=".js-filer-tooltip";document.querySelectorAll(e).forEach(t=>{t.addEventListener("mouseover",function(){const t=this.getAttribute("title");if(!t)return;this.dataset.filerTooltip=t,this.removeAttribute("title");const n=document.createElement("p");n.className="filer-tooltip",n.textContent=t;const r=document.querySelector(e);r&&r.appendChild(n)}),t.addEventListener("mouseout",function(){const e=this.dataset.filerTooltip;e&&this.setAttribute("title",e),document.querySelectorAll(".filer-tooltip").forEach(e=>{e.remove()})})})}},472(){"use strict";document.addEventListener("DOMContentLoaded",()=>{const e=e=>{e.preventDefault();const t=e.currentTarget,n=t.closest(".filerFile");if(!n)return;const r=n.querySelector("input"),i=n.querySelector(".thumbnail_img"),o=n.querySelector(".description_text"),s=n.querySelector(".lookup"),a=n.querySelector(".edit"),l=n.parentElement.querySelector(".dz-message"),c="hidden";if(t.classList.add(c),r&&(r.value=""),i){i.classList.add(c);var u=i.parentElement;"A"===u.tagName&&u.removeAttribute("href")}s&&s.classList.remove("related-lookup-change"),a&&a.classList.remove("related-lookup-change"),l&&l.classList.remove(c),o&&(o.textContent="")};document.querySelectorAll(".filerFile .vForeignKeyRawIdAdminField").forEach(e=>{e.setAttribute("type","hidden")}),document.querySelectorAll(".filerFile .filerClearer").forEach(t=>{t.addEventListener("click",e)})})},628(e){var t;self,t=function(){return function(){var e={3099:function(e){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},6077:function(e,t,n){var r=n(111);e.exports=function(e){if(!r(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},1223:function(e,t,n){var r=n(5112),i=n(30),o=n(3070),s=r("unscopables"),a=Array.prototype;null==a[s]&&o.f(a,s,{configurable:!0,value:i(null)}),e.exports=function(e){a[s][e]=!0}},1530:function(e,t,n){"use strict";var r=n(8710).charAt;e.exports=function(e,t,n){return t+(n?r(e,t).length:1)}},5787:function(e){e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e}},9670:function(e,t,n){var r=n(111);e.exports=function(e){if(!r(e))throw TypeError(String(e)+" is not an object");return e}},4019:function(e){e.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},260:function(e,t,n){"use strict";var r,i=n(4019),o=n(9781),s=n(7854),a=n(111),l=n(6656),c=n(648),u=n(8880),d=n(1320),f=n(3070).f,p=n(9518),h=n(7674),v=n(5112),m=n(9711),g=s.Int8Array,y=g&&g.prototype,b=s.Uint8ClampedArray,w=b&&b.prototype,x=g&&p(g),E=y&&p(y),S=Object.prototype,k=S.isPrototypeOf,L=v("toStringTag"),A=m("TYPED_ARRAY_TAG"),C=i&&!!h&&"Opera"!==c(s.opera),_=!1,F={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},T={BigInt64Array:8,BigUint64Array:8},I=function(e){if(!a(e))return!1;var t=c(e);return l(F,t)||l(T,t)};for(r in F)s[r]||(C=!1);if((!C||"function"!=typeof x||x===Function.prototype)&&(x=function(){throw TypeError("Incorrect invocation")},C))for(r in F)s[r]&&h(s[r],x);if((!C||!E||E===S)&&(E=x.prototype,C))for(r in F)s[r]&&h(s[r].prototype,E);if(C&&p(w)!==E&&h(w,E),o&&!l(E,L))for(r in _=!0,f(E,L,{get:function(){return a(this)?this[A]:void 0}}),F)s[r]&&u(s[r],A,r);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:C,TYPED_ARRAY_TAG:_&&A,aTypedArray:function(e){if(I(e))return e;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(e){if(h){if(k.call(x,e))return e}else for(var t in F)if(l(F,r)){var n=s[t];if(n&&(e===n||k.call(n,e)))return e}throw TypeError("Target is not a typed array constructor")},exportTypedArrayMethod:function(e,t,n){if(o){if(n)for(var r in F){var i=s[r];i&&l(i.prototype,e)&&delete i.prototype[e]}E[e]&&!n||d(E,e,n?t:C&&y[e]||t)}},exportTypedArrayStaticMethod:function(e,t,n){var r,i;if(o){if(h){if(n)for(r in F)(i=s[r])&&l(i,e)&&delete i[e];if(x[e]&&!n)return;try{return d(x,e,n?t:C&&g[e]||t)}catch(e){}}for(r in F)!(i=s[r])||i[e]&&!n||d(i,e,t)}},isView:function(e){if(!a(e))return!1;var t=c(e);return"DataView"===t||l(F,t)||l(T,t)},isTypedArray:I,TypedArray:x,TypedArrayPrototype:E}},3331:function(e,t,n){"use strict";var r=n(7854),i=n(9781),o=n(4019),s=n(8880),a=n(2248),l=n(7293),c=n(5787),u=n(9958),d=n(7466),f=n(7067),p=n(1179),h=n(9518),v=n(7674),m=n(8006).f,g=n(3070).f,y=n(1285),b=n(8003),w=n(9909),x=w.get,E=w.set,S="ArrayBuffer",k="DataView",L="prototype",A="Wrong index",C=r[S],_=C,F=r[k],T=F&&F[L],I=Object.prototype,M=r.RangeError,R=p.pack,z=p.unpack,q=function(e){return[255&e]},O=function(e){return[255&e,e>>8&255]},U=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},j=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},D=function(e){return R(e,23,4)},P=function(e){return R(e,52,8)},N=function(e,t){g(e[L],t,{get:function(){return x(this)[t]}})},$=function(e,t,n,r){var i=f(n),o=x(e);if(i+t>o.byteLength)throw M(A);var s=x(o.buffer).bytes,a=i+o.byteOffset,l=s.slice(a,a+t);return r?l:l.reverse()},B=function(e,t,n,r,i,o){var s=f(n),a=x(e);if(s+t>a.byteLength)throw M(A);for(var l=x(a.buffer).bytes,c=s+a.byteOffset,u=r(+i),d=0;dG;)(W=Y[G++])in _||s(_,W,C[W]);H.constructor=_}v&&h(T)!==I&&v(T,I);var Q=new F(new _(2)),X=T.setInt8;Q.setInt8(0,2147483648),Q.setInt8(1,2147483649),!Q.getInt8(0)&&Q.getInt8(1)||a(T,{setInt8:function(e,t){X.call(this,e,t<<24>>24)},setUint8:function(e,t){X.call(this,e,t<<24>>24)}},{unsafe:!0})}else _=function(e){c(this,_,S);var t=f(e);E(this,{bytes:y.call(new Array(t),0),byteLength:t}),i||(this.byteLength=t)},F=function(e,t,n){c(this,F,k),c(e,_,k);var r=x(e).byteLength,o=u(t);if(o<0||o>r)throw M("Wrong offset");if(o+(n=void 0===n?r-o:d(n))>r)throw M("Wrong length");E(this,{buffer:e,byteLength:n,byteOffset:o}),i||(this.buffer=e,this.byteLength=n,this.byteOffset=o)},i&&(N(_,"byteLength"),N(F,"buffer"),N(F,"byteLength"),N(F,"byteOffset")),a(F[L],{getInt8:function(e){return $(this,1,e)[0]<<24>>24},getUint8:function(e){return $(this,1,e)[0]},getInt16:function(e){var t=$(this,2,e,arguments.length>1?arguments[1]:void 0);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=$(this,2,e,arguments.length>1?arguments[1]:void 0);return t[1]<<8|t[0]},getInt32:function(e){return j($(this,4,e,arguments.length>1?arguments[1]:void 0))},getUint32:function(e){return j($(this,4,e,arguments.length>1?arguments[1]:void 0))>>>0},getFloat32:function(e){return z($(this,4,e,arguments.length>1?arguments[1]:void 0),23)},getFloat64:function(e){return z($(this,8,e,arguments.length>1?arguments[1]:void 0),52)},setInt8:function(e,t){B(this,1,e,q,t)},setUint8:function(e,t){B(this,1,e,q,t)},setInt16:function(e,t){B(this,2,e,O,t,arguments.length>2?arguments[2]:void 0)},setUint16:function(e,t){B(this,2,e,O,t,arguments.length>2?arguments[2]:void 0)},setInt32:function(e,t){B(this,4,e,U,t,arguments.length>2?arguments[2]:void 0)},setUint32:function(e,t){B(this,4,e,U,t,arguments.length>2?arguments[2]:void 0)},setFloat32:function(e,t){B(this,4,e,D,t,arguments.length>2?arguments[2]:void 0)},setFloat64:function(e,t){B(this,8,e,P,t,arguments.length>2?arguments[2]:void 0)}});b(_,S),b(F,k),e.exports={ArrayBuffer:_,DataView:F}},1048:function(e,t,n){"use strict";var r=n(7908),i=n(1400),o=n(7466),s=Math.min;e.exports=[].copyWithin||function(e,t){var n=r(this),a=o(n.length),l=i(e,a),c=i(t,a),u=arguments.length>2?arguments[2]:void 0,d=s((void 0===u?a:i(u,a))-c,a-l),f=1;for(c0;)c in n?n[l]=n[c]:delete n[l],l+=f,c+=f;return n}},1285:function(e,t,n){"use strict";var r=n(7908),i=n(1400),o=n(7466);e.exports=function(e){for(var t=r(this),n=o(t.length),s=arguments.length,a=i(s>1?arguments[1]:void 0,n),l=s>2?arguments[2]:void 0,c=void 0===l?n:i(l,n);c>a;)t[a++]=e;return t}},8533:function(e,t,n){"use strict";var r=n(2092).forEach,i=n(9341)("forEach");e.exports=i?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}},8457:function(e,t,n){"use strict";var r=n(9974),i=n(7908),o=n(3411),s=n(7659),a=n(7466),l=n(6135),c=n(1246);e.exports=function(e){var t,n,u,d,f,p,h=i(e),v="function"==typeof this?this:Array,m=arguments.length,g=m>1?arguments[1]:void 0,y=void 0!==g,b=c(h),w=0;if(y&&(g=r(g,m>2?arguments[2]:void 0,2)),null==b||v==Array&&s(b))for(n=new v(t=a(h.length));t>w;w++)p=y?g(h[w],w):h[w],l(n,w,p);else for(f=(d=b.call(h)).next,n=new v;!(u=f.call(d)).done;w++)p=y?o(d,g,[u.value,w],!0):u.value,l(n,w,p);return n.length=w,n}},1318:function(e,t,n){var r=n(5656),i=n(7466),o=n(1400),s=function(e){return function(t,n,s){var a,l=r(t),c=i(l.length),u=o(s,c);if(e&&n!=n){for(;c>u;)if((a=l[u++])!=a)return!0}else for(;c>u;u++)if((e||u in l)&&l[u]===n)return e||u||0;return!e&&-1}};e.exports={includes:s(!0),indexOf:s(!1)}},2092:function(e,t,n){var r=n(9974),i=n(8361),o=n(7908),s=n(7466),a=n(5417),l=[].push,c=function(e){var t=1==e,n=2==e,c=3==e,u=4==e,d=6==e,f=7==e,p=5==e||d;return function(h,v,m,g){for(var y,b,w=o(h),x=i(w),E=r(v,m,3),S=s(x.length),k=0,L=g||a,A=t?L(h,S):n||f?L(h,0):void 0;S>k;k++)if((p||k in x)&&(b=E(y=x[k],k,w),e))if(t)A[k]=b;else if(b)switch(e){case 3:return!0;case 5:return y;case 6:return k;case 2:l.call(A,y)}else switch(e){case 4:return!1;case 7:l.call(A,y)}return d?-1:c||u?u:A}};e.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterOut:c(7)}},6583:function(e,t,n){"use strict";var r=n(5656),i=n(9958),o=n(7466),s=n(9341),a=Math.min,l=[].lastIndexOf,c=!!l&&1/[1].lastIndexOf(1,-0)<0,u=s("lastIndexOf"),d=c||!u;e.exports=d?function(e){if(c)return l.apply(this,arguments)||0;var t=r(this),n=o(t.length),s=n-1;for(arguments.length>1&&(s=a(s,i(arguments[1]))),s<0&&(s=n+s);s>=0;s--)if(s in t&&t[s]===e)return s||0;return-1}:l},1194:function(e,t,n){var r=n(7293),i=n(5112),o=n(7392),s=i("species");e.exports=function(e){return o>=51||!r(function(){var t=[];return(t.constructor={})[s]=function(){return{foo:1}},1!==t[e](Boolean).foo})}},9341:function(e,t,n){"use strict";var r=n(7293);e.exports=function(e,t){var n=[][e];return!!n&&r(function(){n.call(null,t||function(){throw 1},1)})}},3671:function(e,t,n){var r=n(3099),i=n(7908),o=n(8361),s=n(7466),a=function(e){return function(t,n,a,l){r(n);var c=i(t),u=o(c),d=s(c.length),f=e?d-1:0,p=e?-1:1;if(a<2)for(;;){if(f in u){l=u[f],f+=p;break}if(f+=p,e?f<0:d<=f)throw TypeError("Reduce of empty array with no initial value")}for(;e?f>=0:d>f;f+=p)f in u&&(l=n(l,u[f],f,c));return l}};e.exports={left:a(!1),right:a(!0)}},5417:function(e,t,n){var r=n(111),i=n(3157),o=n(5112)("species");e.exports=function(e,t){var n;return i(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!i(n.prototype)?r(n)&&null===(n=n[o])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)}},3411:function(e,t,n){var r=n(9670),i=n(9212);e.exports=function(e,t,n,o){try{return o?t(r(n)[0],n[1]):t(n)}catch(t){throw i(e),t}}},7072:function(e,t,n){var r=n(5112)("iterator"),i=!1;try{var o=0,s={next:function(){return{done:!!o++}},return:function(){i=!0}};s[r]=function(){return this},Array.from(s,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var n=!1;try{var o={};o[r]=function(){return{next:function(){return{done:n=!0}}}},e(o)}catch(e){}return n}},4326:function(e){var t={}.toString;e.exports=function(e){return t.call(e).slice(8,-1)}},648:function(e,t,n){var r=n(1694),i=n(4326),o=n(5112)("toStringTag"),s="Arguments"==i(function(){return arguments}());e.exports=r?i:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),o))?n:s?i(t):"Object"==(r=i(t))&&"function"==typeof t.callee?"Arguments":r}},9920:function(e,t,n){var r=n(6656),i=n(3887),o=n(1236),s=n(3070);e.exports=function(e,t){for(var n=i(t),a=s.f,l=o.f,c=0;c=74)&&(r=s.match(/Chrome\/(\d+)/))&&(i=r[1]),e.exports=i&&+i},748:function(e){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},2109:function(e,t,n){var r=n(7854),i=n(1236).f,o=n(8880),s=n(1320),a=n(3505),l=n(9920),c=n(4705);e.exports=function(e,t){var n,u,d,f,p,h=e.target,v=e.global,m=e.stat;if(n=v?r:m?r[h]||a(h,{}):(r[h]||{}).prototype)for(u in t){if(f=t[u],d=e.noTargetGet?(p=i(n,u))&&p.value:n[u],!c(v?u:h+(m?".":"#")+u,e.forced)&&void 0!==d){if(typeof f==typeof d)continue;l(f,d)}(e.sham||d&&d.sham)&&o(f,"sham",!0),s(n,u,f,e)}}},7293:function(e){e.exports=function(e){try{return!!e()}catch(e){return!0}}},7007:function(e,t,n){"use strict";n(4916);var r=n(1320),i=n(7293),o=n(5112),s=n(2261),a=n(8880),l=o("species"),c=!i(function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")}),u="$0"==="a".replace(/./,"$0"),d=o("replace"),f=!!/./[d]&&""===/./[d]("a","$0"),p=!i(function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]});e.exports=function(e,t,n,d){var h=o(e),v=!i(function(){var t={};return t[h]=function(){return 7},7!=""[e](t)}),m=v&&!i(function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[l]=function(){return n},n.flags="",n[h]=/./[h]),n.exec=function(){return t=!0,null},n[h](""),!t});if(!v||!m||"replace"===e&&(!c||!u||f)||"split"===e&&!p){var g=/./[h],y=n(h,""[e],function(e,t,n,r,i){return t.exec===s?v&&!i?{done:!0,value:g.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}},{REPLACE_KEEPS_$0:u,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:f}),b=y[0],w=y[1];r(String.prototype,e,b),r(RegExp.prototype,h,2==t?function(e,t){return w.call(e,this,t)}:function(e){return w.call(e,this)})}d&&a(RegExp.prototype[h],"sham",!0)}},9974:function(e,t,n){var r=n(3099);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}}},5005:function(e,t,n){var r=n(857),i=n(7854),o=function(e){return"function"==typeof e?e:void 0};e.exports=function(e,t){return arguments.length<2?o(r[e])||o(i[e]):r[e]&&r[e][t]||i[e]&&i[e][t]}},1246:function(e,t,n){var r=n(648),i=n(7497),o=n(5112)("iterator");e.exports=function(e){if(null!=e)return e[o]||e["@@iterator"]||i[r(e)]}},8554:function(e,t,n){var r=n(9670),i=n(1246);e.exports=function(e){var t=i(e);if("function"!=typeof t)throw TypeError(String(e)+" is not iterable");return r(t.call(e))}},647:function(e,t,n){var r=n(7908),i=Math.floor,o="".replace,s=/\$([$&'`]|\d\d?|<[^>]*>)/g,a=/\$([$&'`]|\d\d?)/g;e.exports=function(e,t,n,l,c,u){var d=n+e.length,f=l.length,p=a;return void 0!==c&&(c=r(c),p=s),o.call(u,p,function(r,o){var s;switch(o.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,n);case"'":return t.slice(d);case"<":s=c[o.slice(1,-1)];break;default:var a=+o;if(0===a)return r;if(a>f){var u=i(a/10);return 0===u?r:u<=f?void 0===l[u-1]?o.charAt(1):l[u-1]+o.charAt(1):r}s=l[a-1]}return void 0===s?"":s})}},7854:function(e,t,n){var r=function(e){return e&&e.Math==Math&&e};e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},6656:function(e){var t={}.hasOwnProperty;e.exports=function(e,n){return t.call(e,n)}},3501:function(e){e.exports={}},490:function(e,t,n){var r=n(5005);e.exports=r("document","documentElement")},4664:function(e,t,n){var r=n(9781),i=n(7293),o=n(317);e.exports=!r&&!i(function(){return 7!=Object.defineProperty(o("div"),"a",{get:function(){return 7}}).a})},1179:function(e){var t=Math.abs,n=Math.pow,r=Math.floor,i=Math.log,o=Math.LN2;e.exports={pack:function(e,s,a){var l,c,u,d=new Array(a),f=8*a-s-1,p=(1<>1,v=23===s?n(2,-24)-n(2,-77):0,m=e<0||0===e&&1/e<0?1:0,g=0;for((e=t(e))!=e||e===1/0?(c=e!=e?1:0,l=p):(l=r(i(e)/o),e*(u=n(2,-l))<1&&(l--,u*=2),(e+=l+h>=1?v/u:v*n(2,1-h))*u>=2&&(l++,u/=2),l+h>=p?(c=0,l=p):l+h>=1?(c=(e*u-1)*n(2,s),l+=h):(c=e*n(2,h-1)*n(2,s),l=0));s>=8;d[g++]=255&c,c/=256,s-=8);for(l=l<0;d[g++]=255&l,l/=256,f-=8);return d[--g]|=128*m,d},unpack:function(e,t){var r,i=e.length,o=8*i-t-1,s=(1<>1,l=o-7,c=i-1,u=e[c--],d=127&u;for(u>>=7;l>0;d=256*d+e[c],c--,l-=8);for(r=d&(1<<-l)-1,d>>=-l,l+=t;l>0;r=256*r+e[c],c--,l-=8);if(0===d)d=1-a;else{if(d===s)return r?NaN:u?-1/0:1/0;r+=n(2,t),d-=a}return(u?-1:1)*r*n(2,d-t)}}},8361:function(e,t,n){var r=n(7293),i=n(4326),o="".split;e.exports=r(function(){return!Object("z").propertyIsEnumerable(0)})?function(e){return"String"==i(e)?o.call(e,""):Object(e)}:Object},9587:function(e,t,n){var r=n(111),i=n(7674);e.exports=function(e,t,n){var o,s;return i&&"function"==typeof(o=t.constructor)&&o!==n&&r(s=o.prototype)&&s!==n.prototype&&i(e,s),e}},2788:function(e,t,n){var r=n(5465),i=Function.toString;"function"!=typeof r.inspectSource&&(r.inspectSource=function(e){return i.call(e)}),e.exports=r.inspectSource},9909:function(e,t,n){var r,i,o,s=n(8536),a=n(7854),l=n(111),c=n(8880),u=n(6656),d=n(5465),f=n(6200),p=n(3501),h=a.WeakMap;if(s){var v=d.state||(d.state=new h),m=v.get,g=v.has,y=v.set;r=function(e,t){return t.facade=e,y.call(v,e,t),t},i=function(e){return m.call(v,e)||{}},o=function(e){return g.call(v,e)}}else{var b=f("state");p[b]=!0,r=function(e,t){return t.facade=e,c(e,b,t),t},i=function(e){return u(e,b)?e[b]:{}},o=function(e){return u(e,b)}}e.exports={set:r,get:i,has:o,enforce:function(e){return o(e)?i(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!l(t)||(n=i(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}}},7659:function(e,t,n){var r=n(5112),i=n(7497),o=r("iterator"),s=Array.prototype;e.exports=function(e){return void 0!==e&&(i.Array===e||s[o]===e)}},3157:function(e,t,n){var r=n(4326);e.exports=Array.isArray||function(e){return"Array"==r(e)}},4705:function(e,t,n){var r=n(7293),i=/#|\.prototype\./,o=function(e,t){var n=a[s(e)];return n==c||n!=l&&("function"==typeof t?r(t):!!t)},s=o.normalize=function(e){return String(e).replace(i,".").toLowerCase()},a=o.data={},l=o.NATIVE="N",c=o.POLYFILL="P";e.exports=o},111:function(e){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},1913:function(e){e.exports=!1},7850:function(e,t,n){var r=n(111),i=n(4326),o=n(5112)("match");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[o])?!!t:"RegExp"==i(e))}},9212:function(e,t,n){var r=n(9670);e.exports=function(e){var t=e.return;if(void 0!==t)return r(t.call(e)).value}},3383:function(e,t,n){"use strict";var r,i,o,s=n(7293),a=n(9518),l=n(8880),c=n(6656),u=n(5112),d=n(1913),f=u("iterator"),p=!1;[].keys&&("next"in(o=[].keys())?(i=a(a(o)))!==Object.prototype&&(r=i):p=!0);var h=null==r||s(function(){var e={};return r[f].call(e)!==e});h&&(r={}),d&&!h||c(r,f)||l(r,f,function(){return this}),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:p}},7497:function(e){e.exports={}},133:function(e,t,n){var r=n(7293);e.exports=!!Object.getOwnPropertySymbols&&!r(function(){return!String(Symbol())})},590:function(e,t,n){var r=n(7293),i=n(5112),o=n(1913),s=i("iterator");e.exports=!r(function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,n="";return e.pathname="c%20d",t.forEach(function(e,r){t.delete("b"),n+=r+e}),o&&!e.toJSON||!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[s]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==n||"x"!==new URL("http://x",void 0).host})},8536:function(e,t,n){var r=n(7854),i=n(2788),o=r.WeakMap;e.exports="function"==typeof o&&/native code/.test(i(o))},1574:function(e,t,n){"use strict";var r=n(9781),i=n(7293),o=n(1956),s=n(5181),a=n(5296),l=n(7908),c=n(8361),u=Object.assign,d=Object.defineProperty;e.exports=!u||i(function(){if(r&&1!==u({b:1},u(d({},"a",{enumerable:!0,get:function(){d(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach(function(e){t[e]=e}),7!=u({},e)[n]||o(u({},t)).join("")!=i})?function(e,t){for(var n=l(e),i=arguments.length,u=1,d=s.f,f=a.f;i>u;)for(var p,h=c(arguments[u++]),v=d?o(h).concat(d(h)):o(h),m=v.length,g=0;m>g;)p=v[g++],r&&!f.call(h,p)||(n[p]=h[p]);return n}:u},30:function(e,t,n){var r,i=n(9670),o=n(6048),s=n(748),a=n(3501),l=n(490),c=n(317),u=n(6200),d="prototype",f="script",p=u("IE_PROTO"),h=function(){},v=function(e){return"<"+f+">"+e+""},m=function(){try{r=document.domain&&new ActiveXObject("htmlfile")}catch(e){}var e,t,n;m=r?function(e){e.write(v("")),e.close();var t=e.parentWindow.Object;return e=null,t}(r):(t=c("iframe"),n="java"+f+":",t.style.display="none",l.appendChild(t),t.src=String(n),(e=t.contentWindow.document).open(),e.write(v("document.F=Object")),e.close(),e.F);for(var i=s.length;i--;)delete m[d][s[i]];return m()};a[p]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(h[d]=i(e),n=new h,h[d]=null,n[p]=e):n=m(),void 0===t?n:o(n,t)}},6048:function(e,t,n){var r=n(9781),i=n(3070),o=n(9670),s=n(1956);e.exports=r?Object.defineProperties:function(e,t){o(e);for(var n,r=s(t),a=r.length,l=0;a>l;)i.f(e,n=r[l++],t[n]);return e}},3070:function(e,t,n){var r=n(9781),i=n(4664),o=n(9670),s=n(7593),a=Object.defineProperty;t.f=r?a:function(e,t,n){if(o(e),t=s(t,!0),o(n),i)try{return a(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},1236:function(e,t,n){var r=n(9781),i=n(5296),o=n(9114),s=n(5656),a=n(7593),l=n(6656),c=n(4664),u=Object.getOwnPropertyDescriptor;t.f=r?u:function(e,t){if(e=s(e),t=a(t,!0),c)try{return u(e,t)}catch(e){}if(l(e,t))return o(!i.f.call(e,t),e[t])}},8006:function(e,t,n){var r=n(6324),i=n(748).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,i)}},5181:function(e,t){t.f=Object.getOwnPropertySymbols},9518:function(e,t,n){var r=n(6656),i=n(7908),o=n(6200),s=n(8544),a=o("IE_PROTO"),l=Object.prototype;e.exports=s?Object.getPrototypeOf:function(e){return e=i(e),r(e,a)?e[a]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?l:null}},6324:function(e,t,n){var r=n(6656),i=n(5656),o=n(1318).indexOf,s=n(3501);e.exports=function(e,t){var n,a=i(e),l=0,c=[];for(n in a)!r(s,n)&&r(a,n)&&c.push(n);for(;t.length>l;)r(a,n=t[l++])&&(~o(c,n)||c.push(n));return c}},1956:function(e,t,n){var r=n(6324),i=n(748);e.exports=Object.keys||function(e){return r(e,i)}},5296:function(e,t){"use strict";var n={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,i=r&&!n.call({1:2},1);t.f=i?function(e){var t=r(this,e);return!!t&&t.enumerable}:n},7674:function(e,t,n){var r=n(9670),i=n(6077);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,o){return r(n),i(o),t?e.call(n,o):n.__proto__=o,n}}():void 0)},288:function(e,t,n){"use strict";var r=n(1694),i=n(648);e.exports=r?{}.toString:function(){return"[object "+i(this)+"]"}},3887:function(e,t,n){var r=n(5005),i=n(8006),o=n(5181),s=n(9670);e.exports=r("Reflect","ownKeys")||function(e){var t=i.f(s(e)),n=o.f;return n?t.concat(n(e)):t}},857:function(e,t,n){var r=n(7854);e.exports=r},2248:function(e,t,n){var r=n(1320);e.exports=function(e,t,n){for(var i in t)r(e,i,t[i],n);return e}},1320:function(e,t,n){var r=n(7854),i=n(8880),o=n(6656),s=n(3505),a=n(2788),l=n(9909),c=l.get,u=l.enforce,d=String(String).split("String");(e.exports=function(e,t,n,a){var l,c=!!a&&!!a.unsafe,f=!!a&&!!a.enumerable,p=!!a&&!!a.noTargetGet;"function"==typeof n&&("string"!=typeof t||o(n,"name")||i(n,"name",t),(l=u(n)).source||(l.source=d.join("string"==typeof t?t:""))),e!==r?(c?!p&&e[t]&&(f=!0):delete e[t],f?e[t]=n:i(e,t,n)):f?e[t]=n:s(t,n)})(Function.prototype,"toString",function(){return"function"==typeof this&&c(this).source||a(this)})},7651:function(e,t,n){var r=n(4326),i=n(2261);e.exports=function(e,t){var n=e.exec;if("function"==typeof n){var o=n.call(e,t);if("object"!=typeof o)throw TypeError("RegExp exec method returned something other than an Object or null");return o}if("RegExp"!==r(e))throw TypeError("RegExp#exec called on incompatible receiver");return i.call(e,t)}},2261:function(e,t,n){"use strict";var r,i,o=n(7066),s=n(2999),a=RegExp.prototype.exec,l=String.prototype.replace,c=a,u=(r=/a/,i=/b*/g,a.call(r,"a"),a.call(i,"a"),0!==r.lastIndex||0!==i.lastIndex),d=s.UNSUPPORTED_Y||s.BROKEN_CARET,f=void 0!==/()??/.exec("")[1];(u||f||d)&&(c=function(e){var t,n,r,i,s=this,c=d&&s.sticky,p=o.call(s),h=s.source,v=0,m=e;return c&&(-1===(p=p.replace("y","")).indexOf("g")&&(p+="g"),m=String(e).slice(s.lastIndex),s.lastIndex>0&&(!s.multiline||s.multiline&&"\n"!==e[s.lastIndex-1])&&(h="(?: "+h+")",m=" "+m,v++),n=new RegExp("^(?:"+h+")",p)),f&&(n=new RegExp("^"+h+"$(?!\\s)",p)),u&&(t=s.lastIndex),r=a.call(c?n:s,m),c?r?(r.input=r.input.slice(v),r[0]=r[0].slice(v),r.index=s.lastIndex,s.lastIndex+=r[0].length):s.lastIndex=0:u&&r&&(s.lastIndex=s.global?r.index+r[0].length:t),f&&r&&r.length>1&&l.call(r[0],n,function(){for(i=1;i=c?e?"":void 0:(o=a.charCodeAt(l))<55296||o>56319||l+1===c||(s=a.charCodeAt(l+1))<56320||s>57343?e?a.charAt(l):o:e?a.slice(l,l+2):s-56320+(o-55296<<10)+65536}};e.exports={codeAt:o(!1),charAt:o(!0)}},3197:function(e){"use strict";var t=2147483647,n=/[^\0-\u007E]/,r=/[.\u3002\uFF0E\uFF61]/g,i="Overflow: input needs wider integers to process",o=Math.floor,s=String.fromCharCode,a=function(e){return e+22+75*(e<26)},l=function(e,t,n){var r=0;for(e=n?o(e/700):e>>1,e+=o(e/t);e>455;r+=36)e=o(e/35);return o(r+36*e/(e+38))},c=function(e){var n=[];e=function(e){for(var t=[],n=0,r=e.length;n=55296&&i<=56319&&n=d&&co((t-f)/g))throw RangeError(i);for(f+=(m-d)*g,d=m,r=0;rt)throw RangeError(i);if(c==d){for(var y=f,b=36;;b+=36){var w=b<=p?1:b>=p+26?26:b-p;if(y0?n:t)(e)}},7466:function(e,t,n){var r=n(9958),i=Math.min;e.exports=function(e){return e>0?i(r(e),9007199254740991):0}},7908:function(e,t,n){var r=n(4488);e.exports=function(e){return Object(r(e))}},4590:function(e,t,n){var r=n(3002);e.exports=function(e,t){var n=r(e);if(n%t)throw RangeError("Wrong offset");return n}},3002:function(e,t,n){var r=n(9958);e.exports=function(e){var t=r(e);if(t<0)throw RangeError("The argument can't be less than 0");return t}},7593:function(e,t,n){var r=n(111);e.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},1694:function(e,t,n){var r={};r[n(5112)("toStringTag")]="z",e.exports="[object z]"===String(r)},9843:function(e,t,n){"use strict";var r=n(2109),i=n(7854),o=n(9781),s=n(3832),a=n(260),l=n(3331),c=n(5787),u=n(9114),d=n(8880),f=n(7466),p=n(7067),h=n(4590),v=n(7593),m=n(6656),g=n(648),y=n(111),b=n(30),w=n(7674),x=n(8006).f,E=n(7321),S=n(2092).forEach,k=n(6340),L=n(3070),A=n(1236),C=n(9909),_=n(9587),F=C.get,T=C.set,I=L.f,M=A.f,R=Math.round,z=i.RangeError,q=l.ArrayBuffer,O=l.DataView,U=a.NATIVE_ARRAY_BUFFER_VIEWS,j=a.TYPED_ARRAY_TAG,D=a.TypedArray,P=a.TypedArrayPrototype,N=a.aTypedArrayConstructor,$=a.isTypedArray,B="BYTES_PER_ELEMENT",W="Wrong length",H=function(e,t){for(var n=0,r=t.length,i=new(N(e))(r);r>n;)i[n]=t[n++];return i},Y=function(e,t){I(e,t,{get:function(){return F(this)[t]}})},G=function(e){var t;return e instanceof q||"ArrayBuffer"==(t=g(e))||"SharedArrayBuffer"==t},Q=function(e,t){return $(e)&&"symbol"!=typeof t&&t in e&&String(+t)==String(t)},X=function(e,t){return Q(e,t=v(t,!0))?u(2,e[t]):M(e,t)},V=function(e,t,n){return!(Q(e,t=v(t,!0))&&y(n)&&m(n,"value"))||m(n,"get")||m(n,"set")||n.configurable||m(n,"writable")&&!n.writable||m(n,"enumerable")&&!n.enumerable?I(e,t,n):(e[t]=n.value,e)};o?(U||(A.f=X,L.f=V,Y(P,"buffer"),Y(P,"byteOffset"),Y(P,"byteLength"),Y(P,"length")),r({target:"Object",stat:!0,forced:!U},{getOwnPropertyDescriptor:X,defineProperty:V}),e.exports=function(e,t,n){var o=e.match(/\d+$/)[0]/8,a=e+(n?"Clamped":"")+"Array",l="get"+e,u="set"+e,v=i[a],m=v,g=m&&m.prototype,L={},A=function(e,t){I(e,t,{get:function(){return function(e,t){var n=F(e);return n.view[l](t*o+n.byteOffset,!0)}(this,t)},set:function(e){return function(e,t,r){var i=F(e);n&&(r=(r=R(r))<0?0:r>255?255:255&r),i.view[u](t*o+i.byteOffset,r,!0)}(this,t,e)},enumerable:!0})};U?s&&(m=t(function(e,t,n,r){return c(e,m,a),_(y(t)?G(t)?void 0!==r?new v(t,h(n,o),r):void 0!==n?new v(t,h(n,o)):new v(t):$(t)?H(m,t):E.call(m,t):new v(p(t)),e,m)}),w&&w(m,D),S(x(v),function(e){e in m||d(m,e,v[e])}),m.prototype=g):(m=t(function(e,t,n,r){c(e,m,a);var i,s,l,u=0,d=0;if(y(t)){if(!G(t))return $(t)?H(m,t):E.call(m,t);i=t,d=h(n,o);var v=t.byteLength;if(void 0===r){if(v%o)throw z(W);if((s=v-d)<0)throw z(W)}else if((s=f(r)*o)+d>v)throw z(W);l=s/o}else l=p(t),i=new q(s=l*o);for(T(e,{buffer:i,byteOffset:d,byteLength:s,length:l,view:new O(i)});uo;)a[o]=t[o++];return a}},7321:function(e,t,n){var r=n(7908),i=n(7466),o=n(1246),s=n(7659),a=n(9974),l=n(260).aTypedArrayConstructor;e.exports=function(e){var t,n,c,u,d,f,p=r(e),h=arguments.length,v=h>1?arguments[1]:void 0,m=void 0!==v,g=o(p);if(null!=g&&!s(g))for(f=(d=g.call(p)).next,p=[];!(u=f.call(d)).done;)p.push(u.value);for(m&&h>2&&(v=a(v,arguments[2],2)),n=i(p.length),c=new(l(this))(n),t=0;n>t;t++)c[t]=m?v(p[t],t):p[t];return c}},9711:function(e){var t=0,n=Math.random();e.exports=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++t+n).toString(36)}},3307:function(e,t,n){var r=n(133);e.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},5112:function(e,t,n){var r=n(7854),i=n(2309),o=n(6656),s=n(9711),a=n(133),l=n(3307),c=i("wks"),u=r.Symbol,d=l?u:u&&u.withoutSetter||s;e.exports=function(e){return o(c,e)||(a&&o(u,e)?c[e]=u[e]:c[e]=d("Symbol."+e)),c[e]}},1361:function(e){e.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},8264:function(e,t,n){"use strict";var r=n(2109),i=n(7854),o=n(3331),s=n(6340),a="ArrayBuffer",l=o[a];r({global:!0,forced:i[a]!==l},{ArrayBuffer:l}),s(a)},2222:function(e,t,n){"use strict";var r=n(2109),i=n(7293),o=n(3157),s=n(111),a=n(7908),l=n(7466),c=n(6135),u=n(5417),d=n(1194),f=n(5112),p=n(7392),h=f("isConcatSpreadable"),v=9007199254740991,m="Maximum allowed index exceeded",g=p>=51||!i(function(){var e=[];return e[h]=!1,e.concat()[0]!==e}),y=d("concat"),b=function(e){if(!s(e))return!1;var t=e[h];return void 0!==t?!!t:o(e)};r({target:"Array",proto:!0,forced:!g||!y},{concat:function(e){var t,n,r,i,o,s=a(this),d=u(s,0),f=0;for(t=-1,r=arguments.length;tv)throw TypeError(m);for(n=0;n=v)throw TypeError(m);c(d,f++,o)}return d.length=f,d}})},7327:function(e,t,n){"use strict";var r=n(2109),i=n(2092).filter;r({target:"Array",proto:!0,forced:!n(1194)("filter")},{filter:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}})},2772:function(e,t,n){"use strict";var r=n(2109),i=n(1318).indexOf,o=n(9341),s=[].indexOf,a=!!s&&1/[1].indexOf(1,-0)<0,l=o("indexOf");r({target:"Array",proto:!0,forced:a||!l},{indexOf:function(e){return a?s.apply(this,arguments)||0:i(this,e,arguments.length>1?arguments[1]:void 0)}})},6992:function(e,t,n){"use strict";var r=n(5656),i=n(1223),o=n(7497),s=n(9909),a=n(654),l="Array Iterator",c=s.set,u=s.getterFor(l);e.exports=a(Array,"Array",function(e,t){c(this,{type:l,target:r(e),index:0,kind:t})},function(){var e=u(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}},"values"),o.Arguments=o.Array,i("keys"),i("values"),i("entries")},1249:function(e,t,n){"use strict";var r=n(2109),i=n(2092).map;r({target:"Array",proto:!0,forced:!n(1194)("map")},{map:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}})},7042:function(e,t,n){"use strict";var r=n(2109),i=n(111),o=n(3157),s=n(1400),a=n(7466),l=n(5656),c=n(6135),u=n(5112),d=n(1194)("slice"),f=u("species"),p=[].slice,h=Math.max;r({target:"Array",proto:!0,forced:!d},{slice:function(e,t){var n,r,u,d=l(this),v=a(d.length),m=s(e,v),g=s(void 0===t?v:t,v);if(o(d)&&("function"!=typeof(n=d.constructor)||n!==Array&&!o(n.prototype)?i(n)&&null===(n=n[f])&&(n=void 0):n=void 0,n===Array||void 0===n))return p.call(d,m,g);for(r=new(void 0===n?Array:n)(h(g-m,0)),u=0;m9007199254740991)throw TypeError("Maximum allowed length exceeded");for(u=l(m,r),p=0;pg-r+n;p--)delete m[p-1]}else if(n>r)for(p=g-r;p>y;p--)v=p+n-1,(h=p+r-1)in m?m[v]=m[h]:delete m[v];for(p=0;p=n.length?{value:void 0,done:!0}:(e=r(n,i),t.index+=e.length,{value:e,done:!1})})},4723:function(e,t,n){"use strict";var r=n(7007),i=n(9670),o=n(7466),s=n(4488),a=n(1530),l=n(7651);r("match",1,function(e,t,n){return[function(t){var n=s(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var s=i(e),c=String(this);if(!s.global)return l(s,c);var u=s.unicode;s.lastIndex=0;for(var d,f=[],p=0;null!==(d=l(s,c));){var h=String(d[0]);f[p]=h,""===h&&(s.lastIndex=a(c,o(s.lastIndex),u)),p++}return 0===p?null:f}]})},5306:function(e,t,n){"use strict";var r=n(7007),i=n(9670),o=n(7466),s=n(9958),a=n(4488),l=n(1530),c=n(647),u=n(7651),d=Math.max,f=Math.min,p=function(e){return void 0===e?e:String(e)};r("replace",2,function(e,t,n,r){var h=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,v=r.REPLACE_KEEPS_$0,m=h?"$":"$0";return[function(n,r){var i=a(this),o=null==n?void 0:n[e];return void 0!==o?o.call(n,i,r):t.call(String(i),n,r)},function(e,r){if(!h&&v||"string"==typeof r&&-1===r.indexOf(m)){var a=n(t,e,this,r);if(a.done)return a.value}var g=i(e),y=String(this),b="function"==typeof r;b||(r=String(r));var w=g.global;if(w){var x=g.unicode;g.lastIndex=0}for(var E=[];;){var S=u(g,y);if(null===S)break;if(E.push(S),!w)break;""===String(S[0])&&(g.lastIndex=l(y,o(g.lastIndex),x))}for(var k="",L=0,A=0;A=L&&(k+=y.slice(L,_)+R,L=_+C.length)}return k+y.slice(L)}]})},3123:function(e,t,n){"use strict";var r=n(7007),i=n(7850),o=n(9670),s=n(4488),a=n(6707),l=n(1530),c=n(7466),u=n(7651),d=n(2261),f=n(7293),p=[].push,h=Math.min,v=4294967295,m=!f(function(){return!RegExp(v,"y")});r("split",2,function(e,t,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var r=String(s(this)),o=void 0===n?v:n>>>0;if(0===o)return[];if(void 0===e)return[r];if(!i(e))return t.call(r,e,o);for(var a,l,c,u=[],f=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),h=0,m=new RegExp(e.source,f+"g");(a=d.call(m,r))&&!((l=m.lastIndex)>h&&(u.push(r.slice(h,a.index)),a.length>1&&a.index=o));)m.lastIndex===a.index&&m.lastIndex++;return h===r.length?!c&&m.test("")||u.push(""):u.push(r.slice(h)),u.length>o?u.slice(0,o):u}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var i=s(this),o=null==t?void 0:t[e];return void 0!==o?o.call(t,i,n):r.call(String(i),t,n)},function(e,i){var s=n(r,e,this,i,r!==t);if(s.done)return s.value;var d=o(e),f=String(this),p=a(d,RegExp),g=d.unicode,y=(d.ignoreCase?"i":"")+(d.multiline?"m":"")+(d.unicode?"u":"")+(m?"y":"g"),b=new p(m?d:"^(?:"+d.source+")",y),w=void 0===i?v:i>>>0;if(0===w)return[];if(0===f.length)return null===u(b,f)?[f]:[];for(var x=0,E=0,S=[];E2?arguments[2]:void 0)})},8927:function(e,t,n){"use strict";var r=n(260),i=n(2092).every,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("every",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},3105:function(e,t,n){"use strict";var r=n(260),i=n(1285),o=r.aTypedArray;(0,r.exportTypedArrayMethod)("fill",function(e){return i.apply(o(this),arguments)})},5035:function(e,t,n){"use strict";var r=n(260),i=n(2092).filter,o=n(3074),s=r.aTypedArray;(0,r.exportTypedArrayMethod)("filter",function(e){var t=i(s(this),e,arguments.length>1?arguments[1]:void 0);return o(this,t)})},7174:function(e,t,n){"use strict";var r=n(260),i=n(2092).findIndex,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("findIndex",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},4345:function(e,t,n){"use strict";var r=n(260),i=n(2092).find,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("find",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},2846:function(e,t,n){"use strict";var r=n(260),i=n(2092).forEach,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("forEach",function(e){i(o(this),e,arguments.length>1?arguments[1]:void 0)})},4731:function(e,t,n){"use strict";var r=n(260),i=n(1318).includes,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("includes",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},7209:function(e,t,n){"use strict";var r=n(260),i=n(1318).indexOf,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("indexOf",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},6319:function(e,t,n){"use strict";var r=n(7854),i=n(260),o=n(6992),s=n(5112)("iterator"),a=r.Uint8Array,l=o.values,c=o.keys,u=o.entries,d=i.aTypedArray,f=i.exportTypedArrayMethod,p=a&&a.prototype[s],h=!!p&&("values"==p.name||null==p.name),v=function(){return l.call(d(this))};f("entries",function(){return u.call(d(this))}),f("keys",function(){return c.call(d(this))}),f("values",v,!h),f(s,v,!h)},8867:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=[].join;o("join",function(e){return s.apply(i(this),arguments)})},7789:function(e,t,n){"use strict";var r=n(260),i=n(6583),o=r.aTypedArray;(0,r.exportTypedArrayMethod)("lastIndexOf",function(e){return i.apply(o(this),arguments)})},3739:function(e,t,n){"use strict";var r=n(260),i=n(2092).map,o=n(6707),s=r.aTypedArray,a=r.aTypedArrayConstructor;(0,r.exportTypedArrayMethod)("map",function(e){return i(s(this),e,arguments.length>1?arguments[1]:void 0,function(e,t){return new(a(o(e,e.constructor)))(t)})})},4483:function(e,t,n){"use strict";var r=n(260),i=n(3671).right,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("reduceRight",function(e){return i(o(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)})},9368:function(e,t,n){"use strict";var r=n(260),i=n(3671).left,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("reduce",function(e){return i(o(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)})},2056:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=Math.floor;o("reverse",function(){for(var e,t=this,n=i(t).length,r=s(n/2),o=0;o1?arguments[1]:void 0,1),n=this.length,r=s(e),a=i(r.length),c=0;if(a+t>n)throw RangeError("Wrong length");for(;co;)u[o]=n[o++];return u},o(function(){new Int8Array(1).slice()}))},7462:function(e,t,n){"use strict";var r=n(260),i=n(2092).some,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("some",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},3824:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=[].sort;o("sort",function(e){return s.call(i(this),e)})},5021:function(e,t,n){"use strict";var r=n(260),i=n(7466),o=n(1400),s=n(6707),a=r.aTypedArray;(0,r.exportTypedArrayMethod)("subarray",function(e,t){var n=a(this),r=n.length,l=o(e,r);return new(s(n,n.constructor))(n.buffer,n.byteOffset+l*n.BYTES_PER_ELEMENT,i((void 0===t?r:o(t,r))-l))})},2974:function(e,t,n){"use strict";var r=n(7854),i=n(260),o=n(7293),s=r.Int8Array,a=i.aTypedArray,l=i.exportTypedArrayMethod,c=[].toLocaleString,u=[].slice,d=!!s&&o(function(){c.call(new s(1))});l("toLocaleString",function(){return c.apply(d?u.call(a(this)):a(this),arguments)},o(function(){return[1,2].toLocaleString()!=new s([1,2]).toLocaleString()})||!o(function(){s.prototype.toLocaleString.call([1,2])}))},5016:function(e,t,n){"use strict";var r=n(260).exportTypedArrayMethod,i=n(7293),o=n(7854).Uint8Array,s=o&&o.prototype||{},a=[].toString,l=[].join;i(function(){a.call({})})&&(a=function(){return l.call(this)});var c=s.toString!=a;r("toString",a,c)},2472:function(e,t,n){n(9843)("Uint8",function(e){return function(t,n,r){return e(this,t,n,r)}})},4747:function(e,t,n){var r=n(7854),i=n(8324),o=n(8533),s=n(8880);for(var a in i){var l=r[a],c=l&&l.prototype;if(c&&c.forEach!==o)try{s(c,"forEach",o)}catch(e){c.forEach=o}}},3948:function(e,t,n){var r=n(7854),i=n(8324),o=n(6992),s=n(8880),a=n(5112),l=a("iterator"),c=a("toStringTag"),u=o.values;for(var d in i){var f=r[d],p=f&&f.prototype;if(p){if(p[l]!==u)try{s(p,l,u)}catch(e){p[l]=u}if(p[c]||s(p,c,d),i[d])for(var h in o)if(p[h]!==o[h])try{s(p,h,o[h])}catch(e){p[h]=o[h]}}}},1637:function(e,t,n){"use strict";n(6992);var r=n(2109),i=n(5005),o=n(590),s=n(1320),a=n(2248),l=n(8003),c=n(4994),u=n(9909),d=n(5787),f=n(6656),p=n(9974),h=n(648),v=n(9670),m=n(111),g=n(30),y=n(9114),b=n(8554),w=n(1246),x=n(5112),E=i("fetch"),S=i("Headers"),k=x("iterator"),L="URLSearchParams",A=L+"Iterator",C=u.set,_=u.getterFor(L),F=u.getterFor(A),T=/\+/g,I=Array(4),M=function(e){return I[e-1]||(I[e-1]=RegExp("((?:%[\\da-f]{2}){"+e+"})","gi"))},R=function(e){try{return decodeURIComponent(e)}catch(t){return e}},z=function(e){var t=e.replace(T," "),n=4;try{return decodeURIComponent(t)}catch(e){for(;n;)t=t.replace(M(n--),R);return t}},q=/[!'()~]|%20/g,O={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},U=function(e){return O[e]},j=function(e){return encodeURIComponent(e).replace(q,U)},D=function(e,t){if(t)for(var n,r,i=t.split("&"),o=0;o0?arguments[0]:void 0,u=[];if(C(this,{type:L,entries:u,updateURL:function(){},updateSearchParams:P}),void 0!==c)if(m(c))if("function"==typeof(e=w(c)))for(n=(t=e.call(c)).next;!(r=n.call(t)).done;){if((s=(o=(i=b(v(r.value))).next).call(i)).done||(a=o.call(i)).done||!o.call(i).done)throw TypeError("Expected sequence with length 2");u.push({key:s.value+"",value:a.value+""})}else for(l in c)f(c,l)&&u.push({key:l,value:c[l]+""});else D(u,"string"==typeof c?"?"===c.charAt(0)?c.slice(1):c:c+"")},W=B.prototype;a(W,{append:function(e,t){N(arguments.length,2);var n=_(this);n.entries.push({key:e+"",value:t+""}),n.updateURL()},delete:function(e){N(arguments.length,1);for(var t=_(this),n=t.entries,r=e+"",i=0;ie.key){i.splice(t,0,e);break}t===n&&i.push(e)}r.updateURL()},forEach:function(e){for(var t,n=_(this).entries,r=p(e,arguments.length>1?arguments[1]:void 0,3),i=0;i1&&(m(t=arguments[1])&&(n=t.body,h(n)===L&&((r=t.headers?new S(t.headers):new S).has("content-type")||r.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),t=g(t,{body:y(0,String(n)),headers:y(0,r)}))),i.push(t)),E.apply(this,i)}}),e.exports={URLSearchParams:B,getState:_}},285:function(e,t,n){"use strict";n(8783);var r,i=n(2109),o=n(9781),s=n(590),a=n(7854),l=n(6048),c=n(1320),u=n(5787),d=n(6656),f=n(1574),p=n(8457),h=n(8710).codeAt,v=n(3197),m=n(8003),g=n(1637),y=n(9909),b=a.URL,w=g.URLSearchParams,x=g.getState,E=y.set,S=y.getterFor("URL"),k=Math.floor,L=Math.pow,A="Invalid scheme",C="Invalid host",_="Invalid port",F=/[A-Za-z]/,T=/[\d+-.A-Za-z]/,I=/\d/,M=/^(0x|0X)/,R=/^[0-7]+$/,z=/^\d+$/,q=/^[\dA-Fa-f]+$/,O=/[\u0000\t\u000A\u000D #%/:?@[\\]]/,U=/[\u0000\t\u000A\u000D #/:?@[\\]]/,j=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,D=/[\t\u000A\u000D]/g,P=function(e,t){var n,r,i;if("["==t.charAt(0)){if("]"!=t.charAt(t.length-1))return C;if(!(n=$(t.slice(1,-1))))return C;e.host=n}else if(V(e)){if(t=v(t),O.test(t))return C;if(null===(n=N(t)))return C;e.host=n}else{if(U.test(t))return C;for(n="",r=p(t),i=0;i4)return e;for(n=[],r=0;r1&&"0"==i.charAt(0)&&(o=M.test(i)?16:8,i=i.slice(8==o?1:2)),""===i)s=0;else{if(!(10==o?z:8==o?R:q).test(i))return e;s=parseInt(i,o)}n.push(s)}for(r=0;r=L(256,5-t))return null}else if(s>255)return null;for(a=n.pop(),r=0;r6)return;for(r=0;f();){if(i=null,r>0){if(!("."==f()&&r<4))return;d++}if(!I.test(f()))return;for(;I.test(f());){if(o=parseInt(f(),10),null===i)i=o;else{if(0==i)return;i=10*i+o}if(i>255)return;d++}l[c]=256*l[c]+i,2!=++r&&4!=r||c++}if(4!=r)return;break}if(":"==f()){if(d++,!f())return}else if(f())return;l[c++]=t}else{if(null!==u)return;d++,u=++c}}if(null!==u)for(s=c-u,c=7;0!=c&&s>0;)a=l[c],l[c--]=l[u+s-1],l[u+--s]=a;else if(8!=c)return;return l},B=function(e){var t,n,r,i;if("number"==typeof e){for(t=[],n=0;n<4;n++)t.unshift(e%256),e=k(e/256);return t.join(".")}if("object"==typeof e){for(t="",r=function(e){for(var t=null,n=1,r=null,i=0,o=0;o<8;o++)0!==e[o]?(i>n&&(t=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(t=r,n=i),t}(e),n=0;n<8;n++)i&&0===e[n]||(i&&(i=!1),r===n?(t+=n?":":"::",i=!0):(t+=e[n].toString(16),n<7&&(t+=":")));return"["+t+"]"}return e},W={},H=f({},W,{" ":1,'"':1,"<":1,">":1,"`":1}),Y=f({},H,{"#":1,"?":1,"{":1,"}":1}),G=f({},Y,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),Q=function(e,t){var n=h(e,0);return n>32&&n<127&&!d(t,e)?e:encodeURIComponent(e)},X={ftp:21,file:null,http:80,https:443,ws:80,wss:443},V=function(e){return d(X,e.scheme)},K=function(e){return""!=e.username||""!=e.password},Z=function(e){return!e.host||e.cannotBeABaseURL||"file"==e.scheme},J=function(e,t){var n;return 2==e.length&&F.test(e.charAt(0))&&(":"==(n=e.charAt(1))||!t&&"|"==n)},ee=function(e){var t;return e.length>1&&J(e.slice(0,2))&&(2==e.length||"/"===(t=e.charAt(2))||"\\"===t||"?"===t||"#"===t)},te=function(e){var t=e.path,n=t.length;!n||"file"==e.scheme&&1==n&&J(t[0],!0)||t.pop()},ne=function(e){return"."===e||"%2e"===e.toLowerCase()},re=function(e){return".."===(e=e.toLowerCase())||"%2e."===e||".%2e"===e||"%2e%2e"===e},ie={},oe={},se={},ae={},le={},ce={},ue={},de={},fe={},pe={},he={},ve={},me={},ge={},ye={},be={},we={},xe={},Ee={},Se={},ke={},Le=function(e,t,n,i){var o,s,a,l,c=n||ie,u=0,f="",h=!1,v=!1,m=!1;for(n||(e.scheme="",e.username="",e.password="",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,t=t.replace(j,"")),t=t.replace(D,""),o=p(t);u<=o.length;){switch(s=o[u],c){case ie:if(!s||!F.test(s)){if(n)return A;c=se;continue}f+=s.toLowerCase(),c=oe;break;case oe:if(s&&(T.test(s)||"+"==s||"-"==s||"."==s))f+=s.toLowerCase();else{if(":"!=s){if(n)return A;f="",c=se,u=0;continue}if(n&&(V(e)!=d(X,f)||"file"==f&&(K(e)||null!==e.port)||"file"==e.scheme&&!e.host))return;if(e.scheme=f,n)return void(V(e)&&X[e.scheme]==e.port&&(e.port=null));f="","file"==e.scheme?c=ge:V(e)&&i&&i.scheme==e.scheme?c=ae:V(e)?c=de:"/"==o[u+1]?(c=le,u++):(e.cannotBeABaseURL=!0,e.path.push(""),c=Ee)}break;case se:if(!i||i.cannotBeABaseURL&&"#"!=s)return A;if(i.cannotBeABaseURL&&"#"==s){e.scheme=i.scheme,e.path=i.path.slice(),e.query=i.query,e.fragment="",e.cannotBeABaseURL=!0,c=ke;break}c="file"==i.scheme?ge:ce;continue;case ae:if("/"!=s||"/"!=o[u+1]){c=ce;continue}c=fe,u++;break;case le:if("/"==s){c=pe;break}c=xe;continue;case ce:if(e.scheme=i.scheme,s==r)e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query=i.query;else if("/"==s||"\\"==s&&V(e))c=ue;else if("?"==s)e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query="",c=Se;else{if("#"!=s){e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.path.pop(),c=xe;continue}e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query=i.query,e.fragment="",c=ke}break;case ue:if(!V(e)||"/"!=s&&"\\"!=s){if("/"!=s){e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,c=xe;continue}c=pe}else c=fe;break;case de:if(c=fe,"/"!=s||"/"!=f.charAt(u+1))continue;u++;break;case fe:if("/"!=s&&"\\"!=s){c=pe;continue}break;case pe:if("@"==s){h&&(f="%40"+f),h=!0,a=p(f);for(var g=0;g65535)return _;e.port=V(e)&&w===X[e.scheme]?null:w,f=""}if(n)return;c=we;continue}return _}f+=s;break;case ge:if(e.scheme="file","/"==s||"\\"==s)c=ye;else{if(!i||"file"!=i.scheme){c=xe;continue}if(s==r)e.host=i.host,e.path=i.path.slice(),e.query=i.query;else if("?"==s)e.host=i.host,e.path=i.path.slice(),e.query="",c=Se;else{if("#"!=s){ee(o.slice(u).join(""))||(e.host=i.host,e.path=i.path.slice(),te(e)),c=xe;continue}e.host=i.host,e.path=i.path.slice(),e.query=i.query,e.fragment="",c=ke}}break;case ye:if("/"==s||"\\"==s){c=be;break}i&&"file"==i.scheme&&!ee(o.slice(u).join(""))&&(J(i.path[0],!0)?e.path.push(i.path[0]):e.host=i.host),c=xe;continue;case be:if(s==r||"/"==s||"\\"==s||"?"==s||"#"==s){if(!n&&J(f))c=xe;else if(""==f){if(e.host="",n)return;c=we}else{if(l=P(e,f))return l;if("localhost"==e.host&&(e.host=""),n)return;f="",c=we}continue}f+=s;break;case we:if(V(e)){if(c=xe,"/"!=s&&"\\"!=s)continue}else if(n||"?"!=s)if(n||"#"!=s){if(s!=r&&(c=xe,"/"!=s))continue}else e.fragment="",c=ke;else e.query="",c=Se;break;case xe:if(s==r||"/"==s||"\\"==s&&V(e)||!n&&("?"==s||"#"==s)){if(re(f)?(te(e),"/"==s||"\\"==s&&V(e)||e.path.push("")):ne(f)?"/"==s||"\\"==s&&V(e)||e.path.push(""):("file"==e.scheme&&!e.path.length&&J(f)&&(e.host&&(e.host=""),f=f.charAt(0)+":"),e.path.push(f)),f="","file"==e.scheme&&(s==r||"?"==s||"#"==s))for(;e.path.length>1&&""===e.path[0];)e.path.shift();"?"==s?(e.query="",c=Se):"#"==s&&(e.fragment="",c=ke)}else f+=Q(s,Y);break;case Ee:"?"==s?(e.query="",c=Se):"#"==s?(e.fragment="",c=ke):s!=r&&(e.path[0]+=Q(s,W));break;case Se:n||"#"!=s?s!=r&&("'"==s&&V(e)?e.query+="%27":e.query+="#"==s?"%23":Q(s,W)):(e.fragment="",c=ke);break;case ke:s!=r&&(e.fragment+=Q(s,H))}u++}},Ae=function(e){var t,n,r=u(this,Ae,"URL"),i=arguments.length>1?arguments[1]:void 0,s=String(e),a=E(r,{type:"URL"});if(void 0!==i)if(i instanceof Ae)t=S(i);else if(n=Le(t={},String(i)))throw TypeError(n);if(n=Le(a,s,null,t))throw TypeError(n);var l=a.searchParams=new w,c=x(l);c.updateSearchParams(a.query),c.updateURL=function(){a.query=String(l)||null},o||(r.href=_e.call(r),r.origin=Fe.call(r),r.protocol=Te.call(r),r.username=Ie.call(r),r.password=Me.call(r),r.host=Re.call(r),r.hostname=ze.call(r),r.port=qe.call(r),r.pathname=Oe.call(r),r.search=Ue.call(r),r.searchParams=je.call(r),r.hash=De.call(r))},Ce=Ae.prototype,_e=function(){var e=S(this),t=e.scheme,n=e.username,r=e.password,i=e.host,o=e.port,s=e.path,a=e.query,l=e.fragment,c=t+":";return null!==i?(c+="//",K(e)&&(c+=n+(r?":"+r:"")+"@"),c+=B(i),null!==o&&(c+=":"+o)):"file"==t&&(c+="//"),c+=e.cannotBeABaseURL?s[0]:s.length?"/"+s.join("/"):"",null!==a&&(c+="?"+a),null!==l&&(c+="#"+l),c},Fe=function(){var e=S(this),t=e.scheme,n=e.port;if("blob"==t)try{return new URL(t.path[0]).origin}catch(e){return"null"}return"file"!=t&&V(e)?t+"://"+B(e.host)+(null!==n?":"+n:""):"null"},Te=function(){return S(this).scheme+":"},Ie=function(){return S(this).username},Me=function(){return S(this).password},Re=function(){var e=S(this),t=e.host,n=e.port;return null===t?"":null===n?B(t):B(t)+":"+n},ze=function(){var e=S(this).host;return null===e?"":B(e)},qe=function(){var e=S(this).port;return null===e?"":String(e)},Oe=function(){var e=S(this),t=e.path;return e.cannotBeABaseURL?t[0]:t.length?"/"+t.join("/"):""},Ue=function(){var e=S(this).query;return e?"?"+e:""},je=function(){return S(this).searchParams},De=function(){var e=S(this).fragment;return e?"#"+e:""},Pe=function(e,t){return{get:e,set:t,configurable:!0,enumerable:!0}};if(o&&l(Ce,{href:Pe(_e,function(e){var t=S(this),n=String(e),r=Le(t,n);if(r)throw TypeError(r);x(t.searchParams).updateSearchParams(t.query)}),origin:Pe(Fe),protocol:Pe(Te,function(e){var t=S(this);Le(t,String(e)+":",ie)}),username:Pe(Ie,function(e){var t=S(this),n=p(String(e));if(!Z(t)){t.username="";for(var r=0;re.length)&&(t=e.length);for(var n=0,r=new Array(t);n1?r-1:0),o=1;o=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,a=!0,l=!1;return{s:function(){r=t[Symbol.iterator]()},n:function(){var e=r.next();return a=e.done,e},e:function(e){l=!0,s=e},f:function(){try{a||null==r.return||r.return()}finally{if(l)throw s}}}}(n,!0);try{for(a.s();!(s=a.n()).done;)s.value.apply(this,i)}catch(e){a.e(e)}finally{a.f()}}return this.element&&this.element.dispatchEvent(this.makeEvent("dropzone:"+t,{args:i})),this}},{key:"makeEvent",value:function(e,t){var n={bubbles:!0,cancelable:!0,detail:t};if("function"==typeof window.CustomEvent)return new CustomEvent(e,n);var r=document.createEvent("CustomEvent");return r.initCustomEvent(e,n.bubbles,n.cancelable,n.detail),r}},{key:"off",value:function(e,t){if(!this._callbacks||0===arguments.length)return this._callbacks={},this;var n=this._callbacks[e];if(!n)return this;if(1===arguments.length)return delete this._callbacks[e],this;for(var r=0;r=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,l=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return a=e.done,e},e:function(e){l=!0,o=e},f:function(){try{a||null==n.return||n.return()}finally{if(l)throw o}}}}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n'),this.element.appendChild(e));var i=e.getElementsByTagName("span")[0];return i&&(null!=i.textContent?i.textContent=this.options.dictFallbackMessage:null!=i.innerText&&(i.innerText=this.options.dictFallbackMessage)),this.element.appendChild(this.getFallbackForm())},resize:function(e,t,n,r){var i={srcX:0,srcY:0,srcWidth:e.width,srcHeight:e.height},o=e.width/e.height;null==t&&null==n?(t=i.srcWidth,n=i.srcHeight):null==t?t=n*o:null==n&&(n=t/o);var s=(t=Math.min(t,i.srcWidth))/(n=Math.min(n,i.srcHeight));if(i.srcWidth>t||i.srcHeight>n)if("crop"===r)o>s?(i.srcHeight=e.height,i.srcWidth=i.srcHeight*s):(i.srcWidth=e.width,i.srcHeight=i.srcWidth/s);else{if("contain"!==r)throw new Error("Unknown resizeMethod '".concat(r,"'"));o>s?n=t/o:t=n*o}return i.srcX=(e.width-i.srcWidth)/2,i.srcY=(e.height-i.srcHeight)/2,i.trgWidth=t,i.trgHeight=n,i},transformFile:function(e,t){return(this.options.resizeWidth||this.options.resizeHeight)&&e.type.match(/image.*/)?this.resizeImage(e,this.options.resizeWidth,this.options.resizeHeight,this.options.resizeMethod,t):t(e)},previewTemplate:'
    Check
    Error
    ',drop:function(e){return this.element.classList.remove("dz-drag-hover")},dragstart:function(e){},dragend:function(e){return this.element.classList.remove("dz-drag-hover")},dragenter:function(e){return this.element.classList.add("dz-drag-hover")},dragover:function(e){return this.element.classList.add("dz-drag-hover")},dragleave:function(e){return this.element.classList.remove("dz-drag-hover")},paste:function(e){},reset:function(){return this.element.classList.remove("dz-started")},addedfile:function(e){var t=this;if(this.element===this.previewsContainer&&this.element.classList.add("dz-started"),this.previewsContainer&&!this.options.disablePreviews){e.previewElement=y.createElement(this.options.previewTemplate.trim()),e.previewTemplate=e.previewElement,this.previewsContainer.appendChild(e.previewElement);var n,r=o(e.previewElement.querySelectorAll("[data-dz-name]"),!0);try{for(r.s();!(n=r.n()).done;){var i=n.value;i.textContent=e.name}}catch(e){r.e(e)}finally{r.f()}var s,a=o(e.previewElement.querySelectorAll("[data-dz-size]"),!0);try{for(a.s();!(s=a.n()).done;)(i=s.value).innerHTML=this.filesize(e.size)}catch(e){a.e(e)}finally{a.f()}this.options.addRemoveLinks&&(e._removeLink=y.createElement('
    '.concat(this.options.dictRemoveFile,"")),e.previewElement.appendChild(e._removeLink));var l,c=function(n){return n.preventDefault(),n.stopPropagation(),e.status===y.UPLOADING?y.confirm(t.options.dictCancelUploadConfirmation,function(){return t.removeFile(e)}):t.options.dictRemoveFileConfirmation?y.confirm(t.options.dictRemoveFileConfirmation,function(){return t.removeFile(e)}):t.removeFile(e)},u=o(e.previewElement.querySelectorAll("[data-dz-remove]"),!0);try{for(u.s();!(l=u.n()).done;)l.value.addEventListener("click",c)}catch(e){u.e(e)}finally{u.f()}}},removedfile:function(e){return null!=e.previewElement&&null!=e.previewElement.parentNode&&e.previewElement.parentNode.removeChild(e.previewElement),this._updateMaxFilesReachedClass()},thumbnail:function(e,t){if(e.previewElement){e.previewElement.classList.remove("dz-file-preview");var n,r=o(e.previewElement.querySelectorAll("[data-dz-thumbnail]"),!0);try{for(r.s();!(n=r.n()).done;){var i=n.value;i.alt=e.name,i.src=t}}catch(e){r.e(e)}finally{r.f()}return setTimeout(function(){return e.previewElement.classList.add("dz-image-preview")},1)}},error:function(e,t){if(e.previewElement){e.previewElement.classList.add("dz-error"),"string"!=typeof t&&t.error&&(t=t.error);var n,r=o(e.previewElement.querySelectorAll("[data-dz-errormessage]"),!0);try{for(r.s();!(n=r.n()).done;)n.value.textContent=t}catch(e){r.e(e)}finally{r.f()}}},errormultiple:function(){},processing:function(e){if(e.previewElement&&(e.previewElement.classList.add("dz-processing"),e._removeLink))return e._removeLink.innerHTML=this.options.dictCancelUpload},processingmultiple:function(){},uploadprogress:function(e,t,n){if(e.previewElement){var r,i=o(e.previewElement.querySelectorAll("[data-dz-uploadprogress]"),!0);try{for(i.s();!(r=i.n()).done;){var s=r.value;"PROGRESS"===s.nodeName?s.value=t:s.style.width="".concat(t,"%")}}catch(e){i.e(e)}finally{i.f()}}},totaluploadprogress:function(){},sending:function(){},sendingmultiple:function(){},success:function(e){if(e.previewElement)return e.previewElement.classList.add("dz-success")},successmultiple:function(){},canceled:function(e){return this.emit("error",e,this.options.dictUploadCanceled)},canceledmultiple:function(){},complete:function(e){if(e._removeLink&&(e._removeLink.innerHTML=this.options.dictRemoveFile),e.previewElement)return e.previewElement.classList.add("dz-complete")},completemultiple:function(){},maxfilesexceeded:function(){},maxfilesreached:function(){},queuecomplete:function(){},addedfiles:function(){}};function l(e){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l(e)}function c(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return u(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?u(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return s=e.done,e},e:function(e){a=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n"))),this.clickableElements.length&&function t(){e.hiddenFileInput&&e.hiddenFileInput.parentNode.removeChild(e.hiddenFileInput),e.hiddenFileInput=document.createElement("input"),e.hiddenFileInput.setAttribute("type","file"),(null===e.options.maxFiles||e.options.maxFiles>1)&&e.hiddenFileInput.setAttribute("multiple","multiple"),e.hiddenFileInput.className="dz-hidden-input",null!==e.options.acceptedFiles&&e.hiddenFileInput.setAttribute("accept",e.options.acceptedFiles),null!==e.options.capture&&e.hiddenFileInput.setAttribute("capture",e.options.capture),e.hiddenFileInput.setAttribute("tabindex","-1"),e.hiddenFileInput.style.visibility="hidden",e.hiddenFileInput.style.position="absolute",e.hiddenFileInput.style.top="0",e.hiddenFileInput.style.left="0",e.hiddenFileInput.style.height="0",e.hiddenFileInput.style.width="0",o.getElement(e.options.hiddenInputContainer,"hiddenInputContainer").appendChild(e.hiddenFileInput),e.hiddenFileInput.addEventListener("change",function(){var n=e.hiddenFileInput.files;if(n.length){var r,i=c(n,!0);try{for(i.s();!(r=i.n()).done;){var o=r.value;e.addFile(o)}}catch(e){i.e(e)}finally{i.f()}}e.emit("addedfiles",n),t()})}(),this.URL=null!==window.URL?window.URL:window.webkitURL;var t,n=c(this.events,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.on(r,this.options[r])}}catch(e){n.e(e)}finally{n.f()}this.on("uploadprogress",function(){return e.updateTotalUploadProgress()}),this.on("removedfile",function(){return e.updateTotalUploadProgress()}),this.on("canceled",function(t){return e.emit("complete",t)}),this.on("complete",function(t){if(0===e.getAddedFiles().length&&0===e.getUploadingFiles().length&&0===e.getQueuedFiles().length)return setTimeout(function(){return e.emit("queuecomplete")},0)});var i=function(e){if(function(e){if(e.dataTransfer.types)for(var t=0;t")),n+='');var r=o.createElement(n);return"FORM"!==this.element.tagName?(t=o.createElement('
    '))).appendChild(r):(this.element.setAttribute("enctype","multipart/form-data"),this.element.setAttribute("method",this.options.method)),null!=t?t:r}},{key:"getExistingFallback",value:function(){for(var e=function(e){var t,n=c(e,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;if(/(^| )fallback($| )/.test(r.className))return r}}catch(e){n.e(e)}finally{n.f()}},t=0,n=["div","form"];t0){for(var r=["tb","gb","mb","kb","b"],i=0;i=Math.pow(this.options.filesizeBase,4-i)/10){t=e/Math.pow(this.options.filesizeBase,4-i),n=o;break}}t=Math.round(10*t)/10}return"".concat(t," ").concat(this.options.dictFileSizeUnits[n])}},{key:"_updateMaxFilesReachedClass",value:function(){return null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(this.getAcceptedFiles().length===this.options.maxFiles&&this.emit("maxfilesreached",this.files),this.element.classList.add("dz-max-files-reached")):this.element.classList.remove("dz-max-files-reached")}},{key:"drop",value:function(e){if(e.dataTransfer){this.emit("drop",e);for(var t=[],n=0;n0){var i,o=c(r,!0);try{for(o.s();!(i=o.n()).done;){var s=i.value;s.isFile?s.file(function(e){if(!n.options.ignoreHiddenFiles||"."!==e.name.substring(0,1))return e.fullPath="".concat(t,"/").concat(e.name),n.addFile(e)}):s.isDirectory&&n._addFilesFromDirectory(s,"".concat(t,"/").concat(s.name))}}catch(e){o.e(e)}finally{o.f()}e()}return null},i)}()}},{key:"accept",value:function(e,t){this.options.maxFilesize&&e.size>1024*this.options.maxFilesize*1024?t(this.options.dictFileTooBig.replace("{{filesize}}",Math.round(e.size/1024/10.24)/100).replace("{{maxFilesize}}",this.options.maxFilesize)):o.isValidFile(e,this.options.acceptedFiles)?null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(t(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}",this.options.maxFiles)),this.emit("maxfilesexceeded",e)):this.options.accept.call(this,e,t):t(this.options.dictInvalidFileType)}},{key:"addFile",value:function(e){var t=this;e.upload={uuid:o.uuidv4(),progress:0,total:e.size,bytesSent:0,filename:this._renameFile(e)},this.files.push(e),e.status=o.ADDED,this.emit("addedfile",e),this._enqueueThumbnail(e),this.accept(e,function(n){n?(e.accepted=!1,t._errorProcessing([e],n)):(e.accepted=!0,t.options.autoQueue&&t.enqueueFile(e)),t._updateMaxFilesReachedClass()})}},{key:"enqueueFiles",value:function(e){var t,n=c(e,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.enqueueFile(r)}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"enqueueFile",value:function(e){var t=this;if(e.status!==o.ADDED||!0!==e.accepted)throw new Error("This file can't be queued because it has already been processed or was rejected.");if(e.status=o.QUEUED,this.options.autoProcessQueue)return setTimeout(function(){return t.processQueue()},0)}},{key:"_enqueueThumbnail",value:function(e){var t=this;if(this.options.createImageThumbnails&&e.type.match(/image.*/)&&e.size<=1024*this.options.maxThumbnailFilesize*1024)return this._thumbnailQueue.push(e),setTimeout(function(){return t._processThumbnailQueue()},0)}},{key:"_processThumbnailQueue",value:function(){var e=this;if(!this._processingThumbnail&&0!==this._thumbnailQueue.length){this._processingThumbnail=!0;var t=this._thumbnailQueue.shift();return this.createThumbnail(t,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,!0,function(n){return e.emit("thumbnail",t,n),e._processingThumbnail=!1,e._processThumbnailQueue()})}}},{key:"removeFile",value:function(e){if(e.status===o.UPLOADING&&this.cancelUpload(e),this.files=b(this.files,e),this.emit("removedfile",e),0===this.files.length)return this.emit("reset")}},{key:"removeAllFiles",value:function(e){null==e&&(e=!1);var t,n=c(this.files.slice(),!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;(r.status!==o.UPLOADING||e)&&this.removeFile(r)}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"resizeImage",value:function(e,t,n,r,i){var s=this;return this.createThumbnail(e,t,n,r,!0,function(t,n){if(null==n)return i(e);var r=s.options.resizeMimeType;null==r&&(r=e.type);var a=n.toDataURL(r,s.options.resizeQuality);return"image/jpeg"!==r&&"image/jpg"!==r||(a=E.restore(e.dataURL,a)),i(o.dataURItoBlob(a))})}},{key:"createThumbnail",value:function(e,t,n,r,i,o){var s=this,a=new FileReader;a.onload=function(){e.dataURL=a.result,"image/svg+xml"!==e.type?s.createThumbnailFromUrl(e,t,n,r,i,o):null!=o&&o(a.result)},a.readAsDataURL(e)}},{key:"displayExistingFile",value:function(e,t,n,r){var i=this,o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4];this.emit("addedfile",e),this.emit("complete",e),o?(e.dataURL=t,this.createThumbnailFromUrl(e,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,this.options.fixOrientation,function(t){i.emit("thumbnail",e,t),n&&n()},r)):(this.emit("thumbnail",e,t),n&&n())}},{key:"createThumbnailFromUrl",value:function(e,t,n,r,i,o,s){var a=this,l=document.createElement("img");return s&&(l.crossOrigin=s),i="from-image"!=getComputedStyle(document.body).imageOrientation&&i,l.onload=function(){var s=function(e){return e(1)};return"undefined"!=typeof EXIF&&null!==EXIF&&i&&(s=function(e){return EXIF.getData(l,function(){return e(EXIF.getTag(this,"Orientation"))})}),s(function(i){e.width=l.width,e.height=l.height;var s=a.options.resize.call(a,e,t,n,r),c=document.createElement("canvas"),u=c.getContext("2d");switch(c.width=s.trgWidth,c.height=s.trgHeight,i>4&&(c.width=s.trgHeight,c.height=s.trgWidth),i){case 2:u.translate(c.width,0),u.scale(-1,1);break;case 3:u.translate(c.width,c.height),u.rotate(Math.PI);break;case 4:u.translate(0,c.height),u.scale(1,-1);break;case 5:u.rotate(.5*Math.PI),u.scale(1,-1);break;case 6:u.rotate(.5*Math.PI),u.translate(0,-c.width);break;case 7:u.rotate(.5*Math.PI),u.translate(c.height,-c.width),u.scale(-1,1);break;case 8:u.rotate(-.5*Math.PI),u.translate(-c.height,0)}x(u,l,null!=s.srcX?s.srcX:0,null!=s.srcY?s.srcY:0,s.srcWidth,s.srcHeight,null!=s.trgX?s.trgX:0,null!=s.trgY?s.trgY:0,s.trgWidth,s.trgHeight);var d=c.toDataURL("image/png");if(null!=o)return o(d,c)})},null!=o&&(l.onerror=o),l.src=e.dataURL}},{key:"processQueue",value:function(){var e=this.options.parallelUploads,t=this.getUploadingFiles().length,n=t;if(!(t>=e)){var r=this.getQueuedFiles();if(r.length>0){if(this.options.uploadMultiple)return this.processFiles(r.slice(0,e-t));for(;n1?t-1:0),r=1;rt.options.chunkSize),e[0].upload.totalChunkCount=Math.ceil(r.size/t.options.chunkSize)}if(e[0].upload.chunked){var i=e[0],s=n[0];i.upload.chunks=[];var a=function(){for(var n=0;void 0!==i.upload.chunks[n];)n++;if(!(n>=i.upload.totalChunkCount)){var r=n*t.options.chunkSize,a=Math.min(r+t.options.chunkSize,s.size),l={name:t._getParamName(0),data:s.webkitSlice?s.webkitSlice(r,a):s.slice(r,a),filename:i.upload.filename,chunkIndex:n};i.upload.chunks[n]={file:i,index:n,dataBlock:l,status:o.UPLOADING,progress:0,retries:0},t._uploadData(e,[l])}};if(i.upload.finishedChunkUpload=function(n,r){var s=!0;n.status=o.SUCCESS,n.dataBlock=null,n.xhr=null;for(var l=0;l1?t-1:0),r=1;r=s;a?o++:o--)i[o]=t.charCodeAt(o);return new Blob([r],{type:n})};var b=function(e,t){return e.filter(function(e){return e!==t}).map(function(e){return e})},w=function(e){return e.replace(/[\-_](\w)/g,function(e){return e.charAt(1).toUpperCase()})};y.createElement=function(e){var t=document.createElement("div");return t.innerHTML=e,t.childNodes[0]},y.elementInside=function(e,t){if(e===t)return!0;for(;e=e.parentNode;)if(e===t)return!0;return!1},y.getElement=function(e,t){var n;if("string"==typeof e?n=document.querySelector(e):null!=e.nodeType&&(n=e),null==n)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector or a plain HTML element."));return n},y.getElements=function(e,t){var n,r;if(e instanceof Array){r=[];try{var i,o=c(e,!0);try{for(o.s();!(i=o.n()).done;)n=i.value,r.push(this.getElement(n,t))}catch(e){o.e(e)}finally{o.f()}}catch(e){r=null}}else if("string"==typeof e){r=[];var s,a=c(document.querySelectorAll(e),!0);try{for(a.s();!(s=a.n()).done;)n=s.value,r.push(n)}catch(e){a.e(e)}finally{a.f()}}else null!=e.nodeType&&(r=[e]);if(null==r||!r.length)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector, a plain HTML element or a list of those."));return r},y.confirm=function(e,t,n){return window.confirm(e)?t():null!=n?n():void 0},y.isValidFile=function(e,t){if(!t)return!0;t=t.split(",");var n,r=e.type,i=r.replace(/\/.*$/,""),o=c(t,!0);try{for(o.s();!(n=o.n()).done;){var s=n.value;if("."===(s=s.trim()).charAt(0)){if(-1!==e.name.toLowerCase().indexOf(s.toLowerCase(),e.name.length-s.length))return!0}else if(/\/\*$/.test(s)){if(i===s.replace(/\/.*$/,""))return!0}else if(r===s)return!0}}catch(e){o.e(e)}finally{o.f()}return!1},"undefined"!=typeof jQuery&&null!==jQuery&&(jQuery.fn.dropzone=function(e){return this.each(function(){return new y(this,e)})}),y.ADDED="added",y.QUEUED="queued",y.ACCEPTED=y.QUEUED,y.UPLOADING="uploading",y.PROCESSING=y.UPLOADING,y.CANCELED="canceled",y.ERROR="error",y.SUCCESS="success";var x=function(e,t,n,r,i,o,s,a,l,c){var u=function(e){e.naturalWidth;var t=e.naturalHeight,n=document.createElement("canvas");n.width=1,n.height=t;var r=n.getContext("2d");r.drawImage(e,0,0);for(var i=r.getImageData(1,0,1,t).data,o=0,s=t,a=t;a>o;)0===i[4*(a-1)+3]?s=a:o=a,a=s+o>>1;var l=a/t;return 0===l?1:l}(t);return e.drawImage(t,n,r,i,o,s,a,l,c/u)},E=function(){function e(){d(this,e)}return p(e,null,[{key:"initClass",value:function(){this.KEY_STR="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}},{key:"encode64",value:function(e){for(var t="",n=void 0,r=void 0,i="",o=void 0,s=void 0,a=void 0,l="",c=0;o=(n=e[c++])>>2,s=(3&n)<<4|(r=e[c++])>>4,a=(15&r)<<2|(i=e[c++])>>6,l=63&i,isNaN(r)?a=l=64:isNaN(i)&&(l=64),t=t+this.KEY_STR.charAt(o)+this.KEY_STR.charAt(s)+this.KEY_STR.charAt(a)+this.KEY_STR.charAt(l),n=r=i="",o=s=a=l="",ce.length)break}return n}},{key:"decode64",value:function(e){var t=void 0,n=void 0,r="",i=void 0,o=void 0,s="",a=0,l=[];for(/[^A-Za-z0-9\+\/\=]/g.exec(e)&&console.warn("There were invalid base64 characters in the input text.\nValid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\nExpect errors in decoding."),e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");t=this.KEY_STR.indexOf(e.charAt(a++))<<2|(i=this.KEY_STR.indexOf(e.charAt(a++)))>>4,n=(15&i)<<4|(o=this.KEY_STR.indexOf(e.charAt(a++)))>>2,r=(3&o)<<6|(s=this.KEY_STR.indexOf(e.charAt(a++))),l.push(t),64!==o&&l.push(n),64!==s&&l.push(r),t=n=r="",i=o=s="",at.options.priority?-1:e.options.priority=0;n--)this._subscribers[n].fn!==e&&this._subscribers[n].id!==e||(this._subscribers[n].channel=null,this._subscribers.splice(n,1));else this._subscribers=[];if(t&&this.autoCleanChannel(),n=this._subscribers.length-1,e)for(;n>=0;n--)this._subscribers[n].fn!==e&&this._subscribers[n].id!==e||(this._subscribers[n].channel=null,this._subscribers.splice(n,1));else this._subscribers=[]},t.prototype.autoCleanChannel=function(){if(0===this._subscribers.length){for(var e in this._channels)if(this._channels.hasOwnProperty(e))return;if(null!=this._parent){var t=this.namespace.split(":"),n=t[t.length-1];this._parent.removeChannel(n)}}},t.prototype.removeChannel=function(e){this.hasChannel(e)&&(this._channels[e]=null,delete this._channels[e],this.autoCleanChannel())},t.prototype.publish=function(e){for(var t,n,r,i=0,o=this._subscribers.length,s=!1;i0)for(;i{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";var e=n(295),t=n.n(e),r=n(216);window.Cl=window.Cl||{};class i{constructor(e={}){this.options={linksSelector:".js-toggler-link",dataHeaderSelector:"toggler-header-selector",dataContentSelector:"toggler-content-selector",collapsedClass:"js-collapsed",expandedClass:"js-expanded",hiddenClass:"hidden",...e},this.togglerInstances=[],document.querySelectorAll(this.options.linksSelector).forEach(e=>{const t=new o(e,this.options);this.togglerInstances.push(t)})}destroy(){this.links=null,this.togglerInstances.forEach(e=>e.destroy()),this.togglerInstances=[]}}class o{constructor(e,t={}){this.options={...t},this.link=e,this.headerSelector=this.link.dataset[this.options.dataHeaderSelector],this.contentSelector=this.link.dataset[this.options.dataContentSelector],this.header=document.querySelector(this.headerSelector),this.header=this.header||this.link,this.content=document.querySelector(this.contentSelector),this.content&&this._initLink()}_updateClasses(){this.content.classList.contains(this.options.hiddenClass)?(this.header.classList.remove(this.options.expandedClass),this.header.classList.add(this.options.collapsedClass)):(this.header.classList.add(this.options.expandedClass),this.header.classList.remove(this.options.collapsedClass))}_onTogglerClick(e){this.content.classList.toggle(this.options.hiddenClass),this._updateClasses(),e.preventDefault()}_initLink(){this._updateClasses(),this.link.addEventListener("click",e=>this._onTogglerClick(e))}destroy(){this.options=null,this.link=null}}Cl.Toggler=i,Cl.TogglerConstructor=o;const s=i;n(413);var a=n(628),l=n.n(a);document.addEventListener("DOMContentLoaded",()=>{let e=0,t=1;const n=document.querySelector(".js-upload-button");if(!n)return;const r=document.querySelector(".js-upload-button-disabled"),i=n.dataset.url;if(!i)return;const o=document.querySelector(".js-filer-dropzone-upload-welcome"),s=document.querySelector(".js-filer-dropzone-upload-info-container"),a=document.querySelector(".js-filer-dropzone-upload-info"),c=document.querySelector(".js-filer-dropzone-upload-number"),u=".js-filer-dropzone-progress",d=document.querySelector(".js-filer-dropzone-upload-success"),f=document.querySelector(".js-filer-dropzone-upload-canceled"),p=document.querySelector(".js-filer-dropzone-cancel"),h=document.querySelector(".js-filer-dropzone-info-message"),v="hidden",m=parseInt(n.dataset.maxUploaderConnections||3,10),g=parseInt(n.dataset.maxFilesize||0,10);let y=!1;const b=()=>{c&&(c.textContent=`${t-e}/${t}`)},w=()=>{n&&n.remove()},x=()=>{const e=window.location.toString();window.location.replace(((e,t,n)=>{const r=new RegExp(`([?&])${t}=.*?(&|$)`,"i"),i=-1!==e.indexOf("?")?"&":"?",o=window.location.hash;return(e=e.replace(/#.*$/,"")).match(r)?e.replace(r,`$1${t}=${n}$2`)+o:e+i+t+"="+n+o})(e,"order_by","-modified_at"))};let E;Cl.mediator.subscribe("filer-upload-in-progress",w),n.addEventListener("click",e=>{e.preventDefault()}),l().autoDiscover=!1;try{E=new(l())(n,{url:i,paramName:"file",maxFilesize:g,parallelUploads:m,clickable:n,previewTemplate:"
    ",addRemoveLinks:!1,autoProcessQueue:!0})}catch(e){return void console.error("[Filer Upload] Failed to create Dropzone instance:",e)}E.on("addedfile",n=>{Cl.mediator.remove("filer-upload-in-progress",w),Cl.mediator.publish("filer-upload-in-progress"),e++,t=E.files.length,h&&h.classList.remove(v),o&&o.classList.add(v),d&&d.classList.add(v),s&&s.classList.remove(v),p&&p.classList.remove(v),f&&f.classList.add(v),b()}),E.on("uploadprogress",(e,t)=>{const n=Math.round(t),r=`file-${encodeURIComponent(e.name)}${e.size}${e.lastModified}`,i=document.getElementById(r);let o;if(i){const e=i.querySelector(u);e&&(e.style.width=`${n}%`)}else if(a){o=a.cloneNode(!0);const t=o.querySelector(".js-filer-dropzone-file-name");t&&(t.textContent=e.name);const i=o.querySelector(u);i&&(i.style.width=`${n}%`),o.classList.remove(v),o.setAttribute("id",r),s&&s.appendChild(o)}}),E.on("success",(n,r)=>{const i=`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}`,s=document.getElementById(i);s&&s.remove(),r.error&&(y=!0,window.filerShowError(`${n.name}: ${r.error}`)),e--,b(),0===e&&(t=1,o&&o.classList.add(v),c&&c.classList.add(v),f&&f.classList.add(v),p&&p.classList.add(v),d&&d.classList.remove(v),y?setTimeout(x,1e3):x())}),E.on("error",(n,r)=>{const i=`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}`,s=document.getElementById(i);s&&s.remove(),y=!0,window.filerShowError(`${n.name}: ${r}`),e--,b(),0===e&&(t=1,o&&o.classList.add(v),c&&c.classList.add(v),f&&f.classList.add(v),p&&p.classList.add(v),d&&d.classList.remove(v),setTimeout(x,1e3))}),p&&p.addEventListener("click",e=>{e.preventDefault(),p.classList.add(v),c&&c.classList.add(v),s&&s.classList.add(v),f&&f.classList.remove(v),setTimeout(()=>{window.location.reload()},1e3)}),r&&Cl.filerTooltip&&Cl.filerTooltip(),document.dispatchEvent(new Event("filer-upload-scripts-executed"))}),l()&&(l().autoDiscover=!1),document.addEventListener("DOMContentLoaded",()=>{const e=".js-img-preview",t=".js-filer-dropzone",n=document.querySelectorAll(t),r=".js-filer-dropzone-progress",i=".js-img-wrapper",o="hidden",s="filer-dropzone-mobile",a="js-object-attached",c=e=>{e.offsetWidth<500?e.classList.add(s):e.classList.remove(s)},u=e=>{try{window.parent.CMS.API.Messages.open({message:e})}catch{window.filerShowError?window.filerShowError(e):alert(e)}},d=function(t){const n=t.dataset.url,s=t.querySelector(".vForeignKeyRawIdAdminField"),d="image"===s?.getAttribute("name"),f=t.querySelector(".js-related-lookup"),p=t.querySelector(".js-related-edit"),h=t.querySelector(".js-filer-dropzone-message"),v=t.querySelector(".filerClearer"),m=t.querySelector(".js-file-selector");t.dropzone||(window.addEventListener("resize",()=>{c(t)}),new(l())(t,{url:n,paramName:"file",maxFiles:1,maxFilesize:t.dataset.maxFilesize,previewTemplate:document.querySelector(".js-filer-dropzone-template")?.innerHTML||"
    ",clickable:!1,addRemoveLinks:!1,init:function(){c(t),this.on("removedfile",()=>{m&&(m.style.display=""),t.classList.remove(a),this.removeAllFiles(),v?.click()}),this.element.querySelectorAll("img").forEach(e=>{e.addEventListener("dragstart",e=>{e.preventDefault()})}),v&&v.addEventListener("click",()=>{t.classList.remove(a)})},maxfilesexceeded:function(){this.removeAllFiles(!0)},drop:function(){this.removeAllFiles(!0),v?.click();const e=t.querySelector(r);e&&e.classList.remove(o),m&&(m.style.display="block"),f?.classList.add("related-lookup-change"),p?.classList.add("related-lookup-change"),h?.classList.add(o),t.classList.remove("dz-drag-hover"),t.classList.add(a)},success:function(n,a){const l=t.querySelector(r);if(l&&l.classList.add(o),n&&"success"===n.status&&a){if(a.file_id&&s){s.value=a.file_id;const e=new Event("change",{bubbles:!0});s.dispatchEvent(e)}if(a.thumbnail_180&&d){const n=t.querySelector(e);n&&(n.style.backgroundImage=`url(${a.thumbnail_180})`);const r=t.querySelector(i);r&&r.classList.remove(o)}}else a&&a.error&&u(`${n.name}: ${a.error}`),this.removeAllFiles(!0);this.element.querySelectorAll("img").forEach(e=>{e.addEventListener("dragstart",e=>{e.preventDefault()})})},error:function(e,t,n){n&&n.error&&(t+=` ; ${n.error}`),u(`${e.name}: ${t}`),this.removeAllFiles(!0)},reset:function(){if(d){const n=t.querySelector(i);n&&n.classList.add(o);const r=t.querySelector(e);r&&(r.style.backgroundImage="none")}if(t.classList.remove(a),s&&(s.value=""),f?.classList.remove("related-lookup-change"),p?.classList.remove("related-lookup-change"),h?.classList.remove(o),s){const e=new Event("change",{bubbles:!0});s.dispatchEvent(e)}}}))};n.length&&l()&&(window.filerDropzoneInitialized||(window.filerDropzoneInitialized=!0,l().autoDiscover=!1),n.forEach(d),document.addEventListener("formset:added",e=>{let n,r,i;e.detail&&e.detail.formsetName?(r=parseInt(document.getElementById(`id_${e.detail.formsetName}-TOTAL_FORMS`).value,10)-1,i=document.getElementById(`${e.detail.formsetName}-${r}`),n=i?.querySelectorAll(t)||[]):(i=e.target,n=i?.querySelectorAll(t)||[]),n?.forEach(d)}))}),document.addEventListener("DOMContentLoaded",()=>{let e=0,t=0;const n=[],r=document.querySelector(".js-filer-dropzone-base"),i=".js-filer-dropzone";let o;const s=document.querySelector(".js-filer-dropzone-info-message"),a=document.querySelector(".js-filer-dropzone-folder-name"),c=document.querySelector(".js-filer-dropzone-upload-info-container"),u=document.querySelector(".js-filer-dropzone-upload-info"),d=document.querySelector(".js-filer-dropzone-upload-welcome"),f=document.querySelector(".js-filer-dropzone-upload-number"),p=document.querySelector(".js-filer-upload-count"),h=document.querySelector(".js-filer-upload-text"),v=".js-filer-dropzone-progress",m=document.querySelector(".js-filer-dropzone-upload-success"),g=document.querySelector(".js-filer-dropzone-upload-canceled"),y=document.querySelector(".js-filer-dropzone-cancel"),b="dz-drag-hover",w=document.querySelector(".drag-hover-border"),x="hidden";let E,S,k,L=!1;const A=()=>{const e=window.location.toString();window.location.replace(((e,t,n)=>{const r=new RegExp(`([?&])${t}=.*?(&|$)`,"i"),i=-1!==e.indexOf("?")?"&":"?",o=window.location.hash;return(e=e.replace(/#.*$/,"")).match(r)?e.replace(r,`$1${t}=${n}$2`)+o:e+i+t+"="+n+o})(e,"order_by","-modified_at"))},C=()=>{f&&(f.textContent=`${t-e}/${t}`),h&&h.classList.remove("hidden"),p&&p.classList.remove("hidden")},_=()=>{n.forEach(e=>{e.destroy()})},F=(e,t)=>document.getElementById(`file-${encodeURIComponent(e.name)}${e.size}${e.lastModified}${t}`);if(r){S=r.dataset.url,k=r.dataset.folderName;const e=document.body;e.dataset.url=S,e.dataset.folderName=k,e.dataset.maxFiles=r.dataset.maxFiles,e.dataset.maxFilesize=r.dataset.maxFiles,e.classList.add("js-filer-dropzone")}Cl.mediator.subscribe("filer-upload-in-progress",_),o=document.querySelectorAll(i),o.length&&l()&&(l().autoDiscover=!1,o.forEach(r=>{if(r.dropzone)return;const p=r.dataset.url,h=new(l())(r,{url:p,paramName:"file",maxFiles:parseInt(r.dataset.maxFiles)||100,maxFilesize:parseInt(r.dataset.maxFilesize),previewTemplate:"
    ",clickable:!1,addRemoveLinks:!1,parallelUploads:r.dataset["max-uploader-connections"]||3,accept:(n,r)=>{let i;if(console.log("[Filer DnD] accept:",n.name,"url:",p),Cl.mediator.remove("filer-upload-in-progress",_),Cl.mediator.publish("filer-upload-in-progress"),clearTimeout(E),clearTimeout(E),d&&d.classList.add(x),y&&y.classList.remove(x),F(n,p))r("duplicate");else{i=u.cloneNode(!0);const o=i.querySelector(".js-filer-dropzone-file-name");o&&(o.textContent=n.name);const s=i.querySelector(v);s&&(s.style.width="0"),i.setAttribute("id",`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}${p}`),c&&c.appendChild(i),e++,t++,console.log("[Filer DnD] file accepted, submitNum:",e,"maxSubmitNum:",t),C(),r()}o.forEach(e=>e.classList.remove("reset-hover")),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b))},dragover:e=>{const t=e.target.closest(i),n=t?.dataset.folderName,l=r.classList.contains("js-filer-dropzone-folder"),c=r.getBoundingClientRect(),u=w?window.getComputedStyle(w):null,d=u?u.borderTopWidth:"0px",f=u?u.borderLeftWidth:"0px",p={top:`${c.top}px`,bottom:`${c.bottom}px`,left:`${c.left}px`,right:`${c.right}px`,width:c.width-2*parseInt(f,10)+"px",height:c.height-2*parseInt(d,10)+"px",display:"block"};l&&w&&Object.assign(w.style,p),o.forEach(e=>e.classList.add("reset-hover")),m&&m.classList.add(x),s&&s.classList.remove(x),r.classList.add(b),r.classList.remove("reset-hover"),a&&n&&(a.textContent=n)},dragend:()=>{clearTimeout(E),E=setTimeout(()=>{s&&s.classList.add(x)},1e3),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b)),w&&Object.assign(w.style,{top:"0",bottom:"0",width:"0",height:"0"})},dragleave:()=>{clearTimeout(E),E=setTimeout(()=>{s&&s.classList.add(x)},1e3),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b)),w&&Object.assign(w.style,{top:"0",bottom:"0",width:"0",height:"0"})},sending:e=>{const t=F(e,p);t&&t.classList.remove(x)},uploadprogress:(e,t)=>{const n=F(e,p);if(n){const e=n.querySelector(v);e&&(e.style.width=`${t}%`)}},success:(t,n)=>{e--,console.log("[Filer DnD] success:",t.name,"submitNum:",e,"response:",n),C();const r=F(t,p);r&&r.remove()},queuecomplete:()=>{console.log("[Filer DnD] queuecomplete: submitNum:",e,"hasErrors:",L),0===e?(C(),y&&y.classList.add(x),u&&u.classList.add(x),L?(f&&f.classList.add(x),console.log("[Filer DnD] reloading after errors (1s delay)"),setTimeout(()=>{A()},1e3)):(m&&m.classList.remove(x),console.log("[Filer DnD] reloading now via reloadOrdered"),A())):console.warn("[Filer DnD] queuecomplete: submitNum is not 0, skipping reload")},error:(t,n)=>{if(console.error("[Filer DnD] error:",t.name,"error:",n,"submitNum:",e),"duplicate"===n)return void console.log("[Filer DnD] duplicate file, ignoring");e--,console.log("[Filer DnD] after error decrement, submitNum:",e),C();const r=F(t,p);r&&r.remove(),L=!0,window.filerShowError&&window.filerShowError(`${t.name}: ${n.message||n}`)}});n.push(h),y&&y.addEventListener("click",e=>{e.preventDefault(),y.classList.add(x),g&&g.classList.remove(x),h.removeAllFiles(!0)})}))}),n(117),n(221),n(472),n(902),n(577),window.Cl=window.Cl||{},Cl.mediator=new(t()),Cl.FocalPoint=r.A,Cl.Toggler=s,document.addEventListener("DOMContentLoaded",()=>{let e;window.filerShowError=t=>{const n=document.querySelector(".messagelist"),r=document.querySelector("#header"),i="js-filer-error",o=`
    • {msg}
    `.replace("{msg}",t);n?n.outerHTML=o:r&&r.insertAdjacentHTML("afterend",o),e&&clearTimeout(e),e=setTimeout(()=>{const e=document.querySelector(`.${i}`);e&&e.remove()},5e3)};const t=document.querySelector(".js-filter-files");t&&(t.addEventListener("focus",e=>{const t=e.target.closest(".navigator-top-nav");t&&t.classList.add("search-is-focused")}),t.addEventListener("blur",e=>{const t=e.target.closest(".navigator-top-nav");if(t){const n=t.querySelector(".dropdown-container a");n&&e.relatedTarget===n||t.classList.remove("search-is-focused")}}));const n=document.querySelector(".js-filter-files-container");n&&n.addEventListener("submit",e=>{}),(()=>{const e=document.querySelector(".js-filter-files"),t=".navigator-top-nav",n=document.querySelector(t),r=n?.querySelector(".filter-search-wrapper .filer-dropdown-container");e&&(e.addEventListener("keydown",function(e){e.key;const n=this.closest(t);n&&n.classList.add("search-is-focused")}),r&&(r.addEventListener("show.bs.filer-dropdown",()=>{n&&n.classList.add("search-is-focused")}),r.addEventListener("hide.bs.filer-dropdown",()=>{n&&n.classList.remove("search-is-focused")})))})(),(()=>{const e=document.querySelectorAll(".navigator-table tr, .navigator-list .list-item"),t=document.querySelector(".actions-wrapper"),n=document.querySelectorAll(".action-select, #action-toggle, #files-action-toggle, #folders-action-toggle, .actions .clear a");setTimeout(()=>{n.forEach(e=>{if(e.checked){const t=e.closest(".list-item");t&&t.classList.add("selected")}}),Array.from(e).some(e=>e.classList.contains("selected"))&&t&&t.classList.add("action-selected")},100),n.forEach(n=>{n.addEventListener("change",function(){const n=this.closest(".list-item");n&&(this.checked?n.classList.add("selected"):n.classList.remove("selected")),setTimeout(()=>{const n=Array.from(e).some(e=>e.classList.contains("selected"));t&&(n?t.classList.add("action-selected"):t.classList.remove("action-selected"))},0)})})})(),(()=>{const e=document.querySelector(".js-actions-menu");if(!e)return;const t=e.querySelector(".filer-dropdown-menu"),n=document.querySelector('.actions select[name="action"]'),r=n?.querySelectorAll("option")||[],i=document.querySelector('.actions button[type="submit"]'),o=document.querySelector(".js-action-delete"),s=document.querySelector(".js-action-copy"),a=document.querySelector(".js-action-move"),l="delete_files_or_folders",c="copy_files_and_folders",u="move_files_and_folders",d=document.querySelectorAll(".navigator-table tr, .navigator-list .list-item"),f=(e,t)=>{t&&r.forEach(r=>{r.value===e&&(t.style.display="",t.addEventListener("click",t=>{if(t.preventDefault(),Array.from(d).some(e=>e.classList.contains("selected"))&&n&&i){n.value=e;const t=n.querySelector(`option[value="${e}"]`);t&&(t.selected=!0),i.click()}}))})};f(l,o),f(c,s),f(u,a),r.forEach((e,n)=>{if(0!==n){const n=document.createElement("li"),r=document.createElement("a");r.href="#",r.textContent=e.textContent,e.value!==l&&e.value!==c&&e.value!==u||r.classList.add("hidden"),n.appendChild(r),t&&t.appendChild(n)}}),t&&t.addEventListener("click",e=>{if("A"===e.target.tagName){const r=e.target.closest("li"),o=Array.from(t.querySelectorAll("li")).indexOf(r)+1;if(e.preventDefault(),n&&i){const e=n.querySelectorAll("option");e[o]&&(n.value=e[o].value,e[o].selected=!0),i.click()}}}),e.addEventListener("click",e=>{Array.from(d).some(e=>e.classList.contains("selected"))||(e.preventDefault(),e.stopPropagation())})})(),(()=>{const e=document.querySelector(".navigator-top-nav");if(!e)return;const t=document.querySelector(".breadcrumbs-container");if(!t)return;const n=t.querySelector(".navigator-breadcrumbs"),r=t.querySelector(".filer-dropdown-container"),i=document.querySelector(".filter-files-container"),o=document.querySelector(".actions-wrapper"),s=document.querySelector(".navigator-button-wrapper"),a=n?.offsetWidth||0,l=r?.offsetWidth||0,c=i?.offsetWidth||0,u=o?.offsetWidth||0,d=s?.offsetWidth||0,f=window.getComputedStyle(e),p=parseInt(f.paddingLeft,10)+parseInt(f.paddingRight,10);let h=e.offsetWidth;const v=80+a+l+c+u+d+p,m="breadcrumb-min-width",g=()=>{h{h=e.offsetWidth,g()})})(),(()=>{const e=document.querySelectorAll(".navigator-list .list-item input.action-select"),t=".navigator-list .navigator-folders-body .list-item input.action-select",n=".navigator-list .navigator-files-body .list-item input.action-select",r=document.querySelector("#files-action-toggle"),i=document.querySelector("#folders-action-toggle");i&&i.addEventListener("click",function(){const e=document.querySelectorAll(t);this.checked?e.forEach(e=>{e.checked||e.click()}):e.forEach(e=>{e.checked&&e.click()})}),r&&r.addEventListener("click",function(){const e=document.querySelectorAll(n);this.checked?e.forEach(e=>{e.checked||e.click()}):e.forEach(e=>{e.checked&&e.click()})}),e.forEach(e=>{e.addEventListener("click",function(){const e=document.querySelectorAll(n),o=document.querySelectorAll(t);if(this.checked){const t=Array.from(e).every(e=>e.checked),n=Array.from(o).every(e=>e.checked);t&&r&&(r.checked=!0),n&&i&&(i.checked=!0)}else{const t=Array.from(e).some(e=>!e.checked),n=Array.from(o).some(e=>!e.checked);t&&r&&(r.checked=!1),n&&i&&(i.checked=!1)}})});const o=document.querySelector(".navigator .actions .clear a");o&&o.addEventListener("click",()=>{i&&(i.checked=!1),r&&(r.checked=!1)})})(),document.querySelectorAll(".js-copy-url").forEach(e=>{e.addEventListener("click",function(e){const t=new URL(this.dataset.url,document.location.href),n=this.dataset.msg||"URL copied to clipboard",r=document.createElement("template");e.preventDefault(),document.querySelectorAll(".info.filer-tooltip").forEach(e=>{e.remove()}),navigator.clipboard.writeText(t.href),r.innerHTML=`
    ${n}
    `,this.classList.add("filer-tooltip-wrapper"),this.appendChild(r.content.firstChild);const i=this;setTimeout(()=>{const e=i.querySelector(".info");e&&e.remove()},1200)})}),(new r.A).initialize(),new s})})()})(); \ No newline at end of file From 5964cd52e48d2d99ad295a54961b4e99a2368a57 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Tue, 9 Jun 2026 15:33:01 +0300 Subject: [PATCH 691/715] BEN-2954: test --- filer/admin/folderadmin.py | 30 +- .../static/filer/js/addons/table-dropzone.js | 11 + .../static/filer/js/dist/filer-base.bundle.js | 264 +++++++++++++++++- 3 files changed, 288 insertions(+), 17 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 422757cc3..916a55e49 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -703,7 +703,7 @@ def response_action(self, request, files_queryset, folders_queryset): action = action_form.cleaned_data['action'] select_across = action_form.cleaned_data['select_across'] func, name, description = self.get_actions(request)[action] - logger.debug("[Action] Dispatching action=%s, func=%s", action, func.__name__) + logger.warning("[Action] Dispatching action=%s, func=%s", action, func.__name__) # Get the list of selected PKs. If nothing's selected, we can't # perform an action on it, so bail. Except we want to perform @@ -731,10 +731,10 @@ def response_action(self, request, files_queryset, folders_queryset): files_queryset = files_queryset.filter(pk__in=selected_files) folders_queryset = folders_queryset.filter( pk__in=selected_folders) - logger.debug("[Action] selected_files=%s, selected_folders=%s", + logger.warning("[Action] selected_files=%s, selected_folders=%s", selected_files, selected_folders) - logger.debug("[Action] Calling %s with files_qs count=%d, folders_qs count=%d", + logger.warning("[Action] Calling %s with files_qs count=%d, folders_qs count=%d", name, files_queryset.count(), folders_queryset.count()) response = func(self, request, files_queryset, folders_queryset) @@ -1251,17 +1251,17 @@ def rename_files(self, request, files_queryset, folders_queryset): def extract_files(self, request, files_queryset, folders_queryset): if request.method != 'POST': - logger.debug("[Extract] Skipping: request.method=%s (not POST)", request.method) + logger.warning("[Extract] Skipping: request.method=%s (not POST)", request.method) return None from ..models import Archive success_format = "Successfully extracted archive {}." - logger.debug("[Extract] Starting extract_files action") - logger.debug("[Extract] files_queryset count=%d, pks=%s", + logger.warning("[Extract] Starting extract_files action") + logger.warning("[Extract] files_queryset count=%d, pks=%s", files_queryset.count(), list(files_queryset.values_list('pk', flat=True))) - logger.debug("[Extract] files in queryset: %s", + logger.warning("[Extract] files in queryset: %s", list(files_queryset.values_list('pk', 'original_filename', 'file', 'polymorphic_ctype_id'))) # Filter by zip file extension rather than polymorphic_ctype, @@ -1274,7 +1274,7 @@ def extract_files(self, request, files_queryset, folders_queryset): extension_filter |= Q(file__iendswith=ext) files_queryset = files_queryset.filter(extension_filter) - logger.debug("[Extract] After extension filter: count=%d, pks=%s", + logger.warning("[Extract] After extension filter: count=%d, pks=%s", files_queryset.count(), list(files_queryset.values_list('pk', 'original_filename', 'file'))) @@ -1297,9 +1297,9 @@ def extract_files(self, request, files_queryset, folders_queryset): def _as_archive(filer_file): """Convert a File instance to Archive so extract methods work.""" if isinstance(filer_file, Archive): - logger.debug("[Extract] File pk=%s is already an Archive instance", filer_file.pk) + logger.warning("[Extract] File pk=%s is already an Archive instance", filer_file.pk) return filer_file - logger.debug("[Extract] Converting File pk=%s (%s) to Archive instance " + logger.warning("[Extract] Converting File pk=%s (%s) to Archive instance " "(polymorphic_ctype=%s)", filer_file.pk, filer_file.original_filename, filer_file.polymorphic_ctype) @@ -1310,7 +1310,7 @@ def _as_archive(filer_file): def is_valid_archive(filer_file): is_valid = filer_file.is_valid() - logger.debug("[Extract] is_valid_archive pk=%s: %s", filer_file.pk, is_valid) + logger.warning("[Extract] is_valid_archive pk=%s: %s", filer_file.pk, is_valid) if not is_valid: error_format = "{} is not a valid zip file" message = error_format.format(filer_file.clean_actual_name) @@ -1319,7 +1319,7 @@ def is_valid_archive(filer_file): def has_collisions(filer_file): collisions = filer_file.collisions() - logger.debug("[Extract] has_collisions pk=%s: %s", filer_file.pk, collisions) + logger.warning("[Extract] has_collisions pk=%s: %s", filer_file.pk, collisions) if collisions: error_format = "Files/Folders from {archive} with names:" error_format += "{names} already exist." @@ -1335,13 +1335,13 @@ def has_collisions(filer_file): for f in files_queryset: f = _as_archive(f) if not is_valid_archive(f) or has_collisions(f): - logger.debug("[Extract] Skipping file pk=%s (invalid or collisions)", f.pk) + logger.warning("[Extract] Skipping file pk=%s (invalid or collisions)", f.pk) continue - logger.debug("[Extract] Extracting file pk=%s (%s)", f.pk, f.original_filename) + logger.warning("[Extract] Extracting file pk=%s (%s)", f.pk, f.original_filename) try: f.extract() message = success_format.format(f.actual_name) - logger.info("[Extract] Success: %s", message) + logger.warning("[Extract] Success: %s", message) self.message_user(request, _(message)) for err_msg in f.extract_errors: logger.warning("[Extract] Extract warning for %s: %s", f.actual_name, err_msg) diff --git a/filer/static/filer/js/addons/table-dropzone.js b/filer/static/filer/js/addons/table-dropzone.js index d2ffc7ba4..c031213b2 100644 --- a/filer/static/filer/js/addons/table-dropzone.js +++ b/filer/static/filer/js/addons/table-dropzone.js @@ -88,19 +88,27 @@ document.addEventListener('DOMContentLoaded', () => { body.dataset.maxFiles = dropzoneBase.dataset.maxFiles; body.dataset.maxFilesize = dropzoneBase.dataset.maxFiles; body.classList.add('js-filer-dropzone'); + console.log('[Filer DnD] dropzoneBase found, url:', baseUrl, 'folder:', baseFolderTitle); + } else { + console.log('[Filer DnD] No .js-filer-dropzone-base element found on page'); } Cl.mediator.subscribe('filer-upload-in-progress', destroyDropzones); dropzones = document.querySelectorAll(dropzoneSelector); + console.log('[Filer DnD] Found', dropzones.length, 'dropzone elements (.js-filer-dropzone)'); if (dropzones.length && Dropzone) { Dropzone.autoDiscover = false; dropzones.forEach((dropzoneElement) => { if (dropzoneElement.dropzone) { + console.log('[Filer DnD] Skipping element (already has dropzone):', dropzoneElement.tagName, dropzoneElement.className); return; } const dropzoneUrl = dropzoneElement.dataset.url; + console.log('[Filer DnD] Creating Dropzone instance for', dropzoneElement.tagName, + 'url:', dropzoneUrl, 'maxFiles:', dropzoneElement.dataset.maxFiles, + 'maxFilesize:', dropzoneElement.dataset.maxFilesize); const dropzoneInstance = new Dropzone(dropzoneElement, { url: dropzoneUrl, paramName: 'file', @@ -228,6 +236,7 @@ document.addEventListener('DOMContentLoaded', () => { } }, sending: (file) => { + console.log('[Filer DnD] sending:', file.name, 'to:', dropzoneUrl); const fileEl = getElementByFile(file, dropzoneUrl); if (fileEl) { fileEl.classList.remove(hiddenClass); @@ -315,5 +324,7 @@ document.addEventListener('DOMContentLoaded', () => { }); } }); + } else { + console.warn('[Filer DnD] No dropzone instances created. dropzones.length:', dropzones.length, 'Dropzone:', !!Dropzone); } }); diff --git a/filer/static/filer/js/dist/filer-base.bundle.js b/filer/static/filer/js/dist/filer-base.bundle.js index ba08a6131..f5ed60fd6 100644 --- a/filer/static/filer/js/dist/filer-base.bundle.js +++ b/filer/static/filer/js/dist/filer-base.bundle.js @@ -1,2 +1,262 @@ -/*! For license information please see filer-base.bundle.js.LICENSE.txt */ -(()=>{var e={117(){"use strict";document.addEventListener("DOMContentLoaded",()=>{const e=document.getElementById("destination");if(!e)return;const t=e.querySelectorAll("option"),n=t.length,r=document.querySelector(".js-submit-copy-move"),i=document.querySelector(".js-disabled-btn-tooltip");1===n&&t[0].disabled&&(r&&(r.style.display="none"),i&&(i.style.display="inline-block")),Cl.filerTooltip&&Cl.filerTooltip()})},413(){"use strict";(()=>{const e="filer-dropdown-backdrop",t='[data-toggle="filer-dropdown"]';class n{constructor(e){this.element=e,e.addEventListener("click",()=>this.toggle())}toggle(){const t=this.element,n=r(t),o=n.classList.contains("open"),s={relatedTarget:t};if(t.disabled||t.classList.contains("disabled"))return!1;if(i(),!o){if("ontouchstart"in document.documentElement&&!n.closest(".navbar-nav")){const n=document.createElement("div");n.className=e,t.parentNode.insertBefore(n,t.nextSibling),n.addEventListener("click",i)}const r=new CustomEvent("show.bs.filer-dropdown",{bubbles:!0,cancelable:!0,detail:s});if(n.dispatchEvent(r),r.defaultPrevented)return!1;t.focus(),t.setAttribute("aria-expanded","true"),n.classList.add("open");const o=new CustomEvent("shown.bs.filer-dropdown",{bubbles:!0,detail:s});n.dispatchEvent(o)}return!1}keydown(e){const n=this.element,i=r(n),o=i.classList.contains("open"),s=Array.from(i.querySelectorAll(".filer-dropdown-menu li:not(.disabled):visible a")).filter(e=>null!==e.offsetParent),a=s.indexOf(e.target);if(!/(38|40|27|32)/.test(e.which)||/input|textarea/i.test(e.target.tagName))return;if(e.preventDefault(),e.stopPropagation(),n.disabled||n.classList.contains("disabled"))return;if(!o&&27!==e.which||o&&27===e.which)return 27===e.which&&i.querySelector(t)?.focus(),n.click();if(!s.length)return;let l=a;38===e.which&&a>0&&l--,40===e.which&&ae.remove()),document.querySelectorAll(t).forEach(e=>{const t=r(e),i={relatedTarget:e};if(!t.classList.contains("open"))return;if(n&&"click"===n.type&&/input|textarea/i.test(n.target.tagName)&&t.contains(n.target))return;const o=new CustomEvent("hide.bs.filer-dropdown",{bubbles:!0,cancelable:!0,detail:i});if(t.dispatchEvent(o),o.defaultPrevented)return;e.setAttribute("aria-expanded","false"),t.classList.remove("open");const s=new CustomEvent("hidden.bs.filer-dropdown",{bubbles:!0,detail:i});t.dispatchEvent(s)}))}function o(e){return this.forEach(t=>{let r=t._filerDropdownInstance;r||(r=new n(t),t._filerDropdownInstance=r),"string"==typeof e&&r[e].call(t)}),this}NodeList.prototype.dropdown||(NodeList.prototype.dropdown=function(e){return o.call(this,e)}),HTMLCollection.prototype.dropdown||(HTMLCollection.prototype.dropdown=function(e){return o.call(this,e)}),document.addEventListener("click",i),document.addEventListener("click",e=>{e.target.closest(".filer-dropdown form")&&e.stopPropagation()}),document.addEventListener("click",e=>{const r=e.target.closest(t);if(r){const t=r._filerDropdownInstance||new n(r);r._filerDropdownInstance||(r._filerDropdownInstance=t),t.toggle(e)}}),document.addEventListener("keydown",e=>{const r=e.target.closest(t);if(r){const t=r._filerDropdownInstance||new n(r);r._filerDropdownInstance||(r._filerDropdownInstance=t),t.keydown(e)}}),document.addEventListener("keydown",e=>{const r=e.target.closest(".filer-dropdown-menu");if(r){const i=r.parentNode.querySelector(t);if(i){const t=i._filerDropdownInstance||new n(i);i._filerDropdownInstance||(i._filerDropdownInstance=t),t.keydown(e)}}}),window.FilerDropdown=n})()},577(){!function(){"use strict";const e=document.getElementById("django-admin-popup-response-constants");let t;if(e)switch(t=JSON.parse(e.dataset.popupResponse),t.action){case"change":opener.dismissRelatedImageLookupPopup(window,t.new_value,null,t.obj,null);break;case"delete":opener.dismissDeleteRelatedObjectPopup(window,t.value);break;default:opener.dismissAddRelatedObjectPopup(window,t.value,t.obj)}}()},216(e,t,n){"use strict";n.d(t,{A:()=>r}),e=n.hmd(e),window.Cl=window.Cl||{},(()=>{class t{constructor(e={}){this.options={containerSelector:".js-focal-point",imageSelector:".js-focal-point-image",circleSelector:".js-focal-point-circle",locationSelector:".js-focal-point-location",draggableClass:"draggable",hiddenClass:"hidden",dataLocation:"locationSelector",...e},this.focalPointInstances=[],this._init=this._init.bind(this)}_init(e){const t=new n(e,this.options);this.focalPointInstances.push(t)}initialize(){document.querySelectorAll(this.options.containerSelector).forEach(e=>{this._init(e)}),window.Cl.mediator&&window.Cl.mediator.subscribe("focal-point:init",this._init)}destroy(){window.Cl.mediator&&window.Cl.mediator.remove("focal-point:init",this._init),this.focalPointInstances.forEach(e=>{e.destroy()}),this.focalPointInstances=[]}}class n{constructor(e,t={}){this.options={imageSelector:".js-focal-point-image",circleSelector:".js-focal-point-circle",locationSelector:".js-focal-point-location",draggableClass:"draggable",hiddenClass:"hidden",dataLocation:"locationSelector",...t},this.container=e,this.image=this.container.querySelector(this.options.imageSelector),this.circle=this.container.querySelector(this.options.circleSelector),this.ratio=parseFloat(this.image?.dataset.ratio||1),this.location=this._getLocation(),this.isDragging=!1,this.dragStartX=0,this.dragStartY=0,this.circleStartX=0,this.circleStartY=0,this._onImageLoaded=this._onImageLoaded.bind(this),this._onMouseDown=this._onMouseDown.bind(this),this._onMouseMove=this._onMouseMove.bind(this),this._onMouseUp=this._onMouseUp.bind(this),this.image?.complete?this._onImageLoaded():this.image&&this.image.addEventListener("load",this._onImageLoaded)}_updateLocationValue(e,t){const n=`${Math.round(e*this.ratio)},${Math.round(t*this.ratio)}`;this.location&&(this.location.value=n)}_getLocation(){const e=this.container.dataset[this.options.dataLocation];if(e){const t=document.querySelector(e);if(t)return t}return this.container.querySelector(this.options.locationSelector)}_makeDraggable(){this.circle&&(this.circle.classList.add(this.options.draggableClass),this.circle.addEventListener("mousedown",this._onMouseDown),this.circle.addEventListener("touchstart",this._onMouseDown,{passive:!1}))}_onMouseDown(e){e.preventDefault(),this.isDragging=!0;const t="touchstart"===e.type?e.touches[0]:e,n=this.container.getBoundingClientRect();this.dragStartX=t.clientX-n.left,this.dragStartY=t.clientY-n.top;const r=this.circle.getBoundingClientRect();this.circleStartX=r.left-n.left+r.width/2,this.circleStartY=r.top-n.top+r.height/2,document.addEventListener("mousemove",this._onMouseMove),document.addEventListener("mouseup",this._onMouseUp),document.addEventListener("touchmove",this._onMouseMove,{passive:!1}),document.addEventListener("touchend",this._onMouseUp)}_onMouseMove(e){if(!this.isDragging)return;e.preventDefault();const t="touchmove"===e.type?e.touches[0]:e,n=this.container.getBoundingClientRect(),r=t.clientX-n.left,i=t.clientY-n.top,o=r-this.dragStartX,s=i-this.dragStartY;let a=this.circleStartX+o,l=this.circleStartY+s;a=Math.max(0,Math.min(n.width-1,a)),l=Math.max(0,Math.min(n.height-1,l)),this.circle.style.left=`${a}px`,this.circle.style.top=`${l}px`,this._updateLocationValue(a,l)}_onMouseUp(){this.isDragging=!1,document.removeEventListener("mousemove",this._onMouseMove),document.removeEventListener("mouseup",this._onMouseUp),document.removeEventListener("touchmove",this._onMouseMove),document.removeEventListener("touchend",this._onMouseUp)}_onImageLoaded(){if(!this.image||0===this.image.naturalWidth)return;this.circle?.classList.remove(this.options.hiddenClass);const e=this.location?.value||"",t=this.image.offsetWidth,n=this.image.offsetHeight;let r,i;if(e.length){const t=e.split(",");r=Math.round(Number(t[0])/this.ratio),i=Math.round(Number(t[1])/this.ratio)}else r=t/2,i=n/2;isNaN(r)||isNaN(i)||(this.circle&&(this.circle.style.left=`${r}px`,this.circle.style.top=`${i}px`),this._makeDraggable(),this._updateLocationValue(r,i))}destroy(){this.circle?.classList.contains(this.options.draggableClass)&&(this.circle.removeEventListener("mousedown",this._onMouseDown),this.circle.removeEventListener("touchstart",this._onMouseDown)),document.removeEventListener("mousemove",this._onMouseMove),document.removeEventListener("mouseup",this._onMouseUp),document.removeEventListener("touchmove",this._onMouseMove),document.removeEventListener("touchend",this._onMouseUp),this.image&&this.image.removeEventListener("load",this._onImageLoaded),this.options=null,this.container=null,this.image=null,this.circle=null,this.location=null,this.ratio=null}}window.Cl.FocalPoint=t,window.Cl.FocalPointConstructor=n,e.exports&&(e.exports=t)})();const r=window.Cl.FocalPoint},902(){"use strict";const e=e=>{const t=(e=(e=e.replace(/__dot__/g,".")).replace(/__dash__/g,"-")).lastIndexOf("__");return-1===t?e:e.substring(0,t)};window.dismissPopupAndReload=e=>{document.location.reload(),e.close()},window.dismissRelatedImageLookupPopup=(t,n,r,i,o)=>{const s=e(t.name),a=document.getElementById(s);if(!a)return;const l=a.closest(".filerFile");if(!l)return;const c=l.querySelector(".edit"),u=l.querySelector(".thumbnail_img"),d=l.querySelector(".description_text"),f=l.querySelector(".filerClearer"),p=l.parentElement.querySelector(".dz-message"),h=l.querySelector("input"),v=h.value;h.value=n;const m=h.closest(".js-filer-dropzone");m&&m.classList.add("js-object-attached"),r&&u&&(u.src=r,u.classList.remove("hidden"),u.removeAttribute("srcset")),d&&(d.textContent=i),f&&f.classList.remove("hidden"),a.classList.add("related-lookup-change"),c&&c.classList.add("related-lookup-change"),o&&c&&c.setAttribute("href",`${o}?_edit_from_widget=1`),p&&p.classList.add("hidden"),v!==n&&h.dispatchEvent(new Event("change",{bubbles:!0})),t.close()},window.dismissRelatedFolderLookupPopup=(t,n,r)=>{const i=e(t.name),o=document.getElementById(i);if(!o)return;const s=o.closest(".filerFile");if(!s)return;const a=s.querySelector(".thumbnail_img"),l=document.getElementById(`id_${i}_clear`),c=document.getElementById(`id_${i}`),u=s.querySelector(".description_text"),d=document.getElementById(i);c&&(c.value=n),a&&a.classList.remove("hidden"),u&&(u.textContent=r),l&&l.classList.remove("hidden"),d&&d.classList.add("hidden"),t.close()},document.addEventListener("DOMContentLoaded",()=>{document.querySelectorAll(".js-dismiss-popup").forEach(e=>{e.addEventListener("click",function(e){e.preventDefault();const t=this.dataset.fileId,n=this.dataset.iconUrl,r=this.dataset.label;if(this.classList.contains("js-dismiss-image")){const e=this.dataset.changeUrl||"";window.opener.dismissRelatedImageLookupPopup(window,t,n,r,e)}else this.classList.contains("js-dismiss-folder")&&window.opener.dismissRelatedFolderLookupPopup(window,t,r)})});const e=document.getElementById("popup-dismiss-data");if(e&&window.opener){const t=e.dataset.pk,n=e.dataset.label;window.opener.dismissRelatedPopup(window,t,n)}})},221(){"use strict";window.Cl=window.Cl||{},Cl.filerTooltip=()=>{const e=".js-filer-tooltip";document.querySelectorAll(e).forEach(t=>{t.addEventListener("mouseover",function(){const t=this.getAttribute("title");if(!t)return;this.dataset.filerTooltip=t,this.removeAttribute("title");const n=document.createElement("p");n.className="filer-tooltip",n.textContent=t;const r=document.querySelector(e);r&&r.appendChild(n)}),t.addEventListener("mouseout",function(){const e=this.dataset.filerTooltip;e&&this.setAttribute("title",e),document.querySelectorAll(".filer-tooltip").forEach(e=>{e.remove()})})})}},472(){"use strict";document.addEventListener("DOMContentLoaded",()=>{const e=e=>{e.preventDefault();const t=e.currentTarget,n=t.closest(".filerFile");if(!n)return;const r=n.querySelector("input"),i=n.querySelector(".thumbnail_img"),o=n.querySelector(".description_text"),s=n.querySelector(".lookup"),a=n.querySelector(".edit"),l=n.parentElement.querySelector(".dz-message"),c="hidden";if(t.classList.add(c),r&&(r.value=""),i){i.classList.add(c);var u=i.parentElement;"A"===u.tagName&&u.removeAttribute("href")}s&&s.classList.remove("related-lookup-change"),a&&a.classList.remove("related-lookup-change"),l&&l.classList.remove(c),o&&(o.textContent="")};document.querySelectorAll(".filerFile .vForeignKeyRawIdAdminField").forEach(e=>{e.setAttribute("type","hidden")}),document.querySelectorAll(".filerFile .filerClearer").forEach(t=>{t.addEventListener("click",e)})})},628(e){var t;self,t=function(){return function(){var e={3099:function(e){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},6077:function(e,t,n){var r=n(111);e.exports=function(e){if(!r(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},1223:function(e,t,n){var r=n(5112),i=n(30),o=n(3070),s=r("unscopables"),a=Array.prototype;null==a[s]&&o.f(a,s,{configurable:!0,value:i(null)}),e.exports=function(e){a[s][e]=!0}},1530:function(e,t,n){"use strict";var r=n(8710).charAt;e.exports=function(e,t,n){return t+(n?r(e,t).length:1)}},5787:function(e){e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e}},9670:function(e,t,n){var r=n(111);e.exports=function(e){if(!r(e))throw TypeError(String(e)+" is not an object");return e}},4019:function(e){e.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},260:function(e,t,n){"use strict";var r,i=n(4019),o=n(9781),s=n(7854),a=n(111),l=n(6656),c=n(648),u=n(8880),d=n(1320),f=n(3070).f,p=n(9518),h=n(7674),v=n(5112),m=n(9711),g=s.Int8Array,y=g&&g.prototype,b=s.Uint8ClampedArray,w=b&&b.prototype,x=g&&p(g),E=y&&p(y),S=Object.prototype,k=S.isPrototypeOf,L=v("toStringTag"),A=m("TYPED_ARRAY_TAG"),C=i&&!!h&&"Opera"!==c(s.opera),_=!1,F={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},T={BigInt64Array:8,BigUint64Array:8},I=function(e){if(!a(e))return!1;var t=c(e);return l(F,t)||l(T,t)};for(r in F)s[r]||(C=!1);if((!C||"function"!=typeof x||x===Function.prototype)&&(x=function(){throw TypeError("Incorrect invocation")},C))for(r in F)s[r]&&h(s[r],x);if((!C||!E||E===S)&&(E=x.prototype,C))for(r in F)s[r]&&h(s[r].prototype,E);if(C&&p(w)!==E&&h(w,E),o&&!l(E,L))for(r in _=!0,f(E,L,{get:function(){return a(this)?this[A]:void 0}}),F)s[r]&&u(s[r],A,r);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:C,TYPED_ARRAY_TAG:_&&A,aTypedArray:function(e){if(I(e))return e;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(e){if(h){if(k.call(x,e))return e}else for(var t in F)if(l(F,r)){var n=s[t];if(n&&(e===n||k.call(n,e)))return e}throw TypeError("Target is not a typed array constructor")},exportTypedArrayMethod:function(e,t,n){if(o){if(n)for(var r in F){var i=s[r];i&&l(i.prototype,e)&&delete i.prototype[e]}E[e]&&!n||d(E,e,n?t:C&&y[e]||t)}},exportTypedArrayStaticMethod:function(e,t,n){var r,i;if(o){if(h){if(n)for(r in F)(i=s[r])&&l(i,e)&&delete i[e];if(x[e]&&!n)return;try{return d(x,e,n?t:C&&g[e]||t)}catch(e){}}for(r in F)!(i=s[r])||i[e]&&!n||d(i,e,t)}},isView:function(e){if(!a(e))return!1;var t=c(e);return"DataView"===t||l(F,t)||l(T,t)},isTypedArray:I,TypedArray:x,TypedArrayPrototype:E}},3331:function(e,t,n){"use strict";var r=n(7854),i=n(9781),o=n(4019),s=n(8880),a=n(2248),l=n(7293),c=n(5787),u=n(9958),d=n(7466),f=n(7067),p=n(1179),h=n(9518),v=n(7674),m=n(8006).f,g=n(3070).f,y=n(1285),b=n(8003),w=n(9909),x=w.get,E=w.set,S="ArrayBuffer",k="DataView",L="prototype",A="Wrong index",C=r[S],_=C,F=r[k],T=F&&F[L],I=Object.prototype,M=r.RangeError,R=p.pack,z=p.unpack,q=function(e){return[255&e]},O=function(e){return[255&e,e>>8&255]},U=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},j=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},D=function(e){return R(e,23,4)},P=function(e){return R(e,52,8)},N=function(e,t){g(e[L],t,{get:function(){return x(this)[t]}})},$=function(e,t,n,r){var i=f(n),o=x(e);if(i+t>o.byteLength)throw M(A);var s=x(o.buffer).bytes,a=i+o.byteOffset,l=s.slice(a,a+t);return r?l:l.reverse()},B=function(e,t,n,r,i,o){var s=f(n),a=x(e);if(s+t>a.byteLength)throw M(A);for(var l=x(a.buffer).bytes,c=s+a.byteOffset,u=r(+i),d=0;dG;)(W=Y[G++])in _||s(_,W,C[W]);H.constructor=_}v&&h(T)!==I&&v(T,I);var Q=new F(new _(2)),X=T.setInt8;Q.setInt8(0,2147483648),Q.setInt8(1,2147483649),!Q.getInt8(0)&&Q.getInt8(1)||a(T,{setInt8:function(e,t){X.call(this,e,t<<24>>24)},setUint8:function(e,t){X.call(this,e,t<<24>>24)}},{unsafe:!0})}else _=function(e){c(this,_,S);var t=f(e);E(this,{bytes:y.call(new Array(t),0),byteLength:t}),i||(this.byteLength=t)},F=function(e,t,n){c(this,F,k),c(e,_,k);var r=x(e).byteLength,o=u(t);if(o<0||o>r)throw M("Wrong offset");if(o+(n=void 0===n?r-o:d(n))>r)throw M("Wrong length");E(this,{buffer:e,byteLength:n,byteOffset:o}),i||(this.buffer=e,this.byteLength=n,this.byteOffset=o)},i&&(N(_,"byteLength"),N(F,"buffer"),N(F,"byteLength"),N(F,"byteOffset")),a(F[L],{getInt8:function(e){return $(this,1,e)[0]<<24>>24},getUint8:function(e){return $(this,1,e)[0]},getInt16:function(e){var t=$(this,2,e,arguments.length>1?arguments[1]:void 0);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=$(this,2,e,arguments.length>1?arguments[1]:void 0);return t[1]<<8|t[0]},getInt32:function(e){return j($(this,4,e,arguments.length>1?arguments[1]:void 0))},getUint32:function(e){return j($(this,4,e,arguments.length>1?arguments[1]:void 0))>>>0},getFloat32:function(e){return z($(this,4,e,arguments.length>1?arguments[1]:void 0),23)},getFloat64:function(e){return z($(this,8,e,arguments.length>1?arguments[1]:void 0),52)},setInt8:function(e,t){B(this,1,e,q,t)},setUint8:function(e,t){B(this,1,e,q,t)},setInt16:function(e,t){B(this,2,e,O,t,arguments.length>2?arguments[2]:void 0)},setUint16:function(e,t){B(this,2,e,O,t,arguments.length>2?arguments[2]:void 0)},setInt32:function(e,t){B(this,4,e,U,t,arguments.length>2?arguments[2]:void 0)},setUint32:function(e,t){B(this,4,e,U,t,arguments.length>2?arguments[2]:void 0)},setFloat32:function(e,t){B(this,4,e,D,t,arguments.length>2?arguments[2]:void 0)},setFloat64:function(e,t){B(this,8,e,P,t,arguments.length>2?arguments[2]:void 0)}});b(_,S),b(F,k),e.exports={ArrayBuffer:_,DataView:F}},1048:function(e,t,n){"use strict";var r=n(7908),i=n(1400),o=n(7466),s=Math.min;e.exports=[].copyWithin||function(e,t){var n=r(this),a=o(n.length),l=i(e,a),c=i(t,a),u=arguments.length>2?arguments[2]:void 0,d=s((void 0===u?a:i(u,a))-c,a-l),f=1;for(c0;)c in n?n[l]=n[c]:delete n[l],l+=f,c+=f;return n}},1285:function(e,t,n){"use strict";var r=n(7908),i=n(1400),o=n(7466);e.exports=function(e){for(var t=r(this),n=o(t.length),s=arguments.length,a=i(s>1?arguments[1]:void 0,n),l=s>2?arguments[2]:void 0,c=void 0===l?n:i(l,n);c>a;)t[a++]=e;return t}},8533:function(e,t,n){"use strict";var r=n(2092).forEach,i=n(9341)("forEach");e.exports=i?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}},8457:function(e,t,n){"use strict";var r=n(9974),i=n(7908),o=n(3411),s=n(7659),a=n(7466),l=n(6135),c=n(1246);e.exports=function(e){var t,n,u,d,f,p,h=i(e),v="function"==typeof this?this:Array,m=arguments.length,g=m>1?arguments[1]:void 0,y=void 0!==g,b=c(h),w=0;if(y&&(g=r(g,m>2?arguments[2]:void 0,2)),null==b||v==Array&&s(b))for(n=new v(t=a(h.length));t>w;w++)p=y?g(h[w],w):h[w],l(n,w,p);else for(f=(d=b.call(h)).next,n=new v;!(u=f.call(d)).done;w++)p=y?o(d,g,[u.value,w],!0):u.value,l(n,w,p);return n.length=w,n}},1318:function(e,t,n){var r=n(5656),i=n(7466),o=n(1400),s=function(e){return function(t,n,s){var a,l=r(t),c=i(l.length),u=o(s,c);if(e&&n!=n){for(;c>u;)if((a=l[u++])!=a)return!0}else for(;c>u;u++)if((e||u in l)&&l[u]===n)return e||u||0;return!e&&-1}};e.exports={includes:s(!0),indexOf:s(!1)}},2092:function(e,t,n){var r=n(9974),i=n(8361),o=n(7908),s=n(7466),a=n(5417),l=[].push,c=function(e){var t=1==e,n=2==e,c=3==e,u=4==e,d=6==e,f=7==e,p=5==e||d;return function(h,v,m,g){for(var y,b,w=o(h),x=i(w),E=r(v,m,3),S=s(x.length),k=0,L=g||a,A=t?L(h,S):n||f?L(h,0):void 0;S>k;k++)if((p||k in x)&&(b=E(y=x[k],k,w),e))if(t)A[k]=b;else if(b)switch(e){case 3:return!0;case 5:return y;case 6:return k;case 2:l.call(A,y)}else switch(e){case 4:return!1;case 7:l.call(A,y)}return d?-1:c||u?u:A}};e.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterOut:c(7)}},6583:function(e,t,n){"use strict";var r=n(5656),i=n(9958),o=n(7466),s=n(9341),a=Math.min,l=[].lastIndexOf,c=!!l&&1/[1].lastIndexOf(1,-0)<0,u=s("lastIndexOf"),d=c||!u;e.exports=d?function(e){if(c)return l.apply(this,arguments)||0;var t=r(this),n=o(t.length),s=n-1;for(arguments.length>1&&(s=a(s,i(arguments[1]))),s<0&&(s=n+s);s>=0;s--)if(s in t&&t[s]===e)return s||0;return-1}:l},1194:function(e,t,n){var r=n(7293),i=n(5112),o=n(7392),s=i("species");e.exports=function(e){return o>=51||!r(function(){var t=[];return(t.constructor={})[s]=function(){return{foo:1}},1!==t[e](Boolean).foo})}},9341:function(e,t,n){"use strict";var r=n(7293);e.exports=function(e,t){var n=[][e];return!!n&&r(function(){n.call(null,t||function(){throw 1},1)})}},3671:function(e,t,n){var r=n(3099),i=n(7908),o=n(8361),s=n(7466),a=function(e){return function(t,n,a,l){r(n);var c=i(t),u=o(c),d=s(c.length),f=e?d-1:0,p=e?-1:1;if(a<2)for(;;){if(f in u){l=u[f],f+=p;break}if(f+=p,e?f<0:d<=f)throw TypeError("Reduce of empty array with no initial value")}for(;e?f>=0:d>f;f+=p)f in u&&(l=n(l,u[f],f,c));return l}};e.exports={left:a(!1),right:a(!0)}},5417:function(e,t,n){var r=n(111),i=n(3157),o=n(5112)("species");e.exports=function(e,t){var n;return i(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!i(n.prototype)?r(n)&&null===(n=n[o])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)}},3411:function(e,t,n){var r=n(9670),i=n(9212);e.exports=function(e,t,n,o){try{return o?t(r(n)[0],n[1]):t(n)}catch(t){throw i(e),t}}},7072:function(e,t,n){var r=n(5112)("iterator"),i=!1;try{var o=0,s={next:function(){return{done:!!o++}},return:function(){i=!0}};s[r]=function(){return this},Array.from(s,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var n=!1;try{var o={};o[r]=function(){return{next:function(){return{done:n=!0}}}},e(o)}catch(e){}return n}},4326:function(e){var t={}.toString;e.exports=function(e){return t.call(e).slice(8,-1)}},648:function(e,t,n){var r=n(1694),i=n(4326),o=n(5112)("toStringTag"),s="Arguments"==i(function(){return arguments}());e.exports=r?i:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),o))?n:s?i(t):"Object"==(r=i(t))&&"function"==typeof t.callee?"Arguments":r}},9920:function(e,t,n){var r=n(6656),i=n(3887),o=n(1236),s=n(3070);e.exports=function(e,t){for(var n=i(t),a=s.f,l=o.f,c=0;c=74)&&(r=s.match(/Chrome\/(\d+)/))&&(i=r[1]),e.exports=i&&+i},748:function(e){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},2109:function(e,t,n){var r=n(7854),i=n(1236).f,o=n(8880),s=n(1320),a=n(3505),l=n(9920),c=n(4705);e.exports=function(e,t){var n,u,d,f,p,h=e.target,v=e.global,m=e.stat;if(n=v?r:m?r[h]||a(h,{}):(r[h]||{}).prototype)for(u in t){if(f=t[u],d=e.noTargetGet?(p=i(n,u))&&p.value:n[u],!c(v?u:h+(m?".":"#")+u,e.forced)&&void 0!==d){if(typeof f==typeof d)continue;l(f,d)}(e.sham||d&&d.sham)&&o(f,"sham",!0),s(n,u,f,e)}}},7293:function(e){e.exports=function(e){try{return!!e()}catch(e){return!0}}},7007:function(e,t,n){"use strict";n(4916);var r=n(1320),i=n(7293),o=n(5112),s=n(2261),a=n(8880),l=o("species"),c=!i(function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")}),u="$0"==="a".replace(/./,"$0"),d=o("replace"),f=!!/./[d]&&""===/./[d]("a","$0"),p=!i(function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]});e.exports=function(e,t,n,d){var h=o(e),v=!i(function(){var t={};return t[h]=function(){return 7},7!=""[e](t)}),m=v&&!i(function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[l]=function(){return n},n.flags="",n[h]=/./[h]),n.exec=function(){return t=!0,null},n[h](""),!t});if(!v||!m||"replace"===e&&(!c||!u||f)||"split"===e&&!p){var g=/./[h],y=n(h,""[e],function(e,t,n,r,i){return t.exec===s?v&&!i?{done:!0,value:g.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}},{REPLACE_KEEPS_$0:u,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:f}),b=y[0],w=y[1];r(String.prototype,e,b),r(RegExp.prototype,h,2==t?function(e,t){return w.call(e,this,t)}:function(e){return w.call(e,this)})}d&&a(RegExp.prototype[h],"sham",!0)}},9974:function(e,t,n){var r=n(3099);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}}},5005:function(e,t,n){var r=n(857),i=n(7854),o=function(e){return"function"==typeof e?e:void 0};e.exports=function(e,t){return arguments.length<2?o(r[e])||o(i[e]):r[e]&&r[e][t]||i[e]&&i[e][t]}},1246:function(e,t,n){var r=n(648),i=n(7497),o=n(5112)("iterator");e.exports=function(e){if(null!=e)return e[o]||e["@@iterator"]||i[r(e)]}},8554:function(e,t,n){var r=n(9670),i=n(1246);e.exports=function(e){var t=i(e);if("function"!=typeof t)throw TypeError(String(e)+" is not iterable");return r(t.call(e))}},647:function(e,t,n){var r=n(7908),i=Math.floor,o="".replace,s=/\$([$&'`]|\d\d?|<[^>]*>)/g,a=/\$([$&'`]|\d\d?)/g;e.exports=function(e,t,n,l,c,u){var d=n+e.length,f=l.length,p=a;return void 0!==c&&(c=r(c),p=s),o.call(u,p,function(r,o){var s;switch(o.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,n);case"'":return t.slice(d);case"<":s=c[o.slice(1,-1)];break;default:var a=+o;if(0===a)return r;if(a>f){var u=i(a/10);return 0===u?r:u<=f?void 0===l[u-1]?o.charAt(1):l[u-1]+o.charAt(1):r}s=l[a-1]}return void 0===s?"":s})}},7854:function(e,t,n){var r=function(e){return e&&e.Math==Math&&e};e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},6656:function(e){var t={}.hasOwnProperty;e.exports=function(e,n){return t.call(e,n)}},3501:function(e){e.exports={}},490:function(e,t,n){var r=n(5005);e.exports=r("document","documentElement")},4664:function(e,t,n){var r=n(9781),i=n(7293),o=n(317);e.exports=!r&&!i(function(){return 7!=Object.defineProperty(o("div"),"a",{get:function(){return 7}}).a})},1179:function(e){var t=Math.abs,n=Math.pow,r=Math.floor,i=Math.log,o=Math.LN2;e.exports={pack:function(e,s,a){var l,c,u,d=new Array(a),f=8*a-s-1,p=(1<>1,v=23===s?n(2,-24)-n(2,-77):0,m=e<0||0===e&&1/e<0?1:0,g=0;for((e=t(e))!=e||e===1/0?(c=e!=e?1:0,l=p):(l=r(i(e)/o),e*(u=n(2,-l))<1&&(l--,u*=2),(e+=l+h>=1?v/u:v*n(2,1-h))*u>=2&&(l++,u/=2),l+h>=p?(c=0,l=p):l+h>=1?(c=(e*u-1)*n(2,s),l+=h):(c=e*n(2,h-1)*n(2,s),l=0));s>=8;d[g++]=255&c,c/=256,s-=8);for(l=l<0;d[g++]=255&l,l/=256,f-=8);return d[--g]|=128*m,d},unpack:function(e,t){var r,i=e.length,o=8*i-t-1,s=(1<>1,l=o-7,c=i-1,u=e[c--],d=127&u;for(u>>=7;l>0;d=256*d+e[c],c--,l-=8);for(r=d&(1<<-l)-1,d>>=-l,l+=t;l>0;r=256*r+e[c],c--,l-=8);if(0===d)d=1-a;else{if(d===s)return r?NaN:u?-1/0:1/0;r+=n(2,t),d-=a}return(u?-1:1)*r*n(2,d-t)}}},8361:function(e,t,n){var r=n(7293),i=n(4326),o="".split;e.exports=r(function(){return!Object("z").propertyIsEnumerable(0)})?function(e){return"String"==i(e)?o.call(e,""):Object(e)}:Object},9587:function(e,t,n){var r=n(111),i=n(7674);e.exports=function(e,t,n){var o,s;return i&&"function"==typeof(o=t.constructor)&&o!==n&&r(s=o.prototype)&&s!==n.prototype&&i(e,s),e}},2788:function(e,t,n){var r=n(5465),i=Function.toString;"function"!=typeof r.inspectSource&&(r.inspectSource=function(e){return i.call(e)}),e.exports=r.inspectSource},9909:function(e,t,n){var r,i,o,s=n(8536),a=n(7854),l=n(111),c=n(8880),u=n(6656),d=n(5465),f=n(6200),p=n(3501),h=a.WeakMap;if(s){var v=d.state||(d.state=new h),m=v.get,g=v.has,y=v.set;r=function(e,t){return t.facade=e,y.call(v,e,t),t},i=function(e){return m.call(v,e)||{}},o=function(e){return g.call(v,e)}}else{var b=f("state");p[b]=!0,r=function(e,t){return t.facade=e,c(e,b,t),t},i=function(e){return u(e,b)?e[b]:{}},o=function(e){return u(e,b)}}e.exports={set:r,get:i,has:o,enforce:function(e){return o(e)?i(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!l(t)||(n=i(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}}},7659:function(e,t,n){var r=n(5112),i=n(7497),o=r("iterator"),s=Array.prototype;e.exports=function(e){return void 0!==e&&(i.Array===e||s[o]===e)}},3157:function(e,t,n){var r=n(4326);e.exports=Array.isArray||function(e){return"Array"==r(e)}},4705:function(e,t,n){var r=n(7293),i=/#|\.prototype\./,o=function(e,t){var n=a[s(e)];return n==c||n!=l&&("function"==typeof t?r(t):!!t)},s=o.normalize=function(e){return String(e).replace(i,".").toLowerCase()},a=o.data={},l=o.NATIVE="N",c=o.POLYFILL="P";e.exports=o},111:function(e){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},1913:function(e){e.exports=!1},7850:function(e,t,n){var r=n(111),i=n(4326),o=n(5112)("match");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[o])?!!t:"RegExp"==i(e))}},9212:function(e,t,n){var r=n(9670);e.exports=function(e){var t=e.return;if(void 0!==t)return r(t.call(e)).value}},3383:function(e,t,n){"use strict";var r,i,o,s=n(7293),a=n(9518),l=n(8880),c=n(6656),u=n(5112),d=n(1913),f=u("iterator"),p=!1;[].keys&&("next"in(o=[].keys())?(i=a(a(o)))!==Object.prototype&&(r=i):p=!0);var h=null==r||s(function(){var e={};return r[f].call(e)!==e});h&&(r={}),d&&!h||c(r,f)||l(r,f,function(){return this}),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:p}},7497:function(e){e.exports={}},133:function(e,t,n){var r=n(7293);e.exports=!!Object.getOwnPropertySymbols&&!r(function(){return!String(Symbol())})},590:function(e,t,n){var r=n(7293),i=n(5112),o=n(1913),s=i("iterator");e.exports=!r(function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,n="";return e.pathname="c%20d",t.forEach(function(e,r){t.delete("b"),n+=r+e}),o&&!e.toJSON||!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[s]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==n||"x"!==new URL("http://x",void 0).host})},8536:function(e,t,n){var r=n(7854),i=n(2788),o=r.WeakMap;e.exports="function"==typeof o&&/native code/.test(i(o))},1574:function(e,t,n){"use strict";var r=n(9781),i=n(7293),o=n(1956),s=n(5181),a=n(5296),l=n(7908),c=n(8361),u=Object.assign,d=Object.defineProperty;e.exports=!u||i(function(){if(r&&1!==u({b:1},u(d({},"a",{enumerable:!0,get:function(){d(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach(function(e){t[e]=e}),7!=u({},e)[n]||o(u({},t)).join("")!=i})?function(e,t){for(var n=l(e),i=arguments.length,u=1,d=s.f,f=a.f;i>u;)for(var p,h=c(arguments[u++]),v=d?o(h).concat(d(h)):o(h),m=v.length,g=0;m>g;)p=v[g++],r&&!f.call(h,p)||(n[p]=h[p]);return n}:u},30:function(e,t,n){var r,i=n(9670),o=n(6048),s=n(748),a=n(3501),l=n(490),c=n(317),u=n(6200),d="prototype",f="script",p=u("IE_PROTO"),h=function(){},v=function(e){return"<"+f+">"+e+""},m=function(){try{r=document.domain&&new ActiveXObject("htmlfile")}catch(e){}var e,t,n;m=r?function(e){e.write(v("")),e.close();var t=e.parentWindow.Object;return e=null,t}(r):(t=c("iframe"),n="java"+f+":",t.style.display="none",l.appendChild(t),t.src=String(n),(e=t.contentWindow.document).open(),e.write(v("document.F=Object")),e.close(),e.F);for(var i=s.length;i--;)delete m[d][s[i]];return m()};a[p]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(h[d]=i(e),n=new h,h[d]=null,n[p]=e):n=m(),void 0===t?n:o(n,t)}},6048:function(e,t,n){var r=n(9781),i=n(3070),o=n(9670),s=n(1956);e.exports=r?Object.defineProperties:function(e,t){o(e);for(var n,r=s(t),a=r.length,l=0;a>l;)i.f(e,n=r[l++],t[n]);return e}},3070:function(e,t,n){var r=n(9781),i=n(4664),o=n(9670),s=n(7593),a=Object.defineProperty;t.f=r?a:function(e,t,n){if(o(e),t=s(t,!0),o(n),i)try{return a(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},1236:function(e,t,n){var r=n(9781),i=n(5296),o=n(9114),s=n(5656),a=n(7593),l=n(6656),c=n(4664),u=Object.getOwnPropertyDescriptor;t.f=r?u:function(e,t){if(e=s(e),t=a(t,!0),c)try{return u(e,t)}catch(e){}if(l(e,t))return o(!i.f.call(e,t),e[t])}},8006:function(e,t,n){var r=n(6324),i=n(748).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,i)}},5181:function(e,t){t.f=Object.getOwnPropertySymbols},9518:function(e,t,n){var r=n(6656),i=n(7908),o=n(6200),s=n(8544),a=o("IE_PROTO"),l=Object.prototype;e.exports=s?Object.getPrototypeOf:function(e){return e=i(e),r(e,a)?e[a]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?l:null}},6324:function(e,t,n){var r=n(6656),i=n(5656),o=n(1318).indexOf,s=n(3501);e.exports=function(e,t){var n,a=i(e),l=0,c=[];for(n in a)!r(s,n)&&r(a,n)&&c.push(n);for(;t.length>l;)r(a,n=t[l++])&&(~o(c,n)||c.push(n));return c}},1956:function(e,t,n){var r=n(6324),i=n(748);e.exports=Object.keys||function(e){return r(e,i)}},5296:function(e,t){"use strict";var n={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,i=r&&!n.call({1:2},1);t.f=i?function(e){var t=r(this,e);return!!t&&t.enumerable}:n},7674:function(e,t,n){var r=n(9670),i=n(6077);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,o){return r(n),i(o),t?e.call(n,o):n.__proto__=o,n}}():void 0)},288:function(e,t,n){"use strict";var r=n(1694),i=n(648);e.exports=r?{}.toString:function(){return"[object "+i(this)+"]"}},3887:function(e,t,n){var r=n(5005),i=n(8006),o=n(5181),s=n(9670);e.exports=r("Reflect","ownKeys")||function(e){var t=i.f(s(e)),n=o.f;return n?t.concat(n(e)):t}},857:function(e,t,n){var r=n(7854);e.exports=r},2248:function(e,t,n){var r=n(1320);e.exports=function(e,t,n){for(var i in t)r(e,i,t[i],n);return e}},1320:function(e,t,n){var r=n(7854),i=n(8880),o=n(6656),s=n(3505),a=n(2788),l=n(9909),c=l.get,u=l.enforce,d=String(String).split("String");(e.exports=function(e,t,n,a){var l,c=!!a&&!!a.unsafe,f=!!a&&!!a.enumerable,p=!!a&&!!a.noTargetGet;"function"==typeof n&&("string"!=typeof t||o(n,"name")||i(n,"name",t),(l=u(n)).source||(l.source=d.join("string"==typeof t?t:""))),e!==r?(c?!p&&e[t]&&(f=!0):delete e[t],f?e[t]=n:i(e,t,n)):f?e[t]=n:s(t,n)})(Function.prototype,"toString",function(){return"function"==typeof this&&c(this).source||a(this)})},7651:function(e,t,n){var r=n(4326),i=n(2261);e.exports=function(e,t){var n=e.exec;if("function"==typeof n){var o=n.call(e,t);if("object"!=typeof o)throw TypeError("RegExp exec method returned something other than an Object or null");return o}if("RegExp"!==r(e))throw TypeError("RegExp#exec called on incompatible receiver");return i.call(e,t)}},2261:function(e,t,n){"use strict";var r,i,o=n(7066),s=n(2999),a=RegExp.prototype.exec,l=String.prototype.replace,c=a,u=(r=/a/,i=/b*/g,a.call(r,"a"),a.call(i,"a"),0!==r.lastIndex||0!==i.lastIndex),d=s.UNSUPPORTED_Y||s.BROKEN_CARET,f=void 0!==/()??/.exec("")[1];(u||f||d)&&(c=function(e){var t,n,r,i,s=this,c=d&&s.sticky,p=o.call(s),h=s.source,v=0,m=e;return c&&(-1===(p=p.replace("y","")).indexOf("g")&&(p+="g"),m=String(e).slice(s.lastIndex),s.lastIndex>0&&(!s.multiline||s.multiline&&"\n"!==e[s.lastIndex-1])&&(h="(?: "+h+")",m=" "+m,v++),n=new RegExp("^(?:"+h+")",p)),f&&(n=new RegExp("^"+h+"$(?!\\s)",p)),u&&(t=s.lastIndex),r=a.call(c?n:s,m),c?r?(r.input=r.input.slice(v),r[0]=r[0].slice(v),r.index=s.lastIndex,s.lastIndex+=r[0].length):s.lastIndex=0:u&&r&&(s.lastIndex=s.global?r.index+r[0].length:t),f&&r&&r.length>1&&l.call(r[0],n,function(){for(i=1;i=c?e?"":void 0:(o=a.charCodeAt(l))<55296||o>56319||l+1===c||(s=a.charCodeAt(l+1))<56320||s>57343?e?a.charAt(l):o:e?a.slice(l,l+2):s-56320+(o-55296<<10)+65536}};e.exports={codeAt:o(!1),charAt:o(!0)}},3197:function(e){"use strict";var t=2147483647,n=/[^\0-\u007E]/,r=/[.\u3002\uFF0E\uFF61]/g,i="Overflow: input needs wider integers to process",o=Math.floor,s=String.fromCharCode,a=function(e){return e+22+75*(e<26)},l=function(e,t,n){var r=0;for(e=n?o(e/700):e>>1,e+=o(e/t);e>455;r+=36)e=o(e/35);return o(r+36*e/(e+38))},c=function(e){var n=[];e=function(e){for(var t=[],n=0,r=e.length;n=55296&&i<=56319&&n=d&&co((t-f)/g))throw RangeError(i);for(f+=(m-d)*g,d=m,r=0;rt)throw RangeError(i);if(c==d){for(var y=f,b=36;;b+=36){var w=b<=p?1:b>=p+26?26:b-p;if(y0?n:t)(e)}},7466:function(e,t,n){var r=n(9958),i=Math.min;e.exports=function(e){return e>0?i(r(e),9007199254740991):0}},7908:function(e,t,n){var r=n(4488);e.exports=function(e){return Object(r(e))}},4590:function(e,t,n){var r=n(3002);e.exports=function(e,t){var n=r(e);if(n%t)throw RangeError("Wrong offset");return n}},3002:function(e,t,n){var r=n(9958);e.exports=function(e){var t=r(e);if(t<0)throw RangeError("The argument can't be less than 0");return t}},7593:function(e,t,n){var r=n(111);e.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},1694:function(e,t,n){var r={};r[n(5112)("toStringTag")]="z",e.exports="[object z]"===String(r)},9843:function(e,t,n){"use strict";var r=n(2109),i=n(7854),o=n(9781),s=n(3832),a=n(260),l=n(3331),c=n(5787),u=n(9114),d=n(8880),f=n(7466),p=n(7067),h=n(4590),v=n(7593),m=n(6656),g=n(648),y=n(111),b=n(30),w=n(7674),x=n(8006).f,E=n(7321),S=n(2092).forEach,k=n(6340),L=n(3070),A=n(1236),C=n(9909),_=n(9587),F=C.get,T=C.set,I=L.f,M=A.f,R=Math.round,z=i.RangeError,q=l.ArrayBuffer,O=l.DataView,U=a.NATIVE_ARRAY_BUFFER_VIEWS,j=a.TYPED_ARRAY_TAG,D=a.TypedArray,P=a.TypedArrayPrototype,N=a.aTypedArrayConstructor,$=a.isTypedArray,B="BYTES_PER_ELEMENT",W="Wrong length",H=function(e,t){for(var n=0,r=t.length,i=new(N(e))(r);r>n;)i[n]=t[n++];return i},Y=function(e,t){I(e,t,{get:function(){return F(this)[t]}})},G=function(e){var t;return e instanceof q||"ArrayBuffer"==(t=g(e))||"SharedArrayBuffer"==t},Q=function(e,t){return $(e)&&"symbol"!=typeof t&&t in e&&String(+t)==String(t)},X=function(e,t){return Q(e,t=v(t,!0))?u(2,e[t]):M(e,t)},V=function(e,t,n){return!(Q(e,t=v(t,!0))&&y(n)&&m(n,"value"))||m(n,"get")||m(n,"set")||n.configurable||m(n,"writable")&&!n.writable||m(n,"enumerable")&&!n.enumerable?I(e,t,n):(e[t]=n.value,e)};o?(U||(A.f=X,L.f=V,Y(P,"buffer"),Y(P,"byteOffset"),Y(P,"byteLength"),Y(P,"length")),r({target:"Object",stat:!0,forced:!U},{getOwnPropertyDescriptor:X,defineProperty:V}),e.exports=function(e,t,n){var o=e.match(/\d+$/)[0]/8,a=e+(n?"Clamped":"")+"Array",l="get"+e,u="set"+e,v=i[a],m=v,g=m&&m.prototype,L={},A=function(e,t){I(e,t,{get:function(){return function(e,t){var n=F(e);return n.view[l](t*o+n.byteOffset,!0)}(this,t)},set:function(e){return function(e,t,r){var i=F(e);n&&(r=(r=R(r))<0?0:r>255?255:255&r),i.view[u](t*o+i.byteOffset,r,!0)}(this,t,e)},enumerable:!0})};U?s&&(m=t(function(e,t,n,r){return c(e,m,a),_(y(t)?G(t)?void 0!==r?new v(t,h(n,o),r):void 0!==n?new v(t,h(n,o)):new v(t):$(t)?H(m,t):E.call(m,t):new v(p(t)),e,m)}),w&&w(m,D),S(x(v),function(e){e in m||d(m,e,v[e])}),m.prototype=g):(m=t(function(e,t,n,r){c(e,m,a);var i,s,l,u=0,d=0;if(y(t)){if(!G(t))return $(t)?H(m,t):E.call(m,t);i=t,d=h(n,o);var v=t.byteLength;if(void 0===r){if(v%o)throw z(W);if((s=v-d)<0)throw z(W)}else if((s=f(r)*o)+d>v)throw z(W);l=s/o}else l=p(t),i=new q(s=l*o);for(T(e,{buffer:i,byteOffset:d,byteLength:s,length:l,view:new O(i)});uo;)a[o]=t[o++];return a}},7321:function(e,t,n){var r=n(7908),i=n(7466),o=n(1246),s=n(7659),a=n(9974),l=n(260).aTypedArrayConstructor;e.exports=function(e){var t,n,c,u,d,f,p=r(e),h=arguments.length,v=h>1?arguments[1]:void 0,m=void 0!==v,g=o(p);if(null!=g&&!s(g))for(f=(d=g.call(p)).next,p=[];!(u=f.call(d)).done;)p.push(u.value);for(m&&h>2&&(v=a(v,arguments[2],2)),n=i(p.length),c=new(l(this))(n),t=0;n>t;t++)c[t]=m?v(p[t],t):p[t];return c}},9711:function(e){var t=0,n=Math.random();e.exports=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++t+n).toString(36)}},3307:function(e,t,n){var r=n(133);e.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},5112:function(e,t,n){var r=n(7854),i=n(2309),o=n(6656),s=n(9711),a=n(133),l=n(3307),c=i("wks"),u=r.Symbol,d=l?u:u&&u.withoutSetter||s;e.exports=function(e){return o(c,e)||(a&&o(u,e)?c[e]=u[e]:c[e]=d("Symbol."+e)),c[e]}},1361:function(e){e.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},8264:function(e,t,n){"use strict";var r=n(2109),i=n(7854),o=n(3331),s=n(6340),a="ArrayBuffer",l=o[a];r({global:!0,forced:i[a]!==l},{ArrayBuffer:l}),s(a)},2222:function(e,t,n){"use strict";var r=n(2109),i=n(7293),o=n(3157),s=n(111),a=n(7908),l=n(7466),c=n(6135),u=n(5417),d=n(1194),f=n(5112),p=n(7392),h=f("isConcatSpreadable"),v=9007199254740991,m="Maximum allowed index exceeded",g=p>=51||!i(function(){var e=[];return e[h]=!1,e.concat()[0]!==e}),y=d("concat"),b=function(e){if(!s(e))return!1;var t=e[h];return void 0!==t?!!t:o(e)};r({target:"Array",proto:!0,forced:!g||!y},{concat:function(e){var t,n,r,i,o,s=a(this),d=u(s,0),f=0;for(t=-1,r=arguments.length;tv)throw TypeError(m);for(n=0;n=v)throw TypeError(m);c(d,f++,o)}return d.length=f,d}})},7327:function(e,t,n){"use strict";var r=n(2109),i=n(2092).filter;r({target:"Array",proto:!0,forced:!n(1194)("filter")},{filter:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}})},2772:function(e,t,n){"use strict";var r=n(2109),i=n(1318).indexOf,o=n(9341),s=[].indexOf,a=!!s&&1/[1].indexOf(1,-0)<0,l=o("indexOf");r({target:"Array",proto:!0,forced:a||!l},{indexOf:function(e){return a?s.apply(this,arguments)||0:i(this,e,arguments.length>1?arguments[1]:void 0)}})},6992:function(e,t,n){"use strict";var r=n(5656),i=n(1223),o=n(7497),s=n(9909),a=n(654),l="Array Iterator",c=s.set,u=s.getterFor(l);e.exports=a(Array,"Array",function(e,t){c(this,{type:l,target:r(e),index:0,kind:t})},function(){var e=u(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}},"values"),o.Arguments=o.Array,i("keys"),i("values"),i("entries")},1249:function(e,t,n){"use strict";var r=n(2109),i=n(2092).map;r({target:"Array",proto:!0,forced:!n(1194)("map")},{map:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}})},7042:function(e,t,n){"use strict";var r=n(2109),i=n(111),o=n(3157),s=n(1400),a=n(7466),l=n(5656),c=n(6135),u=n(5112),d=n(1194)("slice"),f=u("species"),p=[].slice,h=Math.max;r({target:"Array",proto:!0,forced:!d},{slice:function(e,t){var n,r,u,d=l(this),v=a(d.length),m=s(e,v),g=s(void 0===t?v:t,v);if(o(d)&&("function"!=typeof(n=d.constructor)||n!==Array&&!o(n.prototype)?i(n)&&null===(n=n[f])&&(n=void 0):n=void 0,n===Array||void 0===n))return p.call(d,m,g);for(r=new(void 0===n?Array:n)(h(g-m,0)),u=0;m9007199254740991)throw TypeError("Maximum allowed length exceeded");for(u=l(m,r),p=0;pg-r+n;p--)delete m[p-1]}else if(n>r)for(p=g-r;p>y;p--)v=p+n-1,(h=p+r-1)in m?m[v]=m[h]:delete m[v];for(p=0;p=n.length?{value:void 0,done:!0}:(e=r(n,i),t.index+=e.length,{value:e,done:!1})})},4723:function(e,t,n){"use strict";var r=n(7007),i=n(9670),o=n(7466),s=n(4488),a=n(1530),l=n(7651);r("match",1,function(e,t,n){return[function(t){var n=s(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var s=i(e),c=String(this);if(!s.global)return l(s,c);var u=s.unicode;s.lastIndex=0;for(var d,f=[],p=0;null!==(d=l(s,c));){var h=String(d[0]);f[p]=h,""===h&&(s.lastIndex=a(c,o(s.lastIndex),u)),p++}return 0===p?null:f}]})},5306:function(e,t,n){"use strict";var r=n(7007),i=n(9670),o=n(7466),s=n(9958),a=n(4488),l=n(1530),c=n(647),u=n(7651),d=Math.max,f=Math.min,p=function(e){return void 0===e?e:String(e)};r("replace",2,function(e,t,n,r){var h=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,v=r.REPLACE_KEEPS_$0,m=h?"$":"$0";return[function(n,r){var i=a(this),o=null==n?void 0:n[e];return void 0!==o?o.call(n,i,r):t.call(String(i),n,r)},function(e,r){if(!h&&v||"string"==typeof r&&-1===r.indexOf(m)){var a=n(t,e,this,r);if(a.done)return a.value}var g=i(e),y=String(this),b="function"==typeof r;b||(r=String(r));var w=g.global;if(w){var x=g.unicode;g.lastIndex=0}for(var E=[];;){var S=u(g,y);if(null===S)break;if(E.push(S),!w)break;""===String(S[0])&&(g.lastIndex=l(y,o(g.lastIndex),x))}for(var k="",L=0,A=0;A=L&&(k+=y.slice(L,_)+R,L=_+C.length)}return k+y.slice(L)}]})},3123:function(e,t,n){"use strict";var r=n(7007),i=n(7850),o=n(9670),s=n(4488),a=n(6707),l=n(1530),c=n(7466),u=n(7651),d=n(2261),f=n(7293),p=[].push,h=Math.min,v=4294967295,m=!f(function(){return!RegExp(v,"y")});r("split",2,function(e,t,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var r=String(s(this)),o=void 0===n?v:n>>>0;if(0===o)return[];if(void 0===e)return[r];if(!i(e))return t.call(r,e,o);for(var a,l,c,u=[],f=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),h=0,m=new RegExp(e.source,f+"g");(a=d.call(m,r))&&!((l=m.lastIndex)>h&&(u.push(r.slice(h,a.index)),a.length>1&&a.index=o));)m.lastIndex===a.index&&m.lastIndex++;return h===r.length?!c&&m.test("")||u.push(""):u.push(r.slice(h)),u.length>o?u.slice(0,o):u}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var i=s(this),o=null==t?void 0:t[e];return void 0!==o?o.call(t,i,n):r.call(String(i),t,n)},function(e,i){var s=n(r,e,this,i,r!==t);if(s.done)return s.value;var d=o(e),f=String(this),p=a(d,RegExp),g=d.unicode,y=(d.ignoreCase?"i":"")+(d.multiline?"m":"")+(d.unicode?"u":"")+(m?"y":"g"),b=new p(m?d:"^(?:"+d.source+")",y),w=void 0===i?v:i>>>0;if(0===w)return[];if(0===f.length)return null===u(b,f)?[f]:[];for(var x=0,E=0,S=[];E2?arguments[2]:void 0)})},8927:function(e,t,n){"use strict";var r=n(260),i=n(2092).every,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("every",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},3105:function(e,t,n){"use strict";var r=n(260),i=n(1285),o=r.aTypedArray;(0,r.exportTypedArrayMethod)("fill",function(e){return i.apply(o(this),arguments)})},5035:function(e,t,n){"use strict";var r=n(260),i=n(2092).filter,o=n(3074),s=r.aTypedArray;(0,r.exportTypedArrayMethod)("filter",function(e){var t=i(s(this),e,arguments.length>1?arguments[1]:void 0);return o(this,t)})},7174:function(e,t,n){"use strict";var r=n(260),i=n(2092).findIndex,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("findIndex",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},4345:function(e,t,n){"use strict";var r=n(260),i=n(2092).find,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("find",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},2846:function(e,t,n){"use strict";var r=n(260),i=n(2092).forEach,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("forEach",function(e){i(o(this),e,arguments.length>1?arguments[1]:void 0)})},4731:function(e,t,n){"use strict";var r=n(260),i=n(1318).includes,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("includes",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},7209:function(e,t,n){"use strict";var r=n(260),i=n(1318).indexOf,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("indexOf",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},6319:function(e,t,n){"use strict";var r=n(7854),i=n(260),o=n(6992),s=n(5112)("iterator"),a=r.Uint8Array,l=o.values,c=o.keys,u=o.entries,d=i.aTypedArray,f=i.exportTypedArrayMethod,p=a&&a.prototype[s],h=!!p&&("values"==p.name||null==p.name),v=function(){return l.call(d(this))};f("entries",function(){return u.call(d(this))}),f("keys",function(){return c.call(d(this))}),f("values",v,!h),f(s,v,!h)},8867:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=[].join;o("join",function(e){return s.apply(i(this),arguments)})},7789:function(e,t,n){"use strict";var r=n(260),i=n(6583),o=r.aTypedArray;(0,r.exportTypedArrayMethod)("lastIndexOf",function(e){return i.apply(o(this),arguments)})},3739:function(e,t,n){"use strict";var r=n(260),i=n(2092).map,o=n(6707),s=r.aTypedArray,a=r.aTypedArrayConstructor;(0,r.exportTypedArrayMethod)("map",function(e){return i(s(this),e,arguments.length>1?arguments[1]:void 0,function(e,t){return new(a(o(e,e.constructor)))(t)})})},4483:function(e,t,n){"use strict";var r=n(260),i=n(3671).right,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("reduceRight",function(e){return i(o(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)})},9368:function(e,t,n){"use strict";var r=n(260),i=n(3671).left,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("reduce",function(e){return i(o(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)})},2056:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=Math.floor;o("reverse",function(){for(var e,t=this,n=i(t).length,r=s(n/2),o=0;o1?arguments[1]:void 0,1),n=this.length,r=s(e),a=i(r.length),c=0;if(a+t>n)throw RangeError("Wrong length");for(;co;)u[o]=n[o++];return u},o(function(){new Int8Array(1).slice()}))},7462:function(e,t,n){"use strict";var r=n(260),i=n(2092).some,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("some",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},3824:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=[].sort;o("sort",function(e){return s.call(i(this),e)})},5021:function(e,t,n){"use strict";var r=n(260),i=n(7466),o=n(1400),s=n(6707),a=r.aTypedArray;(0,r.exportTypedArrayMethod)("subarray",function(e,t){var n=a(this),r=n.length,l=o(e,r);return new(s(n,n.constructor))(n.buffer,n.byteOffset+l*n.BYTES_PER_ELEMENT,i((void 0===t?r:o(t,r))-l))})},2974:function(e,t,n){"use strict";var r=n(7854),i=n(260),o=n(7293),s=r.Int8Array,a=i.aTypedArray,l=i.exportTypedArrayMethod,c=[].toLocaleString,u=[].slice,d=!!s&&o(function(){c.call(new s(1))});l("toLocaleString",function(){return c.apply(d?u.call(a(this)):a(this),arguments)},o(function(){return[1,2].toLocaleString()!=new s([1,2]).toLocaleString()})||!o(function(){s.prototype.toLocaleString.call([1,2])}))},5016:function(e,t,n){"use strict";var r=n(260).exportTypedArrayMethod,i=n(7293),o=n(7854).Uint8Array,s=o&&o.prototype||{},a=[].toString,l=[].join;i(function(){a.call({})})&&(a=function(){return l.call(this)});var c=s.toString!=a;r("toString",a,c)},2472:function(e,t,n){n(9843)("Uint8",function(e){return function(t,n,r){return e(this,t,n,r)}})},4747:function(e,t,n){var r=n(7854),i=n(8324),o=n(8533),s=n(8880);for(var a in i){var l=r[a],c=l&&l.prototype;if(c&&c.forEach!==o)try{s(c,"forEach",o)}catch(e){c.forEach=o}}},3948:function(e,t,n){var r=n(7854),i=n(8324),o=n(6992),s=n(8880),a=n(5112),l=a("iterator"),c=a("toStringTag"),u=o.values;for(var d in i){var f=r[d],p=f&&f.prototype;if(p){if(p[l]!==u)try{s(p,l,u)}catch(e){p[l]=u}if(p[c]||s(p,c,d),i[d])for(var h in o)if(p[h]!==o[h])try{s(p,h,o[h])}catch(e){p[h]=o[h]}}}},1637:function(e,t,n){"use strict";n(6992);var r=n(2109),i=n(5005),o=n(590),s=n(1320),a=n(2248),l=n(8003),c=n(4994),u=n(9909),d=n(5787),f=n(6656),p=n(9974),h=n(648),v=n(9670),m=n(111),g=n(30),y=n(9114),b=n(8554),w=n(1246),x=n(5112),E=i("fetch"),S=i("Headers"),k=x("iterator"),L="URLSearchParams",A=L+"Iterator",C=u.set,_=u.getterFor(L),F=u.getterFor(A),T=/\+/g,I=Array(4),M=function(e){return I[e-1]||(I[e-1]=RegExp("((?:%[\\da-f]{2}){"+e+"})","gi"))},R=function(e){try{return decodeURIComponent(e)}catch(t){return e}},z=function(e){var t=e.replace(T," "),n=4;try{return decodeURIComponent(t)}catch(e){for(;n;)t=t.replace(M(n--),R);return t}},q=/[!'()~]|%20/g,O={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},U=function(e){return O[e]},j=function(e){return encodeURIComponent(e).replace(q,U)},D=function(e,t){if(t)for(var n,r,i=t.split("&"),o=0;o0?arguments[0]:void 0,u=[];if(C(this,{type:L,entries:u,updateURL:function(){},updateSearchParams:P}),void 0!==c)if(m(c))if("function"==typeof(e=w(c)))for(n=(t=e.call(c)).next;!(r=n.call(t)).done;){if((s=(o=(i=b(v(r.value))).next).call(i)).done||(a=o.call(i)).done||!o.call(i).done)throw TypeError("Expected sequence with length 2");u.push({key:s.value+"",value:a.value+""})}else for(l in c)f(c,l)&&u.push({key:l,value:c[l]+""});else D(u,"string"==typeof c?"?"===c.charAt(0)?c.slice(1):c:c+"")},W=B.prototype;a(W,{append:function(e,t){N(arguments.length,2);var n=_(this);n.entries.push({key:e+"",value:t+""}),n.updateURL()},delete:function(e){N(arguments.length,1);for(var t=_(this),n=t.entries,r=e+"",i=0;ie.key){i.splice(t,0,e);break}t===n&&i.push(e)}r.updateURL()},forEach:function(e){for(var t,n=_(this).entries,r=p(e,arguments.length>1?arguments[1]:void 0,3),i=0;i1&&(m(t=arguments[1])&&(n=t.body,h(n)===L&&((r=t.headers?new S(t.headers):new S).has("content-type")||r.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),t=g(t,{body:y(0,String(n)),headers:y(0,r)}))),i.push(t)),E.apply(this,i)}}),e.exports={URLSearchParams:B,getState:_}},285:function(e,t,n){"use strict";n(8783);var r,i=n(2109),o=n(9781),s=n(590),a=n(7854),l=n(6048),c=n(1320),u=n(5787),d=n(6656),f=n(1574),p=n(8457),h=n(8710).codeAt,v=n(3197),m=n(8003),g=n(1637),y=n(9909),b=a.URL,w=g.URLSearchParams,x=g.getState,E=y.set,S=y.getterFor("URL"),k=Math.floor,L=Math.pow,A="Invalid scheme",C="Invalid host",_="Invalid port",F=/[A-Za-z]/,T=/[\d+-.A-Za-z]/,I=/\d/,M=/^(0x|0X)/,R=/^[0-7]+$/,z=/^\d+$/,q=/^[\dA-Fa-f]+$/,O=/[\u0000\t\u000A\u000D #%/:?@[\\]]/,U=/[\u0000\t\u000A\u000D #/:?@[\\]]/,j=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,D=/[\t\u000A\u000D]/g,P=function(e,t){var n,r,i;if("["==t.charAt(0)){if("]"!=t.charAt(t.length-1))return C;if(!(n=$(t.slice(1,-1))))return C;e.host=n}else if(V(e)){if(t=v(t),O.test(t))return C;if(null===(n=N(t)))return C;e.host=n}else{if(U.test(t))return C;for(n="",r=p(t),i=0;i4)return e;for(n=[],r=0;r1&&"0"==i.charAt(0)&&(o=M.test(i)?16:8,i=i.slice(8==o?1:2)),""===i)s=0;else{if(!(10==o?z:8==o?R:q).test(i))return e;s=parseInt(i,o)}n.push(s)}for(r=0;r=L(256,5-t))return null}else if(s>255)return null;for(a=n.pop(),r=0;r6)return;for(r=0;f();){if(i=null,r>0){if(!("."==f()&&r<4))return;d++}if(!I.test(f()))return;for(;I.test(f());){if(o=parseInt(f(),10),null===i)i=o;else{if(0==i)return;i=10*i+o}if(i>255)return;d++}l[c]=256*l[c]+i,2!=++r&&4!=r||c++}if(4!=r)return;break}if(":"==f()){if(d++,!f())return}else if(f())return;l[c++]=t}else{if(null!==u)return;d++,u=++c}}if(null!==u)for(s=c-u,c=7;0!=c&&s>0;)a=l[c],l[c--]=l[u+s-1],l[u+--s]=a;else if(8!=c)return;return l},B=function(e){var t,n,r,i;if("number"==typeof e){for(t=[],n=0;n<4;n++)t.unshift(e%256),e=k(e/256);return t.join(".")}if("object"==typeof e){for(t="",r=function(e){for(var t=null,n=1,r=null,i=0,o=0;o<8;o++)0!==e[o]?(i>n&&(t=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(t=r,n=i),t}(e),n=0;n<8;n++)i&&0===e[n]||(i&&(i=!1),r===n?(t+=n?":":"::",i=!0):(t+=e[n].toString(16),n<7&&(t+=":")));return"["+t+"]"}return e},W={},H=f({},W,{" ":1,'"':1,"<":1,">":1,"`":1}),Y=f({},H,{"#":1,"?":1,"{":1,"}":1}),G=f({},Y,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),Q=function(e,t){var n=h(e,0);return n>32&&n<127&&!d(t,e)?e:encodeURIComponent(e)},X={ftp:21,file:null,http:80,https:443,ws:80,wss:443},V=function(e){return d(X,e.scheme)},K=function(e){return""!=e.username||""!=e.password},Z=function(e){return!e.host||e.cannotBeABaseURL||"file"==e.scheme},J=function(e,t){var n;return 2==e.length&&F.test(e.charAt(0))&&(":"==(n=e.charAt(1))||!t&&"|"==n)},ee=function(e){var t;return e.length>1&&J(e.slice(0,2))&&(2==e.length||"/"===(t=e.charAt(2))||"\\"===t||"?"===t||"#"===t)},te=function(e){var t=e.path,n=t.length;!n||"file"==e.scheme&&1==n&&J(t[0],!0)||t.pop()},ne=function(e){return"."===e||"%2e"===e.toLowerCase()},re=function(e){return".."===(e=e.toLowerCase())||"%2e."===e||".%2e"===e||"%2e%2e"===e},ie={},oe={},se={},ae={},le={},ce={},ue={},de={},fe={},pe={},he={},ve={},me={},ge={},ye={},be={},we={},xe={},Ee={},Se={},ke={},Le=function(e,t,n,i){var o,s,a,l,c=n||ie,u=0,f="",h=!1,v=!1,m=!1;for(n||(e.scheme="",e.username="",e.password="",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,t=t.replace(j,"")),t=t.replace(D,""),o=p(t);u<=o.length;){switch(s=o[u],c){case ie:if(!s||!F.test(s)){if(n)return A;c=se;continue}f+=s.toLowerCase(),c=oe;break;case oe:if(s&&(T.test(s)||"+"==s||"-"==s||"."==s))f+=s.toLowerCase();else{if(":"!=s){if(n)return A;f="",c=se,u=0;continue}if(n&&(V(e)!=d(X,f)||"file"==f&&(K(e)||null!==e.port)||"file"==e.scheme&&!e.host))return;if(e.scheme=f,n)return void(V(e)&&X[e.scheme]==e.port&&(e.port=null));f="","file"==e.scheme?c=ge:V(e)&&i&&i.scheme==e.scheme?c=ae:V(e)?c=de:"/"==o[u+1]?(c=le,u++):(e.cannotBeABaseURL=!0,e.path.push(""),c=Ee)}break;case se:if(!i||i.cannotBeABaseURL&&"#"!=s)return A;if(i.cannotBeABaseURL&&"#"==s){e.scheme=i.scheme,e.path=i.path.slice(),e.query=i.query,e.fragment="",e.cannotBeABaseURL=!0,c=ke;break}c="file"==i.scheme?ge:ce;continue;case ae:if("/"!=s||"/"!=o[u+1]){c=ce;continue}c=fe,u++;break;case le:if("/"==s){c=pe;break}c=xe;continue;case ce:if(e.scheme=i.scheme,s==r)e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query=i.query;else if("/"==s||"\\"==s&&V(e))c=ue;else if("?"==s)e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query="",c=Se;else{if("#"!=s){e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.path.pop(),c=xe;continue}e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query=i.query,e.fragment="",c=ke}break;case ue:if(!V(e)||"/"!=s&&"\\"!=s){if("/"!=s){e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,c=xe;continue}c=pe}else c=fe;break;case de:if(c=fe,"/"!=s||"/"!=f.charAt(u+1))continue;u++;break;case fe:if("/"!=s&&"\\"!=s){c=pe;continue}break;case pe:if("@"==s){h&&(f="%40"+f),h=!0,a=p(f);for(var g=0;g65535)return _;e.port=V(e)&&w===X[e.scheme]?null:w,f=""}if(n)return;c=we;continue}return _}f+=s;break;case ge:if(e.scheme="file","/"==s||"\\"==s)c=ye;else{if(!i||"file"!=i.scheme){c=xe;continue}if(s==r)e.host=i.host,e.path=i.path.slice(),e.query=i.query;else if("?"==s)e.host=i.host,e.path=i.path.slice(),e.query="",c=Se;else{if("#"!=s){ee(o.slice(u).join(""))||(e.host=i.host,e.path=i.path.slice(),te(e)),c=xe;continue}e.host=i.host,e.path=i.path.slice(),e.query=i.query,e.fragment="",c=ke}}break;case ye:if("/"==s||"\\"==s){c=be;break}i&&"file"==i.scheme&&!ee(o.slice(u).join(""))&&(J(i.path[0],!0)?e.path.push(i.path[0]):e.host=i.host),c=xe;continue;case be:if(s==r||"/"==s||"\\"==s||"?"==s||"#"==s){if(!n&&J(f))c=xe;else if(""==f){if(e.host="",n)return;c=we}else{if(l=P(e,f))return l;if("localhost"==e.host&&(e.host=""),n)return;f="",c=we}continue}f+=s;break;case we:if(V(e)){if(c=xe,"/"!=s&&"\\"!=s)continue}else if(n||"?"!=s)if(n||"#"!=s){if(s!=r&&(c=xe,"/"!=s))continue}else e.fragment="",c=ke;else e.query="",c=Se;break;case xe:if(s==r||"/"==s||"\\"==s&&V(e)||!n&&("?"==s||"#"==s)){if(re(f)?(te(e),"/"==s||"\\"==s&&V(e)||e.path.push("")):ne(f)?"/"==s||"\\"==s&&V(e)||e.path.push(""):("file"==e.scheme&&!e.path.length&&J(f)&&(e.host&&(e.host=""),f=f.charAt(0)+":"),e.path.push(f)),f="","file"==e.scheme&&(s==r||"?"==s||"#"==s))for(;e.path.length>1&&""===e.path[0];)e.path.shift();"?"==s?(e.query="",c=Se):"#"==s&&(e.fragment="",c=ke)}else f+=Q(s,Y);break;case Ee:"?"==s?(e.query="",c=Se):"#"==s?(e.fragment="",c=ke):s!=r&&(e.path[0]+=Q(s,W));break;case Se:n||"#"!=s?s!=r&&("'"==s&&V(e)?e.query+="%27":e.query+="#"==s?"%23":Q(s,W)):(e.fragment="",c=ke);break;case ke:s!=r&&(e.fragment+=Q(s,H))}u++}},Ae=function(e){var t,n,r=u(this,Ae,"URL"),i=arguments.length>1?arguments[1]:void 0,s=String(e),a=E(r,{type:"URL"});if(void 0!==i)if(i instanceof Ae)t=S(i);else if(n=Le(t={},String(i)))throw TypeError(n);if(n=Le(a,s,null,t))throw TypeError(n);var l=a.searchParams=new w,c=x(l);c.updateSearchParams(a.query),c.updateURL=function(){a.query=String(l)||null},o||(r.href=_e.call(r),r.origin=Fe.call(r),r.protocol=Te.call(r),r.username=Ie.call(r),r.password=Me.call(r),r.host=Re.call(r),r.hostname=ze.call(r),r.port=qe.call(r),r.pathname=Oe.call(r),r.search=Ue.call(r),r.searchParams=je.call(r),r.hash=De.call(r))},Ce=Ae.prototype,_e=function(){var e=S(this),t=e.scheme,n=e.username,r=e.password,i=e.host,o=e.port,s=e.path,a=e.query,l=e.fragment,c=t+":";return null!==i?(c+="//",K(e)&&(c+=n+(r?":"+r:"")+"@"),c+=B(i),null!==o&&(c+=":"+o)):"file"==t&&(c+="//"),c+=e.cannotBeABaseURL?s[0]:s.length?"/"+s.join("/"):"",null!==a&&(c+="?"+a),null!==l&&(c+="#"+l),c},Fe=function(){var e=S(this),t=e.scheme,n=e.port;if("blob"==t)try{return new URL(t.path[0]).origin}catch(e){return"null"}return"file"!=t&&V(e)?t+"://"+B(e.host)+(null!==n?":"+n:""):"null"},Te=function(){return S(this).scheme+":"},Ie=function(){return S(this).username},Me=function(){return S(this).password},Re=function(){var e=S(this),t=e.host,n=e.port;return null===t?"":null===n?B(t):B(t)+":"+n},ze=function(){var e=S(this).host;return null===e?"":B(e)},qe=function(){var e=S(this).port;return null===e?"":String(e)},Oe=function(){var e=S(this),t=e.path;return e.cannotBeABaseURL?t[0]:t.length?"/"+t.join("/"):""},Ue=function(){var e=S(this).query;return e?"?"+e:""},je=function(){return S(this).searchParams},De=function(){var e=S(this).fragment;return e?"#"+e:""},Pe=function(e,t){return{get:e,set:t,configurable:!0,enumerable:!0}};if(o&&l(Ce,{href:Pe(_e,function(e){var t=S(this),n=String(e),r=Le(t,n);if(r)throw TypeError(r);x(t.searchParams).updateSearchParams(t.query)}),origin:Pe(Fe),protocol:Pe(Te,function(e){var t=S(this);Le(t,String(e)+":",ie)}),username:Pe(Ie,function(e){var t=S(this),n=p(String(e));if(!Z(t)){t.username="";for(var r=0;re.length)&&(t=e.length);for(var n=0,r=new Array(t);n1?r-1:0),o=1;o=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,a=!0,l=!1;return{s:function(){r=t[Symbol.iterator]()},n:function(){var e=r.next();return a=e.done,e},e:function(e){l=!0,s=e},f:function(){try{a||null==r.return||r.return()}finally{if(l)throw s}}}}(n,!0);try{for(a.s();!(s=a.n()).done;)s.value.apply(this,i)}catch(e){a.e(e)}finally{a.f()}}return this.element&&this.element.dispatchEvent(this.makeEvent("dropzone:"+t,{args:i})),this}},{key:"makeEvent",value:function(e,t){var n={bubbles:!0,cancelable:!0,detail:t};if("function"==typeof window.CustomEvent)return new CustomEvent(e,n);var r=document.createEvent("CustomEvent");return r.initCustomEvent(e,n.bubbles,n.cancelable,n.detail),r}},{key:"off",value:function(e,t){if(!this._callbacks||0===arguments.length)return this._callbacks={},this;var n=this._callbacks[e];if(!n)return this;if(1===arguments.length)return delete this._callbacks[e],this;for(var r=0;r=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,l=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return a=e.done,e},e:function(e){l=!0,o=e},f:function(){try{a||null==n.return||n.return()}finally{if(l)throw o}}}}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n'),this.element.appendChild(e));var i=e.getElementsByTagName("span")[0];return i&&(null!=i.textContent?i.textContent=this.options.dictFallbackMessage:null!=i.innerText&&(i.innerText=this.options.dictFallbackMessage)),this.element.appendChild(this.getFallbackForm())},resize:function(e,t,n,r){var i={srcX:0,srcY:0,srcWidth:e.width,srcHeight:e.height},o=e.width/e.height;null==t&&null==n?(t=i.srcWidth,n=i.srcHeight):null==t?t=n*o:null==n&&(n=t/o);var s=(t=Math.min(t,i.srcWidth))/(n=Math.min(n,i.srcHeight));if(i.srcWidth>t||i.srcHeight>n)if("crop"===r)o>s?(i.srcHeight=e.height,i.srcWidth=i.srcHeight*s):(i.srcWidth=e.width,i.srcHeight=i.srcWidth/s);else{if("contain"!==r)throw new Error("Unknown resizeMethod '".concat(r,"'"));o>s?n=t/o:t=n*o}return i.srcX=(e.width-i.srcWidth)/2,i.srcY=(e.height-i.srcHeight)/2,i.trgWidth=t,i.trgHeight=n,i},transformFile:function(e,t){return(this.options.resizeWidth||this.options.resizeHeight)&&e.type.match(/image.*/)?this.resizeImage(e,this.options.resizeWidth,this.options.resizeHeight,this.options.resizeMethod,t):t(e)},previewTemplate:'
    Check
    Error
    ',drop:function(e){return this.element.classList.remove("dz-drag-hover")},dragstart:function(e){},dragend:function(e){return this.element.classList.remove("dz-drag-hover")},dragenter:function(e){return this.element.classList.add("dz-drag-hover")},dragover:function(e){return this.element.classList.add("dz-drag-hover")},dragleave:function(e){return this.element.classList.remove("dz-drag-hover")},paste:function(e){},reset:function(){return this.element.classList.remove("dz-started")},addedfile:function(e){var t=this;if(this.element===this.previewsContainer&&this.element.classList.add("dz-started"),this.previewsContainer&&!this.options.disablePreviews){e.previewElement=y.createElement(this.options.previewTemplate.trim()),e.previewTemplate=e.previewElement,this.previewsContainer.appendChild(e.previewElement);var n,r=o(e.previewElement.querySelectorAll("[data-dz-name]"),!0);try{for(r.s();!(n=r.n()).done;){var i=n.value;i.textContent=e.name}}catch(e){r.e(e)}finally{r.f()}var s,a=o(e.previewElement.querySelectorAll("[data-dz-size]"),!0);try{for(a.s();!(s=a.n()).done;)(i=s.value).innerHTML=this.filesize(e.size)}catch(e){a.e(e)}finally{a.f()}this.options.addRemoveLinks&&(e._removeLink=y.createElement('
    '.concat(this.options.dictRemoveFile,"")),e.previewElement.appendChild(e._removeLink));var l,c=function(n){return n.preventDefault(),n.stopPropagation(),e.status===y.UPLOADING?y.confirm(t.options.dictCancelUploadConfirmation,function(){return t.removeFile(e)}):t.options.dictRemoveFileConfirmation?y.confirm(t.options.dictRemoveFileConfirmation,function(){return t.removeFile(e)}):t.removeFile(e)},u=o(e.previewElement.querySelectorAll("[data-dz-remove]"),!0);try{for(u.s();!(l=u.n()).done;)l.value.addEventListener("click",c)}catch(e){u.e(e)}finally{u.f()}}},removedfile:function(e){return null!=e.previewElement&&null!=e.previewElement.parentNode&&e.previewElement.parentNode.removeChild(e.previewElement),this._updateMaxFilesReachedClass()},thumbnail:function(e,t){if(e.previewElement){e.previewElement.classList.remove("dz-file-preview");var n,r=o(e.previewElement.querySelectorAll("[data-dz-thumbnail]"),!0);try{for(r.s();!(n=r.n()).done;){var i=n.value;i.alt=e.name,i.src=t}}catch(e){r.e(e)}finally{r.f()}return setTimeout(function(){return e.previewElement.classList.add("dz-image-preview")},1)}},error:function(e,t){if(e.previewElement){e.previewElement.classList.add("dz-error"),"string"!=typeof t&&t.error&&(t=t.error);var n,r=o(e.previewElement.querySelectorAll("[data-dz-errormessage]"),!0);try{for(r.s();!(n=r.n()).done;)n.value.textContent=t}catch(e){r.e(e)}finally{r.f()}}},errormultiple:function(){},processing:function(e){if(e.previewElement&&(e.previewElement.classList.add("dz-processing"),e._removeLink))return e._removeLink.innerHTML=this.options.dictCancelUpload},processingmultiple:function(){},uploadprogress:function(e,t,n){if(e.previewElement){var r,i=o(e.previewElement.querySelectorAll("[data-dz-uploadprogress]"),!0);try{for(i.s();!(r=i.n()).done;){var s=r.value;"PROGRESS"===s.nodeName?s.value=t:s.style.width="".concat(t,"%")}}catch(e){i.e(e)}finally{i.f()}}},totaluploadprogress:function(){},sending:function(){},sendingmultiple:function(){},success:function(e){if(e.previewElement)return e.previewElement.classList.add("dz-success")},successmultiple:function(){},canceled:function(e){return this.emit("error",e,this.options.dictUploadCanceled)},canceledmultiple:function(){},complete:function(e){if(e._removeLink&&(e._removeLink.innerHTML=this.options.dictRemoveFile),e.previewElement)return e.previewElement.classList.add("dz-complete")},completemultiple:function(){},maxfilesexceeded:function(){},maxfilesreached:function(){},queuecomplete:function(){},addedfiles:function(){}};function l(e){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l(e)}function c(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return u(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?u(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return s=e.done,e},e:function(e){a=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n"))),this.clickableElements.length&&function t(){e.hiddenFileInput&&e.hiddenFileInput.parentNode.removeChild(e.hiddenFileInput),e.hiddenFileInput=document.createElement("input"),e.hiddenFileInput.setAttribute("type","file"),(null===e.options.maxFiles||e.options.maxFiles>1)&&e.hiddenFileInput.setAttribute("multiple","multiple"),e.hiddenFileInput.className="dz-hidden-input",null!==e.options.acceptedFiles&&e.hiddenFileInput.setAttribute("accept",e.options.acceptedFiles),null!==e.options.capture&&e.hiddenFileInput.setAttribute("capture",e.options.capture),e.hiddenFileInput.setAttribute("tabindex","-1"),e.hiddenFileInput.style.visibility="hidden",e.hiddenFileInput.style.position="absolute",e.hiddenFileInput.style.top="0",e.hiddenFileInput.style.left="0",e.hiddenFileInput.style.height="0",e.hiddenFileInput.style.width="0",o.getElement(e.options.hiddenInputContainer,"hiddenInputContainer").appendChild(e.hiddenFileInput),e.hiddenFileInput.addEventListener("change",function(){var n=e.hiddenFileInput.files;if(n.length){var r,i=c(n,!0);try{for(i.s();!(r=i.n()).done;){var o=r.value;e.addFile(o)}}catch(e){i.e(e)}finally{i.f()}}e.emit("addedfiles",n),t()})}(),this.URL=null!==window.URL?window.URL:window.webkitURL;var t,n=c(this.events,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.on(r,this.options[r])}}catch(e){n.e(e)}finally{n.f()}this.on("uploadprogress",function(){return e.updateTotalUploadProgress()}),this.on("removedfile",function(){return e.updateTotalUploadProgress()}),this.on("canceled",function(t){return e.emit("complete",t)}),this.on("complete",function(t){if(0===e.getAddedFiles().length&&0===e.getUploadingFiles().length&&0===e.getQueuedFiles().length)return setTimeout(function(){return e.emit("queuecomplete")},0)});var i=function(e){if(function(e){if(e.dataTransfer.types)for(var t=0;t")),n+='');var r=o.createElement(n);return"FORM"!==this.element.tagName?(t=o.createElement('
    '))).appendChild(r):(this.element.setAttribute("enctype","multipart/form-data"),this.element.setAttribute("method",this.options.method)),null!=t?t:r}},{key:"getExistingFallback",value:function(){for(var e=function(e){var t,n=c(e,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;if(/(^| )fallback($| )/.test(r.className))return r}}catch(e){n.e(e)}finally{n.f()}},t=0,n=["div","form"];t0){for(var r=["tb","gb","mb","kb","b"],i=0;i=Math.pow(this.options.filesizeBase,4-i)/10){t=e/Math.pow(this.options.filesizeBase,4-i),n=o;break}}t=Math.round(10*t)/10}return"".concat(t," ").concat(this.options.dictFileSizeUnits[n])}},{key:"_updateMaxFilesReachedClass",value:function(){return null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(this.getAcceptedFiles().length===this.options.maxFiles&&this.emit("maxfilesreached",this.files),this.element.classList.add("dz-max-files-reached")):this.element.classList.remove("dz-max-files-reached")}},{key:"drop",value:function(e){if(e.dataTransfer){this.emit("drop",e);for(var t=[],n=0;n0){var i,o=c(r,!0);try{for(o.s();!(i=o.n()).done;){var s=i.value;s.isFile?s.file(function(e){if(!n.options.ignoreHiddenFiles||"."!==e.name.substring(0,1))return e.fullPath="".concat(t,"/").concat(e.name),n.addFile(e)}):s.isDirectory&&n._addFilesFromDirectory(s,"".concat(t,"/").concat(s.name))}}catch(e){o.e(e)}finally{o.f()}e()}return null},i)}()}},{key:"accept",value:function(e,t){this.options.maxFilesize&&e.size>1024*this.options.maxFilesize*1024?t(this.options.dictFileTooBig.replace("{{filesize}}",Math.round(e.size/1024/10.24)/100).replace("{{maxFilesize}}",this.options.maxFilesize)):o.isValidFile(e,this.options.acceptedFiles)?null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(t(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}",this.options.maxFiles)),this.emit("maxfilesexceeded",e)):this.options.accept.call(this,e,t):t(this.options.dictInvalidFileType)}},{key:"addFile",value:function(e){var t=this;e.upload={uuid:o.uuidv4(),progress:0,total:e.size,bytesSent:0,filename:this._renameFile(e)},this.files.push(e),e.status=o.ADDED,this.emit("addedfile",e),this._enqueueThumbnail(e),this.accept(e,function(n){n?(e.accepted=!1,t._errorProcessing([e],n)):(e.accepted=!0,t.options.autoQueue&&t.enqueueFile(e)),t._updateMaxFilesReachedClass()})}},{key:"enqueueFiles",value:function(e){var t,n=c(e,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.enqueueFile(r)}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"enqueueFile",value:function(e){var t=this;if(e.status!==o.ADDED||!0!==e.accepted)throw new Error("This file can't be queued because it has already been processed or was rejected.");if(e.status=o.QUEUED,this.options.autoProcessQueue)return setTimeout(function(){return t.processQueue()},0)}},{key:"_enqueueThumbnail",value:function(e){var t=this;if(this.options.createImageThumbnails&&e.type.match(/image.*/)&&e.size<=1024*this.options.maxThumbnailFilesize*1024)return this._thumbnailQueue.push(e),setTimeout(function(){return t._processThumbnailQueue()},0)}},{key:"_processThumbnailQueue",value:function(){var e=this;if(!this._processingThumbnail&&0!==this._thumbnailQueue.length){this._processingThumbnail=!0;var t=this._thumbnailQueue.shift();return this.createThumbnail(t,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,!0,function(n){return e.emit("thumbnail",t,n),e._processingThumbnail=!1,e._processThumbnailQueue()})}}},{key:"removeFile",value:function(e){if(e.status===o.UPLOADING&&this.cancelUpload(e),this.files=b(this.files,e),this.emit("removedfile",e),0===this.files.length)return this.emit("reset")}},{key:"removeAllFiles",value:function(e){null==e&&(e=!1);var t,n=c(this.files.slice(),!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;(r.status!==o.UPLOADING||e)&&this.removeFile(r)}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"resizeImage",value:function(e,t,n,r,i){var s=this;return this.createThumbnail(e,t,n,r,!0,function(t,n){if(null==n)return i(e);var r=s.options.resizeMimeType;null==r&&(r=e.type);var a=n.toDataURL(r,s.options.resizeQuality);return"image/jpeg"!==r&&"image/jpg"!==r||(a=E.restore(e.dataURL,a)),i(o.dataURItoBlob(a))})}},{key:"createThumbnail",value:function(e,t,n,r,i,o){var s=this,a=new FileReader;a.onload=function(){e.dataURL=a.result,"image/svg+xml"!==e.type?s.createThumbnailFromUrl(e,t,n,r,i,o):null!=o&&o(a.result)},a.readAsDataURL(e)}},{key:"displayExistingFile",value:function(e,t,n,r){var i=this,o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4];this.emit("addedfile",e),this.emit("complete",e),o?(e.dataURL=t,this.createThumbnailFromUrl(e,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,this.options.fixOrientation,function(t){i.emit("thumbnail",e,t),n&&n()},r)):(this.emit("thumbnail",e,t),n&&n())}},{key:"createThumbnailFromUrl",value:function(e,t,n,r,i,o,s){var a=this,l=document.createElement("img");return s&&(l.crossOrigin=s),i="from-image"!=getComputedStyle(document.body).imageOrientation&&i,l.onload=function(){var s=function(e){return e(1)};return"undefined"!=typeof EXIF&&null!==EXIF&&i&&(s=function(e){return EXIF.getData(l,function(){return e(EXIF.getTag(this,"Orientation"))})}),s(function(i){e.width=l.width,e.height=l.height;var s=a.options.resize.call(a,e,t,n,r),c=document.createElement("canvas"),u=c.getContext("2d");switch(c.width=s.trgWidth,c.height=s.trgHeight,i>4&&(c.width=s.trgHeight,c.height=s.trgWidth),i){case 2:u.translate(c.width,0),u.scale(-1,1);break;case 3:u.translate(c.width,c.height),u.rotate(Math.PI);break;case 4:u.translate(0,c.height),u.scale(1,-1);break;case 5:u.rotate(.5*Math.PI),u.scale(1,-1);break;case 6:u.rotate(.5*Math.PI),u.translate(0,-c.width);break;case 7:u.rotate(.5*Math.PI),u.translate(c.height,-c.width),u.scale(-1,1);break;case 8:u.rotate(-.5*Math.PI),u.translate(-c.height,0)}x(u,l,null!=s.srcX?s.srcX:0,null!=s.srcY?s.srcY:0,s.srcWidth,s.srcHeight,null!=s.trgX?s.trgX:0,null!=s.trgY?s.trgY:0,s.trgWidth,s.trgHeight);var d=c.toDataURL("image/png");if(null!=o)return o(d,c)})},null!=o&&(l.onerror=o),l.src=e.dataURL}},{key:"processQueue",value:function(){var e=this.options.parallelUploads,t=this.getUploadingFiles().length,n=t;if(!(t>=e)){var r=this.getQueuedFiles();if(r.length>0){if(this.options.uploadMultiple)return this.processFiles(r.slice(0,e-t));for(;n1?t-1:0),r=1;rt.options.chunkSize),e[0].upload.totalChunkCount=Math.ceil(r.size/t.options.chunkSize)}if(e[0].upload.chunked){var i=e[0],s=n[0];i.upload.chunks=[];var a=function(){for(var n=0;void 0!==i.upload.chunks[n];)n++;if(!(n>=i.upload.totalChunkCount)){var r=n*t.options.chunkSize,a=Math.min(r+t.options.chunkSize,s.size),l={name:t._getParamName(0),data:s.webkitSlice?s.webkitSlice(r,a):s.slice(r,a),filename:i.upload.filename,chunkIndex:n};i.upload.chunks[n]={file:i,index:n,dataBlock:l,status:o.UPLOADING,progress:0,retries:0},t._uploadData(e,[l])}};if(i.upload.finishedChunkUpload=function(n,r){var s=!0;n.status=o.SUCCESS,n.dataBlock=null,n.xhr=null;for(var l=0;l1?t-1:0),r=1;r=s;a?o++:o--)i[o]=t.charCodeAt(o);return new Blob([r],{type:n})};var b=function(e,t){return e.filter(function(e){return e!==t}).map(function(e){return e})},w=function(e){return e.replace(/[\-_](\w)/g,function(e){return e.charAt(1).toUpperCase()})};y.createElement=function(e){var t=document.createElement("div");return t.innerHTML=e,t.childNodes[0]},y.elementInside=function(e,t){if(e===t)return!0;for(;e=e.parentNode;)if(e===t)return!0;return!1},y.getElement=function(e,t){var n;if("string"==typeof e?n=document.querySelector(e):null!=e.nodeType&&(n=e),null==n)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector or a plain HTML element."));return n},y.getElements=function(e,t){var n,r;if(e instanceof Array){r=[];try{var i,o=c(e,!0);try{for(o.s();!(i=o.n()).done;)n=i.value,r.push(this.getElement(n,t))}catch(e){o.e(e)}finally{o.f()}}catch(e){r=null}}else if("string"==typeof e){r=[];var s,a=c(document.querySelectorAll(e),!0);try{for(a.s();!(s=a.n()).done;)n=s.value,r.push(n)}catch(e){a.e(e)}finally{a.f()}}else null!=e.nodeType&&(r=[e]);if(null==r||!r.length)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector, a plain HTML element or a list of those."));return r},y.confirm=function(e,t,n){return window.confirm(e)?t():null!=n?n():void 0},y.isValidFile=function(e,t){if(!t)return!0;t=t.split(",");var n,r=e.type,i=r.replace(/\/.*$/,""),o=c(t,!0);try{for(o.s();!(n=o.n()).done;){var s=n.value;if("."===(s=s.trim()).charAt(0)){if(-1!==e.name.toLowerCase().indexOf(s.toLowerCase(),e.name.length-s.length))return!0}else if(/\/\*$/.test(s)){if(i===s.replace(/\/.*$/,""))return!0}else if(r===s)return!0}}catch(e){o.e(e)}finally{o.f()}return!1},"undefined"!=typeof jQuery&&null!==jQuery&&(jQuery.fn.dropzone=function(e){return this.each(function(){return new y(this,e)})}),y.ADDED="added",y.QUEUED="queued",y.ACCEPTED=y.QUEUED,y.UPLOADING="uploading",y.PROCESSING=y.UPLOADING,y.CANCELED="canceled",y.ERROR="error",y.SUCCESS="success";var x=function(e,t,n,r,i,o,s,a,l,c){var u=function(e){e.naturalWidth;var t=e.naturalHeight,n=document.createElement("canvas");n.width=1,n.height=t;var r=n.getContext("2d");r.drawImage(e,0,0);for(var i=r.getImageData(1,0,1,t).data,o=0,s=t,a=t;a>o;)0===i[4*(a-1)+3]?s=a:o=a,a=s+o>>1;var l=a/t;return 0===l?1:l}(t);return e.drawImage(t,n,r,i,o,s,a,l,c/u)},E=function(){function e(){d(this,e)}return p(e,null,[{key:"initClass",value:function(){this.KEY_STR="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}},{key:"encode64",value:function(e){for(var t="",n=void 0,r=void 0,i="",o=void 0,s=void 0,a=void 0,l="",c=0;o=(n=e[c++])>>2,s=(3&n)<<4|(r=e[c++])>>4,a=(15&r)<<2|(i=e[c++])>>6,l=63&i,isNaN(r)?a=l=64:isNaN(i)&&(l=64),t=t+this.KEY_STR.charAt(o)+this.KEY_STR.charAt(s)+this.KEY_STR.charAt(a)+this.KEY_STR.charAt(l),n=r=i="",o=s=a=l="",ce.length)break}return n}},{key:"decode64",value:function(e){var t=void 0,n=void 0,r="",i=void 0,o=void 0,s="",a=0,l=[];for(/[^A-Za-z0-9\+\/\=]/g.exec(e)&&console.warn("There were invalid base64 characters in the input text.\nValid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\nExpect errors in decoding."),e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");t=this.KEY_STR.indexOf(e.charAt(a++))<<2|(i=this.KEY_STR.indexOf(e.charAt(a++)))>>4,n=(15&i)<<4|(o=this.KEY_STR.indexOf(e.charAt(a++)))>>2,r=(3&o)<<6|(s=this.KEY_STR.indexOf(e.charAt(a++))),l.push(t),64!==o&&l.push(n),64!==s&&l.push(r),t=n=r="",i=o=s="",at.options.priority?-1:e.options.priority=0;n--)this._subscribers[n].fn!==e&&this._subscribers[n].id!==e||(this._subscribers[n].channel=null,this._subscribers.splice(n,1));else this._subscribers=[];if(t&&this.autoCleanChannel(),n=this._subscribers.length-1,e)for(;n>=0;n--)this._subscribers[n].fn!==e&&this._subscribers[n].id!==e||(this._subscribers[n].channel=null,this._subscribers.splice(n,1));else this._subscribers=[]},t.prototype.autoCleanChannel=function(){if(0===this._subscribers.length){for(var e in this._channels)if(this._channels.hasOwnProperty(e))return;if(null!=this._parent){var t=this.namespace.split(":"),n=t[t.length-1];this._parent.removeChannel(n)}}},t.prototype.removeChannel=function(e){this.hasChannel(e)&&(this._channels[e]=null,delete this._channels[e],this.autoCleanChannel())},t.prototype.publish=function(e){for(var t,n,r,i=0,o=this._subscribers.length,s=!1;i0)for(;i{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";var e=n(295),t=n.n(e),r=n(216);window.Cl=window.Cl||{};class i{constructor(e={}){this.options={linksSelector:".js-toggler-link",dataHeaderSelector:"toggler-header-selector",dataContentSelector:"toggler-content-selector",collapsedClass:"js-collapsed",expandedClass:"js-expanded",hiddenClass:"hidden",...e},this.togglerInstances=[],document.querySelectorAll(this.options.linksSelector).forEach(e=>{const t=new o(e,this.options);this.togglerInstances.push(t)})}destroy(){this.links=null,this.togglerInstances.forEach(e=>e.destroy()),this.togglerInstances=[]}}class o{constructor(e,t={}){this.options={...t},this.link=e,this.headerSelector=this.link.dataset[this.options.dataHeaderSelector],this.contentSelector=this.link.dataset[this.options.dataContentSelector],this.header=document.querySelector(this.headerSelector),this.header=this.header||this.link,this.content=document.querySelector(this.contentSelector),this.content&&this._initLink()}_updateClasses(){this.content.classList.contains(this.options.hiddenClass)?(this.header.classList.remove(this.options.expandedClass),this.header.classList.add(this.options.collapsedClass)):(this.header.classList.add(this.options.expandedClass),this.header.classList.remove(this.options.collapsedClass))}_onTogglerClick(e){this.content.classList.toggle(this.options.hiddenClass),this._updateClasses(),e.preventDefault()}_initLink(){this._updateClasses(),this.link.addEventListener("click",e=>this._onTogglerClick(e))}destroy(){this.options=null,this.link=null}}Cl.Toggler=i,Cl.TogglerConstructor=o;const s=i;n(413);var a=n(628),l=n.n(a);document.addEventListener("DOMContentLoaded",()=>{let e=0,t=1;const n=document.querySelector(".js-upload-button");if(!n)return;const r=document.querySelector(".js-upload-button-disabled"),i=n.dataset.url;if(!i)return;const o=document.querySelector(".js-filer-dropzone-upload-welcome"),s=document.querySelector(".js-filer-dropzone-upload-info-container"),a=document.querySelector(".js-filer-dropzone-upload-info"),c=document.querySelector(".js-filer-dropzone-upload-number"),u=".js-filer-dropzone-progress",d=document.querySelector(".js-filer-dropzone-upload-success"),f=document.querySelector(".js-filer-dropzone-upload-canceled"),p=document.querySelector(".js-filer-dropzone-cancel"),h=document.querySelector(".js-filer-dropzone-info-message"),v="hidden",m=parseInt(n.dataset.maxUploaderConnections||3,10),g=parseInt(n.dataset.maxFilesize||0,10);let y=!1;const b=()=>{c&&(c.textContent=`${t-e}/${t}`)},w=()=>{n&&n.remove()},x=()=>{const e=window.location.toString();window.location.replace(((e,t,n)=>{const r=new RegExp(`([?&])${t}=.*?(&|$)`,"i"),i=-1!==e.indexOf("?")?"&":"?",o=window.location.hash;return(e=e.replace(/#.*$/,"")).match(r)?e.replace(r,`$1${t}=${n}$2`)+o:e+i+t+"="+n+o})(e,"order_by","-modified_at"))};let E;Cl.mediator.subscribe("filer-upload-in-progress",w),n.addEventListener("click",e=>{e.preventDefault()}),l().autoDiscover=!1;try{E=new(l())(n,{url:i,paramName:"file",maxFilesize:g,parallelUploads:m,clickable:n,previewTemplate:"
    ",addRemoveLinks:!1,autoProcessQueue:!0})}catch(e){return void console.error("[Filer Upload] Failed to create Dropzone instance:",e)}E.on("addedfile",n=>{Cl.mediator.remove("filer-upload-in-progress",w),Cl.mediator.publish("filer-upload-in-progress"),e++,t=E.files.length,h&&h.classList.remove(v),o&&o.classList.add(v),d&&d.classList.add(v),s&&s.classList.remove(v),p&&p.classList.remove(v),f&&f.classList.add(v),b()}),E.on("uploadprogress",(e,t)=>{const n=Math.round(t),r=`file-${encodeURIComponent(e.name)}${e.size}${e.lastModified}`,i=document.getElementById(r);let o;if(i){const e=i.querySelector(u);e&&(e.style.width=`${n}%`)}else if(a){o=a.cloneNode(!0);const t=o.querySelector(".js-filer-dropzone-file-name");t&&(t.textContent=e.name);const i=o.querySelector(u);i&&(i.style.width=`${n}%`),o.classList.remove(v),o.setAttribute("id",r),s&&s.appendChild(o)}}),E.on("success",(n,r)=>{const i=`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}`,s=document.getElementById(i);s&&s.remove(),r.error&&(y=!0,window.filerShowError(`${n.name}: ${r.error}`)),e--,b(),0===e&&(t=1,o&&o.classList.add(v),c&&c.classList.add(v),f&&f.classList.add(v),p&&p.classList.add(v),d&&d.classList.remove(v),y?setTimeout(x,1e3):x())}),E.on("error",(n,r)=>{const i=`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}`,s=document.getElementById(i);s&&s.remove(),y=!0,window.filerShowError(`${n.name}: ${r}`),e--,b(),0===e&&(t=1,o&&o.classList.add(v),c&&c.classList.add(v),f&&f.classList.add(v),p&&p.classList.add(v),d&&d.classList.remove(v),setTimeout(x,1e3))}),p&&p.addEventListener("click",e=>{e.preventDefault(),p.classList.add(v),c&&c.classList.add(v),s&&s.classList.add(v),f&&f.classList.remove(v),setTimeout(()=>{window.location.reload()},1e3)}),r&&Cl.filerTooltip&&Cl.filerTooltip(),document.dispatchEvent(new Event("filer-upload-scripts-executed"))}),l()&&(l().autoDiscover=!1),document.addEventListener("DOMContentLoaded",()=>{const e=".js-img-preview",t=".js-filer-dropzone",n=document.querySelectorAll(t),r=".js-filer-dropzone-progress",i=".js-img-wrapper",o="hidden",s="filer-dropzone-mobile",a="js-object-attached",c=e=>{e.offsetWidth<500?e.classList.add(s):e.classList.remove(s)},u=e=>{try{window.parent.CMS.API.Messages.open({message:e})}catch{window.filerShowError?window.filerShowError(e):alert(e)}},d=function(t){const n=t.dataset.url,s=t.querySelector(".vForeignKeyRawIdAdminField"),d="image"===s?.getAttribute("name"),f=t.querySelector(".js-related-lookup"),p=t.querySelector(".js-related-edit"),h=t.querySelector(".js-filer-dropzone-message"),v=t.querySelector(".filerClearer"),m=t.querySelector(".js-file-selector");t.dropzone||(window.addEventListener("resize",()=>{c(t)}),new(l())(t,{url:n,paramName:"file",maxFiles:1,maxFilesize:t.dataset.maxFilesize,previewTemplate:document.querySelector(".js-filer-dropzone-template")?.innerHTML||"
    ",clickable:!1,addRemoveLinks:!1,init:function(){c(t),this.on("removedfile",()=>{m&&(m.style.display=""),t.classList.remove(a),this.removeAllFiles(),v?.click()}),this.element.querySelectorAll("img").forEach(e=>{e.addEventListener("dragstart",e=>{e.preventDefault()})}),v&&v.addEventListener("click",()=>{t.classList.remove(a)})},maxfilesexceeded:function(){this.removeAllFiles(!0)},drop:function(){this.removeAllFiles(!0),v?.click();const e=t.querySelector(r);e&&e.classList.remove(o),m&&(m.style.display="block"),f?.classList.add("related-lookup-change"),p?.classList.add("related-lookup-change"),h?.classList.add(o),t.classList.remove("dz-drag-hover"),t.classList.add(a)},success:function(n,a){const l=t.querySelector(r);if(l&&l.classList.add(o),n&&"success"===n.status&&a){if(a.file_id&&s){s.value=a.file_id;const e=new Event("change",{bubbles:!0});s.dispatchEvent(e)}if(a.thumbnail_180&&d){const n=t.querySelector(e);n&&(n.style.backgroundImage=`url(${a.thumbnail_180})`);const r=t.querySelector(i);r&&r.classList.remove(o)}}else a&&a.error&&u(`${n.name}: ${a.error}`),this.removeAllFiles(!0);this.element.querySelectorAll("img").forEach(e=>{e.addEventListener("dragstart",e=>{e.preventDefault()})})},error:function(e,t,n){n&&n.error&&(t+=` ; ${n.error}`),u(`${e.name}: ${t}`),this.removeAllFiles(!0)},reset:function(){if(d){const n=t.querySelector(i);n&&n.classList.add(o);const r=t.querySelector(e);r&&(r.style.backgroundImage="none")}if(t.classList.remove(a),s&&(s.value=""),f?.classList.remove("related-lookup-change"),p?.classList.remove("related-lookup-change"),h?.classList.remove(o),s){const e=new Event("change",{bubbles:!0});s.dispatchEvent(e)}}}))};n.length&&l()&&(window.filerDropzoneInitialized||(window.filerDropzoneInitialized=!0,l().autoDiscover=!1),n.forEach(d),document.addEventListener("formset:added",e=>{let n,r,i;e.detail&&e.detail.formsetName?(r=parseInt(document.getElementById(`id_${e.detail.formsetName}-TOTAL_FORMS`).value,10)-1,i=document.getElementById(`${e.detail.formsetName}-${r}`),n=i?.querySelectorAll(t)||[]):(i=e.target,n=i?.querySelectorAll(t)||[]),n?.forEach(d)}))}),document.addEventListener("DOMContentLoaded",()=>{let e=0,t=0;const n=[],r=document.querySelector(".js-filer-dropzone-base"),i=".js-filer-dropzone";let o;const s=document.querySelector(".js-filer-dropzone-info-message"),a=document.querySelector(".js-filer-dropzone-folder-name"),c=document.querySelector(".js-filer-dropzone-upload-info-container"),u=document.querySelector(".js-filer-dropzone-upload-info"),d=document.querySelector(".js-filer-dropzone-upload-welcome"),f=document.querySelector(".js-filer-dropzone-upload-number"),p=document.querySelector(".js-filer-upload-count"),h=document.querySelector(".js-filer-upload-text"),v=".js-filer-dropzone-progress",m=document.querySelector(".js-filer-dropzone-upload-success"),g=document.querySelector(".js-filer-dropzone-upload-canceled"),y=document.querySelector(".js-filer-dropzone-cancel"),b="dz-drag-hover",w=document.querySelector(".drag-hover-border"),x="hidden";let E,S,k,L=!1;const A=()=>{const e=window.location.toString();window.location.replace(((e,t,n)=>{const r=new RegExp(`([?&])${t}=.*?(&|$)`,"i"),i=-1!==e.indexOf("?")?"&":"?",o=window.location.hash;return(e=e.replace(/#.*$/,"")).match(r)?e.replace(r,`$1${t}=${n}$2`)+o:e+i+t+"="+n+o})(e,"order_by","-modified_at"))},C=()=>{f&&(f.textContent=`${t-e}/${t}`),h&&h.classList.remove("hidden"),p&&p.classList.remove("hidden")},_=()=>{n.forEach(e=>{e.destroy()})},F=(e,t)=>document.getElementById(`file-${encodeURIComponent(e.name)}${e.size}${e.lastModified}${t}`);if(r){S=r.dataset.url,k=r.dataset.folderName;const e=document.body;e.dataset.url=S,e.dataset.folderName=k,e.dataset.maxFiles=r.dataset.maxFiles,e.dataset.maxFilesize=r.dataset.maxFiles,e.classList.add("js-filer-dropzone")}Cl.mediator.subscribe("filer-upload-in-progress",_),o=document.querySelectorAll(i),o.length&&l()&&(l().autoDiscover=!1,o.forEach(r=>{if(r.dropzone)return;const p=r.dataset.url,h=new(l())(r,{url:p,paramName:"file",maxFiles:parseInt(r.dataset.maxFiles)||100,maxFilesize:parseInt(r.dataset.maxFilesize),previewTemplate:"
    ",clickable:!1,addRemoveLinks:!1,parallelUploads:r.dataset["max-uploader-connections"]||3,accept:(n,r)=>{let i;if(console.log("[Filer DnD] accept:",n.name,"url:",p),Cl.mediator.remove("filer-upload-in-progress",_),Cl.mediator.publish("filer-upload-in-progress"),clearTimeout(E),clearTimeout(E),d&&d.classList.add(x),y&&y.classList.remove(x),F(n,p))r("duplicate");else{i=u.cloneNode(!0);const o=i.querySelector(".js-filer-dropzone-file-name");o&&(o.textContent=n.name);const s=i.querySelector(v);s&&(s.style.width="0"),i.setAttribute("id",`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}${p}`),c&&c.appendChild(i),e++,t++,console.log("[Filer DnD] file accepted, submitNum:",e,"maxSubmitNum:",t),C(),r()}o.forEach(e=>e.classList.remove("reset-hover")),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b))},dragover:e=>{const t=e.target.closest(i),n=t?.dataset.folderName,l=r.classList.contains("js-filer-dropzone-folder"),c=r.getBoundingClientRect(),u=w?window.getComputedStyle(w):null,d=u?u.borderTopWidth:"0px",f=u?u.borderLeftWidth:"0px",p={top:`${c.top}px`,bottom:`${c.bottom}px`,left:`${c.left}px`,right:`${c.right}px`,width:c.width-2*parseInt(f,10)+"px",height:c.height-2*parseInt(d,10)+"px",display:"block"};l&&w&&Object.assign(w.style,p),o.forEach(e=>e.classList.add("reset-hover")),m&&m.classList.add(x),s&&s.classList.remove(x),r.classList.add(b),r.classList.remove("reset-hover"),a&&n&&(a.textContent=n)},dragend:()=>{clearTimeout(E),E=setTimeout(()=>{s&&s.classList.add(x)},1e3),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b)),w&&Object.assign(w.style,{top:"0",bottom:"0",width:"0",height:"0"})},dragleave:()=>{clearTimeout(E),E=setTimeout(()=>{s&&s.classList.add(x)},1e3),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b)),w&&Object.assign(w.style,{top:"0",bottom:"0",width:"0",height:"0"})},sending:e=>{const t=F(e,p);t&&t.classList.remove(x)},uploadprogress:(e,t)=>{const n=F(e,p);if(n){const e=n.querySelector(v);e&&(e.style.width=`${t}%`)}},success:(t,n)=>{e--,console.log("[Filer DnD] success:",t.name,"submitNum:",e,"response:",n),C();const r=F(t,p);r&&r.remove()},queuecomplete:()=>{console.log("[Filer DnD] queuecomplete: submitNum:",e,"hasErrors:",L),0===e?(C(),y&&y.classList.add(x),u&&u.classList.add(x),L?(f&&f.classList.add(x),console.log("[Filer DnD] reloading after errors (1s delay)"),setTimeout(()=>{A()},1e3)):(m&&m.classList.remove(x),console.log("[Filer DnD] reloading now via reloadOrdered"),A())):console.warn("[Filer DnD] queuecomplete: submitNum is not 0, skipping reload")},error:(t,n)=>{if(console.error("[Filer DnD] error:",t.name,"error:",n,"submitNum:",e),"duplicate"===n)return void console.log("[Filer DnD] duplicate file, ignoring");e--,console.log("[Filer DnD] after error decrement, submitNum:",e),C();const r=F(t,p);r&&r.remove(),L=!0,window.filerShowError&&window.filerShowError(`${t.name}: ${n.message||n}`)}});n.push(h),y&&y.addEventListener("click",e=>{e.preventDefault(),y.classList.add(x),g&&g.classList.remove(x),h.removeAllFiles(!0)})}))}),n(117),n(221),n(472),n(902),n(577),window.Cl=window.Cl||{},Cl.mediator=new(t()),Cl.FocalPoint=r.A,Cl.Toggler=s,document.addEventListener("DOMContentLoaded",()=>{let e;window.filerShowError=t=>{const n=document.querySelector(".messagelist"),r=document.querySelector("#header"),i="js-filer-error",o=`
    • {msg}
    `.replace("{msg}",t);n?n.outerHTML=o:r&&r.insertAdjacentHTML("afterend",o),e&&clearTimeout(e),e=setTimeout(()=>{const e=document.querySelector(`.${i}`);e&&e.remove()},5e3)};const t=document.querySelector(".js-filter-files");t&&(t.addEventListener("focus",e=>{const t=e.target.closest(".navigator-top-nav");t&&t.classList.add("search-is-focused")}),t.addEventListener("blur",e=>{const t=e.target.closest(".navigator-top-nav");if(t){const n=t.querySelector(".dropdown-container a");n&&e.relatedTarget===n||t.classList.remove("search-is-focused")}}));const n=document.querySelector(".js-filter-files-container");n&&n.addEventListener("submit",e=>{}),(()=>{const e=document.querySelector(".js-filter-files"),t=".navigator-top-nav",n=document.querySelector(t),r=n?.querySelector(".filter-search-wrapper .filer-dropdown-container");e&&(e.addEventListener("keydown",function(e){e.key;const n=this.closest(t);n&&n.classList.add("search-is-focused")}),r&&(r.addEventListener("show.bs.filer-dropdown",()=>{n&&n.classList.add("search-is-focused")}),r.addEventListener("hide.bs.filer-dropdown",()=>{n&&n.classList.remove("search-is-focused")})))})(),(()=>{const e=document.querySelectorAll(".navigator-table tr, .navigator-list .list-item"),t=document.querySelector(".actions-wrapper"),n=document.querySelectorAll(".action-select, #action-toggle, #files-action-toggle, #folders-action-toggle, .actions .clear a");setTimeout(()=>{n.forEach(e=>{if(e.checked){const t=e.closest(".list-item");t&&t.classList.add("selected")}}),Array.from(e).some(e=>e.classList.contains("selected"))&&t&&t.classList.add("action-selected")},100),n.forEach(n=>{n.addEventListener("change",function(){const n=this.closest(".list-item");n&&(this.checked?n.classList.add("selected"):n.classList.remove("selected")),setTimeout(()=>{const n=Array.from(e).some(e=>e.classList.contains("selected"));t&&(n?t.classList.add("action-selected"):t.classList.remove("action-selected"))},0)})})})(),(()=>{const e=document.querySelector(".js-actions-menu");if(!e)return;const t=e.querySelector(".filer-dropdown-menu"),n=document.querySelector('.actions select[name="action"]'),r=n?.querySelectorAll("option")||[],i=document.querySelector('.actions button[type="submit"]'),o=document.querySelector(".js-action-delete"),s=document.querySelector(".js-action-copy"),a=document.querySelector(".js-action-move"),l="delete_files_or_folders",c="copy_files_and_folders",u="move_files_and_folders",d=document.querySelectorAll(".navigator-table tr, .navigator-list .list-item"),f=(e,t)=>{t&&r.forEach(r=>{r.value===e&&(t.style.display="",t.addEventListener("click",t=>{if(t.preventDefault(),Array.from(d).some(e=>e.classList.contains("selected"))&&n&&i){n.value=e;const t=n.querySelector(`option[value="${e}"]`);t&&(t.selected=!0),i.click()}}))})};f(l,o),f(c,s),f(u,a),r.forEach((e,n)=>{if(0!==n){const n=document.createElement("li"),r=document.createElement("a");r.href="#",r.textContent=e.textContent,e.value!==l&&e.value!==c&&e.value!==u||r.classList.add("hidden"),n.appendChild(r),t&&t.appendChild(n)}}),t&&t.addEventListener("click",e=>{if("A"===e.target.tagName){const r=e.target.closest("li"),o=Array.from(t.querySelectorAll("li")).indexOf(r)+1;if(e.preventDefault(),n&&i){const e=n.querySelectorAll("option");e[o]&&(n.value=e[o].value,e[o].selected=!0),i.click()}}}),e.addEventListener("click",e=>{Array.from(d).some(e=>e.classList.contains("selected"))||(e.preventDefault(),e.stopPropagation())})})(),(()=>{const e=document.querySelector(".navigator-top-nav");if(!e)return;const t=document.querySelector(".breadcrumbs-container");if(!t)return;const n=t.querySelector(".navigator-breadcrumbs"),r=t.querySelector(".filer-dropdown-container"),i=document.querySelector(".filter-files-container"),o=document.querySelector(".actions-wrapper"),s=document.querySelector(".navigator-button-wrapper"),a=n?.offsetWidth||0,l=r?.offsetWidth||0,c=i?.offsetWidth||0,u=o?.offsetWidth||0,d=s?.offsetWidth||0,f=window.getComputedStyle(e),p=parseInt(f.paddingLeft,10)+parseInt(f.paddingRight,10);let h=e.offsetWidth;const v=80+a+l+c+u+d+p,m="breadcrumb-min-width",g=()=>{h{h=e.offsetWidth,g()})})(),(()=>{const e=document.querySelectorAll(".navigator-list .list-item input.action-select"),t=".navigator-list .navigator-folders-body .list-item input.action-select",n=".navigator-list .navigator-files-body .list-item input.action-select",r=document.querySelector("#files-action-toggle"),i=document.querySelector("#folders-action-toggle");i&&i.addEventListener("click",function(){const e=document.querySelectorAll(t);this.checked?e.forEach(e=>{e.checked||e.click()}):e.forEach(e=>{e.checked&&e.click()})}),r&&r.addEventListener("click",function(){const e=document.querySelectorAll(n);this.checked?e.forEach(e=>{e.checked||e.click()}):e.forEach(e=>{e.checked&&e.click()})}),e.forEach(e=>{e.addEventListener("click",function(){const e=document.querySelectorAll(n),o=document.querySelectorAll(t);if(this.checked){const t=Array.from(e).every(e=>e.checked),n=Array.from(o).every(e=>e.checked);t&&r&&(r.checked=!0),n&&i&&(i.checked=!0)}else{const t=Array.from(e).some(e=>!e.checked),n=Array.from(o).some(e=>!e.checked);t&&r&&(r.checked=!1),n&&i&&(i.checked=!1)}})});const o=document.querySelector(".navigator .actions .clear a");o&&o.addEventListener("click",()=>{i&&(i.checked=!1),r&&(r.checked=!1)})})(),document.querySelectorAll(".js-copy-url").forEach(e=>{e.addEventListener("click",function(e){const t=new URL(this.dataset.url,document.location.href),n=this.dataset.msg||"URL copied to clipboard",r=document.createElement("template");e.preventDefault(),document.querySelectorAll(".info.filer-tooltip").forEach(e=>{e.remove()}),navigator.clipboard.writeText(t.href),r.innerHTML=`
    ${n}
    `,this.classList.add("filer-tooltip-wrapper"),this.appendChild(r.content.firstChild);const i=this;setTimeout(()=>{const e=i.querySelector(".info");e&&e.remove()},1200)})}),(new r.A).initialize(),new s})})()})(); \ No newline at end of file +/* + * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development"). + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ "./filer/static/filer/js/addons/copy-move-files.js" +/*!*********************************************************!*\ + !*** ./filer/static/filer/js/addons/copy-move-files.js ***! + \*********************************************************/ +() { + +"use strict"; +eval("{\n/* global Cl */\n\n/*\n This functionality is used in folder/choose_copy_destination.html template\n to disable submit if there is only one folder to copy\n*/\n\ndocument.addEventListener('DOMContentLoaded', () => {\n const destination = document.getElementById('destination');\n if (!destination) {\n return;\n }\n\n const destinationOptions = destination.querySelectorAll('option');\n const destinationOptionLength = destinationOptions.length;\n const submit = document.querySelector('.js-submit-copy-move');\n const tooltip = document.querySelector('.js-disabled-btn-tooltip');\n\n if (destinationOptionLength === 1 && destinationOptions[0].disabled) {\n if (submit) {\n submit.style.display = 'none';\n }\n if (tooltip) {\n tooltip.style.display = 'inline-block';\n }\n }\n\n if (Cl.filerTooltip) {\n Cl.filerTooltip();\n }\n});\n\n\n//# sourceURL=webpack://django-filer/./filer/static/filer/js/addons/copy-move-files.js?\n}"); + +/***/ }, + +/***/ "./filer/static/filer/js/addons/dropdown-menu.js" +/*!*******************************************************!*\ + !*** ./filer/static/filer/js/addons/dropdown-menu.js ***! + \*******************************************************/ +() { + +"use strict"; +eval("{/* ========================================================================\n * Bootstrap: dropdown.js v3.3.6\n * http://getbootstrap.com/javascript/#dropdowns\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n(() => {\n // DROPDOWN CLASS DEFINITION\n // =========================\n\n const backdropClass = 'filer-dropdown-backdrop';\n const toggleSelector = '[data-toggle=\"filer-dropdown\"]';\n\n class Dropdown {\n constructor(element) {\n this.element = element;\n element.addEventListener('click', () => this.toggle());\n }\n\n toggle() {\n const element = this.element;\n const parent = getParent(element);\n const isActive = parent.classList.contains('open');\n const relatedTarget = { relatedTarget: element };\n\n if (element.disabled || element.classList.contains('disabled')) {\n return false;\n }\n\n clearMenus();\n\n if (!isActive) {\n if ('ontouchstart' in document.documentElement && !parent.closest('.navbar-nav')) {\n // if mobile we use a backdrop because click events don't delegate\n const backdrop = document.createElement('div');\n backdrop.className = backdropClass;\n element.parentNode.insertBefore(backdrop, element.nextSibling);\n backdrop.addEventListener('click', clearMenus);\n }\n\n const showEvent = new CustomEvent('show.bs.filer-dropdown', {\n bubbles: true,\n cancelable: true,\n detail: relatedTarget\n });\n parent.dispatchEvent(showEvent);\n\n if (showEvent.defaultPrevented) {\n return false;\n }\n\n element.focus();\n element.setAttribute('aria-expanded', 'true');\n parent.classList.add('open');\n\n const shownEvent = new CustomEvent('shown.bs.filer-dropdown', {\n bubbles: true,\n detail: relatedTarget\n });\n parent.dispatchEvent(shownEvent);\n }\n\n return false;\n }\n\n keydown(e) {\n const element = this.element;\n const parent = getParent(element);\n const isActive = parent.classList.contains('open');\n const desc = ' li:not(.disabled):visible a';\n const items = Array.from(parent.querySelectorAll(`.filer-dropdown-menu${desc}`))\n .filter(item => item.offsetParent !== null); // visible check\n const index = items.indexOf(e.target);\n\n if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n if (element.disabled || element.classList.contains('disabled')) {\n return;\n }\n\n if ((!isActive && e.which !== 27) || (isActive && e.which === 27)) {\n if (e.which === 27) {\n parent.querySelector(toggleSelector)?.focus();\n }\n return element.click();\n }\n\n if (!items.length) {\n return;\n }\n\n let newIndex = index;\n if (e.which === 38 && index > 0) {\n newIndex--; // up\n }\n if (e.which === 40 && index < items.length - 1) {\n newIndex++; // down\n }\n if (newIndex === -1) {\n newIndex = 0;\n }\n\n items[newIndex]?.focus();\n }\n }\n\n function getParent(element) {\n let selector = element.getAttribute('data-target');\n let parent = selector ? document.querySelector(selector) : null;\n\n if (!selector) {\n selector = element.getAttribute('href');\n selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, ''); // strip for ie7\n parent = selector ? document.querySelector(selector) : null;\n }\n\n return parent && parent.parentNode ? parent : element.parentNode;\n }\n\n function clearMenus(e) {\n if (e && e.which === 3) {\n return;\n }\n\n // Remove all backdrops\n document.querySelectorAll(`.${backdropClass}`).forEach(el => el.remove());\n\n document.querySelectorAll(toggleSelector).forEach((toggle) => {\n const parent = getParent(toggle);\n const relatedTarget = { relatedTarget: toggle };\n\n if (!parent.classList.contains('open')) {\n return;\n }\n\n if (e && e.type === 'click' && /input|textarea/i.test(e.target.tagName) && parent.contains(e.target)) {\n return;\n }\n\n const hideEvent = new CustomEvent('hide.bs.filer-dropdown', {\n bubbles: true,\n cancelable: true,\n detail: relatedTarget\n });\n parent.dispatchEvent(hideEvent);\n\n if (hideEvent.defaultPrevented) {\n return;\n }\n\n toggle.setAttribute('aria-expanded', 'false');\n parent.classList.remove('open');\n\n const hiddenEvent = new CustomEvent('hidden.bs.filer-dropdown', {\n bubbles: true,\n detail: relatedTarget\n });\n parent.dispatchEvent(hiddenEvent);\n });\n }\n\n // DROPDOWN PLUGIN DEFINITION\n // ==========================\n\n function Plugin(option) {\n this.forEach((element) => {\n let data = element._filerDropdownInstance;\n\n if (!data) {\n data = new Dropdown(element);\n element._filerDropdownInstance = data;\n }\n if (typeof option === 'string') {\n data[option].call(element);\n }\n });\n return this;\n }\n\n // Extend NodeList and HTMLCollection with dropdown method\n if (!NodeList.prototype.dropdown) {\n NodeList.prototype.dropdown = function(option) {\n return Plugin.call(this, option);\n };\n }\n if (!HTMLCollection.prototype.dropdown) {\n HTMLCollection.prototype.dropdown = function(option) {\n return Plugin.call(this, option);\n };\n }\n\n // APPLY TO STANDARD DROPDOWN ELEMENTS\n // ===================================\n\n document.addEventListener('click', clearMenus);\n\n document.addEventListener('click', (e) => {\n if (e.target.closest('.filer-dropdown form')) {\n e.stopPropagation();\n }\n });\n\n document.addEventListener('click', (e) => {\n const toggle = e.target.closest(toggleSelector);\n if (toggle) {\n const instance = toggle._filerDropdownInstance || new Dropdown(toggle);\n if (!toggle._filerDropdownInstance) {\n toggle._filerDropdownInstance = instance;\n }\n instance.toggle(e);\n }\n });\n\n document.addEventListener('keydown', (e) => {\n const toggle = e.target.closest(toggleSelector);\n if (toggle) {\n const instance = toggle._filerDropdownInstance || new Dropdown(toggle);\n if (!toggle._filerDropdownInstance) {\n toggle._filerDropdownInstance = instance;\n }\n instance.keydown(e);\n }\n });\n\n document.addEventListener('keydown', (e) => {\n const menu = e.target.closest('.filer-dropdown-menu');\n if (menu) {\n const toggle = menu.parentNode.querySelector(toggleSelector);\n if (toggle) {\n const instance = toggle._filerDropdownInstance || new Dropdown(toggle);\n if (!toggle._filerDropdownInstance) {\n toggle._filerDropdownInstance = instance;\n }\n instance.keydown(e);\n }\n }\n });\n\n // Export for compatibility\n window.FilerDropdown = Dropdown;\n})();\n\n\n//# sourceURL=webpack://django-filer/./filer/static/filer/js/addons/dropdown-menu.js?\n}"); + +/***/ }, + +/***/ "./filer/static/filer/js/addons/dropzone.init.js" +/*!*******************************************************!*\ + !*** ./filer/static/filer/js/addons/dropzone.init.js ***! + \*******************************************************/ +(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var dropzone__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! dropzone */ \"./node_modules/dropzone/dist/dropzone.js\");\n/* harmony import */ var dropzone__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(dropzone__WEBPACK_IMPORTED_MODULE_0__);\n// #DROPZONE#\n// This script implements the dropzone settings\n\n\n\n\nif ((dropzone__WEBPACK_IMPORTED_MODULE_0___default())) {\n (dropzone__WEBPACK_IMPORTED_MODULE_0___default().autoDiscover) = false;\n}\n\ndocument.addEventListener('DOMContentLoaded', () => {\n const previewImageSelector = '.js-img-preview';\n const dropzoneSelector = '.js-filer-dropzone';\n const dropzones = document.querySelectorAll(dropzoneSelector);\n const messageSelector = '.js-filer-dropzone-message';\n const lookupButtonSelector = '.js-related-lookup';\n const editButtonSelector = '.js-related-edit';\n const dropzoneTemplate = '.js-filer-dropzone-template';\n const progressSelector = '.js-filer-dropzone-progress';\n const previewImageWrapperSelector = '.js-img-wrapper';\n const filerClearerSelector = '.filerClearer';\n const fileChooseSelector = '.js-file-selector';\n const fileIdInputSelector = '.vForeignKeyRawIdAdminField';\n const dragHoverClass = 'dz-drag-hover';\n const hiddenClass = 'hidden';\n const mobileClass = 'filer-dropzone-mobile';\n const objectAttachedClass = 'js-object-attached';\n const minWidth = 500;\n\n const checkMinWidth = (element) => {\n const width = element.offsetWidth;\n if (width < minWidth) {\n element.classList.add(mobileClass);\n } else {\n element.classList.remove(mobileClass);\n }\n };\n\n const showError = (message) => {\n try {\n window.parent.CMS.API.Messages.open({\n message: message\n });\n } catch {\n if (window.filerShowError) {\n window.filerShowError(message);\n } else {\n alert(message);\n }\n }\n };\n\n const createDropzone = function (dropzone) {\n const dropzoneUrl = dropzone.dataset.url;\n const inputId = dropzone.querySelector(fileIdInputSelector);\n const isImage = inputId?.getAttribute('name') === 'image';\n const lookupButton = dropzone.querySelector(lookupButtonSelector);\n const editButton = dropzone.querySelector(editButtonSelector);\n const message = dropzone.querySelector(messageSelector);\n const clearButton = dropzone.querySelector(filerClearerSelector);\n const fileChoose = dropzone.querySelector(fileChooseSelector);\n\n if (dropzone.dropzone) {\n return;\n }\n\n const resizeHandler = () => {\n checkMinWidth(dropzone);\n };\n window.addEventListener('resize', resizeHandler);\n\n new (dropzone__WEBPACK_IMPORTED_MODULE_0___default())(dropzone, {\n url: dropzoneUrl,\n paramName: 'file',\n maxFiles: 1,\n maxFilesize: dropzone.dataset.maxFilesize,\n previewTemplate: document.querySelector(dropzoneTemplate)?.innerHTML || '
    ',\n clickable: false,\n addRemoveLinks: false,\n init: function () {\n checkMinWidth(dropzone);\n\n this.on('removedfile', () => {\n if (fileChoose) {\n fileChoose.style.display = '';\n }\n dropzone.classList.remove(objectAttachedClass);\n this.removeAllFiles();\n clearButton?.click();\n });\n\n const images = this.element.querySelectorAll('img');\n images.forEach((img) => {\n img.addEventListener('dragstart', (event) => {\n event.preventDefault();\n });\n });\n\n if (clearButton) {\n clearButton.addEventListener('click', () => {\n dropzone.classList.remove(objectAttachedClass);\n // const changeEvent = new Event('change', { bubbles: true });\n // inputId?.dispatchEvent(changeEvent);\n });\n }\n },\n maxfilesexceeded: function () {\n this.removeAllFiles(true);\n },\n drop: function () {\n this.removeAllFiles(true);\n clearButton?.click();\n const progressEl = dropzone.querySelector(progressSelector);\n if (progressEl) {\n progressEl.classList.remove(hiddenClass);\n }\n if (fileChoose) {\n fileChoose.style.display = 'block';\n }\n lookupButton?.classList.add('related-lookup-change');\n editButton?.classList.add('related-lookup-change');\n message?.classList.add(hiddenClass);\n dropzone.classList.remove(dragHoverClass);\n dropzone.classList.add(objectAttachedClass);\n },\n success: function (file, response) {\n const progressEl = dropzone.querySelector(progressSelector);\n if (progressEl) {\n progressEl.classList.add(hiddenClass);\n }\n\n if (file && file.status === 'success' && response) {\n if (response.file_id && inputId) {\n inputId.value = response.file_id;\n const changeEvent = new Event('change', { bubbles: true });\n inputId.dispatchEvent(changeEvent);\n }\n if (response.thumbnail_180 && isImage) {\n const previewImg = dropzone.querySelector(previewImageSelector);\n if (previewImg) {\n previewImg.style.backgroundImage = `url(${response.thumbnail_180})`;\n }\n const wrapper = dropzone.querySelector(previewImageWrapperSelector);\n if (wrapper) {\n wrapper.classList.remove(hiddenClass);\n }\n }\n } else {\n if (response && response.error) {\n showError(`${file.name}: ${response.error}`);\n }\n this.removeAllFiles(true);\n }\n\n const images = this.element.querySelectorAll('img');\n images.forEach((img) => {\n img.addEventListener('dragstart', (event) => {\n event.preventDefault();\n });\n });\n },\n error: function (file, msg, response) {\n if (response && response.error) {\n msg += ` ; ${response.error}`;\n }\n showError(`${file.name}: ${msg}`);\n this.removeAllFiles(true);\n },\n reset: function () {\n if (isImage) {\n const wrapper = dropzone.querySelector(previewImageWrapperSelector);\n if (wrapper) {\n wrapper.classList.add(hiddenClass);\n }\n const previewImg = dropzone.querySelector(previewImageSelector);\n if (previewImg) {\n previewImg.style.backgroundImage = 'none';\n }\n }\n dropzone.classList.remove(objectAttachedClass);\n if (inputId) {\n inputId.value = '';\n }\n lookupButton?.classList.remove('related-lookup-change');\n editButton?.classList.remove('related-lookup-change');\n message?.classList.remove(hiddenClass);\n if (inputId) {\n const changeEvent = new Event('change', { bubbles: true });\n inputId.dispatchEvent(changeEvent);\n }\n }\n });\n };\n\n if (dropzones.length && (dropzone__WEBPACK_IMPORTED_MODULE_0___default())) {\n if (!window.filerDropzoneInitialized) {\n window.filerDropzoneInitialized = true;\n (dropzone__WEBPACK_IMPORTED_MODULE_0___default().autoDiscover) = false;\n }\n dropzones.forEach(createDropzone);\n\n // Handle initialization of the dropzone on dynamic formsets (i.e. Django admin inlines)\n document.addEventListener('formset:added', (event) => {\n let dropzones;\n let rowIdx;\n let row;\n\n if (event.detail && event.detail.formsetName) {\n /*\n Django 4.1 changed the event type being fired when adding\n a new formset from a jQuery to a vanilla JavaScript event.\n https://docs.djangoproject.com/en/4.1/ref/contrib/admin/javascript/\n\n In this case we find the newly added row and initialize the\n dropzone on any dropzoneSelector on that row.\n */\n\n rowIdx = parseInt(\n document.getElementById(\n `id_${event.detail.formsetName}-TOTAL_FORMS`\n ).value, 10\n ) - 1;\n row = document.getElementById(`${event.detail.formsetName}-${rowIdx}`);\n dropzones = row?.querySelectorAll(dropzoneSelector) || [];\n } else {\n // Fallback for older jQuery event format\n row = event.target;\n dropzones = row?.querySelectorAll(dropzoneSelector) || [];\n }\n\n dropzones?.forEach(createDropzone);\n });\n }\n});\n\n\n//# sourceURL=webpack://django-filer/./filer/static/filer/js/addons/dropzone.init.js?\n}"); + +/***/ }, + +/***/ "./filer/static/filer/js/addons/filer_popup_response.js" +/*!**************************************************************!*\ + !*** ./filer/static/filer/js/addons/filer_popup_response.js ***! + \**************************************************************/ +() { + +eval("{/*global opener */\n(function () {\n 'use strict';\n const dataElement = document.getElementById('django-admin-popup-response-constants');\n let initData;\n\n if (dataElement) {\n initData = JSON.parse(dataElement.dataset.popupResponse);\n switch (initData.action) {\n case 'change':\n // Specific function for file editing popup opened from widget\n opener.dismissRelatedImageLookupPopup(window, initData.new_value, null, initData.obj, null);\n break;\n case 'delete':\n opener.dismissDeleteRelatedObjectPopup(window, initData.value);\n break;\n default:\n opener.dismissAddRelatedObjectPopup(window, initData.value, initData.obj);\n break;\n }\n }\n})();\n\n\n//# sourceURL=webpack://django-filer/./filer/static/filer/js/addons/filer_popup_response.js?\n}"); + +/***/ }, + +/***/ "./filer/static/filer/js/addons/focal-point.js" +/*!*****************************************************!*\ + !*** ./filer/static/filer/js/addons/focal-point.js ***! + \*****************************************************/ +(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* module decorator */ module = __webpack_require__.hmd(module);\n// #FOCAL POINT#\n// This script implements the image focal point setting\n\n\nwindow.Cl = window.Cl || {};\n\n(() => {\n class FocalPoint {\n constructor(options = {}) {\n this.options = {\n containerSelector: '.js-focal-point',\n imageSelector: '.js-focal-point-image',\n circleSelector: '.js-focal-point-circle',\n locationSelector: '.js-focal-point-location',\n draggableClass: 'draggable',\n hiddenClass: 'hidden',\n dataLocation: 'locationSelector',\n ...options\n };\n this.focalPointInstances = [];\n this._init = this._init.bind(this);\n }\n\n _init(container) {\n const focalPointInstance = new FocalPointConstructor(container, this.options);\n this.focalPointInstances.push(focalPointInstance);\n }\n\n initialize() {\n const containers = document.querySelectorAll(this.options.containerSelector);\n containers.forEach((container) => {\n this._init(container);\n });\n\n if (window.Cl.mediator) {\n window.Cl.mediator.subscribe('focal-point:init', this._init);\n }\n }\n\n destroy() {\n if (window.Cl.mediator) {\n window.Cl.mediator.remove('focal-point:init', this._init);\n }\n\n this.focalPointInstances.forEach((focalPointInstance) => {\n focalPointInstance.destroy();\n });\n\n this.focalPointInstances = [];\n }\n }\n\n class FocalPointConstructor {\n constructor(container, options = {}) {\n this.options = {\n imageSelector: '.js-focal-point-image',\n circleSelector: '.js-focal-point-circle',\n locationSelector: '.js-focal-point-location',\n draggableClass: 'draggable',\n hiddenClass: 'hidden',\n dataLocation: 'locationSelector',\n ...options\n };\n\n this.container = container;\n this.image = this.container.querySelector(this.options.imageSelector);\n this.circle = this.container.querySelector(this.options.circleSelector);\n this.ratio = parseFloat(this.image?.dataset.ratio || 1);\n this.location = this._getLocation();\n this.isDragging = false;\n this.dragStartX = 0;\n this.dragStartY = 0;\n this.circleStartX = 0;\n this.circleStartY = 0;\n\n this._onImageLoaded = this._onImageLoaded.bind(this);\n this._onMouseDown = this._onMouseDown.bind(this);\n this._onMouseMove = this._onMouseMove.bind(this);\n this._onMouseUp = this._onMouseUp.bind(this);\n\n if (this.image?.complete) {\n this._onImageLoaded();\n } else if (this.image) {\n this.image.addEventListener('load', this._onImageLoaded);\n }\n }\n\n _updateLocationValue(x, y) {\n const locationValue = `${Math.round(x * this.ratio)},${Math.round(y * this.ratio)}`;\n if (this.location) {\n this.location.value = locationValue;\n }\n }\n\n _getLocation() {\n const locationSelector = this.container.dataset[this.options.dataLocation];\n if (locationSelector) {\n const newLocation = document.querySelector(locationSelector);\n if (newLocation) {\n return newLocation;\n }\n }\n return this.container.querySelector(this.options.locationSelector);\n }\n\n _makeDraggable() {\n if (!this.circle) {\n return;\n }\n\n this.circle.classList.add(this.options.draggableClass);\n this.circle.addEventListener('mousedown', this._onMouseDown);\n this.circle.addEventListener('touchstart', this._onMouseDown, { passive: false });\n }\n\n _onMouseDown(event) {\n event.preventDefault();\n this.isDragging = true;\n\n const touch = event.type === 'touchstart' ? event.touches[0] : event;\n\n // Get container bounds\n const containerRect = this.container.getBoundingClientRect();\n\n // Calculate mouse position relative to container\n this.dragStartX = touch.clientX - containerRect.left;\n this.dragStartY = touch.clientY - containerRect.top;\n\n // Get current circle position (center)\n const circleRect = this.circle.getBoundingClientRect();\n this.circleStartX = circleRect.left - containerRect.left + circleRect.width / 2;\n this.circleStartY = circleRect.top - containerRect.top + circleRect.height / 2;\n\n document.addEventListener('mousemove', this._onMouseMove);\n document.addEventListener('mouseup', this._onMouseUp);\n document.addEventListener('touchmove', this._onMouseMove, { passive: false });\n document.addEventListener('touchend', this._onMouseUp);\n }\n\n _onMouseMove(event) {\n if (!this.isDragging) {\n return;\n }\n\n event.preventDefault();\n\n const touch = event.type === 'touchmove' ? event.touches[0] : event;\n\n // Get container bounds\n const containerRect = this.container.getBoundingClientRect();\n\n // Calculate current mouse position relative to container\n const currentX = touch.clientX - containerRect.left;\n const currentY = touch.clientY - containerRect.top;\n\n // Calculate how much the mouse moved\n const deltaX = currentX - this.dragStartX;\n const deltaY = currentY - this.dragStartY;\n\n // Calculate new center position\n let centerX = this.circleStartX + deltaX;\n let centerY = this.circleStartY + deltaY;\n\n // Constrain center to container bounds\n centerX = Math.max(0, Math.min(containerRect.width - 1, centerX));\n centerY = Math.max(0, Math.min(containerRect.height - 1, centerY));\n\n // Position circle by its top-left corner (center - radius)\n this.circle.style.left = `${centerX}px`;\n this.circle.style.top = `${centerY}px`;\n\n // Update location value with center coordinates\n this._updateLocationValue(centerX, centerY);\n }\n\n _onMouseUp() {\n this.isDragging = false;\n document.removeEventListener('mousemove', this._onMouseMove);\n document.removeEventListener('mouseup', this._onMouseUp);\n document.removeEventListener('touchmove', this._onMouseMove);\n document.removeEventListener('touchend', this._onMouseUp);\n }\n\n _onImageLoaded() {\n if (!this.image || this.image.naturalWidth === 0) {\n return;\n }\n\n this.circle?.classList.remove(this.options.hiddenClass);\n\n const locationValue = this.location?.value || '';\n const imageWidth = this.image.offsetWidth;\n const imageHeight = this.image.offsetHeight;\n\n let x, y;\n\n if (locationValue.length) {\n const coords = locationValue.split(',');\n x = Math.round(Number(coords[0]) / this.ratio);\n y = Math.round(Number(coords[1]) / this.ratio);\n } else {\n x = imageWidth / 2;\n y = imageHeight / 2;\n }\n\n if (isNaN(x) || isNaN(y)) {\n return;\n }\n\n // Position circle (accounting for circle size)\n if (this.circle) {\n this.circle.style.left = `${x}px`;\n this.circle.style.top = `${y}px`;\n }\n\n this._makeDraggable();\n this._updateLocationValue(x, y);\n }\n\n destroy() {\n if (this.circle?.classList.contains(this.options.draggableClass)) {\n this.circle.removeEventListener('mousedown', this._onMouseDown);\n this.circle.removeEventListener('touchstart', this._onMouseDown);\n }\n\n document.removeEventListener('mousemove', this._onMouseMove);\n document.removeEventListener('mouseup', this._onMouseUp);\n document.removeEventListener('touchmove', this._onMouseMove);\n document.removeEventListener('touchend', this._onMouseUp);\n\n if (this.image) {\n this.image.removeEventListener('load', this._onImageLoaded);\n }\n\n this.options = null;\n this.container = null;\n this.image = null;\n this.circle = null;\n this.location = null;\n this.ratio = null;\n }\n }\n\n window.Cl.FocalPoint = FocalPoint;\n window.Cl.FocalPointConstructor = FocalPointConstructor;\n\n // Export for ES6 module usage\n if ( true && module.exports) {\n module.exports = FocalPoint;\n }\n})();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (window.Cl.FocalPoint);\n\n\n//# sourceURL=webpack://django-filer/./filer/static/filer/js/addons/focal-point.js?\n}"); + +/***/ }, + +/***/ "./filer/static/filer/js/addons/popup_handling.js" +/*!********************************************************!*\ + !*** ./filer/static/filer/js/addons/popup_handling.js ***! + \********************************************************/ +() { + +"use strict"; +eval("{\n\nconst windowname_to_id = (text) => {\n text = text.replace(/__dot__/g, '.');\n text = text.replace(/__dash__/g, '-');\n const last = text.lastIndexOf('__');\n return last === -1 ? text : text.substring(0, last);\n};\n\nwindow.dismissPopupAndReload = (win) => {\n document.location.reload();\n win.close();\n};\n\nwindow.dismissRelatedImageLookupPopup = (\n win,\n chosenId,\n chosenThumbnailUrl,\n chosenDescriptionTxt,\n chosenAdminChangeUrl\n) => {\n const id = windowname_to_id(win.name);\n const lookup = document.getElementById(id);\n if (!lookup) {\n return;\n }\n const container = lookup.closest('.filerFile');\n if (!container) {\n return;\n }\n const edit = container.querySelector('.edit');\n const image = container.querySelector('.thumbnail_img');\n const descriptionText = container.querySelector('.description_text');\n const clearer = container.querySelector('.filerClearer');\n const dropzoneMessage = container.parentElement.querySelector('.dz-message');\n const element = container.querySelector('input');\n const oldId = element.value;\n\n element.value = chosenId;\n const dropzone = element.closest('.js-filer-dropzone');\n if (dropzone) {\n dropzone.classList.add('js-object-attached');\n }\n if (chosenThumbnailUrl && image) {\n image.src = chosenThumbnailUrl;\n image.classList.remove('hidden');\n image.removeAttribute('srcset');\n }\n if (descriptionText) {\n descriptionText.textContent = chosenDescriptionTxt;\n }\n if (clearer) {\n clearer.classList.remove('hidden');\n }\n lookup.classList.add('related-lookup-change');\n if (edit) {\n edit.classList.add('related-lookup-change');\n }\n if (chosenAdminChangeUrl && edit) {\n edit.setAttribute('href', `${chosenAdminChangeUrl}?_edit_from_widget=1`);\n }\n if (dropzoneMessage) {\n dropzoneMessage.classList.add('hidden');\n }\n\n if (oldId !== chosenId) {\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n win.close();\n};\nwindow.dismissRelatedFolderLookupPopup = (win, chosenId, chosenName) => {\n const id = windowname_to_id(win.name);\n const lookup = document.getElementById(id);\n if (!lookup) {\n return;\n }\n const container = lookup.closest('.filerFile');\n if (!container) {\n return;\n }\n const image = container.querySelector('.thumbnail_img');\n const clearButton = document.getElementById(`id_${id}_clear`);\n const input = document.getElementById(`id_${id}`);\n const folderName = container.querySelector('.description_text');\n const addFolderButton = document.getElementById(id);\n\n if (input) {\n input.value = chosenId;\n }\n if (image) {\n image.classList.remove('hidden');\n }\n if (folderName) {\n folderName.textContent = chosenName;\n }\n if (clearButton) {\n clearButton.classList.remove('hidden');\n }\n if (addFolderButton) {\n addFolderButton.classList.add('hidden');\n }\n win.close();\n};\n\n// Handle popup dismiss links (for folder/image selection in popups)\ndocument.addEventListener('DOMContentLoaded', () => {\n document.querySelectorAll('.js-dismiss-popup').forEach((link) => {\n link.addEventListener('click', function (e) {\n e.preventDefault();\n\n const fileId = this.dataset.fileId;\n const iconUrl = this.dataset.iconUrl;\n const label = this.dataset.label;\n\n if (this.classList.contains('js-dismiss-image')) {\n const changeUrl = this.dataset.changeUrl || '';\n window.opener.dismissRelatedImageLookupPopup(\n window,\n fileId,\n iconUrl,\n label,\n changeUrl\n );\n } else if (this.classList.contains('js-dismiss-folder')) {\n window.opener.dismissRelatedFolderLookupPopup(window, fileId, label);\n }\n });\n });\n\n // Auto-dismiss popup on page load (for dismiss_popup.html)\n const popupData = document.getElementById('popup-dismiss-data');\n if (popupData && window.opener) {\n const pk = popupData.dataset.pk;\n const label = popupData.dataset.label;\n window.opener.dismissRelatedPopup(window, pk, label);\n }\n});\n\n\n//# sourceURL=webpack://django-filer/./filer/static/filer/js/addons/popup_handling.js?\n}"); + +/***/ }, + +/***/ "./filer/static/filer/js/addons/table-dropzone.js" +/*!********************************************************!*\ + !*** ./filer/static/filer/js/addons/table-dropzone.js ***! + \********************************************************/ +(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var dropzone__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! dropzone */ \"./node_modules/dropzone/dist/dropzone.js\");\n/* harmony import */ var dropzone__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(dropzone__WEBPACK_IMPORTED_MODULE_0__);\n// #DROPZONE#\n// This script implements the dropzone settings\n\n\n\n\n\n/* globals Cl */\ndocument.addEventListener('DOMContentLoaded', () => {\n let submitNum = 0;\n let maxSubmitNum = 0;\n const dropzoneInstances = [];\n const dropzoneBase = document.querySelector('.js-filer-dropzone-base');\n const dropzoneSelector = '.js-filer-dropzone';\n let dropzones;\n const infoMessageClass = 'js-filer-dropzone-info-message';\n const infoMessage = document.querySelector(`.${infoMessageClass}`);\n const folderName = document.querySelector('.js-filer-dropzone-folder-name');\n const uploadInfoContainer = document.querySelector('.js-filer-dropzone-upload-info-container');\n const uploadInfo = document.querySelector('.js-filer-dropzone-upload-info');\n const uploadWelcome = document.querySelector('.js-filer-dropzone-upload-welcome');\n const uploadNumber = document.querySelector('.js-filer-dropzone-upload-number');\n const uploadCount = document.querySelector('.js-filer-upload-count');\n const uploadText = document.querySelector('.js-filer-upload-text');\n const uploadFileNameSelector = '.js-filer-dropzone-file-name';\n const uploadProgressSelector = '.js-filer-dropzone-progress';\n const uploadSuccess = document.querySelector('.js-filer-dropzone-upload-success');\n const uploadCanceled = document.querySelector('.js-filer-dropzone-upload-canceled');\n const cancelUpload = document.querySelector('.js-filer-dropzone-cancel');\n const dragHoverClass = 'dz-drag-hover';\n const dataUploaderConnections = 'max-uploader-connections';\n const dragHoverBorder = document.querySelector('.drag-hover-border');\n const hiddenClass = 'hidden';\n let hideMessageTimeout;\n let hasErrors = false;\n let baseUrl;\n let baseFolderTitle;\n\n // utility to update query string (same as upload-button)\n const updateQuery = (uri, key, value) => {\n const re = new RegExp(`([?&])${key}=.*?(&|$)`, 'i');\n const separator = uri.indexOf('?') !== -1 ? '&' : '?';\n const hash = window.location.hash;\n uri = uri.replace(/#.*$/, '');\n if (uri.match(re)) {\n return uri.replace(re, `$1${key}=${value}$2`) + hash;\n } else {\n return uri + separator + key + '=' + value + hash;\n }\n };\n\n const reloadOrdered = () => {\n const uri = window.location.toString();\n window.location.replace(updateQuery(uri, 'order_by', '-modified_at'));\n };\n\n const updateUploadNumber = () => {\n if (uploadNumber) {\n uploadNumber.textContent = `${maxSubmitNum - submitNum}/${maxSubmitNum}`;\n }\n if (uploadText) {\n uploadText.classList.remove('hidden');\n }\n if (uploadCount) {\n uploadCount.classList.remove('hidden');\n }\n };\n\n const destroyDropzones = () => {\n dropzoneInstances.forEach((instance) => {\n instance.destroy();\n });\n };\n\n const getElementByFile = (file, url) => {\n return document.getElementById(\n `file-${encodeURIComponent(file.name)}${file.size}${file.lastModified}${url}`\n );\n };\n\n if (dropzoneBase) {\n baseUrl = dropzoneBase.dataset.url;\n baseFolderTitle = dropzoneBase.dataset.folderName;\n\n const body = document.body;\n body.dataset.url = baseUrl;\n body.dataset.folderName = baseFolderTitle;\n body.dataset.maxFiles = dropzoneBase.dataset.maxFiles;\n body.dataset.maxFilesize = dropzoneBase.dataset.maxFiles;\n body.classList.add('js-filer-dropzone');\n console.log('[Filer DnD] dropzoneBase found, url:', baseUrl, 'folder:', baseFolderTitle);\n } else {\n console.log('[Filer DnD] No .js-filer-dropzone-base element found on page');\n }\n\n Cl.mediator.subscribe('filer-upload-in-progress', destroyDropzones);\n\n dropzones = document.querySelectorAll(dropzoneSelector);\n console.log('[Filer DnD] Found', dropzones.length, 'dropzone elements (.js-filer-dropzone)');\n\n if (dropzones.length && (dropzone__WEBPACK_IMPORTED_MODULE_0___default())) {\n (dropzone__WEBPACK_IMPORTED_MODULE_0___default().autoDiscover) = false;\n dropzones.forEach((dropzoneElement) => {\n if (dropzoneElement.dropzone) {\n console.log('[Filer DnD] Skipping element (already has dropzone):', dropzoneElement.tagName, dropzoneElement.className);\n return;\n }\n const dropzoneUrl = dropzoneElement.dataset.url;\n console.log('[Filer DnD] Creating Dropzone instance for', dropzoneElement.tagName,\n 'url:', dropzoneUrl, 'maxFiles:', dropzoneElement.dataset.maxFiles,\n 'maxFilesize:', dropzoneElement.dataset.maxFilesize);\n const dropzoneInstance = new (dropzone__WEBPACK_IMPORTED_MODULE_0___default())(dropzoneElement, {\n url: dropzoneUrl,\n paramName: 'file',\n maxFiles: parseInt(dropzoneElement.dataset.maxFiles) || 100,\n maxFilesize: parseInt(dropzoneElement.dataset.maxFilesize), // no default\n previewTemplate: '
    ',\n clickable: false,\n addRemoveLinks: false,\n parallelUploads: dropzoneElement.dataset[dataUploaderConnections] || 3,\n accept: (file, done) => {\n let uploadInfoClone;\n console.log('[Filer DnD] accept:', file.name, 'url:', dropzoneUrl);\n\n Cl.mediator.remove('filer-upload-in-progress', destroyDropzones);\n Cl.mediator.publish('filer-upload-in-progress');\n\n clearTimeout(hideMessageTimeout);\n clearTimeout(hideMessageTimeout);\n if (uploadWelcome) {\n uploadWelcome.classList.add(hiddenClass);\n }\n if (cancelUpload) {\n cancelUpload.classList.remove(hiddenClass);\n }\n\n if (getElementByFile(file, dropzoneUrl)) {\n done('duplicate');\n } else {\n uploadInfoClone = uploadInfo.cloneNode(true);\n\n const fileNameEl = uploadInfoClone.querySelector(uploadFileNameSelector);\n if (fileNameEl) {\n fileNameEl.textContent = file.name;\n }\n const progressEl = uploadInfoClone.querySelector(uploadProgressSelector);\n if (progressEl) {\n progressEl.style.width = '0';\n }\n uploadInfoClone.setAttribute(\n 'id',\n `file-${encodeURIComponent(file.name)}${file.size}${file.lastModified}${dropzoneUrl}`\n );\n if (uploadInfoContainer) {\n uploadInfoContainer.appendChild(uploadInfoClone);\n }\n\n submitNum++;\n maxSubmitNum++;\n console.log('[Filer DnD] file accepted, submitNum:', submitNum, 'maxSubmitNum:', maxSubmitNum);\n updateUploadNumber();\n done();\n }\n\n dropzones.forEach((dz) => dz.classList.remove('reset-hover'));\n if (infoMessage) {\n infoMessage.classList.remove(hiddenClass);\n }\n dropzones.forEach((dz) => dz.classList.remove(dragHoverClass));\n },\n dragover: (dragEvent) => {\n const target = dragEvent.target.closest(dropzoneSelector);\n const folderTitle = target?.dataset.folderName;\n const dropzoneFolder = dropzoneElement.classList.contains('js-filer-dropzone-folder');\n const dropzoneBoundingRect = dropzoneElement.getBoundingClientRect();\n const borderStyle = dragHoverBorder ? window.getComputedStyle(dragHoverBorder) : null;\n const topBorderSize = borderStyle ? borderStyle.borderTopWidth : '0px';\n const leftBorderSize = borderStyle ? borderStyle.borderLeftWidth : '0px';\n const dropzonePosition = {\n top: `${dropzoneBoundingRect.top}px`,\n bottom: `${dropzoneBoundingRect.bottom}px`,\n left: `${dropzoneBoundingRect.left}px`,\n right: `${dropzoneBoundingRect.right}px`,\n width: `${dropzoneBoundingRect.width - parseInt(leftBorderSize, 10) * 2}px`,\n height: `${dropzoneBoundingRect.height - parseInt(topBorderSize, 10) * 2}px`,\n display: 'block'\n };\n if (dropzoneFolder && dragHoverBorder) {\n Object.assign(dragHoverBorder.style, dropzonePosition);\n }\n\n dropzones.forEach((dz) => dz.classList.add('reset-hover'));\n if (uploadSuccess) {\n uploadSuccess.classList.add(hiddenClass);\n }\n if (infoMessage) {\n infoMessage.classList.remove(hiddenClass);\n }\n dropzoneElement.classList.add(dragHoverClass);\n dropzoneElement.classList.remove('reset-hover');\n\n if (folderName && folderTitle) {\n folderName.textContent = folderTitle;\n }\n },\n dragend: () => {\n clearTimeout(hideMessageTimeout);\n hideMessageTimeout = setTimeout(() => {\n if (infoMessage) {\n infoMessage.classList.add(hiddenClass);\n }\n }, 1000);\n\n if (infoMessage) {\n infoMessage.classList.remove(hiddenClass);\n }\n dropzones.forEach((dz) => dz.classList.remove(dragHoverClass));\n if (dragHoverBorder) {\n Object.assign(dragHoverBorder.style, { top: '0', bottom: '0', width: '0', height: '0' });\n }\n },\n dragleave: () => {\n clearTimeout(hideMessageTimeout);\n hideMessageTimeout = setTimeout(() => {\n if (infoMessage) {\n infoMessage.classList.add(hiddenClass);\n }\n }, 1000);\n\n if (infoMessage) {\n infoMessage.classList.remove(hiddenClass);\n }\n dropzones.forEach((dz) => dz.classList.remove(dragHoverClass));\n if (dragHoverBorder) {\n Object.assign(dragHoverBorder.style, { top: '0', bottom: '0', width: '0', height: '0' });\n }\n },\n sending: (file) => {\n console.log('[Filer DnD] sending:', file.name, 'to:', dropzoneUrl);\n const fileEl = getElementByFile(file, dropzoneUrl);\n if (fileEl) {\n fileEl.classList.remove(hiddenClass);\n }\n },\n uploadprogress: (file, progress) => {\n const fileEl = getElementByFile(file, dropzoneUrl);\n if (fileEl) {\n const progressEl = fileEl.querySelector(uploadProgressSelector);\n if (progressEl) {\n progressEl.style.width = `${progress}%`;\n }\n }\n },\n success: (file, response) => {\n submitNum--;\n console.log('[Filer DnD] success:', file.name, 'submitNum:', submitNum, 'response:', response);\n updateUploadNumber();\n const fileEl = getElementByFile(file, dropzoneUrl);\n if (fileEl) {\n fileEl.remove();\n }\n },\n queuecomplete: () => {\n console.log('[Filer DnD] queuecomplete: submitNum:', submitNum, 'hasErrors:', hasErrors);\n if (submitNum !== 0) {\n console.warn('[Filer DnD] queuecomplete: submitNum is not 0, skipping reload');\n return;\n }\n\n updateUploadNumber();\n\n if (cancelUpload) {\n cancelUpload.classList.add(hiddenClass);\n }\n if (uploadInfo) {\n uploadInfo.classList.add(hiddenClass);\n }\n\n if (hasErrors) {\n if (uploadNumber) {\n uploadNumber.classList.add(hiddenClass);\n }\n console.log('[Filer DnD] reloading after errors (1s delay)');\n setTimeout(() => {\n reloadOrdered();\n }, 1000);\n } else {\n if (uploadSuccess) {\n uploadSuccess.classList.remove(hiddenClass);\n }\n console.log('[Filer DnD] reloading now via reloadOrdered');\n reloadOrdered();\n }\n },\n error: (file, error) => {\n console.error('[Filer DnD] error:', file.name, 'error:', error, 'submitNum:', submitNum);\n if (error === 'duplicate') {\n // submitNum was never incremented for duplicates\n console.log('[Filer DnD] duplicate file, ignoring');\n return;\n }\n submitNum--;\n console.log('[Filer DnD] after error decrement, submitNum:', submitNum);\n updateUploadNumber();\n const fileEl = getElementByFile(file, dropzoneUrl);\n if (fileEl) {\n fileEl.remove();\n }\n hasErrors = true;\n if (window.filerShowError) {\n window.filerShowError(`${file.name}: ${error.message || error}`);\n }\n }\n });\n dropzoneInstances.push(dropzoneInstance);\n if (cancelUpload) {\n cancelUpload.addEventListener('click', (clickEvent) => {\n clickEvent.preventDefault();\n cancelUpload.classList.add(hiddenClass);\n if (uploadCanceled) {\n uploadCanceled.classList.remove(hiddenClass);\n }\n dropzoneInstance.removeAllFiles(true);\n });\n }\n });\n } else {\n console.warn('[Filer DnD] No dropzone instances created. dropzones.length:', dropzones.length, 'Dropzone:', !!(dropzone__WEBPACK_IMPORTED_MODULE_0___default()));\n }\n});\n\n\n//# sourceURL=webpack://django-filer/./filer/static/filer/js/addons/table-dropzone.js?\n}"); + +/***/ }, + +/***/ "./filer/static/filer/js/addons/toggler.js" +/*!*************************************************!*\ + !*** ./filer/static/filer/js/addons/toggler.js ***! + \*************************************************/ +(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n// #TOGGLER#\n// This script implements the simple element toggle\n\n\nwindow.Cl = window.Cl || {};\n\nclass Toggler {\n constructor(options = {}) {\n this.options = {\n linksSelector: '.js-toggler-link',\n dataHeaderSelector: 'toggler-header-selector',\n dataContentSelector: 'toggler-content-selector',\n collapsedClass: 'js-collapsed',\n expandedClass: 'js-expanded',\n hiddenClass: 'hidden',\n ...options\n };\n\n this.togglerInstances = [];\n\n const links = document.querySelectorAll(this.options.linksSelector);\n links.forEach(link => {\n const togglerInstance = new TogglerConstructor(link, this.options);\n this.togglerInstances.push(togglerInstance);\n });\n }\n\n destroy() {\n this.links = null;\n this.togglerInstances.forEach(togglerInstance => togglerInstance.destroy());\n this.togglerInstances = [];\n }\n}\n\nclass TogglerConstructor {\n constructor(link, options = {}) {\n this.options = { ...options };\n this.link = link;\n this.headerSelector = this.link.dataset[this.options.dataHeaderSelector];\n this.contentSelector = this.link.dataset[this.options.dataContentSelector];\n this.header = document.querySelector(this.headerSelector);\n this.header = this.header || this.link;\n this.content = document.querySelector(this.contentSelector);\n\n if (!this.content) {\n return;\n }\n\n this._initLink();\n }\n\n _updateClasses() {\n if (this.content.classList.contains(this.options.hiddenClass)) {\n this.header.classList.remove(this.options.expandedClass);\n this.header.classList.add(this.options.collapsedClass);\n } else {\n this.header.classList.add(this.options.expandedClass);\n this.header.classList.remove(this.options.collapsedClass);\n }\n }\n\n _onTogglerClick(clickEvent) {\n this.content.classList.toggle(this.options.hiddenClass);\n this._updateClasses();\n clickEvent.preventDefault();\n }\n\n _initLink() {\n this._updateClasses();\n this.link.addEventListener('click', e => this._onTogglerClick(e));\n }\n\n destroy() {\n this.options = null;\n this.link = null;\n }\n}\n\nCl.Toggler = Toggler;\nCl.TogglerConstructor = TogglerConstructor;\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Toggler);\n\n\n//# sourceURL=webpack://django-filer/./filer/static/filer/js/addons/toggler.js?\n}"); + +/***/ }, + +/***/ "./filer/static/filer/js/addons/tooltip.js" +/*!*************************************************!*\ + !*** ./filer/static/filer/js/addons/tooltip.js ***! + \*************************************************/ +() { + +"use strict"; +eval("{\nwindow.Cl = window.Cl || {};\n\nCl.filerTooltip = () => {\n const tooltipSelector = '.js-filer-tooltip';\n const tooltips = document.querySelectorAll(tooltipSelector);\n\n tooltips.forEach((element) => {\n element.addEventListener('mouseover', function () {\n const title = this.getAttribute('title');\n if (!title) {\n return;\n }\n\n this.dataset.filerTooltip = title;\n this.removeAttribute('title');\n\n const tooltip = document.createElement('p');\n tooltip.className = 'filer-tooltip';\n tooltip.textContent = title;\n\n const container = document.querySelector(tooltipSelector);\n if (container) {\n container.appendChild(tooltip);\n }\n });\n\n element.addEventListener('mouseout', function () {\n const title = this.dataset.filerTooltip;\n if (title) {\n this.setAttribute('title', title);\n }\n\n const existingTooltips = document.querySelectorAll('.filer-tooltip');\n existingTooltips.forEach((t) => {\n t.remove();\n });\n });\n });\n};\n\n\n//# sourceURL=webpack://django-filer/./filer/static/filer/js/addons/tooltip.js?\n}"); + +/***/ }, + +/***/ "./filer/static/filer/js/addons/upload-button.js" +/*!*******************************************************!*\ + !*** ./filer/static/filer/js/addons/upload-button.js ***! + \*******************************************************/ +(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var dropzone__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! dropzone */ \"./node_modules/dropzone/dist/dropzone.js\");\n/* harmony import */ var dropzone__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(dropzone__WEBPACK_IMPORTED_MODULE_0__);\n// #UPLOAD BUTTON#\n// This script implements the upload button logic\n\n\n\n\n/* globals Cl */\n\ndocument.addEventListener('DOMContentLoaded', () => {\n let submitNum = 0;\n let maxSubmitNum = 1;\n const uploadButton = document.querySelector('.js-upload-button');\n if (!uploadButton) {\n return;\n }\n\n const uploadButtonDisabled = document.querySelector('.js-upload-button-disabled');\n const uploadUrl = uploadButton.dataset.url;\n\n if (!uploadUrl) {\n return;\n }\n\n const uploadWelcome = document.querySelector('.js-filer-dropzone-upload-welcome');\n const uploadInfoContainer = document.querySelector('.js-filer-dropzone-upload-info-container');\n const uploadInfo = document.querySelector('.js-filer-dropzone-upload-info');\n const uploadNumber = document.querySelector('.js-filer-dropzone-upload-number');\n const uploadFileNameSelector = '.js-filer-dropzone-file-name';\n const uploadProgressSelector = '.js-filer-dropzone-progress';\n const uploadSuccess = document.querySelector('.js-filer-dropzone-upload-success');\n const uploadCanceled = document.querySelector('.js-filer-dropzone-upload-canceled');\n const uploadCancel = document.querySelector('.js-filer-dropzone-cancel');\n const infoMessage = document.querySelector('.js-filer-dropzone-info-message');\n const hiddenClass = 'hidden';\n const maxUploaderConnections = parseInt(uploadButton.dataset.maxUploaderConnections || 3, 10);\n const maxFilesize = parseInt(uploadButton.dataset.maxFilesize || 0, 10);\n let hasErrors = false;\n\n const updateUploadNumber = () => {\n if (uploadNumber) {\n uploadNumber.textContent = `${maxSubmitNum - submitNum}/${maxSubmitNum}`;\n }\n };\n\n const removeButton = () => {\n if (uploadButton) {\n uploadButton.remove();\n }\n };\n\n // utility\n const updateQuery = (uri, key, value) => {\n const re = new RegExp(`([?&])${key}=.*?(&|$)`, 'i');\n const separator = uri.indexOf('?') !== -1 ? '&' : '?';\n const hash = window.location.hash;\n uri = uri.replace(/#.*$/, '');\n if (uri.match(re)) {\n return uri.replace(re, `$1${key}=${value}$2`) + hash;\n } else {\n return uri + separator + key + '=' + value + hash;\n }\n };\n\n const reloadOrdered = () => {\n const uri = window.location.toString();\n window.location.replace(updateQuery(uri, 'order_by', '-modified_at'));\n };\n\n Cl.mediator.subscribe('filer-upload-in-progress', removeButton);\n\n // Prevent default navigation which can interfere with the file dialog\n uploadButton.addEventListener('click', (evt) => {\n evt.preventDefault();\n });\n\n // Initialize Dropzone on the upload button\n (dropzone__WEBPACK_IMPORTED_MODULE_0___default().autoDiscover) = false;\n\n let dropzone;\n try {\n dropzone = new (dropzone__WEBPACK_IMPORTED_MODULE_0___default())(uploadButton, {\n url: uploadUrl,\n paramName: 'file',\n maxFilesize: maxFilesize, // already in MB\n parallelUploads: maxUploaderConnections,\n clickable: uploadButton,\n previewTemplate: '
    ',\n addRemoveLinks: false,\n autoProcessQueue: true\n });\n } catch (e) {\n console.error('[Filer Upload] Failed to create Dropzone instance:', e);\n return;\n }\n\n dropzone.on('addedfile', (file) => {\n Cl.mediator.remove('filer-upload-in-progress', removeButton);\n Cl.mediator.publish('filer-upload-in-progress');\n submitNum++;\n\n maxSubmitNum = dropzone.files.length;\n\n if (infoMessage) {\n infoMessage.classList.remove(hiddenClass);\n }\n if (uploadWelcome) {\n uploadWelcome.classList.add(hiddenClass);\n }\n if (uploadSuccess) {\n uploadSuccess.classList.add(hiddenClass);\n }\n if (uploadInfoContainer) {\n uploadInfoContainer.classList.remove(hiddenClass);\n }\n if (uploadCancel) {\n uploadCancel.classList.remove(hiddenClass);\n }\n if (uploadCanceled) {\n uploadCanceled.classList.add(hiddenClass);\n }\n\n updateUploadNumber();\n });\n\n dropzone.on('uploadprogress', (file, progress) => {\n const percent = Math.round(progress);\n const fileId = `file-${encodeURIComponent(file.name)}${file.size}${file.lastModified}`;\n const fileItem = document.getElementById(fileId);\n let uploadInfoClone;\n\n if (fileItem) {\n const progressBar = fileItem.querySelector(uploadProgressSelector);\n if (progressBar) {\n progressBar.style.width = `${percent}%`;\n }\n } else if (uploadInfo) {\n uploadInfoClone = uploadInfo.cloneNode(true);\n\n const fileNameEl = uploadInfoClone.querySelector(uploadFileNameSelector);\n if (fileNameEl) {\n fileNameEl.textContent = file.name;\n }\n const progressEl = uploadInfoClone.querySelector(uploadProgressSelector);\n if (progressEl) {\n progressEl.style.width = `${percent}%`;\n }\n uploadInfoClone.classList.remove(hiddenClass);\n uploadInfoClone.setAttribute('id', fileId);\n if (uploadInfoContainer) {\n uploadInfoContainer.appendChild(uploadInfoClone);\n }\n }\n });\n\n dropzone.on('success', (file, response) => {\n const fileId = `file-${encodeURIComponent(file.name)}${file.size}${file.lastModified}`;\n const fileEl = document.getElementById(fileId);\n if (fileEl) {\n fileEl.remove();\n }\n\n if (response.error) {\n hasErrors = true;\n window.filerShowError(`${file.name}: ${response.error}`);\n }\n\n submitNum--;\n updateUploadNumber();\n\n if (submitNum === 0) {\n maxSubmitNum = 1;\n\n if (uploadWelcome) {\n uploadWelcome.classList.add(hiddenClass);\n }\n if (uploadNumber) {\n uploadNumber.classList.add(hiddenClass);\n }\n if (uploadCanceled) {\n uploadCanceled.classList.add(hiddenClass);\n }\n if (uploadCancel) {\n uploadCancel.classList.add(hiddenClass);\n }\n if (uploadSuccess) {\n uploadSuccess.classList.remove(hiddenClass);\n }\n\n if (hasErrors) {\n setTimeout(reloadOrdered, 1000);\n } else {\n reloadOrdered();\n }\n }\n });\n\n dropzone.on('error', (file, errorMessage) => {\n const fileId = `file-${encodeURIComponent(file.name)}${file.size}${file.lastModified}`;\n const fileEl = document.getElementById(fileId);\n if (fileEl) {\n fileEl.remove();\n }\n\n hasErrors = true;\n window.filerShowError(`${file.name}: ${errorMessage}`);\n\n submitNum--;\n updateUploadNumber();\n\n if (submitNum === 0) {\n maxSubmitNum = 1;\n\n if (uploadWelcome) {\n uploadWelcome.classList.add(hiddenClass);\n }\n if (uploadNumber) {\n uploadNumber.classList.add(hiddenClass);\n }\n if (uploadCanceled) {\n uploadCanceled.classList.add(hiddenClass);\n }\n if (uploadCancel) {\n uploadCancel.classList.add(hiddenClass);\n }\n if (uploadSuccess) {\n uploadSuccess.classList.remove(hiddenClass);\n }\n\n setTimeout(reloadOrdered, 1000);\n }\n });\n\n if (uploadCancel) {\n uploadCancel.addEventListener('click', (clickEvent) => {\n clickEvent.preventDefault();\n uploadCancel.classList.add(hiddenClass);\n if (uploadNumber) {\n uploadNumber.classList.add(hiddenClass);\n }\n if (uploadInfoContainer) {\n uploadInfoContainer.classList.add(hiddenClass);\n }\n if (uploadCanceled) {\n uploadCanceled.classList.remove(hiddenClass);\n }\n\n setTimeout(() => {\n window.location.reload();\n }, 1000);\n });\n }\n\n if (uploadButtonDisabled && Cl.filerTooltip) {\n Cl.filerTooltip();\n }\n\n // Fire custom event after scripts have been executed\n document.dispatchEvent(new Event('filer-upload-scripts-executed'));\n});\n\n\n//# sourceURL=webpack://django-filer/./filer/static/filer/js/addons/upload-button.js?\n}"); + +/***/ }, + +/***/ "./filer/static/filer/js/addons/widget.js" +/*!************************************************!*\ + !*** ./filer/static/filer/js/addons/widget.js ***! + \************************************************/ +() { + +"use strict"; +eval("{\n\ndocument.addEventListener('DOMContentLoaded', () => {\n const filer_clear = (ev) => {\n ev.preventDefault();\n\n const clearer = ev.currentTarget;\n const container = clearer.closest('.filerFile');\n if (!container) {\n return;\n }\n\n const input = container.querySelector('input');\n const thumbnail = container.querySelector('.thumbnail_img');\n const description = container.querySelector('.description_text');\n const addImageButton = container.querySelector('.lookup');\n const editImageButton = container.querySelector('.edit');\n const dropzoneMessage = container.parentElement.querySelector('.dz-message');\n const hiddenClass = 'hidden';\n\n clearer.classList.add(hiddenClass);\n if (input) {\n input.value = '';\n }\n if (thumbnail) {\n thumbnail.classList.add(hiddenClass);\n var thumbnailLink = thumbnail.parentElement;\n if (thumbnailLink.tagName === 'A') {\n thumbnailLink.removeAttribute('href');\n }\n }\n if (addImageButton) {\n addImageButton.classList.remove('related-lookup-change');\n }\n if (editImageButton) {\n editImageButton.classList.remove('related-lookup-change');\n }\n if (dropzoneMessage) {\n dropzoneMessage.classList.remove(hiddenClass);\n }\n if (description) {\n description.textContent = '';\n }\n };\n\n const foreignKeyFields = document.querySelectorAll('.filerFile .vForeignKeyRawIdAdminField');\n foreignKeyFields.forEach((field) => {\n field.setAttribute('type', 'hidden');\n });\n\n // Remove any existing handlers and add new ones\n const clearers = document.querySelectorAll('.filerFile .filerClearer');\n clearers.forEach((clearer) => {\n clearer.addEventListener('click', filer_clear);\n });\n});\n\n\n//# sourceURL=webpack://django-filer/./filer/static/filer/js/addons/widget.js?\n}"); + +/***/ }, + +/***/ "./filer/static/filer/js/base.js" +/*!***************************************!*\ + !*** ./filer/static/filer/js/base.js ***! + \***************************************/ +(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var mediator_js_lib_mediator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! mediator-js/lib/mediator */ \"./node_modules/mediator-js/lib/mediator.js\");\n/* harmony import */ var mediator_js_lib_mediator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(mediator_js_lib_mediator__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _addons_focal_point__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./addons/focal-point */ \"./filer/static/filer/js/addons/focal-point.js\");\n/* harmony import */ var _addons_toggler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./addons/toggler */ \"./filer/static/filer/js/addons/toggler.js\");\n/* harmony import */ var _addons_dropdown_menu__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./addons/dropdown-menu */ \"./filer/static/filer/js/addons/dropdown-menu.js\");\n/* harmony import */ var _addons_dropdown_menu__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_addons_dropdown_menu__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _addons_upload_button__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./addons/upload-button */ \"./filer/static/filer/js/addons/upload-button.js\");\n/* harmony import */ var _addons_dropzone_init__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./addons/dropzone.init */ \"./filer/static/filer/js/addons/dropzone.init.js\");\n/* harmony import */ var _addons_table_dropzone__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./addons/table-dropzone */ \"./filer/static/filer/js/addons/table-dropzone.js\");\n/* harmony import */ var _addons_copy_move_files__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./addons/copy-move-files */ \"./filer/static/filer/js/addons/copy-move-files.js\");\n/* harmony import */ var _addons_copy_move_files__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_addons_copy_move_files__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _addons_tooltip__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./addons/tooltip */ \"./filer/static/filer/js/addons/tooltip.js\");\n/* harmony import */ var _addons_tooltip__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_addons_tooltip__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _addons_widget__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./addons/widget */ \"./filer/static/filer/js/addons/widget.js\");\n/* harmony import */ var _addons_widget__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_addons_widget__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _addons_popup_handling__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./addons/popup_handling */ \"./filer/static/filer/js/addons/popup_handling.js\");\n/* harmony import */ var _addons_popup_handling__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_addons_popup_handling__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _addons_filer_popup_response__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./addons/filer_popup_response */ \"./filer/static/filer/js/addons/filer_popup_response.js\");\n/* harmony import */ var _addons_filer_popup_response__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_addons_filer_popup_response__WEBPACK_IMPORTED_MODULE_11__);\n// #####################################################################################################################\n// #BASE#\n// Basic logic django filer\n\n\n\n\n\n\n// Import self-initializing addons so they are included in the bundle\n\n\n\n\n\n\n\n\n\n\nwindow.Cl = window.Cl || {};\nCl.mediator = new (mediator_js_lib_mediator__WEBPACK_IMPORTED_MODULE_0___default())(); // mediator init\nCl.FocalPoint = _addons_focal_point__WEBPACK_IMPORTED_MODULE_1__[\"default\"];\nCl.Toggler = _addons_toggler__WEBPACK_IMPORTED_MODULE_2__[\"default\"];\n\n\ndocument.addEventListener('DOMContentLoaded', () => {\n let showErrorTimeout;\n\n window.filerShowError = (message) => {\n const messages = document.querySelector('.messagelist');\n const header = document.querySelector('#header');\n const filerErrorClass = 'js-filer-error';\n const tpl = `
    • {msg}
    `;\n const msg = tpl.replace('{msg}', message);\n\n if (messages) {\n messages.outerHTML = msg;\n } else if (header) {\n header.insertAdjacentHTML('afterend', msg);\n }\n\n if (showErrorTimeout) {\n clearTimeout(showErrorTimeout);\n }\n\n showErrorTimeout = setTimeout(() => {\n const errorEl = document.querySelector(`.${filerErrorClass}`);\n if (errorEl) {\n errorEl.remove();\n }\n }, 5000);\n };\n\n const filterFiles = document.querySelector('.js-filter-files');\n if (filterFiles) {\n\n filterFiles.addEventListener('focus', (event) => {\n const container = event.target.closest('.navigator-top-nav');\n if (container) {\n container.classList.add('search-is-focused');\n }\n });\n\n filterFiles.addEventListener('blur', (event) => {\n const container = event.target.closest('.navigator-top-nav');\n if (container) {\n const dropdownTrigger = container.querySelector('.dropdown-container a');\n if (!dropdownTrigger || event.relatedTarget !== dropdownTrigger) {\n container.classList.remove('search-is-focused');\n }\n }\n });\n }\n\n // Search form submission logging\n const searchForm = document.querySelector('.js-filter-files-container');\n if (searchForm) {\n searchForm.addEventListener('submit', (event) => {\n // form submit handling\n });\n }\n\n // Focus on the search field on page load\n (() => {\n const filter = document.querySelector('.js-filter-files');\n const containerSelector = '.navigator-top-nav';\n const container = document.querySelector(containerSelector);\n const searchDropdown = container?.querySelector('.filter-search-wrapper .filer-dropdown-container');\n\n if (filter) {\n filter.addEventListener('keydown', function (event) {\n if (event.key === 'Enter') {\n // Enter key pressed\n }\n const navContainer = this.closest(containerSelector);\n if (navContainer) {\n navContainer.classList.add('search-is-focused');\n }\n });\n\n if (searchDropdown) {\n searchDropdown.addEventListener('show.bs.filer-dropdown', () => {\n if (container) {\n container.classList.add('search-is-focused');\n }\n });\n searchDropdown.addEventListener('hide.bs.filer-dropdown', () => {\n if (container) {\n container.classList.remove('search-is-focused');\n }\n });\n }\n }\n })();\n\n // show counter if file is selected\n (() => {\n const navigatorTable = document.querySelectorAll('.navigator-table tr, .navigator-list .list-item');\n const actionList = document.querySelector('.actions-wrapper');\n const actionSelect = document.querySelectorAll(\n '.action-select, #action-toggle, #files-action-toggle, #folders-action-toggle, .actions .clear a'\n );\n\n // timeout is needed to wait until table row has class selected.\n setTimeout(() => {\n // Set classes for checked items\n actionSelect.forEach((el) => {\n if (el.checked) {\n const listItem = el.closest('.list-item');\n if (listItem) {\n listItem.classList.add('selected');\n }\n }\n });\n const hasSelected = Array.from(navigatorTable).some((el) =>\n el.classList.contains('selected')\n );\n if (hasSelected && actionList) {\n actionList.classList.add('action-selected');\n }\n }, 100);\n\n actionSelect.forEach((el) => {\n el.addEventListener('change', function () {\n // Mark element selected (for table view this is done by Django admin js - we do it ourselves\n const listItem = this.closest('.list-item');\n if (listItem) {\n if (this.checked) {\n listItem.classList.add('selected');\n } else {\n listItem.classList.remove('selected');\n }\n }\n // setTimeout makes sure that change event fires before click event which is reliable to admin\n setTimeout(() => {\n const hasSelected = Array.from(navigatorTable).some((el) =>\n el.classList.contains('selected')\n );\n if (actionList) {\n if (hasSelected) {\n actionList.classList.add('action-selected');\n } else {\n actionList.classList.remove('action-selected');\n }\n }\n }, 0);\n });\n });\n })();\n\n (() => {\n const actionsMenu = document.querySelector('.js-actions-menu');\n if (!actionsMenu) {\n return;\n }\n\n const dropdown = actionsMenu.querySelector('.filer-dropdown-menu');\n const actionsSelect = document.querySelector('.actions select[name=\"action\"]');\n const actionsSelectOptions = actionsSelect?.querySelectorAll('option') || [];\n const actionsGo = document.querySelector('.actions button[type=\"submit\"]');\n const actionDelete = document.querySelector('.js-action-delete');\n const actionCopy = document.querySelector('.js-action-copy');\n const actionMove = document.querySelector('.js-action-move');\n const valueDelete = 'delete_files_or_folders';\n const valueCopy = 'copy_files_and_folders';\n const valueMove = 'move_files_and_folders';\n const navigatorTable = document.querySelectorAll('.navigator-table tr, .navigator-list .list-item');\n\n // triggers delete copy and move actions on separate buttons\n const actionsButton = (optionValue, actionButton) => {\n if (!actionButton) {\n return;\n }\n actionsSelectOptions.forEach((option) => {\n if (option.value === optionValue) {\n actionButton.style.display = '';\n actionButton.addEventListener('click', (e) => {\n e.preventDefault();\n const hasSelected = Array.from(navigatorTable).some((el) =>\n el.classList.contains('selected')\n );\n if (hasSelected && actionsSelect && actionsGo) {\n actionsSelect.value = optionValue;\n const targetOption = actionsSelect.querySelector(`option[value=\"${optionValue}\"]`);\n if (targetOption) {\n targetOption.selected = true;\n }\n actionsGo.click();\n }\n });\n }\n });\n };\n actionsButton(valueDelete, actionDelete);\n actionsButton(valueCopy, actionCopy);\n actionsButton(valueMove, actionMove);\n\n // mocking the action buttons to work in frontend UI\n actionsSelectOptions.forEach((option, index) => {\n if (index !== 0) {\n const li = document.createElement('li');\n const a = document.createElement('a');\n a.href = '#';\n a.textContent = option.textContent;\n\n if (option.value === valueDelete || option.value === valueCopy || option.value === valueMove) {\n a.classList.add('hidden');\n }\n\n li.appendChild(a);\n if (dropdown) {\n dropdown.appendChild(li);\n }\n }\n });\n if (dropdown) {\n\n dropdown.addEventListener('click', (clickEvent) => {\n if (clickEvent.target.tagName === 'A') {\n const li = clickEvent.target.closest('li');\n const targetIndex = Array.from(dropdown.querySelectorAll('li')).indexOf(li) + 1;\n\n clickEvent.preventDefault();\n\n if (actionsSelect && actionsGo) {\n const options = actionsSelect.querySelectorAll('option');\n if (options[targetIndex]) {\n actionsSelect.value = options[targetIndex].value;\n options[targetIndex].selected = true;\n }\n actionsGo.click();\n }\n }\n });\n }\n\n actionsMenu.addEventListener('click', (e) => {\n const hasSelected = Array.from(navigatorTable).some((el) =>\n el.classList.contains('selected')\n );\n if (!hasSelected) {\n e.preventDefault();\n e.stopPropagation();\n }\n });\n })();\n\n // breaks header if breadcrumbs name reaches a width of 80px\n (() => {\n const minBreadcrumbWidth = 80;\n const header = document.querySelector('.navigator-top-nav');\n\n if (!header) {\n return;\n }\n\n const breadcrumbContainer = document.querySelector('.breadcrumbs-container');\n if (!breadcrumbContainer) {\n return;\n }\n\n const breadcrumbFolder = breadcrumbContainer.querySelector('.navigator-breadcrumbs');\n const breadcrumbDropdown = breadcrumbContainer.querySelector('.filer-dropdown-container');\n const filterFilesContainer = document.querySelector('.filter-files-container');\n const actionsWrapper = document.querySelector('.actions-wrapper');\n const navigatorButtonWrapper = document.querySelector('.navigator-button-wrapper');\n\n const breadcrumbFolderWidth = breadcrumbFolder?.offsetWidth || 0;\n const breadcrumbDropdownWidth = breadcrumbDropdown?.offsetWidth || 0;\n const searchWidth = filterFilesContainer?.offsetWidth || 0;\n const actionsWidth = actionsWrapper?.offsetWidth || 0;\n const buttonsWidth = navigatorButtonWrapper?.offsetWidth || 0;\n\n const headerStyles = window.getComputedStyle(header);\n const headerPadding = parseInt(headerStyles.paddingLeft, 10) + parseInt(headerStyles.paddingRight, 10);\n\n let headerWidth = header.offsetWidth;\n const fullHeaderWidth = minBreadcrumbWidth + breadcrumbFolderWidth +\n breadcrumbDropdownWidth + searchWidth + actionsWidth + buttonsWidth + headerPadding;\n\n const breadcrumbSizeHandlerClassName = 'breadcrumb-min-width';\n\n const breadcrumbSizeHandler = () => {\n if (headerWidth < fullHeaderWidth) {\n header.classList.add(breadcrumbSizeHandlerClassName);\n } else {\n header.classList.remove(breadcrumbSizeHandlerClassName);\n }\n };\n\n breadcrumbSizeHandler();\n\n window.addEventListener('resize', () => {\n headerWidth = header.offsetWidth;\n breadcrumbSizeHandler();\n });\n })();\n // thumbnail folder admin view\n (() => {\n const actionEls = document.querySelectorAll('.navigator-list .list-item input.action-select');\n const foldersActionCheckboxes = '.navigator-list .navigator-folders-body .list-item input.action-select';\n const filesActionCheckboxes = '.navigator-list .navigator-files-body .list-item input.action-select';\n const allFilesToggle = document.querySelector('#files-action-toggle');\n const allFoldersToggle = document.querySelector('#folders-action-toggle');\n\n if (allFoldersToggle) {\n allFoldersToggle.addEventListener('click', function () {\n const checkboxes = document.querySelectorAll(foldersActionCheckboxes);\n if (this.checked) {\n checkboxes.forEach((cb) => {\n if (!cb.checked) {\n cb.click();\n }\n });\n } else {\n checkboxes.forEach((cb) => {\n if (cb.checked) {\n cb.click();\n }\n });\n }\n });\n }\n\n if (allFilesToggle) {\n allFilesToggle.addEventListener('click', function () {\n const checkboxes = document.querySelectorAll(filesActionCheckboxes);\n if (this.checked) {\n checkboxes.forEach((cb) => {\n if (!cb.checked) {\n cb.click();\n }\n });\n } else {\n checkboxes.forEach((cb) => {\n if (cb.checked) {\n cb.click();\n }\n });\n }\n });\n }\n\n actionEls.forEach((el) => {\n el.addEventListener('click', function () {\n const filesCheckboxes = document.querySelectorAll(filesActionCheckboxes);\n const foldersCheckboxes = document.querySelectorAll(foldersActionCheckboxes);\n\n if (!this.checked) {\n const hasUncheckedFiles = Array.from(filesCheckboxes).some((cb) => !cb.checked);\n const hasUncheckedFolders = Array.from(foldersCheckboxes).some((cb) => !cb.checked);\n\n if (hasUncheckedFiles && allFilesToggle) {\n allFilesToggle.checked = false;\n }\n if (hasUncheckedFolders && allFoldersToggle) {\n allFoldersToggle.checked = false;\n }\n } else {\n const allFilesChecked = Array.from(filesCheckboxes).every((cb) => cb.checked);\n const allFoldersChecked = Array.from(foldersCheckboxes).every((cb) => cb.checked);\n\n if (allFilesChecked && allFilesToggle) {\n allFilesToggle.checked = true;\n }\n if (allFoldersChecked && allFoldersToggle) {\n allFoldersToggle.checked = true;\n }\n }\n });\n });\n\n const clearLink = document.querySelector('.navigator .actions .clear a');\n if (clearLink) {\n clearLink.addEventListener('click', () => {\n if (allFoldersToggle) {\n allFoldersToggle.checked = false;\n }\n if (allFilesToggle) {\n allFilesToggle.checked = false;\n }\n });\n }\n })();\n\n const copyUrlButtons = document.querySelectorAll('.js-copy-url');\n copyUrlButtons.forEach((button) => {\n button.addEventListener('click', function (e) {\n const url = new URL(this.dataset.url, document.location.href);\n const msg = this.dataset.msg || 'URL copied to clipboard';\n const infobox = document.createElement('template');\n e.preventDefault();\n\n const existingTooltips = document.querySelectorAll('.info.filer-tooltip');\n existingTooltips.forEach((el) => {\n el.remove();\n });\n\n navigator.clipboard.writeText(url.href);\n infobox.innerHTML = `
    ${msg}
    `;\n this.classList.add('filer-tooltip-wrapper');\n this.appendChild(infobox.content.firstChild);\n\n const self = this;\n setTimeout(() => {\n const tooltip = self.querySelector('.info');\n if (tooltip) {\n tooltip.remove();\n }\n }, 1200);\n });\n });\n\n // Initialize FocalPoint\n const focalPoint = new _addons_focal_point__WEBPACK_IMPORTED_MODULE_1__[\"default\"]();\n focalPoint.initialize();\n\n // Initialize Toggler (auto-initializes in constructor)\n new _addons_toggler__WEBPACK_IMPORTED_MODULE_2__[\"default\"]();\n});\n\n\n//# sourceURL=webpack://django-filer/./filer/static/filer/js/base.js?\n}"); + +/***/ }, + +/***/ "./node_modules/dropzone/dist/dropzone.js" +/*!************************************************!*\ + !*** ./node_modules/dropzone/dist/dropzone.js ***! + \************************************************/ +(module) { + +eval("{(function webpackUniversalModuleDefinition(root, factory) {\n\tif(true)\n\t\tmodule.exports = factory();\n\telse // removed by dead control flow\n{ var i, a; }\n})(self, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 3099:\n/***/ (function(module) {\n\nmodule.exports = function (it) {\n if (typeof it != 'function') {\n throw TypeError(String(it) + ' is not a function');\n } return it;\n};\n\n\n/***/ }),\n\n/***/ 6077:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_703__) {\n\nvar isObject = __nested_webpack_require_703__(111);\n\nmodule.exports = function (it) {\n if (!isObject(it) && it !== null) {\n throw TypeError(\"Can't set \" + String(it) + ' as a prototype');\n } return it;\n};\n\n\n/***/ }),\n\n/***/ 1223:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_1001__) {\n\nvar wellKnownSymbol = __nested_webpack_require_1001__(5112);\nvar create = __nested_webpack_require_1001__(30);\nvar definePropertyModule = __nested_webpack_require_1001__(3070);\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n definePropertyModule.f(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n\n\n/***/ }),\n\n/***/ 1530:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_1715__) {\n\n\"use strict\";\n\nvar charAt = __nested_webpack_require_1715__(8710).charAt;\n\n// `AdvanceStringIndex` abstract operation\n// https://tc39.es/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? charAt(S, index).length : 1);\n};\n\n\n/***/ }),\n\n/***/ 5787:\n/***/ (function(module) {\n\nmodule.exports = function (it, Constructor, name) {\n if (!(it instanceof Constructor)) {\n throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n } return it;\n};\n\n\n/***/ }),\n\n/***/ 9670:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_2317__) {\n\nvar isObject = __nested_webpack_require_2317__(111);\n\nmodule.exports = function (it) {\n if (!isObject(it)) {\n throw TypeError(String(it) + ' is not an object');\n } return it;\n};\n\n\n/***/ }),\n\n/***/ 4019:\n/***/ (function(module) {\n\nmodule.exports = typeof ArrayBuffer !== 'undefined' && typeof DataView !== 'undefined';\n\n\n/***/ }),\n\n/***/ 260:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_2726__) {\n\n\"use strict\";\n\nvar NATIVE_ARRAY_BUFFER = __nested_webpack_require_2726__(4019);\nvar DESCRIPTORS = __nested_webpack_require_2726__(9781);\nvar global = __nested_webpack_require_2726__(7854);\nvar isObject = __nested_webpack_require_2726__(111);\nvar has = __nested_webpack_require_2726__(6656);\nvar classof = __nested_webpack_require_2726__(648);\nvar createNonEnumerableProperty = __nested_webpack_require_2726__(8880);\nvar redefine = __nested_webpack_require_2726__(1320);\nvar defineProperty = __nested_webpack_require_2726__(3070).f;\nvar getPrototypeOf = __nested_webpack_require_2726__(9518);\nvar setPrototypeOf = __nested_webpack_require_2726__(7674);\nvar wellKnownSymbol = __nested_webpack_require_2726__(5112);\nvar uid = __nested_webpack_require_2726__(9711);\n\nvar Int8Array = global.Int8Array;\nvar Int8ArrayPrototype = Int8Array && Int8Array.prototype;\nvar Uint8ClampedArray = global.Uint8ClampedArray;\nvar Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype;\nvar TypedArray = Int8Array && getPrototypeOf(Int8Array);\nvar TypedArrayPrototype = Int8ArrayPrototype && getPrototypeOf(Int8ArrayPrototype);\nvar ObjectPrototype = Object.prototype;\nvar isPrototypeOf = ObjectPrototype.isPrototypeOf;\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG');\n// Fixing native typed arrays in Opera Presto crashes the browser, see #595\nvar NATIVE_ARRAY_BUFFER_VIEWS = NATIVE_ARRAY_BUFFER && !!setPrototypeOf && classof(global.opera) !== 'Opera';\nvar TYPED_ARRAY_TAG_REQIRED = false;\nvar NAME;\n\nvar TypedArrayConstructorsList = {\n Int8Array: 1,\n Uint8Array: 1,\n Uint8ClampedArray: 1,\n Int16Array: 2,\n Uint16Array: 2,\n Int32Array: 4,\n Uint32Array: 4,\n Float32Array: 4,\n Float64Array: 8\n};\n\nvar BigIntArrayConstructorsList = {\n BigInt64Array: 8,\n BigUint64Array: 8\n};\n\nvar isView = function isView(it) {\n if (!isObject(it)) return false;\n var klass = classof(it);\n return klass === 'DataView'\n || has(TypedArrayConstructorsList, klass)\n || has(BigIntArrayConstructorsList, klass);\n};\n\nvar isTypedArray = function (it) {\n if (!isObject(it)) return false;\n var klass = classof(it);\n return has(TypedArrayConstructorsList, klass)\n || has(BigIntArrayConstructorsList, klass);\n};\n\nvar aTypedArray = function (it) {\n if (isTypedArray(it)) return it;\n throw TypeError('Target is not a typed array');\n};\n\nvar aTypedArrayConstructor = function (C) {\n if (setPrototypeOf) {\n if (isPrototypeOf.call(TypedArray, C)) return C;\n } else for (var ARRAY in TypedArrayConstructorsList) if (has(TypedArrayConstructorsList, NAME)) {\n var TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && (C === TypedArrayConstructor || isPrototypeOf.call(TypedArrayConstructor, C))) {\n return C;\n }\n } throw TypeError('Target is not a typed array constructor');\n};\n\nvar exportTypedArrayMethod = function (KEY, property, forced) {\n if (!DESCRIPTORS) return;\n if (forced) for (var ARRAY in TypedArrayConstructorsList) {\n var TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && has(TypedArrayConstructor.prototype, KEY)) {\n delete TypedArrayConstructor.prototype[KEY];\n }\n }\n if (!TypedArrayPrototype[KEY] || forced) {\n redefine(TypedArrayPrototype, KEY, forced ? property\n : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property);\n }\n};\n\nvar exportTypedArrayStaticMethod = function (KEY, property, forced) {\n var ARRAY, TypedArrayConstructor;\n if (!DESCRIPTORS) return;\n if (setPrototypeOf) {\n if (forced) for (ARRAY in TypedArrayConstructorsList) {\n TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && has(TypedArrayConstructor, KEY)) {\n delete TypedArrayConstructor[KEY];\n }\n }\n if (!TypedArray[KEY] || forced) {\n // V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable\n try {\n return redefine(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && Int8Array[KEY] || property);\n } catch (error) { /* empty */ }\n } else return;\n }\n for (ARRAY in TypedArrayConstructorsList) {\n TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) {\n redefine(TypedArrayConstructor, KEY, property);\n }\n }\n};\n\nfor (NAME in TypedArrayConstructorsList) {\n if (!global[NAME]) NATIVE_ARRAY_BUFFER_VIEWS = false;\n}\n\n// WebKit bug - typed arrays constructors prototype is Object.prototype\nif (!NATIVE_ARRAY_BUFFER_VIEWS || typeof TypedArray != 'function' || TypedArray === Function.prototype) {\n // eslint-disable-next-line no-shadow -- safe\n TypedArray = function TypedArray() {\n throw TypeError('Incorrect invocation');\n };\n if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {\n if (global[NAME]) setPrototypeOf(global[NAME], TypedArray);\n }\n}\n\nif (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype) {\n TypedArrayPrototype = TypedArray.prototype;\n if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {\n if (global[NAME]) setPrototypeOf(global[NAME].prototype, TypedArrayPrototype);\n }\n}\n\n// WebKit bug - one more object in Uint8ClampedArray prototype chain\nif (NATIVE_ARRAY_BUFFER_VIEWS && getPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) {\n setPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype);\n}\n\nif (DESCRIPTORS && !has(TypedArrayPrototype, TO_STRING_TAG)) {\n TYPED_ARRAY_TAG_REQIRED = true;\n defineProperty(TypedArrayPrototype, TO_STRING_TAG, { get: function () {\n return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined;\n } });\n for (NAME in TypedArrayConstructorsList) if (global[NAME]) {\n createNonEnumerableProperty(global[NAME], TYPED_ARRAY_TAG, NAME);\n }\n}\n\nmodule.exports = {\n NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS,\n TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQIRED && TYPED_ARRAY_TAG,\n aTypedArray: aTypedArray,\n aTypedArrayConstructor: aTypedArrayConstructor,\n exportTypedArrayMethod: exportTypedArrayMethod,\n exportTypedArrayStaticMethod: exportTypedArrayStaticMethod,\n isView: isView,\n isTypedArray: isTypedArray,\n TypedArray: TypedArray,\n TypedArrayPrototype: TypedArrayPrototype\n};\n\n\n/***/ }),\n\n/***/ 3331:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_8934__) {\n\n\"use strict\";\n\nvar global = __nested_webpack_require_8934__(7854);\nvar DESCRIPTORS = __nested_webpack_require_8934__(9781);\nvar NATIVE_ARRAY_BUFFER = __nested_webpack_require_8934__(4019);\nvar createNonEnumerableProperty = __nested_webpack_require_8934__(8880);\nvar redefineAll = __nested_webpack_require_8934__(2248);\nvar fails = __nested_webpack_require_8934__(7293);\nvar anInstance = __nested_webpack_require_8934__(5787);\nvar toInteger = __nested_webpack_require_8934__(9958);\nvar toLength = __nested_webpack_require_8934__(7466);\nvar toIndex = __nested_webpack_require_8934__(7067);\nvar IEEE754 = __nested_webpack_require_8934__(1179);\nvar getPrototypeOf = __nested_webpack_require_8934__(9518);\nvar setPrototypeOf = __nested_webpack_require_8934__(7674);\nvar getOwnPropertyNames = __nested_webpack_require_8934__(8006).f;\nvar defineProperty = __nested_webpack_require_8934__(3070).f;\nvar arrayFill = __nested_webpack_require_8934__(1285);\nvar setToStringTag = __nested_webpack_require_8934__(8003);\nvar InternalStateModule = __nested_webpack_require_8934__(9909);\n\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length';\nvar WRONG_INDEX = 'Wrong index';\nvar NativeArrayBuffer = global[ARRAY_BUFFER];\nvar $ArrayBuffer = NativeArrayBuffer;\nvar $DataView = global[DATA_VIEW];\nvar $DataViewPrototype = $DataView && $DataView[PROTOTYPE];\nvar ObjectPrototype = Object.prototype;\nvar RangeError = global.RangeError;\n\nvar packIEEE754 = IEEE754.pack;\nvar unpackIEEE754 = IEEE754.unpack;\n\nvar packInt8 = function (number) {\n return [number & 0xFF];\n};\n\nvar packInt16 = function (number) {\n return [number & 0xFF, number >> 8 & 0xFF];\n};\n\nvar packInt32 = function (number) {\n return [number & 0xFF, number >> 8 & 0xFF, number >> 16 & 0xFF, number >> 24 & 0xFF];\n};\n\nvar unpackInt32 = function (buffer) {\n return buffer[3] << 24 | buffer[2] << 16 | buffer[1] << 8 | buffer[0];\n};\n\nvar packFloat32 = function (number) {\n return packIEEE754(number, 23, 4);\n};\n\nvar packFloat64 = function (number) {\n return packIEEE754(number, 52, 8);\n};\n\nvar addGetter = function (Constructor, key) {\n defineProperty(Constructor[PROTOTYPE], key, { get: function () { return getInternalState(this)[key]; } });\n};\n\nvar get = function (view, count, index, isLittleEndian) {\n var intIndex = toIndex(index);\n var store = getInternalState(view);\n if (intIndex + count > store.byteLength) throw RangeError(WRONG_INDEX);\n var bytes = getInternalState(store.buffer).bytes;\n var start = intIndex + store.byteOffset;\n var pack = bytes.slice(start, start + count);\n return isLittleEndian ? pack : pack.reverse();\n};\n\nvar set = function (view, count, index, conversion, value, isLittleEndian) {\n var intIndex = toIndex(index);\n var store = getInternalState(view);\n if (intIndex + count > store.byteLength) throw RangeError(WRONG_INDEX);\n var bytes = getInternalState(store.buffer).bytes;\n var start = intIndex + store.byteOffset;\n var pack = conversion(+value);\n for (var i = 0; i < count; i++) bytes[start + i] = pack[isLittleEndian ? i : count - i - 1];\n};\n\nif (!NATIVE_ARRAY_BUFFER) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n var byteLength = toIndex(length);\n setInternalState(this, {\n bytes: arrayFill.call(new Array(byteLength), 0),\n byteLength: byteLength\n });\n if (!DESCRIPTORS) this.byteLength = byteLength;\n };\n\n $DataView = function DataView(buffer, byteOffset, byteLength) {\n anInstance(this, $DataView, DATA_VIEW);\n anInstance(buffer, $ArrayBuffer, DATA_VIEW);\n var bufferLength = getInternalState(buffer).byteLength;\n var offset = toInteger(byteOffset);\n if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset');\n byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);\n setInternalState(this, {\n buffer: buffer,\n byteLength: byteLength,\n byteOffset: offset\n });\n if (!DESCRIPTORS) {\n this.buffer = buffer;\n this.byteLength = byteLength;\n this.byteOffset = offset;\n }\n };\n\n if (DESCRIPTORS) {\n addGetter($ArrayBuffer, 'byteLength');\n addGetter($DataView, 'buffer');\n addGetter($DataView, 'byteLength');\n addGetter($DataView, 'byteOffset');\n }\n\n redefineAll($DataView[PROTOTYPE], {\n getInt8: function getInt8(byteOffset) {\n return get(this, 1, byteOffset)[0] << 24 >> 24;\n },\n getUint8: function getUint8(byteOffset) {\n return get(this, 1, byteOffset)[0];\n },\n getInt16: function getInt16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);\n return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n },\n getUint16: function getUint16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);\n return bytes[1] << 8 | bytes[0];\n },\n getInt32: function getInt32(byteOffset /* , littleEndian */) {\n return unpackInt32(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined));\n },\n getUint32: function getUint32(byteOffset /* , littleEndian */) {\n return unpackInt32(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined)) >>> 0;\n },\n getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 23);\n },\n getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 8, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 52);\n },\n setInt8: function setInt8(byteOffset, value) {\n set(this, 1, byteOffset, packInt8, value);\n },\n setUint8: function setUint8(byteOffset, value) {\n set(this, 1, byteOffset, packInt8, value);\n },\n setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packFloat32, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n set(this, 8, byteOffset, packFloat64, value, arguments.length > 2 ? arguments[2] : undefined);\n }\n });\n} else {\n /* eslint-disable no-new -- required for testing */\n if (!fails(function () {\n NativeArrayBuffer(1);\n }) || !fails(function () {\n new NativeArrayBuffer(-1);\n }) || fails(function () {\n new NativeArrayBuffer();\n new NativeArrayBuffer(1.5);\n new NativeArrayBuffer(NaN);\n return NativeArrayBuffer.name != ARRAY_BUFFER;\n })) {\n /* eslint-enable no-new -- required for testing */\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer);\n return new NativeArrayBuffer(toIndex(length));\n };\n var ArrayBufferPrototype = $ArrayBuffer[PROTOTYPE] = NativeArrayBuffer[PROTOTYPE];\n for (var keys = getOwnPropertyNames(NativeArrayBuffer), j = 0, key; keys.length > j;) {\n if (!((key = keys[j++]) in $ArrayBuffer)) {\n createNonEnumerableProperty($ArrayBuffer, key, NativeArrayBuffer[key]);\n }\n }\n ArrayBufferPrototype.constructor = $ArrayBuffer;\n }\n\n // WebKit bug - the same parent prototype for typed arrays and data view\n if (setPrototypeOf && getPrototypeOf($DataViewPrototype) !== ObjectPrototype) {\n setPrototypeOf($DataViewPrototype, ObjectPrototype);\n }\n\n // iOS Safari 7.x bug\n var testView = new $DataView(new $ArrayBuffer(2));\n var nativeSetInt8 = $DataViewPrototype.setInt8;\n testView.setInt8(0, 2147483648);\n testView.setInt8(1, 2147483649);\n if (testView.getInt8(0) || !testView.getInt8(1)) redefineAll($DataViewPrototype, {\n setInt8: function setInt8(byteOffset, value) {\n nativeSetInt8.call(this, byteOffset, value << 24 >> 24);\n },\n setUint8: function setUint8(byteOffset, value) {\n nativeSetInt8.call(this, byteOffset, value << 24 >> 24);\n }\n }, { unsafe: true });\n}\n\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\n\nmodule.exports = {\n ArrayBuffer: $ArrayBuffer,\n DataView: $DataView\n};\n\n\n/***/ }),\n\n/***/ 1048:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_17881__) {\n\n\"use strict\";\n\nvar toObject = __nested_webpack_require_17881__(7908);\nvar toAbsoluteIndex = __nested_webpack_require_17881__(1400);\nvar toLength = __nested_webpack_require_17881__(7466);\n\nvar min = Math.min;\n\n// `Array.prototype.copyWithin` method implementation\n// https://tc39.es/ecma262/#sec-array.prototype.copywithin\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var to = toAbsoluteIndex(target, len);\n var from = toAbsoluteIndex(start, len);\n var end = arguments.length > 2 ? arguments[2] : undefined;\n var count = min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n var inc = 1;\n if (from < to && to < from + count) {\n inc = -1;\n from += count - 1;\n to += count - 1;\n }\n while (count-- > 0) {\n if (from in O) O[to] = O[from];\n else delete O[to];\n to += inc;\n from += inc;\n } return O;\n};\n\n\n/***/ }),\n\n/***/ 1285:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_18911__) {\n\n\"use strict\";\n\nvar toObject = __nested_webpack_require_18911__(7908);\nvar toAbsoluteIndex = __nested_webpack_require_18911__(1400);\nvar toLength = __nested_webpack_require_18911__(7466);\n\n// `Array.prototype.fill` method implementation\n// https://tc39.es/ecma262/#sec-array.prototype.fill\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n var O = toObject(this);\n var length = toLength(O.length);\n var argumentsLength = arguments.length;\n var index = toAbsoluteIndex(argumentsLength > 1 ? arguments[1] : undefined, length);\n var end = argumentsLength > 2 ? arguments[2] : undefined;\n var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n while (endPos > index) O[index++] = value;\n return O;\n};\n\n\n/***/ }),\n\n/***/ 8533:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_19717__) {\n\n\"use strict\";\n\nvar $forEach = __nested_webpack_require_19717__(2092).forEach;\nvar arrayMethodIsStrict = __nested_webpack_require_19717__(9341);\n\nvar STRICT_METHOD = arrayMethodIsStrict('forEach');\n\n// `Array.prototype.forEach` method implementation\n// https://tc39.es/ecma262/#sec-array.prototype.foreach\nmodule.exports = !STRICT_METHOD ? function forEach(callbackfn /* , thisArg */) {\n return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n} : [].forEach;\n\n\n/***/ }),\n\n/***/ 8457:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_20278__) {\n\n\"use strict\";\n\nvar bind = __nested_webpack_require_20278__(9974);\nvar toObject = __nested_webpack_require_20278__(7908);\nvar callWithSafeIterationClosing = __nested_webpack_require_20278__(3411);\nvar isArrayIteratorMethod = __nested_webpack_require_20278__(7659);\nvar toLength = __nested_webpack_require_20278__(7466);\nvar createProperty = __nested_webpack_require_20278__(6135);\nvar getIteratorMethod = __nested_webpack_require_20278__(1246);\n\n// `Array.from` method implementation\n// https://tc39.es/ecma262/#sec-array.from\nmodule.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var index = 0;\n var length, result, step, iterator, next, value;\n if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);\n // if the target is not iterable or it's an array with the default iterator - use a simple case\n if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {\n iterator = iteratorMethod.call(O);\n next = iterator.next;\n result = new C();\n for (;!(step = next.call(iterator)).done; index++) {\n value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n createProperty(result, index, value);\n }\n } else {\n length = toLength(O.length);\n result = new C(length);\n for (;length > index; index++) {\n value = mapping ? mapfn(O[index], index) : O[index];\n createProperty(result, index, value);\n }\n }\n result.length = index;\n return result;\n};\n\n\n/***/ }),\n\n/***/ 1318:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_22092__) {\n\nvar toIndexedObject = __nested_webpack_require_22092__(5656);\nvar toLength = __nested_webpack_require_22092__(7466);\nvar toAbsoluteIndex = __nested_webpack_require_22092__(1400);\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare -- NaN check\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare -- NaN check\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.es/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.es/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n\n\n/***/ }),\n\n/***/ 2092:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_23446__) {\n\nvar bind = __nested_webpack_require_23446__(9974);\nvar IndexedObject = __nested_webpack_require_23446__(8361);\nvar toObject = __nested_webpack_require_23446__(7908);\nvar toLength = __nested_webpack_require_23446__(7466);\nvar arraySpeciesCreate = __nested_webpack_require_23446__(5417);\n\nvar push = [].push;\n\n// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterOut }` methods implementation\nvar createMethod = function (TYPE) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var IS_FILTER_OUT = TYPE == 7;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n return function ($this, callbackfn, that, specificCreate) {\n var O = toObject($this);\n var self = IndexedObject(O);\n var boundFunction = bind(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var create = specificCreate || arraySpeciesCreate;\n var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_OUT ? create($this, 0) : undefined;\n var value, result;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n value = self[index];\n result = boundFunction(value, index, O);\n if (TYPE) {\n if (IS_MAP) target[index] = result; // map\n else if (result) switch (TYPE) {\n case 3: return true; // some\n case 5: return value; // find\n case 6: return index; // findIndex\n case 2: push.call(target, value); // filter\n } else switch (TYPE) {\n case 4: return false; // every\n case 7: push.call(target, value); // filterOut\n }\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.forEach` method\n // https://tc39.es/ecma262/#sec-array.prototype.foreach\n forEach: createMethod(0),\n // `Array.prototype.map` method\n // https://tc39.es/ecma262/#sec-array.prototype.map\n map: createMethod(1),\n // `Array.prototype.filter` method\n // https://tc39.es/ecma262/#sec-array.prototype.filter\n filter: createMethod(2),\n // `Array.prototype.some` method\n // https://tc39.es/ecma262/#sec-array.prototype.some\n some: createMethod(3),\n // `Array.prototype.every` method\n // https://tc39.es/ecma262/#sec-array.prototype.every\n every: createMethod(4),\n // `Array.prototype.find` method\n // https://tc39.es/ecma262/#sec-array.prototype.find\n find: createMethod(5),\n // `Array.prototype.findIndex` method\n // https://tc39.es/ecma262/#sec-array.prototype.findIndex\n findIndex: createMethod(6),\n // `Array.prototype.filterOut` method\n // https://github.com/tc39/proposal-array-filtering\n filterOut: createMethod(7)\n};\n\n\n/***/ }),\n\n/***/ 6583:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_26271__) {\n\n\"use strict\";\n\nvar toIndexedObject = __nested_webpack_require_26271__(5656);\nvar toInteger = __nested_webpack_require_26271__(9958);\nvar toLength = __nested_webpack_require_26271__(7466);\nvar arrayMethodIsStrict = __nested_webpack_require_26271__(9341);\n\nvar min = Math.min;\nvar nativeLastIndexOf = [].lastIndexOf;\nvar NEGATIVE_ZERO = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;\nvar STRICT_METHOD = arrayMethodIsStrict('lastIndexOf');\nvar FORCED = NEGATIVE_ZERO || !STRICT_METHOD;\n\n// `Array.prototype.lastIndexOf` method implementation\n// https://tc39.es/ecma262/#sec-array.prototype.lastindexof\nmodule.exports = FORCED ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n // convert -0 to +0\n if (NEGATIVE_ZERO) return nativeLastIndexOf.apply(this, arguments) || 0;\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var index = length - 1;\n if (arguments.length > 1) index = min(index, toInteger(arguments[1]));\n if (index < 0) index = length + index;\n for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;\n return -1;\n} : nativeLastIndexOf;\n\n\n/***/ }),\n\n/***/ 1194:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_27452__) {\n\nvar fails = __nested_webpack_require_27452__(7293);\nvar wellKnownSymbol = __nested_webpack_require_27452__(5112);\nvar V8_VERSION = __nested_webpack_require_27452__(7392);\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (METHOD_NAME) {\n // We can't use this feature detection in V8 since it causes\n // deoptimization and serious performance degradation\n // https://github.com/zloirock/core-js/issues/677\n return V8_VERSION >= 51 || !fails(function () {\n var array = [];\n var constructor = array.constructor = {};\n constructor[SPECIES] = function () {\n return { foo: 1 };\n };\n return array[METHOD_NAME](Boolean).foo !== 1;\n });\n};\n\n\n/***/ }),\n\n/***/ 9341:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_28188__) {\n\n\"use strict\";\n\nvar fails = __nested_webpack_require_28188__(7293);\n\nmodule.exports = function (METHOD_NAME, argument) {\n var method = [][METHOD_NAME];\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call,no-throw-literal -- required for testing\n method.call(null, argument || function () { throw 1; }, 1);\n });\n};\n\n\n/***/ }),\n\n/***/ 3671:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_28629__) {\n\nvar aFunction = __nested_webpack_require_28629__(3099);\nvar toObject = __nested_webpack_require_28629__(7908);\nvar IndexedObject = __nested_webpack_require_28629__(8361);\nvar toLength = __nested_webpack_require_28629__(7466);\n\n// `Array.prototype.{ reduce, reduceRight }` methods implementation\nvar createMethod = function (IS_RIGHT) {\n return function (that, callbackfn, argumentsLength, memo) {\n aFunction(callbackfn);\n var O = toObject(that);\n var self = IndexedObject(O);\n var length = toLength(O.length);\n var index = IS_RIGHT ? length - 1 : 0;\n var i = IS_RIGHT ? -1 : 1;\n if (argumentsLength < 2) while (true) {\n if (index in self) {\n memo = self[index];\n index += i;\n break;\n }\n index += i;\n if (IS_RIGHT ? index < 0 : length <= index) {\n throw TypeError('Reduce of empty array with no initial value');\n }\n }\n for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n memo = callbackfn(memo, self[index], index, O);\n }\n return memo;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.reduce` method\n // https://tc39.es/ecma262/#sec-array.prototype.reduce\n left: createMethod(false),\n // `Array.prototype.reduceRight` method\n // https://tc39.es/ecma262/#sec-array.prototype.reduceright\n right: createMethod(true)\n};\n\n\n/***/ }),\n\n/***/ 5417:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_30017__) {\n\nvar isObject = __nested_webpack_require_30017__(111);\nvar isArray = __nested_webpack_require_30017__(3157);\nvar wellKnownSymbol = __nested_webpack_require_30017__(5112);\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.es/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray, length) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n};\n\n\n/***/ }),\n\n/***/ 3411:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_30798__) {\n\nvar anObject = __nested_webpack_require_30798__(9670);\nvar iteratorClose = __nested_webpack_require_30798__(9212);\n\n// call something on iterator step with safe closing on error\nmodule.exports = function (iterator, fn, value, ENTRIES) {\n try {\n return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (error) {\n iteratorClose(iterator);\n throw error;\n }\n};\n\n\n/***/ }),\n\n/***/ 7072:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_31303__) {\n\nvar wellKnownSymbol = __nested_webpack_require_31303__(5112);\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line no-throw-literal -- required for testing\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n\n\n/***/ }),\n\n/***/ 4326:\n/***/ (function(module) {\n\nvar toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n\n\n/***/ }),\n\n/***/ 648:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_32503__) {\n\nvar TO_STRING_TAG_SUPPORT = __nested_webpack_require_32503__(1694);\nvar classofRaw = __nested_webpack_require_32503__(4326);\nvar wellKnownSymbol = __nested_webpack_require_32503__(5112);\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n};\n\n\n/***/ }),\n\n/***/ 9920:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_33565__) {\n\nvar has = __nested_webpack_require_33565__(6656);\nvar ownKeys = __nested_webpack_require_33565__(3887);\nvar getOwnPropertyDescriptorModule = __nested_webpack_require_33565__(1236);\nvar definePropertyModule = __nested_webpack_require_33565__(3070);\n\nmodule.exports = function (target, source) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n};\n\n\n/***/ }),\n\n/***/ 8544:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_34217__) {\n\nvar fails = __nested_webpack_require_34217__(7293);\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n\n\n/***/ }),\n\n/***/ 4994:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_34520__) {\n\n\"use strict\";\n\nvar IteratorPrototype = __nested_webpack_require_34520__(3383).IteratorPrototype;\nvar create = __nested_webpack_require_34520__(30);\nvar createPropertyDescriptor = __nested_webpack_require_34520__(9114);\nvar setToStringTag = __nested_webpack_require_34520__(8003);\nvar Iterators = __nested_webpack_require_34520__(7497);\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n Iterators[TO_STRING_TAG] = returnThis;\n return IteratorConstructor;\n};\n\n\n/***/ }),\n\n/***/ 8880:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_35290__) {\n\nvar DESCRIPTORS = __nested_webpack_require_35290__(9781);\nvar definePropertyModule = __nested_webpack_require_35290__(3070);\nvar createPropertyDescriptor = __nested_webpack_require_35290__(9114);\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n\n\n/***/ }),\n\n/***/ 9114:\n/***/ (function(module) {\n\nmodule.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n\n\n/***/ }),\n\n/***/ 6135:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_35996__) {\n\n\"use strict\";\n\nvar toPrimitive = __nested_webpack_require_35996__(7593);\nvar definePropertyModule = __nested_webpack_require_35996__(3070);\nvar createPropertyDescriptor = __nested_webpack_require_35996__(9114);\n\nmodule.exports = function (object, key, value) {\n var propertyKey = toPrimitive(key);\n if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));\n else object[propertyKey] = value;\n};\n\n\n/***/ }),\n\n/***/ 654:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_36503__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_36503__(2109);\nvar createIteratorConstructor = __nested_webpack_require_36503__(4994);\nvar getPrototypeOf = __nested_webpack_require_36503__(9518);\nvar setPrototypeOf = __nested_webpack_require_36503__(7674);\nvar setToStringTag = __nested_webpack_require_36503__(8003);\nvar createNonEnumerableProperty = __nested_webpack_require_36503__(8880);\nvar redefine = __nested_webpack_require_36503__(1320);\nvar wellKnownSymbol = __nested_webpack_require_36503__(5112);\nvar IS_PURE = __nested_webpack_require_36503__(1913);\nvar Iterators = __nested_webpack_require_36503__(7497);\nvar IteratorsCore = __nested_webpack_require_36503__(3383);\n\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n } return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n if (setPrototypeOf) {\n setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') {\n createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR, returnThis);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n }\n }\n\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return nativeIterator.call(this); };\n }\n\n // define iterator\n if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n createNonEnumerableProperty(IterablePrototype, ITERATOR, defaultIterator);\n }\n Iterators[NAME] = defaultIterator;\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n redefine(IterablePrototype, KEY, methods[KEY]);\n }\n } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n }\n\n return methods;\n};\n\n\n/***/ }),\n\n/***/ 9781:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_40475__) {\n\nvar fails = __nested_webpack_require_40475__(7293);\n\n// Detect IE8's incomplete defineProperty implementation\nmodule.exports = !fails(function () {\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n\n\n/***/ }),\n\n/***/ 317:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_40795__) {\n\nvar global = __nested_webpack_require_40795__(7854);\nvar isObject = __nested_webpack_require_40795__(111);\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n\n\n/***/ }),\n\n/***/ 8324:\n/***/ (function(module) {\n\n// iterable DOM collections\n// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\nmodule.exports = {\n CSSRuleList: 0,\n CSSStyleDeclaration: 0,\n CSSValueList: 0,\n ClientRectList: 0,\n DOMRectList: 0,\n DOMStringList: 0,\n DOMTokenList: 1,\n DataTransferItemList: 0,\n FileList: 0,\n HTMLAllCollection: 0,\n HTMLCollection: 0,\n HTMLFormElement: 0,\n HTMLSelectElement: 0,\n MediaList: 0,\n MimeTypeArray: 0,\n NamedNodeMap: 0,\n NodeList: 1,\n PaintRequestList: 0,\n Plugin: 0,\n PluginArray: 0,\n SVGLengthList: 0,\n SVGNumberList: 0,\n SVGPathSegList: 0,\n SVGPointList: 0,\n SVGStringList: 0,\n SVGTransformList: 0,\n SourceBufferList: 0,\n StyleSheetList: 0,\n TextTrackCueList: 0,\n TextTrackList: 0,\n TouchList: 0\n};\n\n\n/***/ }),\n\n/***/ 8113:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_42025__) {\n\nvar getBuiltIn = __nested_webpack_require_42025__(5005);\n\nmodule.exports = getBuiltIn('navigator', 'userAgent') || '';\n\n\n/***/ }),\n\n/***/ 7392:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_42230__) {\n\nvar global = __nested_webpack_require_42230__(7854);\nvar userAgent = __nested_webpack_require_42230__(8113);\n\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n version = match[0] + match[1];\n} else if (userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = match[1];\n }\n}\n\nmodule.exports = version && +version;\n\n\n/***/ }),\n\n/***/ 748:\n/***/ (function(module) {\n\n// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n\n\n/***/ }),\n\n/***/ 2109:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_43065__) {\n\nvar global = __nested_webpack_require_43065__(7854);\nvar getOwnPropertyDescriptor = __nested_webpack_require_43065__(1236).f;\nvar createNonEnumerableProperty = __nested_webpack_require_43065__(8880);\nvar redefine = __nested_webpack_require_43065__(1320);\nvar setGlobal = __nested_webpack_require_43065__(3505);\nvar copyConstructorProperties = __nested_webpack_require_43065__(9920);\nvar isForced = __nested_webpack_require_43065__(4705);\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.noTargetGet - prevent calling a getter on target\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || setGlobal(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.noTargetGet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty === typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n // extend global\n redefine(target, key, sourceProperty, options);\n }\n};\n\n\n/***/ }),\n\n/***/ 7293:\n/***/ (function(module) {\n\nmodule.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n\n\n/***/ }),\n\n/***/ 7007:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_45726__) {\n\n\"use strict\";\n\n// TODO: Remove from `core-js@4` since it's moved to entry points\n__nested_webpack_require_45726__(4916);\nvar redefine = __nested_webpack_require_45726__(1320);\nvar fails = __nested_webpack_require_45726__(7293);\nvar wellKnownSymbol = __nested_webpack_require_45726__(5112);\nvar regexpExec = __nested_webpack_require_45726__(2261);\nvar createNonEnumerableProperty = __nested_webpack_require_45726__(8880);\n\nvar SPECIES = wellKnownSymbol('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$
    ') !== '7';\n});\n\n// IE <= 11 replaces $0 with the whole match, as if it was $&\n// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\nvar REPLACE_KEEPS_$0 = (function () {\n return 'a'.replace(/./, '$0') === '$0';\n})();\n\nvar REPLACE = wellKnownSymbol('replace');\n// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\nvar REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\n if (/./[REPLACE]) {\n return /./[REPLACE]('a', '$0') === '';\n }\n return false;\n})();\n\n// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n// Weex JS has frozen built-in prototypes, so use try / catch wrapper\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n // eslint-disable-next-line regexp/no-empty-group -- required for testing\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n});\n\nmodule.exports = function (KEY, length, exec, sham) {\n var SYMBOL = wellKnownSymbol(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n\n if (KEY === 'split') {\n // We can't use real regex here since it causes deoptimization\n // and serious performance degradation in V8\n // https://github.com/zloirock/core-js/issues/306\n re = {};\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n re.flags = '';\n re[SYMBOL] = /./[SYMBOL];\n }\n\n re.exec = function () { execCalled = true; return null; };\n\n re[SYMBOL]('');\n return !execCalled;\n });\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !(\n REPLACE_SUPPORTS_NAMED_GROUPS &&\n REPLACE_KEEPS_$0 &&\n !REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n )) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }, {\n REPLACE_KEEPS_$0: REPLACE_KEEPS_$0,\n REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n });\n var stringMethod = methods[0];\n var regexMethod = methods[1];\n\n redefine(String.prototype, KEY, stringMethod);\n redefine(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return regexMethod.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return regexMethod.call(string, this); }\n );\n }\n\n if (sham) createNonEnumerableProperty(RegExp.prototype[SYMBOL], 'sham', true);\n};\n\n\n/***/ }),\n\n/***/ 9974:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_50488__) {\n\nvar aFunction = __nested_webpack_require_50488__(3099);\n\n// optional / simple context binding\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 0: return function () {\n return fn.call(that);\n };\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n\n\n/***/ }),\n\n/***/ 5005:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_51177__) {\n\nvar path = __nested_webpack_require_51177__(857);\nvar global = __nested_webpack_require_51177__(7854);\n\nvar aFunction = function (variable) {\n return typeof variable == 'function' ? variable : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace])\n : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method];\n};\n\n\n/***/ }),\n\n/***/ 1246:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_51701__) {\n\nvar classof = __nested_webpack_require_51701__(648);\nvar Iterators = __nested_webpack_require_51701__(7497);\nvar wellKnownSymbol = __nested_webpack_require_51701__(5112);\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n\n\n/***/ }),\n\n/***/ 8554:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_52112__) {\n\nvar anObject = __nested_webpack_require_52112__(9670);\nvar getIteratorMethod = __nested_webpack_require_52112__(1246);\n\nmodule.exports = function (it) {\n var iteratorMethod = getIteratorMethod(it);\n if (typeof iteratorMethod != 'function') {\n throw TypeError(String(it) + ' is not iterable');\n } return anObject(iteratorMethod.call(it));\n};\n\n\n/***/ }),\n\n/***/ 647:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_52531__) {\n\nvar toObject = __nested_webpack_require_52531__(7908);\n\nvar floor = Math.floor;\nvar replace = ''.replace;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d\\d?)/g;\n\n// https://tc39.es/ecma262/#sec-getsubstitution\nmodule.exports = function (matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return replace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n};\n\n\n/***/ }),\n\n/***/ 7854:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_53970__) {\n\nvar check = function (it) {\n return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n /* global globalThis -- safe */\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n check(typeof self == 'object' && self) ||\n check(typeof __nested_webpack_require_53970__.g == 'object' && __nested_webpack_require_53970__.g) ||\n // eslint-disable-next-line no-new-func -- fallback\n (function () { return this; })() || Function('return this')();\n\n\n/***/ }),\n\n/***/ 6656:\n/***/ (function(module) {\n\nvar hasOwnProperty = {}.hasOwnProperty;\n\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n\n\n/***/ }),\n\n/***/ 3501:\n/***/ (function(module) {\n\nmodule.exports = {};\n\n\n/***/ }),\n\n/***/ 490:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_54852__) {\n\nvar getBuiltIn = __nested_webpack_require_54852__(5005);\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n\n\n/***/ }),\n\n/***/ 4664:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_55056__) {\n\nvar DESCRIPTORS = __nested_webpack_require_55056__(9781);\nvar fails = __nested_webpack_require_55056__(7293);\nvar createElement = __nested_webpack_require_55056__(317);\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n\n\n/***/ }),\n\n/***/ 1179:\n/***/ (function(module) {\n\n// IEEE754 conversions based on https://github.com/feross/ieee754\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\n\nvar pack = function (number, mantissaLength, bytes) {\n var buffer = new Array(bytes);\n var exponentLength = bytes * 8 - mantissaLength - 1;\n var eMax = (1 << exponentLength) - 1;\n var eBias = eMax >> 1;\n var rt = mantissaLength === 23 ? pow(2, -24) - pow(2, -77) : 0;\n var sign = number < 0 || number === 0 && 1 / number < 0 ? 1 : 0;\n var index = 0;\n var exponent, mantissa, c;\n number = abs(number);\n // eslint-disable-next-line no-self-compare -- NaN check\n if (number != number || number === Infinity) {\n // eslint-disable-next-line no-self-compare -- NaN check\n mantissa = number != number ? 1 : 0;\n exponent = eMax;\n } else {\n exponent = floor(log(number) / LN2);\n if (number * (c = pow(2, -exponent)) < 1) {\n exponent--;\n c *= 2;\n }\n if (exponent + eBias >= 1) {\n number += rt / c;\n } else {\n number += rt * pow(2, 1 - eBias);\n }\n if (number * c >= 2) {\n exponent++;\n c /= 2;\n }\n if (exponent + eBias >= eMax) {\n mantissa = 0;\n exponent = eMax;\n } else if (exponent + eBias >= 1) {\n mantissa = (number * c - 1) * pow(2, mantissaLength);\n exponent = exponent + eBias;\n } else {\n mantissa = number * pow(2, eBias - 1) * pow(2, mantissaLength);\n exponent = 0;\n }\n }\n for (; mantissaLength >= 8; buffer[index++] = mantissa & 255, mantissa /= 256, mantissaLength -= 8);\n exponent = exponent << mantissaLength | mantissa;\n exponentLength += mantissaLength;\n for (; exponentLength > 0; buffer[index++] = exponent & 255, exponent /= 256, exponentLength -= 8);\n buffer[--index] |= sign * 128;\n return buffer;\n};\n\nvar unpack = function (buffer, mantissaLength) {\n var bytes = buffer.length;\n var exponentLength = bytes * 8 - mantissaLength - 1;\n var eMax = (1 << exponentLength) - 1;\n var eBias = eMax >> 1;\n var nBits = exponentLength - 7;\n var index = bytes - 1;\n var sign = buffer[index--];\n var exponent = sign & 127;\n var mantissa;\n sign >>= 7;\n for (; nBits > 0; exponent = exponent * 256 + buffer[index], index--, nBits -= 8);\n mantissa = exponent & (1 << -nBits) - 1;\n exponent >>= -nBits;\n nBits += mantissaLength;\n for (; nBits > 0; mantissa = mantissa * 256 + buffer[index], index--, nBits -= 8);\n if (exponent === 0) {\n exponent = 1 - eBias;\n } else if (exponent === eMax) {\n return mantissa ? NaN : sign ? -Infinity : Infinity;\n } else {\n mantissa = mantissa + pow(2, mantissaLength);\n exponent = exponent - eBias;\n } return (sign ? -1 : 1) * mantissa * pow(2, exponent - mantissaLength);\n};\n\nmodule.exports = {\n pack: pack,\n unpack: unpack\n};\n\n\n/***/ }),\n\n/***/ 8361:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_58329__) {\n\nvar fails = __nested_webpack_require_58329__(7293);\nvar classof = __nested_webpack_require_58329__(4326);\n\nvar split = ''.split;\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins -- safe\n return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split.call(it, '') : Object(it);\n} : Object;\n\n\n/***/ }),\n\n/***/ 9587:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_58925__) {\n\nvar isObject = __nested_webpack_require_58925__(111);\nvar setPrototypeOf = __nested_webpack_require_58925__(7674);\n\n// makes subclassing work correct for wrapped built-ins\nmodule.exports = function ($this, dummy, Wrapper) {\n var NewTarget, NewTargetPrototype;\n if (\n // it can work only with native `setPrototypeOf`\n setPrototypeOf &&\n // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n typeof (NewTarget = dummy.constructor) == 'function' &&\n NewTarget !== Wrapper &&\n isObject(NewTargetPrototype = NewTarget.prototype) &&\n NewTargetPrototype !== Wrapper.prototype\n ) setPrototypeOf($this, NewTargetPrototype);\n return $this;\n};\n\n\n/***/ }),\n\n/***/ 2788:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_59686__) {\n\nvar store = __nested_webpack_require_59686__(5465);\n\nvar functionToString = Function.toString;\n\n// this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper\nif (typeof store.inspectSource != 'function') {\n store.inspectSource = function (it) {\n return functionToString.call(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n\n\n/***/ }),\n\n/***/ 9909:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_60112__) {\n\nvar NATIVE_WEAK_MAP = __nested_webpack_require_60112__(8536);\nvar global = __nested_webpack_require_60112__(7854);\nvar isObject = __nested_webpack_require_60112__(111);\nvar createNonEnumerableProperty = __nested_webpack_require_60112__(8880);\nvar objectHas = __nested_webpack_require_60112__(6656);\nvar shared = __nested_webpack_require_60112__(5465);\nvar sharedKey = __nested_webpack_require_60112__(6200);\nvar hiddenKeys = __nested_webpack_require_60112__(3501);\n\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP) {\n var store = shared.state || (shared.state = new WeakMap());\n var wmget = store.get;\n var wmhas = store.has;\n var wmset = store.set;\n set = function (it, metadata) {\n metadata.facade = it;\n wmset.call(store, it, metadata);\n return metadata;\n };\n get = function (it) {\n return wmget.call(store, it) || {};\n };\n has = function (it) {\n return wmhas.call(store, it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return objectHas(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return objectHas(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n\n\n/***/ }),\n\n/***/ 7659:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_61804__) {\n\nvar wellKnownSymbol = __nested_webpack_require_61804__(5112);\nvar Iterators = __nested_webpack_require_61804__(7497);\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n\n\n/***/ }),\n\n/***/ 3157:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_62240__) {\n\nvar classof = __nested_webpack_require_62240__(4326);\n\n// `IsArray` abstract operation\n// https://tc39.es/ecma262/#sec-isarray\nmodule.exports = Array.isArray || function isArray(arg) {\n return classof(arg) == 'Array';\n};\n\n\n/***/ }),\n\n/***/ 4705:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_62548__) {\n\nvar fails = __nested_webpack_require_62548__(7293);\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : typeof detection == 'function' ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n\n\n/***/ }),\n\n/***/ 111:\n/***/ (function(module) {\n\nmodule.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n\n\n/***/ }),\n\n/***/ 1913:\n/***/ (function(module) {\n\nmodule.exports = false;\n\n\n/***/ }),\n\n/***/ 7850:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_63453__) {\n\nvar isObject = __nested_webpack_require_63453__(111);\nvar classof = __nested_webpack_require_63453__(4326);\nvar wellKnownSymbol = __nested_webpack_require_63453__(5112);\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.es/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');\n};\n\n\n/***/ }),\n\n/***/ 9212:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_63953__) {\n\nvar anObject = __nested_webpack_require_63953__(9670);\n\nmodule.exports = function (iterator) {\n var returnMethod = iterator['return'];\n if (returnMethod !== undefined) {\n return anObject(returnMethod.call(iterator)).value;\n }\n};\n\n\n/***/ }),\n\n/***/ 3383:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_64274__) {\n\n\"use strict\";\n\nvar fails = __nested_webpack_require_64274__(7293);\nvar getPrototypeOf = __nested_webpack_require_64274__(9518);\nvar createNonEnumerableProperty = __nested_webpack_require_64274__(8880);\nvar has = __nested_webpack_require_64274__(6656);\nvar wellKnownSymbol = __nested_webpack_require_64274__(5112);\nvar IS_PURE = __nested_webpack_require_64274__(1913);\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\nvar returnThis = function () { return this; };\n\n// `%IteratorPrototype%` object\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nvar NEW_ITERATOR_PROTOTYPE = IteratorPrototype == undefined || fails(function () {\n var test = {};\n // FF44- legacy iterators case\n return IteratorPrototype[ITERATOR].call(test) !== test;\n});\n\nif (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nif ((!IS_PURE || NEW_ITERATOR_PROTOTYPE) && !has(IteratorPrototype, ITERATOR)) {\n createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis);\n}\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n\n\n/***/ }),\n\n/***/ 7497:\n/***/ (function(module) {\n\nmodule.exports = {};\n\n\n/***/ }),\n\n/***/ 133:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_65970__) {\n\nvar fails = __nested_webpack_require_65970__(7293);\n\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n // Chrome 38 Symbol has incorrect toString conversion\n /* global Symbol -- required for testing */\n return !String(Symbol());\n});\n\n\n/***/ }),\n\n/***/ 590:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_66314__) {\n\nvar fails = __nested_webpack_require_66314__(7293);\nvar wellKnownSymbol = __nested_webpack_require_66314__(5112);\nvar IS_PURE = __nested_webpack_require_66314__(1913);\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = !fails(function () {\n var url = new URL('b?a=1&b=2&c=3', 'http://a');\n var searchParams = url.searchParams;\n var result = '';\n url.pathname = 'c%20d';\n searchParams.forEach(function (value, key) {\n searchParams['delete']('b');\n result += key + value;\n });\n return (IS_PURE && !url.toJSON)\n || !searchParams.sort\n || url.href !== 'http://a/c%20d?a=1&c=3'\n || searchParams.get('c') !== '3'\n || String(new URLSearchParams('?a=1')) !== 'a=1'\n || !searchParams[ITERATOR]\n // throws in Edge\n || new URL('https://a@b').username !== 'a'\n || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n // not punycoded in Edge\n || new URL('http://тест').host !== 'xn--e1aybc'\n // not escaped in Chrome 62-\n || new URL('http://a#б').hash !== '#%D0%B1'\n // fails in Chrome 66-\n || result !== 'a1c3'\n // throws in Safari\n || new URL('http://x', undefined).host !== 'x';\n});\n\n\n/***/ }),\n\n/***/ 8536:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_67534__) {\n\nvar global = __nested_webpack_require_67534__(7854);\nvar inspectSource = __nested_webpack_require_67534__(2788);\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = typeof WeakMap === 'function' && /native code/.test(inspectSource(WeakMap));\n\n\n/***/ }),\n\n/***/ 1574:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_67846__) {\n\n\"use strict\";\n\nvar DESCRIPTORS = __nested_webpack_require_67846__(9781);\nvar fails = __nested_webpack_require_67846__(7293);\nvar objectKeys = __nested_webpack_require_67846__(1956);\nvar getOwnPropertySymbolsModule = __nested_webpack_require_67846__(5181);\nvar propertyIsEnumerableModule = __nested_webpack_require_67846__(5296);\nvar toObject = __nested_webpack_require_67846__(7908);\nvar IndexedObject = __nested_webpack_require_67846__(8361);\n\nvar nativeAssign = Object.assign;\nvar defineProperty = Object.defineProperty;\n\n// `Object.assign` method\n// https://tc39.es/ecma262/#sec-object.assign\nmodule.exports = !nativeAssign || fails(function () {\n // should have correct order of operations (Edge bug)\n if (DESCRIPTORS && nativeAssign({ b: 1 }, nativeAssign(defineProperty({}, 'a', {\n enumerable: true,\n get: function () {\n defineProperty(this, 'b', {\n value: 3,\n enumerable: false\n });\n }\n }), { b: 2 })).b !== 1) return true;\n // should work with symbols and should have deterministic property order (V8 bug)\n var A = {};\n var B = {};\n /* global Symbol -- required for testing */\n var symbol = Symbol();\n var alphabet = 'abcdefghijklmnopqrst';\n A[symbol] = 7;\n alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars -- required for `.length`\n var T = toObject(target);\n var argumentsLength = arguments.length;\n var index = 1;\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n var propertyIsEnumerable = propertyIsEnumerableModule.f;\n while (argumentsLength > index) {\n var S = IndexedObject(arguments[index++]);\n var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(S, key)) T[key] = S[key];\n }\n } return T;\n} : nativeAssign;\n\n\n/***/ }),\n\n/***/ 30:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_69941__) {\n\nvar anObject = __nested_webpack_require_69941__(9670);\nvar defineProperties = __nested_webpack_require_69941__(6048);\nvar enumBugKeys = __nested_webpack_require_69941__(748);\nvar hiddenKeys = __nested_webpack_require_69941__(3501);\nvar html = __nested_webpack_require_69941__(490);\nvar documentCreateElement = __nested_webpack_require_69941__(317);\nvar sharedKey = __nested_webpack_require_69941__(6200);\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n activeXDocument = null; // avoid memory leak\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n /* global ActiveXObject -- old IE */\n activeXDocument = document.domain && new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame();\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.es/ecma262/#sec-object.create\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : defineProperties(result, Properties);\n};\n\n\n/***/ }),\n\n/***/ 6048:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_72835__) {\n\nvar DESCRIPTORS = __nested_webpack_require_72835__(9781);\nvar definePropertyModule = __nested_webpack_require_72835__(3070);\nvar anObject = __nested_webpack_require_72835__(9670);\nvar objectKeys = __nested_webpack_require_72835__(1956);\n\n// `Object.defineProperties` method\n// https://tc39.es/ecma262/#sec-object.defineproperties\nmodule.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], Properties[key]);\n return O;\n};\n\n\n/***/ }),\n\n/***/ 3070:\n/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_73525__) {\n\nvar DESCRIPTORS = __nested_webpack_require_73525__(9781);\nvar IE8_DOM_DEFINE = __nested_webpack_require_73525__(4664);\nvar anObject = __nested_webpack_require_73525__(9670);\nvar toPrimitive = __nested_webpack_require_73525__(7593);\n\nvar nativeDefineProperty = Object.defineProperty;\n\n// `Object.defineProperty` method\n// https://tc39.es/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return nativeDefineProperty(O, P, Attributes);\n } catch (error) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n\n\n/***/ }),\n\n/***/ 1236:\n/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_74380__) {\n\nvar DESCRIPTORS = __nested_webpack_require_74380__(9781);\nvar propertyIsEnumerableModule = __nested_webpack_require_74380__(5296);\nvar createPropertyDescriptor = __nested_webpack_require_74380__(9114);\nvar toIndexedObject = __nested_webpack_require_74380__(5656);\nvar toPrimitive = __nested_webpack_require_74380__(7593);\nvar has = __nested_webpack_require_74380__(6656);\nvar IE8_DOM_DEFINE = __nested_webpack_require_74380__(4664);\n\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return nativeGetOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);\n};\n\n\n/***/ }),\n\n/***/ 8006:\n/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_75368__) {\n\nvar internalObjectKeys = __nested_webpack_require_75368__(6324);\nvar enumBugKeys = __nested_webpack_require_75368__(748);\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.es/ecma262/#sec-object.getownpropertynames\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n\n\n/***/ }),\n\n/***/ 5181:\n/***/ (function(__unused_webpack_module, exports) {\n\nexports.f = Object.getOwnPropertySymbols;\n\n\n/***/ }),\n\n/***/ 9518:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_75966__) {\n\nvar has = __nested_webpack_require_75966__(6656);\nvar toObject = __nested_webpack_require_75966__(7908);\nvar sharedKey = __nested_webpack_require_75966__(6200);\nvar CORRECT_PROTOTYPE_GETTER = __nested_webpack_require_75966__(8544);\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar ObjectPrototype = Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.getprototypeof\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectPrototype : null;\n};\n\n\n/***/ }),\n\n/***/ 6324:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_76729__) {\n\nvar has = __nested_webpack_require_76729__(6656);\nvar toIndexedObject = __nested_webpack_require_76729__(5656);\nvar indexOf = __nested_webpack_require_76729__(1318).indexOf;\nvar hiddenKeys = __nested_webpack_require_76729__(3501);\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~indexOf(result, key) || result.push(key);\n }\n return result;\n};\n\n\n/***/ }),\n\n/***/ 1956:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_77369__) {\n\nvar internalObjectKeys = __nested_webpack_require_77369__(6324);\nvar enumBugKeys = __nested_webpack_require_77369__(748);\n\n// `Object.keys` method\n// https://tc39.es/ecma262/#sec-object.keys\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n\n\n/***/ }),\n\n/***/ 5296:\n/***/ (function(__unused_webpack_module, exports) {\n\n\"use strict\";\n\nvar nativePropertyIsEnumerable = {}.propertyIsEnumerable;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : nativePropertyIsEnumerable;\n\n\n/***/ }),\n\n/***/ 7674:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_78394__) {\n\n/* eslint-disable no-proto -- safe */\nvar anObject = __nested_webpack_require_78394__(9670);\nvar aPossiblePrototype = __nested_webpack_require_78394__(6077);\n\n// `Object.setPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n setter.call(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n anObject(O);\n aPossiblePrototype(proto);\n if (CORRECT_SETTER) setter.call(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n\n\n/***/ }),\n\n/***/ 288:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_79325__) {\n\n\"use strict\";\n\nvar TO_STRING_TAG_SUPPORT = __nested_webpack_require_79325__(1694);\nvar classof = __nested_webpack_require_79325__(648);\n\n// `Object.prototype.toString` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.tostring\nmodule.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() {\n return '[object ' + classof(this) + ']';\n};\n\n\n/***/ }),\n\n/***/ 3887:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_79769__) {\n\nvar getBuiltIn = __nested_webpack_require_79769__(5005);\nvar getOwnPropertyNamesModule = __nested_webpack_require_79769__(8006);\nvar getOwnPropertySymbolsModule = __nested_webpack_require_79769__(5181);\nvar anObject = __nested_webpack_require_79769__(9670);\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n};\n\n\n/***/ }),\n\n/***/ 857:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_80406__) {\n\nvar global = __nested_webpack_require_80406__(7854);\n\nmodule.exports = global;\n\n\n/***/ }),\n\n/***/ 2248:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_80571__) {\n\nvar redefine = __nested_webpack_require_80571__(1320);\n\nmodule.exports = function (target, src, options) {\n for (var key in src) redefine(target, key, src[key], options);\n return target;\n};\n\n\n/***/ }),\n\n/***/ 1320:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_80849__) {\n\nvar global = __nested_webpack_require_80849__(7854);\nvar createNonEnumerableProperty = __nested_webpack_require_80849__(8880);\nvar has = __nested_webpack_require_80849__(6656);\nvar setGlobal = __nested_webpack_require_80849__(3505);\nvar inspectSource = __nested_webpack_require_80849__(2788);\nvar InternalStateModule = __nested_webpack_require_80849__(9909);\n\nvar getInternalState = InternalStateModule.get;\nvar enforceInternalState = InternalStateModule.enforce;\nvar TEMPLATE = String(String).split('String');\n\n(module.exports = function (O, key, value, options) {\n var unsafe = options ? !!options.unsafe : false;\n var simple = options ? !!options.enumerable : false;\n var noTargetGet = options ? !!options.noTargetGet : false;\n var state;\n if (typeof value == 'function') {\n if (typeof key == 'string' && !has(value, 'name')) {\n createNonEnumerableProperty(value, 'name', key);\n }\n state = enforceInternalState(value);\n if (!state.source) {\n state.source = TEMPLATE.join(typeof key == 'string' ? key : '');\n }\n }\n if (O === global) {\n if (simple) O[key] = value;\n else setGlobal(key, value);\n return;\n } else if (!unsafe) {\n delete O[key];\n } else if (!noTargetGet && O[key]) {\n simple = true;\n }\n if (simple) O[key] = value;\n else createNonEnumerableProperty(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n return typeof this == 'function' && getInternalState(this).source || inspectSource(this);\n});\n\n\n/***/ }),\n\n/***/ 7651:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_82466__) {\n\nvar classof = __nested_webpack_require_82466__(4326);\nvar regexpExec = __nested_webpack_require_82466__(2261);\n\n// `RegExpExec` abstract operation\n// https://tc39.es/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n\n if (classof(R) !== 'RegExp') {\n throw TypeError('RegExp#exec called on incompatible receiver');\n }\n\n return regexpExec.call(R, S);\n};\n\n\n\n/***/ }),\n\n/***/ 2261:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_83158__) {\n\n\"use strict\";\n\nvar regexpFlags = __nested_webpack_require_83158__(7066);\nvar stickyHelpers = __nested_webpack_require_83158__(2999);\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/;\n var re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n})();\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y || stickyHelpers.BROKEN_CARET;\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\n// eslint-disable-next-line regexp/no-assertion-capturing-group, regexp/no-empty-group -- required for testing\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n var sticky = UNSUPPORTED_Y && re.sticky;\n var flags = regexpFlags.call(re);\n var source = re.source;\n var charsAdded = 0;\n var strCopy = str;\n\n if (sticky) {\n flags = flags.replace('y', '');\n if (flags.indexOf('g') === -1) {\n flags += 'g';\n }\n\n strCopy = String(str).slice(re.lastIndex);\n // Support anchored sticky behavior.\n if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\\n')) {\n source = '(?: ' + source + ')';\n strCopy = ' ' + strCopy;\n charsAdded++;\n }\n // ^(? + rx + ) is needed, in combination with some str slicing, to\n // simulate the 'y' flag.\n reCopy = new RegExp('^(?:' + source + ')', flags);\n }\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n match = nativeExec.call(sticky ? reCopy : re, strCopy);\n\n if (sticky) {\n if (match) {\n match.input = match.input.slice(charsAdded);\n match[0] = match[0].slice(charsAdded);\n match.index = re.lastIndex;\n re.lastIndex += match[0].length;\n } else re.lastIndex = 0;\n } else if (UPDATES_LAST_INDEX_WRONG && match) {\n re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n\n\n/***/ }),\n\n/***/ 7066:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_86176__) {\n\n\"use strict\";\n\nvar anObject = __nested_webpack_require_86176__(9670);\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.dotAll) result += 's';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n\n\n/***/ }),\n\n/***/ 2999:\n/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_86753__) {\n\n\"use strict\";\n\n\nvar fails = __nested_webpack_require_86753__(7293);\n\n// babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError,\n// so we use an intermediate function.\nfunction RE(s, f) {\n return RegExp(s, f);\n}\n\nexports.UNSUPPORTED_Y = fails(function () {\n // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\n var re = RE('a', 'y');\n re.lastIndex = 2;\n return re.exec('abcd') != null;\n});\n\nexports.BROKEN_CARET = fails(function () {\n // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n var re = RE('^r', 'gy');\n re.lastIndex = 2;\n return re.exec('str') != null;\n});\n\n\n/***/ }),\n\n/***/ 4488:\n/***/ (function(module) {\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n\n\n/***/ }),\n\n/***/ 3505:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_87737__) {\n\nvar global = __nested_webpack_require_87737__(7854);\nvar createNonEnumerableProperty = __nested_webpack_require_87737__(8880);\n\nmodule.exports = function (key, value) {\n try {\n createNonEnumerableProperty(global, key, value);\n } catch (error) {\n global[key] = value;\n } return value;\n};\n\n\n/***/ }),\n\n/***/ 6340:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_88106__) {\n\n\"use strict\";\n\nvar getBuiltIn = __nested_webpack_require_88106__(5005);\nvar definePropertyModule = __nested_webpack_require_88106__(3070);\nvar wellKnownSymbol = __nested_webpack_require_88106__(5112);\nvar DESCRIPTORS = __nested_webpack_require_88106__(9781);\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n var defineProperty = definePropertyModule.f;\n\n if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {\n defineProperty(Constructor, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n }\n};\n\n\n/***/ }),\n\n/***/ 8003:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_88786__) {\n\nvar defineProperty = __nested_webpack_require_88786__(3070).f;\nvar has = __nested_webpack_require_88786__(6656);\nvar wellKnownSymbol = __nested_webpack_require_88786__(5112);\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (it, TAG, STATIC) {\n if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {\n defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n\n\n/***/ }),\n\n/***/ 6200:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_89271__) {\n\nvar shared = __nested_webpack_require_89271__(2309);\nvar uid = __nested_webpack_require_89271__(9711);\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n\n\n/***/ }),\n\n/***/ 5465:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_89559__) {\n\nvar global = __nested_webpack_require_89559__(7854);\nvar setGlobal = __nested_webpack_require_89559__(3505);\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || setGlobal(SHARED, {});\n\nmodule.exports = store;\n\n\n/***/ }),\n\n/***/ 2309:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_89855__) {\n\nvar IS_PURE = __nested_webpack_require_89855__(1913);\nvar store = __nested_webpack_require_89855__(5465);\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.9.0',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2021 Denis Pushkarev (zloirock.ru)'\n});\n\n\n/***/ }),\n\n/***/ 6707:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_90288__) {\n\nvar anObject = __nested_webpack_require_90288__(9670);\nvar aFunction = __nested_webpack_require_90288__(3099);\nvar wellKnownSymbol = __nested_webpack_require_90288__(5112);\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.es/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aFunction(S);\n};\n\n\n/***/ }),\n\n/***/ 8710:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_90863__) {\n\nvar toInteger = __nested_webpack_require_90863__(9958);\nvar requireObjectCoercible = __nested_webpack_require_90863__(4488);\n\n// `String.prototype.{ codePointAt, at }` methods implementation\nvar createMethod = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = String(requireObjectCoercible($this));\n var position = toInteger(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = S.charCodeAt(position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING ? S.charAt(position) : first\n : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n};\n\nmodule.exports = {\n // `String.prototype.codePointAt` method\n // https://tc39.es/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod(true)\n};\n\n\n/***/ }),\n\n/***/ 3197:\n/***/ (function(module) {\n\n\"use strict\";\n\n// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\nvar maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\nvar base = 36;\nvar tMin = 1;\nvar tMax = 26;\nvar skew = 38;\nvar damp = 700;\nvar initialBias = 72;\nvar initialN = 128; // 0x80\nvar delimiter = '-'; // '\\x2D'\nvar regexNonASCII = /[^\\0-\\u007E]/; // non-ASCII chars\nvar regexSeparators = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\nvar OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';\nvar baseMinusTMin = base - tMin;\nvar floor = Math.floor;\nvar stringFromCharCode = String.fromCharCode;\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n */\nvar ucs2decode = function (string) {\n var output = [];\n var counter = 0;\n var length = string.length;\n while (counter < length) {\n var value = string.charCodeAt(counter++);\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n // It's a high surrogate, and there is a next character.\n var extra = string.charCodeAt(counter++);\n if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n */\nvar digitToBasic = function (digit) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n */\nvar adapt = function (delta, numPoints, firstTime) {\n var k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n for (; delta > baseMinusTMin * tMax >> 1; k += base) {\n delta = floor(delta / baseMinusTMin);\n }\n return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n */\n// eslint-disable-next-line max-statements -- TODO\nvar encode = function (input) {\n var output = [];\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n input = ucs2decode(input);\n\n // Cache the length.\n var inputLength = input.length;\n\n // Initialize the state.\n var n = initialN;\n var delta = 0;\n var bias = initialBias;\n var i, currentValue;\n\n // Handle the basic code points.\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue));\n }\n }\n\n var basicLength = output.length; // number of basic code points.\n var handledCPCount = basicLength; // number of code points that have been handled;\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n output.push(delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next larger one:\n var m = maxInt;\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's state to , but guard against overflow.\n var handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n throw RangeError(OVERFLOW_ERROR);\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < n && ++delta > maxInt) {\n throw RangeError(OVERFLOW_ERROR);\n }\n if (currentValue == n) {\n // Represent delta as a generalized variable-length integer.\n var q = delta;\n for (var k = base; /* no condition */; k += base) {\n var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n if (q < t) break;\n var qMinusT = q - t;\n var baseMinusT = base - t;\n output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT)));\n q = floor(qMinusT / baseMinusT);\n }\n\n output.push(stringFromCharCode(digitToBasic(q)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n delta = 0;\n ++handledCPCount;\n }\n }\n\n ++delta;\n ++n;\n }\n return output.join('');\n};\n\nmodule.exports = function (input) {\n var encoded = [];\n var labels = input.toLowerCase().replace(regexSeparators, '\\u002E').split('.');\n var i, label;\n for (i = 0; i < labels.length; i++) {\n label = labels[i];\n encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label);\n }\n return encoded.join('.');\n};\n\n\n/***/ }),\n\n/***/ 6091:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_97360__) {\n\nvar fails = __nested_webpack_require_97360__(7293);\nvar whitespaces = __nested_webpack_require_97360__(1361);\n\nvar non = '\\u200B\\u0085\\u180E';\n\n// check that a method works with the correct list\n// of whitespaces and has a correct name\nmodule.exports = function (METHOD_NAME) {\n return fails(function () {\n return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME;\n });\n};\n\n\n/***/ }),\n\n/***/ 3111:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_97868__) {\n\nvar requireObjectCoercible = __nested_webpack_require_97868__(4488);\nvar whitespaces = __nested_webpack_require_97868__(1361);\n\nvar whitespace = '[' + whitespaces + ']';\nvar ltrim = RegExp('^' + whitespace + whitespace + '*');\nvar rtrim = RegExp(whitespace + whitespace + '*$');\n\n// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\nvar createMethod = function (TYPE) {\n return function ($this) {\n var string = String(requireObjectCoercible($this));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n };\n};\n\nmodule.exports = {\n // `String.prototype.{ trimLeft, trimStart }` methods\n // https://tc39.es/ecma262/#sec-string.prototype.trimstart\n start: createMethod(1),\n // `String.prototype.{ trimRight, trimEnd }` methods\n // https://tc39.es/ecma262/#sec-string.prototype.trimend\n end: createMethod(2),\n // `String.prototype.trim` method\n // https://tc39.es/ecma262/#sec-string.prototype.trim\n trim: createMethod(3)\n};\n\n\n/***/ }),\n\n/***/ 1400:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_98992__) {\n\nvar toInteger = __nested_webpack_require_98992__(9958);\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toInteger(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n\n\n/***/ }),\n\n/***/ 7067:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_99521__) {\n\nvar toInteger = __nested_webpack_require_99521__(9958);\nvar toLength = __nested_webpack_require_99521__(7466);\n\n// `ToIndex` abstract operation\n// https://tc39.es/ecma262/#sec-toindex\nmodule.exports = function (it) {\n if (it === undefined) return 0;\n var number = toInteger(it);\n var length = toLength(number);\n if (number !== length) throw RangeError('Wrong length or index');\n return length;\n};\n\n\n/***/ }),\n\n/***/ 5656:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_99996__) {\n\n// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = __nested_webpack_require_99996__(8361);\nvar requireObjectCoercible = __nested_webpack_require_99996__(4488);\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n\n\n/***/ }),\n\n/***/ 9958:\n/***/ (function(module) {\n\nvar ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `ToInteger` abstract operation\n// https://tc39.es/ecma262/#sec-tointeger\nmodule.exports = function (argument) {\n return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n};\n\n\n/***/ }),\n\n/***/ 7466:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_100645__) {\n\nvar toInteger = __nested_webpack_require_100645__(9958);\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.es/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n\n\n/***/ }),\n\n/***/ 7908:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_101032__) {\n\nvar requireObjectCoercible = __nested_webpack_require_101032__(4488);\n\n// `ToObject` abstract operation\n// https://tc39.es/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return Object(requireObjectCoercible(argument));\n};\n\n\n/***/ }),\n\n/***/ 4590:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_101355__) {\n\nvar toPositiveInteger = __nested_webpack_require_101355__(3002);\n\nmodule.exports = function (it, BYTES) {\n var offset = toPositiveInteger(it);\n if (offset % BYTES) throw RangeError('Wrong offset');\n return offset;\n};\n\n\n/***/ }),\n\n/***/ 3002:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_101660__) {\n\nvar toInteger = __nested_webpack_require_101660__(9958);\n\nmodule.exports = function (it) {\n var result = toInteger(it);\n if (result < 0) throw RangeError(\"The argument can't be less than 0\");\n return result;\n};\n\n\n/***/ }),\n\n/***/ 7593:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_101959__) {\n\nvar isObject = __nested_webpack_require_101959__(111);\n\n// `ToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-toprimitive\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (input, PREFERRED_STRING) {\n if (!isObject(input)) return input;\n var fn, val;\n if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\n if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n\n\n/***/ }),\n\n/***/ 1694:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_102821__) {\n\nvar wellKnownSymbol = __nested_webpack_require_102821__(5112);\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n\n\n/***/ }),\n\n/***/ 9843:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_103114__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_103114__(2109);\nvar global = __nested_webpack_require_103114__(7854);\nvar DESCRIPTORS = __nested_webpack_require_103114__(9781);\nvar TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS = __nested_webpack_require_103114__(3832);\nvar ArrayBufferViewCore = __nested_webpack_require_103114__(260);\nvar ArrayBufferModule = __nested_webpack_require_103114__(3331);\nvar anInstance = __nested_webpack_require_103114__(5787);\nvar createPropertyDescriptor = __nested_webpack_require_103114__(9114);\nvar createNonEnumerableProperty = __nested_webpack_require_103114__(8880);\nvar toLength = __nested_webpack_require_103114__(7466);\nvar toIndex = __nested_webpack_require_103114__(7067);\nvar toOffset = __nested_webpack_require_103114__(4590);\nvar toPrimitive = __nested_webpack_require_103114__(7593);\nvar has = __nested_webpack_require_103114__(6656);\nvar classof = __nested_webpack_require_103114__(648);\nvar isObject = __nested_webpack_require_103114__(111);\nvar create = __nested_webpack_require_103114__(30);\nvar setPrototypeOf = __nested_webpack_require_103114__(7674);\nvar getOwnPropertyNames = __nested_webpack_require_103114__(8006).f;\nvar typedArrayFrom = __nested_webpack_require_103114__(7321);\nvar forEach = __nested_webpack_require_103114__(2092).forEach;\nvar setSpecies = __nested_webpack_require_103114__(6340);\nvar definePropertyModule = __nested_webpack_require_103114__(3070);\nvar getOwnPropertyDescriptorModule = __nested_webpack_require_103114__(1236);\nvar InternalStateModule = __nested_webpack_require_103114__(9909);\nvar inheritIfRequired = __nested_webpack_require_103114__(9587);\n\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar nativeDefineProperty = definePropertyModule.f;\nvar nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\nvar round = Math.round;\nvar RangeError = global.RangeError;\nvar ArrayBuffer = ArrayBufferModule.ArrayBuffer;\nvar DataView = ArrayBufferModule.DataView;\nvar NATIVE_ARRAY_BUFFER_VIEWS = ArrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS;\nvar TYPED_ARRAY_TAG = ArrayBufferViewCore.TYPED_ARRAY_TAG;\nvar TypedArray = ArrayBufferViewCore.TypedArray;\nvar TypedArrayPrototype = ArrayBufferViewCore.TypedArrayPrototype;\nvar aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;\nvar isTypedArray = ArrayBufferViewCore.isTypedArray;\nvar BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\nvar WRONG_LENGTH = 'Wrong length';\n\nvar fromList = function (C, list) {\n var index = 0;\n var length = list.length;\n var result = new (aTypedArrayConstructor(C))(length);\n while (length > index) result[index] = list[index++];\n return result;\n};\n\nvar addGetter = function (it, key) {\n nativeDefineProperty(it, key, { get: function () {\n return getInternalState(this)[key];\n } });\n};\n\nvar isArrayBuffer = function (it) {\n var klass;\n return it instanceof ArrayBuffer || (klass = classof(it)) == 'ArrayBuffer' || klass == 'SharedArrayBuffer';\n};\n\nvar isTypedArrayIndex = function (target, key) {\n return isTypedArray(target)\n && typeof key != 'symbol'\n && key in target\n && String(+key) == String(key);\n};\n\nvar wrappedGetOwnPropertyDescriptor = function getOwnPropertyDescriptor(target, key) {\n return isTypedArrayIndex(target, key = toPrimitive(key, true))\n ? createPropertyDescriptor(2, target[key])\n : nativeGetOwnPropertyDescriptor(target, key);\n};\n\nvar wrappedDefineProperty = function defineProperty(target, key, descriptor) {\n if (isTypedArrayIndex(target, key = toPrimitive(key, true))\n && isObject(descriptor)\n && has(descriptor, 'value')\n && !has(descriptor, 'get')\n && !has(descriptor, 'set')\n // TODO: add validation descriptor w/o calling accessors\n && !descriptor.configurable\n && (!has(descriptor, 'writable') || descriptor.writable)\n && (!has(descriptor, 'enumerable') || descriptor.enumerable)\n ) {\n target[key] = descriptor.value;\n return target;\n } return nativeDefineProperty(target, key, descriptor);\n};\n\nif (DESCRIPTORS) {\n if (!NATIVE_ARRAY_BUFFER_VIEWS) {\n getOwnPropertyDescriptorModule.f = wrappedGetOwnPropertyDescriptor;\n definePropertyModule.f = wrappedDefineProperty;\n addGetter(TypedArrayPrototype, 'buffer');\n addGetter(TypedArrayPrototype, 'byteOffset');\n addGetter(TypedArrayPrototype, 'byteLength');\n addGetter(TypedArrayPrototype, 'length');\n }\n\n $({ target: 'Object', stat: true, forced: !NATIVE_ARRAY_BUFFER_VIEWS }, {\n getOwnPropertyDescriptor: wrappedGetOwnPropertyDescriptor,\n defineProperty: wrappedDefineProperty\n });\n\n module.exports = function (TYPE, wrapper, CLAMPED) {\n var BYTES = TYPE.match(/\\d+$/)[0] / 8;\n var CONSTRUCTOR_NAME = TYPE + (CLAMPED ? 'Clamped' : '') + 'Array';\n var GETTER = 'get' + TYPE;\n var SETTER = 'set' + TYPE;\n var NativeTypedArrayConstructor = global[CONSTRUCTOR_NAME];\n var TypedArrayConstructor = NativeTypedArrayConstructor;\n var TypedArrayConstructorPrototype = TypedArrayConstructor && TypedArrayConstructor.prototype;\n var exported = {};\n\n var getter = function (that, index) {\n var data = getInternalState(that);\n return data.view[GETTER](index * BYTES + data.byteOffset, true);\n };\n\n var setter = function (that, index, value) {\n var data = getInternalState(that);\n if (CLAMPED) value = (value = round(value)) < 0 ? 0 : value > 0xFF ? 0xFF : value & 0xFF;\n data.view[SETTER](index * BYTES + data.byteOffset, value, true);\n };\n\n var addElement = function (that, index) {\n nativeDefineProperty(that, index, {\n get: function () {\n return getter(this, index);\n },\n set: function (value) {\n return setter(this, index, value);\n },\n enumerable: true\n });\n };\n\n if (!NATIVE_ARRAY_BUFFER_VIEWS) {\n TypedArrayConstructor = wrapper(function (that, data, offset, $length) {\n anInstance(that, TypedArrayConstructor, CONSTRUCTOR_NAME);\n var index = 0;\n var byteOffset = 0;\n var buffer, byteLength, length;\n if (!isObject(data)) {\n length = toIndex(data);\n byteLength = length * BYTES;\n buffer = new ArrayBuffer(byteLength);\n } else if (isArrayBuffer(data)) {\n buffer = data;\n byteOffset = toOffset(offset, BYTES);\n var $len = data.byteLength;\n if ($length === undefined) {\n if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n byteLength = $len - byteOffset;\n if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n } else {\n byteLength = toLength($length) * BYTES;\n if (byteLength + byteOffset > $len) throw RangeError(WRONG_LENGTH);\n }\n length = byteLength / BYTES;\n } else if (isTypedArray(data)) {\n return fromList(TypedArrayConstructor, data);\n } else {\n return typedArrayFrom.call(TypedArrayConstructor, data);\n }\n setInternalState(that, {\n buffer: buffer,\n byteOffset: byteOffset,\n byteLength: byteLength,\n length: length,\n view: new DataView(buffer)\n });\n while (index < length) addElement(that, index++);\n });\n\n if (setPrototypeOf) setPrototypeOf(TypedArrayConstructor, TypedArray);\n TypedArrayConstructorPrototype = TypedArrayConstructor.prototype = create(TypedArrayPrototype);\n } else if (TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS) {\n TypedArrayConstructor = wrapper(function (dummy, data, typedArrayOffset, $length) {\n anInstance(dummy, TypedArrayConstructor, CONSTRUCTOR_NAME);\n return inheritIfRequired(function () {\n if (!isObject(data)) return new NativeTypedArrayConstructor(toIndex(data));\n if (isArrayBuffer(data)) return $length !== undefined\n ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES), $length)\n : typedArrayOffset !== undefined\n ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES))\n : new NativeTypedArrayConstructor(data);\n if (isTypedArray(data)) return fromList(TypedArrayConstructor, data);\n return typedArrayFrom.call(TypedArrayConstructor, data);\n }(), dummy, TypedArrayConstructor);\n });\n\n if (setPrototypeOf) setPrototypeOf(TypedArrayConstructor, TypedArray);\n forEach(getOwnPropertyNames(NativeTypedArrayConstructor), function (key) {\n if (!(key in TypedArrayConstructor)) {\n createNonEnumerableProperty(TypedArrayConstructor, key, NativeTypedArrayConstructor[key]);\n }\n });\n TypedArrayConstructor.prototype = TypedArrayConstructorPrototype;\n }\n\n if (TypedArrayConstructorPrototype.constructor !== TypedArrayConstructor) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, 'constructor', TypedArrayConstructor);\n }\n\n if (TYPED_ARRAY_TAG) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, TYPED_ARRAY_TAG, CONSTRUCTOR_NAME);\n }\n\n exported[CONSTRUCTOR_NAME] = TypedArrayConstructor;\n\n $({\n global: true, forced: TypedArrayConstructor != NativeTypedArrayConstructor, sham: !NATIVE_ARRAY_BUFFER_VIEWS\n }, exported);\n\n if (!(BYTES_PER_ELEMENT in TypedArrayConstructor)) {\n createNonEnumerableProperty(TypedArrayConstructor, BYTES_PER_ELEMENT, BYTES);\n }\n\n if (!(BYTES_PER_ELEMENT in TypedArrayConstructorPrototype)) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, BYTES_PER_ELEMENT, BYTES);\n }\n\n setSpecies(CONSTRUCTOR_NAME);\n };\n} else module.exports = function () { /* empty */ };\n\n\n/***/ }),\n\n/***/ 3832:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_112503__) {\n\n/* eslint-disable no-new -- required for testing */\nvar global = __nested_webpack_require_112503__(7854);\nvar fails = __nested_webpack_require_112503__(7293);\nvar checkCorrectnessOfIteration = __nested_webpack_require_112503__(7072);\nvar NATIVE_ARRAY_BUFFER_VIEWS = __nested_webpack_require_112503__(260).NATIVE_ARRAY_BUFFER_VIEWS;\n\nvar ArrayBuffer = global.ArrayBuffer;\nvar Int8Array = global.Int8Array;\n\nmodule.exports = !NATIVE_ARRAY_BUFFER_VIEWS || !fails(function () {\n Int8Array(1);\n}) || !fails(function () {\n new Int8Array(-1);\n}) || !checkCorrectnessOfIteration(function (iterable) {\n new Int8Array();\n new Int8Array(null);\n new Int8Array(1.5);\n new Int8Array(iterable);\n}, true) || fails(function () {\n // Safari (11+) bug - a reason why even Safari 13 should load a typed array polyfill\n return new Int8Array(new ArrayBuffer(2), 1, undefined).length !== 1;\n});\n\n\n/***/ }),\n\n/***/ 3074:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_113426__) {\n\nvar aTypedArrayConstructor = __nested_webpack_require_113426__(260).aTypedArrayConstructor;\nvar speciesConstructor = __nested_webpack_require_113426__(6707);\n\nmodule.exports = function (instance, list) {\n var C = speciesConstructor(instance, instance.constructor);\n var index = 0;\n var length = list.length;\n var result = new (aTypedArrayConstructor(C))(length);\n while (length > index) result[index] = list[index++];\n return result;\n};\n\n\n/***/ }),\n\n/***/ 7321:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_113940__) {\n\nvar toObject = __nested_webpack_require_113940__(7908);\nvar toLength = __nested_webpack_require_113940__(7466);\nvar getIteratorMethod = __nested_webpack_require_113940__(1246);\nvar isArrayIteratorMethod = __nested_webpack_require_113940__(7659);\nvar bind = __nested_webpack_require_113940__(9974);\nvar aTypedArrayConstructor = __nested_webpack_require_113940__(260).aTypedArrayConstructor;\n\nmodule.exports = function from(source /* , mapfn, thisArg */) {\n var O = toObject(source);\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var i, length, result, step, iterator, next;\n if (iteratorMethod != undefined && !isArrayIteratorMethod(iteratorMethod)) {\n iterator = iteratorMethod.call(O);\n next = iterator.next;\n O = [];\n while (!(step = next.call(iterator)).done) {\n O.push(step.value);\n }\n }\n if (mapping && argumentsLength > 2) {\n mapfn = bind(mapfn, arguments[2], 2);\n }\n length = toLength(O.length);\n result = new (aTypedArrayConstructor(this))(length);\n for (i = 0; length > i; i++) {\n result[i] = mapping ? mapfn(O[i], i) : O[i];\n }\n return result;\n};\n\n\n/***/ }),\n\n/***/ 9711:\n/***/ (function(module) {\n\nvar id = 0;\nvar postfix = Math.random();\n\nmodule.exports = function (key) {\n return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\n};\n\n\n/***/ }),\n\n/***/ 3307:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_115419__) {\n\nvar NATIVE_SYMBOL = __nested_webpack_require_115419__(133);\n\nmodule.exports = NATIVE_SYMBOL\n /* global Symbol -- safe */\n && !Symbol.sham\n && typeof Symbol.iterator == 'symbol';\n\n\n/***/ }),\n\n/***/ 5112:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_115685__) {\n\nvar global = __nested_webpack_require_115685__(7854);\nvar shared = __nested_webpack_require_115685__(2309);\nvar has = __nested_webpack_require_115685__(6656);\nvar uid = __nested_webpack_require_115685__(9711);\nvar NATIVE_SYMBOL = __nested_webpack_require_115685__(133);\nvar USE_SYMBOL_AS_UID = __nested_webpack_require_115685__(3307);\n\nvar WellKnownSymbolsStore = shared('wks');\nvar Symbol = global.Symbol;\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!has(WellKnownSymbolsStore, name)) {\n if (NATIVE_SYMBOL && has(Symbol, name)) WellKnownSymbolsStore[name] = Symbol[name];\n else WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n\n\n/***/ }),\n\n/***/ 1361:\n/***/ (function(module) {\n\n// a string of all valid unicode whitespaces\nmodule.exports = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002' +\n '\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n\n\n/***/ }),\n\n/***/ 8264:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_116785__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_116785__(2109);\nvar global = __nested_webpack_require_116785__(7854);\nvar arrayBufferModule = __nested_webpack_require_116785__(3331);\nvar setSpecies = __nested_webpack_require_116785__(6340);\n\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar ArrayBuffer = arrayBufferModule[ARRAY_BUFFER];\nvar NativeArrayBuffer = global[ARRAY_BUFFER];\n\n// `ArrayBuffer` constructor\n// https://tc39.es/ecma262/#sec-arraybuffer-constructor\n$({ global: true, forced: NativeArrayBuffer !== ArrayBuffer }, {\n ArrayBuffer: ArrayBuffer\n});\n\nsetSpecies(ARRAY_BUFFER);\n\n\n/***/ }),\n\n/***/ 2222:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_117427__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_117427__(2109);\nvar fails = __nested_webpack_require_117427__(7293);\nvar isArray = __nested_webpack_require_117427__(3157);\nvar isObject = __nested_webpack_require_117427__(111);\nvar toObject = __nested_webpack_require_117427__(7908);\nvar toLength = __nested_webpack_require_117427__(7466);\nvar createProperty = __nested_webpack_require_117427__(6135);\nvar arraySpeciesCreate = __nested_webpack_require_117427__(5417);\nvar arrayMethodHasSpeciesSupport = __nested_webpack_require_117427__(1194);\nvar wellKnownSymbol = __nested_webpack_require_117427__(5112);\nvar V8_VERSION = __nested_webpack_require_117427__(7392);\n\nvar IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';\n\n// We can't use this feature detection in V8 since it causes\n// deoptimization and serious performance degradation\n// https://github.com/zloirock/core-js/issues/679\nvar IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails(function () {\n var array = [];\n array[IS_CONCAT_SPREADABLE] = false;\n return array.concat()[0] !== array;\n});\n\nvar SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');\n\nvar isConcatSpreadable = function (O) {\n if (!isObject(O)) return false;\n var spreadable = O[IS_CONCAT_SPREADABLE];\n return spreadable !== undefined ? !!spreadable : isArray(O);\n};\n\nvar FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;\n\n// `Array.prototype.concat` method\n// https://tc39.es/ecma262/#sec-array.prototype.concat\n// with adding support of @@isConcatSpreadable and @@species\n$({ target: 'Array', proto: true, forced: FORCED }, {\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n concat: function concat(arg) {\n var O = toObject(this);\n var A = arraySpeciesCreate(O, 0);\n var n = 0;\n var i, k, length, len, E;\n for (i = -1, length = arguments.length; i < length; i++) {\n E = i === -1 ? O : arguments[i];\n if (isConcatSpreadable(E)) {\n len = toLength(E.length);\n if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\n } else {\n if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n createProperty(A, n++, E);\n }\n }\n A.length = n;\n return A;\n }\n});\n\n\n/***/ }),\n\n/***/ 7327:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_119834__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_119834__(2109);\nvar $filter = __nested_webpack_require_119834__(2092).filter;\nvar arrayMethodHasSpeciesSupport = __nested_webpack_require_119834__(1194);\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('filter');\n\n// `Array.prototype.filter` method\n// https://tc39.es/ecma262/#sec-array.prototype.filter\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {\n filter: function filter(callbackfn /* , thisArg */) {\n return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n\n/***/ }),\n\n/***/ 2772:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_120523__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_120523__(2109);\nvar $indexOf = __nested_webpack_require_120523__(1318).indexOf;\nvar arrayMethodIsStrict = __nested_webpack_require_120523__(9341);\n\nvar nativeIndexOf = [].indexOf;\n\nvar NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;\nvar STRICT_METHOD = arrayMethodIsStrict('indexOf');\n\n// `Array.prototype.indexOf` method\n// https://tc39.es/ecma262/#sec-array.prototype.indexof\n$({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD }, {\n indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n return NEGATIVE_ZERO\n // convert -0 to +0\n ? nativeIndexOf.apply(this, arguments) || 0\n : $indexOf(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n\n/***/ }),\n\n/***/ 6992:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_121364__) {\n\n\"use strict\";\n\nvar toIndexedObject = __nested_webpack_require_121364__(5656);\nvar addToUnscopables = __nested_webpack_require_121364__(1223);\nvar Iterators = __nested_webpack_require_121364__(7497);\nvar InternalStateModule = __nested_webpack_require_121364__(9909);\nvar defineIterator = __nested_webpack_require_121364__(654);\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.es/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.es/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.es/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.es/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n var state = getInternalState(this);\n var target = state.target;\n var kind = state.kind;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = undefined;\n return { value: undefined, done: true };\n }\n if (kind == 'keys') return { value: index, done: false };\n if (kind == 'values') return { value: target[index], done: false };\n return { value: [index, target[index]], done: false };\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.es/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.es/ecma262/#sec-createmappedargumentsobject\nIterators.Arguments = Iterators.Array;\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n\n/***/ }),\n\n/***/ 1249:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_123565__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_123565__(2109);\nvar $map = __nested_webpack_require_123565__(2092).map;\nvar arrayMethodHasSpeciesSupport = __nested_webpack_require_123565__(1194);\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');\n\n// `Array.prototype.map` method\n// https://tc39.es/ecma262/#sec-array.prototype.map\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n\n/***/ }),\n\n/***/ 7042:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_124230__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_124230__(2109);\nvar isObject = __nested_webpack_require_124230__(111);\nvar isArray = __nested_webpack_require_124230__(3157);\nvar toAbsoluteIndex = __nested_webpack_require_124230__(1400);\nvar toLength = __nested_webpack_require_124230__(7466);\nvar toIndexedObject = __nested_webpack_require_124230__(5656);\nvar createProperty = __nested_webpack_require_124230__(6135);\nvar wellKnownSymbol = __nested_webpack_require_124230__(5112);\nvar arrayMethodHasSpeciesSupport = __nested_webpack_require_124230__(1194);\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');\n\nvar SPECIES = wellKnownSymbol('species');\nvar nativeSlice = [].slice;\nvar max = Math.max;\n\n// `Array.prototype.slice` method\n// https://tc39.es/ecma262/#sec-array.prototype.slice\n// fallback for not array-like ES3 strings and DOM objects\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {\n slice: function slice(start, end) {\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var k = toAbsoluteIndex(start, length);\n var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\n var Constructor, result, n;\n if (isArray(O)) {\n Constructor = O.constructor;\n // cross-realm fallback\n if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {\n Constructor = undefined;\n } else if (isObject(Constructor)) {\n Constructor = Constructor[SPECIES];\n if (Constructor === null) Constructor = undefined;\n }\n if (Constructor === Array || Constructor === undefined) {\n return nativeSlice.call(O, k, fin);\n }\n }\n result = new (Constructor === undefined ? Array : Constructor)(max(fin - k, 0));\n for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);\n result.length = n;\n return result;\n }\n});\n\n\n/***/ }),\n\n/***/ 561:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_126211__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_126211__(2109);\nvar toAbsoluteIndex = __nested_webpack_require_126211__(1400);\nvar toInteger = __nested_webpack_require_126211__(9958);\nvar toLength = __nested_webpack_require_126211__(7466);\nvar toObject = __nested_webpack_require_126211__(7908);\nvar arraySpeciesCreate = __nested_webpack_require_126211__(5417);\nvar createProperty = __nested_webpack_require_126211__(6135);\nvar arrayMethodHasSpeciesSupport = __nested_webpack_require_126211__(1194);\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('splice');\n\nvar max = Math.max;\nvar min = Math.min;\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';\n\n// `Array.prototype.splice` method\n// https://tc39.es/ecma262/#sec-array.prototype.splice\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {\n splice: function splice(start, deleteCount /* , ...items */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var actualStart = toAbsoluteIndex(start, len);\n var argumentsLength = arguments.length;\n var insertCount, actualDeleteCount, A, k, from, to;\n if (argumentsLength === 0) {\n insertCount = actualDeleteCount = 0;\n } else if (argumentsLength === 1) {\n insertCount = 0;\n actualDeleteCount = len - actualStart;\n } else {\n insertCount = argumentsLength - 2;\n actualDeleteCount = min(max(toInteger(deleteCount), 0), len - actualStart);\n }\n if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER) {\n throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);\n }\n A = arraySpeciesCreate(O, actualDeleteCount);\n for (k = 0; k < actualDeleteCount; k++) {\n from = actualStart + k;\n if (from in O) createProperty(A, k, O[from]);\n }\n A.length = actualDeleteCount;\n if (insertCount < actualDeleteCount) {\n for (k = actualStart; k < len - actualDeleteCount; k++) {\n from = k + actualDeleteCount;\n to = k + insertCount;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];\n } else if (insertCount > actualDeleteCount) {\n for (k = len - actualDeleteCount; k > actualStart; k--) {\n from = k + actualDeleteCount - 1;\n to = k + insertCount - 1;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n }\n for (k = 0; k < insertCount; k++) {\n O[k + actualStart] = arguments[k + 2];\n }\n O.length = len - actualDeleteCount + insertCount;\n return A;\n }\n});\n\n\n/***/ }),\n\n/***/ 8309:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_128857__) {\n\nvar DESCRIPTORS = __nested_webpack_require_128857__(9781);\nvar defineProperty = __nested_webpack_require_128857__(3070).f;\n\nvar FunctionPrototype = Function.prototype;\nvar FunctionPrototypeToString = FunctionPrototype.toString;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// Function instances `.name` property\n// https://tc39.es/ecma262/#sec-function-instances-name\nif (DESCRIPTORS && !(NAME in FunctionPrototype)) {\n defineProperty(FunctionPrototype, NAME, {\n configurable: true,\n get: function () {\n try {\n return FunctionPrototypeToString.call(this).match(nameRE)[1];\n } catch (error) {\n return '';\n }\n }\n });\n}\n\n\n/***/ }),\n\n/***/ 489:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_129614__) {\n\nvar $ = __nested_webpack_require_129614__(2109);\nvar fails = __nested_webpack_require_129614__(7293);\nvar toObject = __nested_webpack_require_129614__(7908);\nvar nativeGetPrototypeOf = __nested_webpack_require_129614__(9518);\nvar CORRECT_PROTOTYPE_GETTER = __nested_webpack_require_129614__(8544);\n\nvar FAILS_ON_PRIMITIVES = fails(function () { nativeGetPrototypeOf(1); });\n\n// `Object.getPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.getprototypeof\n$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !CORRECT_PROTOTYPE_GETTER }, {\n getPrototypeOf: function getPrototypeOf(it) {\n return nativeGetPrototypeOf(toObject(it));\n }\n});\n\n\n\n/***/ }),\n\n/***/ 1539:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_130327__) {\n\nvar TO_STRING_TAG_SUPPORT = __nested_webpack_require_130327__(1694);\nvar redefine = __nested_webpack_require_130327__(1320);\nvar toString = __nested_webpack_require_130327__(288);\n\n// `Object.prototype.toString` method\n// https://tc39.es/ecma262/#sec-object.prototype.tostring\nif (!TO_STRING_TAG_SUPPORT) {\n redefine(Object.prototype, 'toString', toString, { unsafe: true });\n}\n\n\n/***/ }),\n\n/***/ 4916:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_130780__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_130780__(2109);\nvar exec = __nested_webpack_require_130780__(2261);\n\n// `RegExp.prototype.exec` method\n// https://tc39.es/ecma262/#sec-regexp.prototype.exec\n$({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, {\n exec: exec\n});\n\n\n/***/ }),\n\n/***/ 9714:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_131156__) {\n\n\"use strict\";\n\nvar redefine = __nested_webpack_require_131156__(1320);\nvar anObject = __nested_webpack_require_131156__(9670);\nvar fails = __nested_webpack_require_131156__(7293);\nvar flags = __nested_webpack_require_131156__(7066);\n\nvar TO_STRING = 'toString';\nvar RegExpPrototype = RegExp.prototype;\nvar nativeToString = RegExpPrototype[TO_STRING];\n\nvar NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\n// FF44- RegExp#toString has a wrong name\nvar INCORRECT_NAME = nativeToString.name != TO_STRING;\n\n// `RegExp.prototype.toString` method\n// https://tc39.es/ecma262/#sec-regexp.prototype.tostring\nif (NOT_GENERIC || INCORRECT_NAME) {\n redefine(RegExp.prototype, TO_STRING, function toString() {\n var R = anObject(this);\n var p = String(R.source);\n var rf = R.flags;\n var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? flags.call(R) : rf);\n return '/' + p + '/' + f;\n }, { unsafe: true });\n}\n\n\n/***/ }),\n\n/***/ 8783:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_132221__) {\n\n\"use strict\";\n\nvar charAt = __nested_webpack_require_132221__(8710).charAt;\nvar InternalStateModule = __nested_webpack_require_132221__(9909);\nvar defineIterator = __nested_webpack_require_132221__(654);\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: String(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return { value: undefined, done: true };\n point = charAt(string, index);\n state.index += point.length;\n return { value: point, done: false };\n});\n\n\n/***/ }),\n\n/***/ 4723:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_133333__) {\n\n\"use strict\";\n\nvar fixRegExpWellKnownSymbolLogic = __nested_webpack_require_133333__(7007);\nvar anObject = __nested_webpack_require_133333__(9670);\nvar toLength = __nested_webpack_require_133333__(7466);\nvar requireObjectCoercible = __nested_webpack_require_133333__(4488);\nvar advanceStringIndex = __nested_webpack_require_133333__(1530);\nvar regExpExec = __nested_webpack_require_133333__(7651);\n\n// @@match logic\nfixRegExpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.es/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = requireObjectCoercible(this);\n var matcher = regexp == undefined ? undefined : regexp[MATCH];\n return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.es/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative(nativeMatch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n if (!rx.global) return regExpExec(rx, S);\n\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n\n\n/***/ }),\n\n/***/ 5306:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_134975__) {\n\n\"use strict\";\n\nvar fixRegExpWellKnownSymbolLogic = __nested_webpack_require_134975__(7007);\nvar anObject = __nested_webpack_require_134975__(9670);\nvar toLength = __nested_webpack_require_134975__(7466);\nvar toInteger = __nested_webpack_require_134975__(9958);\nvar requireObjectCoercible = __nested_webpack_require_134975__(4488);\nvar advanceStringIndex = __nested_webpack_require_134975__(1530);\nvar getSubstitution = __nested_webpack_require_134975__(647);\nvar regExpExec = __nested_webpack_require_134975__(7651);\n\nvar max = Math.max;\nvar min = Math.min;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\nfixRegExpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative, reason) {\n var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = reason.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE;\n var REPLACE_KEEPS_$0 = reason.REPLACE_KEEPS_$0;\n var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n return [\n // `String.prototype.replace` method\n // https://tc39.es/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n return replacer !== undefined\n ? replacer.call(searchValue, O, replaceValue)\n : nativeReplace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.es/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n if (\n (!REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE && REPLACE_KEEPS_$0) ||\n (typeof replaceValue === 'string' && replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1)\n ) {\n var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n if (res.done) return res.value;\n }\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regExpExec(rx, S);\n if (result === null) break;\n\n results.push(result);\n if (!global) break;\n\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n var matched = String(result[0]);\n var position = max(min(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n});\n\n\n/***/ }),\n\n/***/ 3123:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_139010__) {\n\n\"use strict\";\n\nvar fixRegExpWellKnownSymbolLogic = __nested_webpack_require_139010__(7007);\nvar isRegExp = __nested_webpack_require_139010__(7850);\nvar anObject = __nested_webpack_require_139010__(9670);\nvar requireObjectCoercible = __nested_webpack_require_139010__(4488);\nvar speciesConstructor = __nested_webpack_require_139010__(6707);\nvar advanceStringIndex = __nested_webpack_require_139010__(1530);\nvar toLength = __nested_webpack_require_139010__(7466);\nvar callRegExpExec = __nested_webpack_require_139010__(7651);\nvar regexpExec = __nested_webpack_require_139010__(2261);\nvar fails = __nested_webpack_require_139010__(7293);\n\nvar arrayPush = [].push;\nvar min = Math.min;\nvar MAX_UINT32 = 0xFFFFFFFF;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\nfixRegExpWellKnownSymbolLogic('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {\n var internalSplit;\n if (\n 'abbc'.split(/(b)*/)[1] == 'c' ||\n // eslint-disable-next-line regexp/no-empty-group -- required for testing\n 'test'.split(/(?:)/, -1).length != 4 ||\n 'ab'.split(/(?:ab)*/).length != 2 ||\n '.'.split(/(.?)(.?)/).length != 4 ||\n // eslint-disable-next-line regexp/no-assertion-capturing-group, regexp/no-empty-group -- required for testing\n '.'.split(/()()/).length > 1 ||\n ''.split(/.?/).length\n ) {\n // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(requireObjectCoercible(this));\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (separator === undefined) return [string];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) {\n return nativeSplit.call(string, separator, lim);\n }\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy.lastIndex;\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\n lastLength = match[0].length;\n lastLastIndex = lastIndex;\n if (output.length >= lim) break;\n }\n if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop\n }\n if (lastLastIndex === string.length) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output.length > lim ? output.slice(0, lim) : output;\n };\n // Chakra, V8\n } else if ('0'.split(undefined, 0).length) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n };\n } else internalSplit = nativeSplit;\n\n return [\n // `String.prototype.split` method\n // https://tc39.es/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = requireObjectCoercible(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.es/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n}, !SUPPORTS_Y);\n\n\n/***/ }),\n\n/***/ 3210:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_144619__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_144619__(2109);\nvar $trim = __nested_webpack_require_144619__(3111).trim;\nvar forcedStringTrimMethod = __nested_webpack_require_144619__(6091);\n\n// `String.prototype.trim` method\n// https://tc39.es/ecma262/#sec-string.prototype.trim\n$({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, {\n trim: function trim() {\n return $trim(this);\n }\n});\n\n\n/***/ }),\n\n/***/ 2990:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_145111__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_145111__(260);\nvar $copyWithin = __nested_webpack_require_145111__(1048);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.copyWithin` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.copywithin\nexportTypedArrayMethod('copyWithin', function copyWithin(target, start /* , end */) {\n return $copyWithin.call(aTypedArray(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 8927:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_145777__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_145777__(260);\nvar $every = __nested_webpack_require_145777__(2092).every;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.every` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.every\nexportTypedArrayMethod('every', function every(callbackfn /* , thisArg */) {\n return $every(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 3105:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_146412__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_146412__(260);\nvar $fill = __nested_webpack_require_146412__(1285);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.fill` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.fill\n// eslint-disable-next-line no-unused-vars -- required for `.length`\nexportTypedArrayMethod('fill', function fill(value /* , start, end */) {\n return $fill.apply(aTypedArray(this), arguments);\n});\n\n\n/***/ }),\n\n/***/ 5035:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_147058__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_147058__(260);\nvar $filter = __nested_webpack_require_147058__(2092).filter;\nvar fromSpeciesAndList = __nested_webpack_require_147058__(3074);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.filter` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.filter\nexportTypedArrayMethod('filter', function filter(callbackfn /* , thisArg */) {\n var list = $filter(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n return fromSpeciesAndList(this, list);\n});\n\n\n/***/ }),\n\n/***/ 7174:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_147797__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_147797__(260);\nvar $findIndex = __nested_webpack_require_147797__(2092).findIndex;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.findIndex` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.findindex\nexportTypedArrayMethod('findIndex', function findIndex(predicate /* , thisArg */) {\n return $findIndex(aTypedArray(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 4345:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_148458__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_148458__(260);\nvar $find = __nested_webpack_require_148458__(2092).find;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.find` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.find\nexportTypedArrayMethod('find', function find(predicate /* , thisArg */) {\n return $find(aTypedArray(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 2846:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_149084__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_149084__(260);\nvar $forEach = __nested_webpack_require_149084__(2092).forEach;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.forEach` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.foreach\nexportTypedArrayMethod('forEach', function forEach(callbackfn /* , thisArg */) {\n $forEach(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 4731:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_149726__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_149726__(260);\nvar $includes = __nested_webpack_require_149726__(1318).includes;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.includes` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.includes\nexportTypedArrayMethod('includes', function includes(searchElement /* , fromIndex */) {\n return $includes(aTypedArray(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 7209:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_150390__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_150390__(260);\nvar $indexOf = __nested_webpack_require_150390__(1318).indexOf;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.indexOf` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.indexof\nexportTypedArrayMethod('indexOf', function indexOf(searchElement /* , fromIndex */) {\n return $indexOf(aTypedArray(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 6319:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_151047__) {\n\n\"use strict\";\n\nvar global = __nested_webpack_require_151047__(7854);\nvar ArrayBufferViewCore = __nested_webpack_require_151047__(260);\nvar ArrayIterators = __nested_webpack_require_151047__(6992);\nvar wellKnownSymbol = __nested_webpack_require_151047__(5112);\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar Uint8Array = global.Uint8Array;\nvar arrayValues = ArrayIterators.values;\nvar arrayKeys = ArrayIterators.keys;\nvar arrayEntries = ArrayIterators.entries;\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar nativeTypedArrayIterator = Uint8Array && Uint8Array.prototype[ITERATOR];\n\nvar CORRECT_ITER_NAME = !!nativeTypedArrayIterator\n && (nativeTypedArrayIterator.name == 'values' || nativeTypedArrayIterator.name == undefined);\n\nvar typedArrayValues = function values() {\n return arrayValues.call(aTypedArray(this));\n};\n\n// `%TypedArray%.prototype.entries` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.entries\nexportTypedArrayMethod('entries', function entries() {\n return arrayEntries.call(aTypedArray(this));\n});\n// `%TypedArray%.prototype.keys` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.keys\nexportTypedArrayMethod('keys', function keys() {\n return arrayKeys.call(aTypedArray(this));\n});\n// `%TypedArray%.prototype.values` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.values\nexportTypedArrayMethod('values', typedArrayValues, !CORRECT_ITER_NAME);\n// `%TypedArray%.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype-@@iterator\nexportTypedArrayMethod(ITERATOR, typedArrayValues, !CORRECT_ITER_NAME);\n\n\n/***/ }),\n\n/***/ 8867:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_152782__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_152782__(260);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $join = [].join;\n\n// `%TypedArray%.prototype.join` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.join\n// eslint-disable-next-line no-unused-vars -- required for `.length`\nexportTypedArrayMethod('join', function join(separator) {\n return $join.apply(aTypedArray(this), arguments);\n});\n\n\n/***/ }),\n\n/***/ 7789:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_153395__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_153395__(260);\nvar $lastIndexOf = __nested_webpack_require_153395__(6583);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.lastIndexOf` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.lastindexof\n// eslint-disable-next-line no-unused-vars -- required for `.length`\nexportTypedArrayMethod('lastIndexOf', function lastIndexOf(searchElement /* , fromIndex */) {\n return $lastIndexOf.apply(aTypedArray(this), arguments);\n});\n\n\n/***/ }),\n\n/***/ 3739:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_154090__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_154090__(260);\nvar $map = __nested_webpack_require_154090__(2092).map;\nvar speciesConstructor = __nested_webpack_require_154090__(6707);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.map` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.map\nexportTypedArrayMethod('map', function map(mapfn /* , thisArg */) {\n return $map(aTypedArray(this), mapfn, arguments.length > 1 ? arguments[1] : undefined, function (O, length) {\n return new (aTypedArrayConstructor(speciesConstructor(O, O.constructor)))(length);\n });\n});\n\n\n/***/ }),\n\n/***/ 4483:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_154941__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_154941__(260);\nvar $reduceRight = __nested_webpack_require_154941__(3671).right;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.reduceRicht` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.reduceright\nexportTypedArrayMethod('reduceRight', function reduceRight(callbackfn /* , initialValue */) {\n return $reduceRight(aTypedArray(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 9368:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_155635__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_155635__(260);\nvar $reduce = __nested_webpack_require_155635__(3671).left;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.reduce` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.reduce\nexportTypedArrayMethod('reduce', function reduce(callbackfn /* , initialValue */) {\n return $reduce(aTypedArray(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 2056:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_156298__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_156298__(260);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar floor = Math.floor;\n\n// `%TypedArray%.prototype.reverse` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.reverse\nexportTypedArrayMethod('reverse', function reverse() {\n var that = this;\n var length = aTypedArray(that).length;\n var middle = floor(length / 2);\n var index = 0;\n var value;\n while (index < middle) {\n value = that[index];\n that[index++] = that[--length];\n that[length] = value;\n } return that;\n});\n\n\n/***/ }),\n\n/***/ 3462:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_157051__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_157051__(260);\nvar toLength = __nested_webpack_require_157051__(7466);\nvar toOffset = __nested_webpack_require_157051__(4590);\nvar toObject = __nested_webpack_require_157051__(7908);\nvar fails = __nested_webpack_require_157051__(7293);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\nvar FORCED = fails(function () {\n /* global Int8Array -- safe */\n new Int8Array(1).set({});\n});\n\n// `%TypedArray%.prototype.set` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.set\nexportTypedArrayMethod('set', function set(arrayLike /* , offset */) {\n aTypedArray(this);\n var offset = toOffset(arguments.length > 1 ? arguments[1] : undefined, 1);\n var length = this.length;\n var src = toObject(arrayLike);\n var len = toLength(src.length);\n var index = 0;\n if (len + offset > length) throw RangeError('Wrong length');\n while (index < len) this[offset + index] = src[index++];\n}, FORCED);\n\n\n/***/ }),\n\n/***/ 678:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_158136__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_158136__(260);\nvar speciesConstructor = __nested_webpack_require_158136__(6707);\nvar fails = __nested_webpack_require_158136__(7293);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $slice = [].slice;\n\nvar FORCED = fails(function () {\n /* global Int8Array -- safe */\n new Int8Array(1).slice();\n});\n\n// `%TypedArray%.prototype.slice` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.slice\nexportTypedArrayMethod('slice', function slice(start, end) {\n var list = $slice.call(aTypedArray(this), start, end);\n var C = speciesConstructor(this, this.constructor);\n var index = 0;\n var length = list.length;\n var result = new (aTypedArrayConstructor(C))(length);\n while (length > index) result[index] = list[index++];\n return result;\n}, FORCED);\n\n\n/***/ }),\n\n/***/ 7462:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_159191__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_159191__(260);\nvar $some = __nested_webpack_require_159191__(2092).some;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.some` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.some\nexportTypedArrayMethod('some', function some(callbackfn /* , thisArg */) {\n return $some(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 3824:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_159819__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_159819__(260);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $sort = [].sort;\n\n// `%TypedArray%.prototype.sort` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.sort\nexportTypedArrayMethod('sort', function sort(comparefn) {\n return $sort.call(aTypedArray(this), comparefn);\n});\n\n\n/***/ }),\n\n/***/ 5021:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_160362__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_160362__(260);\nvar toLength = __nested_webpack_require_160362__(7466);\nvar toAbsoluteIndex = __nested_webpack_require_160362__(1400);\nvar speciesConstructor = __nested_webpack_require_160362__(6707);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.subarray` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.subarray\nexportTypedArrayMethod('subarray', function subarray(begin, end) {\n var O = aTypedArray(this);\n var length = O.length;\n var beginIndex = toAbsoluteIndex(begin, length);\n return new (speciesConstructor(O, O.constructor))(\n O.buffer,\n O.byteOffset + beginIndex * O.BYTES_PER_ELEMENT,\n toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - beginIndex)\n );\n});\n\n\n/***/ }),\n\n/***/ 2974:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_161310__) {\n\n\"use strict\";\n\nvar global = __nested_webpack_require_161310__(7854);\nvar ArrayBufferViewCore = __nested_webpack_require_161310__(260);\nvar fails = __nested_webpack_require_161310__(7293);\n\nvar Int8Array = global.Int8Array;\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $toLocaleString = [].toLocaleString;\nvar $slice = [].slice;\n\n// iOS Safari 6.x fails here\nvar TO_LOCALE_STRING_BUG = !!Int8Array && fails(function () {\n $toLocaleString.call(new Int8Array(1));\n});\n\nvar FORCED = fails(function () {\n return [1, 2].toLocaleString() != new Int8Array([1, 2]).toLocaleString();\n}) || !fails(function () {\n Int8Array.prototype.toLocaleString.call([1, 2]);\n});\n\n// `%TypedArray%.prototype.toLocaleString` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.tolocalestring\nexportTypedArrayMethod('toLocaleString', function toLocaleString() {\n return $toLocaleString.apply(TO_LOCALE_STRING_BUG ? $slice.call(aTypedArray(this)) : aTypedArray(this), arguments);\n}, FORCED);\n\n\n/***/ }),\n\n/***/ 5016:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_162445__) {\n\n\"use strict\";\n\nvar exportTypedArrayMethod = __nested_webpack_require_162445__(260).exportTypedArrayMethod;\nvar fails = __nested_webpack_require_162445__(7293);\nvar global = __nested_webpack_require_162445__(7854);\n\nvar Uint8Array = global.Uint8Array;\nvar Uint8ArrayPrototype = Uint8Array && Uint8Array.prototype || {};\nvar arrayToString = [].toString;\nvar arrayJoin = [].join;\n\nif (fails(function () { arrayToString.call({}); })) {\n arrayToString = function toString() {\n return arrayJoin.call(this);\n };\n}\n\nvar IS_NOT_ARRAY_METHOD = Uint8ArrayPrototype.toString != arrayToString;\n\n// `%TypedArray%.prototype.toString` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.tostring\nexportTypedArrayMethod('toString', arrayToString, IS_NOT_ARRAY_METHOD);\n\n\n/***/ }),\n\n/***/ 2472:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_163286__) {\n\nvar createTypedArrayConstructor = __nested_webpack_require_163286__(9843);\n\n// `Uint8Array` constructor\n// https://tc39.es/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Uint8', function (init) {\n return function Uint8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n\n\n/***/ }),\n\n/***/ 4747:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_163713__) {\n\nvar global = __nested_webpack_require_163713__(7854);\nvar DOMIterables = __nested_webpack_require_163713__(8324);\nvar forEach = __nested_webpack_require_163713__(8533);\nvar createNonEnumerableProperty = __nested_webpack_require_163713__(8880);\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try {\n createNonEnumerableProperty(CollectionPrototype, 'forEach', forEach);\n } catch (error) {\n CollectionPrototype.forEach = forEach;\n }\n}\n\n\n/***/ }),\n\n/***/ 3948:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_164461__) {\n\nvar global = __nested_webpack_require_164461__(7854);\nvar DOMIterables = __nested_webpack_require_164461__(8324);\nvar ArrayIteratorMethods = __nested_webpack_require_164461__(6992);\nvar createNonEnumerableProperty = __nested_webpack_require_164461__(8880);\nvar wellKnownSymbol = __nested_webpack_require_164461__(5112);\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar ArrayValues = ArrayIteratorMethods.values;\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n if (CollectionPrototype) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[ITERATOR] !== ArrayValues) try {\n createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues);\n } catch (error) {\n CollectionPrototype[ITERATOR] = ArrayValues;\n }\n if (!CollectionPrototype[TO_STRING_TAG]) {\n createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);\n }\n if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {\n createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);\n } catch (error) {\n CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ 1637:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_166049__) {\n\n\"use strict\";\n\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\n__nested_webpack_require_166049__(6992);\nvar $ = __nested_webpack_require_166049__(2109);\nvar getBuiltIn = __nested_webpack_require_166049__(5005);\nvar USE_NATIVE_URL = __nested_webpack_require_166049__(590);\nvar redefine = __nested_webpack_require_166049__(1320);\nvar redefineAll = __nested_webpack_require_166049__(2248);\nvar setToStringTag = __nested_webpack_require_166049__(8003);\nvar createIteratorConstructor = __nested_webpack_require_166049__(4994);\nvar InternalStateModule = __nested_webpack_require_166049__(9909);\nvar anInstance = __nested_webpack_require_166049__(5787);\nvar hasOwn = __nested_webpack_require_166049__(6656);\nvar bind = __nested_webpack_require_166049__(9974);\nvar classof = __nested_webpack_require_166049__(648);\nvar anObject = __nested_webpack_require_166049__(9670);\nvar isObject = __nested_webpack_require_166049__(111);\nvar create = __nested_webpack_require_166049__(30);\nvar createPropertyDescriptor = __nested_webpack_require_166049__(9114);\nvar getIterator = __nested_webpack_require_166049__(8554);\nvar getIteratorMethod = __nested_webpack_require_166049__(1246);\nvar wellKnownSymbol = __nested_webpack_require_166049__(5112);\n\nvar $fetch = getBuiltIn('fetch');\nvar Headers = getBuiltIn('Headers');\nvar ITERATOR = wellKnownSymbol('iterator');\nvar URL_SEARCH_PARAMS = 'URLSearchParams';\nvar URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalParamsState = InternalStateModule.getterFor(URL_SEARCH_PARAMS);\nvar getInternalIteratorState = InternalStateModule.getterFor(URL_SEARCH_PARAMS_ITERATOR);\n\nvar plus = /\\+/g;\nvar sequences = Array(4);\n\nvar percentSequence = function (bytes) {\n return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\\\da-f]{2}){' + bytes + '})', 'gi'));\n};\n\nvar percentDecode = function (sequence) {\n try {\n return decodeURIComponent(sequence);\n } catch (error) {\n return sequence;\n }\n};\n\nvar deserialize = function (it) {\n var result = it.replace(plus, ' ');\n var bytes = 4;\n try {\n return decodeURIComponent(result);\n } catch (error) {\n while (bytes) {\n result = result.replace(percentSequence(bytes--), percentDecode);\n }\n return result;\n }\n};\n\nvar find = /[!'()~]|%20/g;\n\nvar replace = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+'\n};\n\nvar replacer = function (match) {\n return replace[match];\n};\n\nvar serialize = function (it) {\n return encodeURIComponent(it).replace(find, replacer);\n};\n\nvar parseSearchParams = function (result, query) {\n if (query) {\n var attributes = query.split('&');\n var index = 0;\n var attribute, entry;\n while (index < attributes.length) {\n attribute = attributes[index++];\n if (attribute.length) {\n entry = attribute.split('=');\n result.push({\n key: deserialize(entry.shift()),\n value: deserialize(entry.join('='))\n });\n }\n }\n }\n};\n\nvar updateSearchParams = function (query) {\n this.entries.length = 0;\n parseSearchParams(this.entries, query);\n};\n\nvar validateArgumentsLength = function (passed, required) {\n if (passed < required) throw TypeError('Not enough arguments');\n};\n\nvar URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {\n setInternalState(this, {\n type: URL_SEARCH_PARAMS_ITERATOR,\n iterator: getIterator(getInternalParamsState(params).entries),\n kind: kind\n });\n}, 'Iterator', function next() {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var step = state.iterator.next();\n var entry = step.value;\n if (!step.done) {\n step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];\n } return step;\n});\n\n// `URLSearchParams` constructor\n// https://url.spec.whatwg.org/#interface-urlsearchparams\nvar URLSearchParamsConstructor = function URLSearchParams(/* init */) {\n anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n var init = arguments.length > 0 ? arguments[0] : undefined;\n var that = this;\n var entries = [];\n var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key;\n\n setInternalState(that, {\n type: URL_SEARCH_PARAMS,\n entries: entries,\n updateURL: function () { /* empty */ },\n updateSearchParams: updateSearchParams\n });\n\n if (init !== undefined) {\n if (isObject(init)) {\n iteratorMethod = getIteratorMethod(init);\n if (typeof iteratorMethod === 'function') {\n iterator = iteratorMethod.call(init);\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n entryIterator = getIterator(anObject(step.value));\n entryNext = entryIterator.next;\n if (\n (first = entryNext.call(entryIterator)).done ||\n (second = entryNext.call(entryIterator)).done ||\n !entryNext.call(entryIterator).done\n ) throw TypeError('Expected sequence with length 2');\n entries.push({ key: first.value + '', value: second.value + '' });\n }\n } else for (key in init) if (hasOwn(init, key)) entries.push({ key: key, value: init[key] + '' });\n } else {\n parseSearchParams(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + '');\n }\n }\n};\n\nvar URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;\n\nredefineAll(URLSearchParamsPrototype, {\n // `URLSearchParams.prototype.append` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n append: function append(name, value) {\n validateArgumentsLength(arguments.length, 2);\n var state = getInternalParamsState(this);\n state.entries.push({ key: name + '', value: value + '' });\n state.updateURL();\n },\n // `URLSearchParams.prototype.delete` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n 'delete': function (name) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index].key === key) entries.splice(index, 1);\n else index++;\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.get` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n get: function get(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) return entries[index].value;\n }\n return null;\n },\n // `URLSearchParams.prototype.getAll` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n getAll: function getAll(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var result = [];\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) result.push(entries[index].value);\n }\n return result;\n },\n // `URLSearchParams.prototype.has` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n has: function has(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index++].key === key) return true;\n }\n return false;\n },\n // `URLSearchParams.prototype.set` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n set: function set(name, value) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var found = false;\n var key = name + '';\n var val = value + '';\n var index = 0;\n var entry;\n for (; index < entries.length; index++) {\n entry = entries[index];\n if (entry.key === key) {\n if (found) entries.splice(index--, 1);\n else {\n found = true;\n entry.value = val;\n }\n }\n }\n if (!found) entries.push({ key: key, value: val });\n state.updateURL();\n },\n // `URLSearchParams.prototype.sort` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n sort: function sort() {\n var state = getInternalParamsState(this);\n var entries = state.entries;\n // Array#sort is not stable in some engines\n var slice = entries.slice();\n var entry, entriesIndex, sliceIndex;\n entries.length = 0;\n for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) {\n entry = slice[sliceIndex];\n for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) {\n if (entries[entriesIndex].key > entry.key) {\n entries.splice(entriesIndex, 0, entry);\n break;\n }\n }\n if (entriesIndex === sliceIndex) entries.push(entry);\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.forEach` method\n forEach: function forEach(callback /* , thisArg */) {\n var entries = getInternalParamsState(this).entries;\n var boundFunction = bind(callback, arguments.length > 1 ? arguments[1] : undefined, 3);\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n boundFunction(entry.value, entry.key, this);\n }\n },\n // `URLSearchParams.prototype.keys` method\n keys: function keys() {\n return new URLSearchParamsIterator(this, 'keys');\n },\n // `URLSearchParams.prototype.values` method\n values: function values() {\n return new URLSearchParamsIterator(this, 'values');\n },\n // `URLSearchParams.prototype.entries` method\n entries: function entries() {\n return new URLSearchParamsIterator(this, 'entries');\n }\n}, { enumerable: true });\n\n// `URLSearchParams.prototype[@@iterator]` method\nredefine(URLSearchParamsPrototype, ITERATOR, URLSearchParamsPrototype.entries);\n\n// `URLSearchParams.prototype.toString` method\n// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\nredefine(URLSearchParamsPrototype, 'toString', function toString() {\n var entries = getInternalParamsState(this).entries;\n var result = [];\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n result.push(serialize(entry.key) + '=' + serialize(entry.value));\n } return result.join('&');\n}, { enumerable: true });\n\nsetToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\n$({ global: true, forced: !USE_NATIVE_URL }, {\n URLSearchParams: URLSearchParamsConstructor\n});\n\n// Wrap `fetch` for correct work with polyfilled `URLSearchParams`\n// https://github.com/zloirock/core-js/issues/674\nif (!USE_NATIVE_URL && typeof $fetch == 'function' && typeof Headers == 'function') {\n $({ global: true, enumerable: true, forced: true }, {\n fetch: function fetch(input /* , init */) {\n var args = [input];\n var init, body, headers;\n if (arguments.length > 1) {\n init = arguments[1];\n if (isObject(init)) {\n body = init.body;\n if (classof(body) === URL_SEARCH_PARAMS) {\n headers = init.headers ? new Headers(init.headers) : new Headers();\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n init = create(init, {\n body: createPropertyDescriptor(0, String(body)),\n headers: createPropertyDescriptor(0, headers)\n });\n }\n }\n args.push(init);\n } return $fetch.apply(this, args);\n }\n });\n}\n\nmodule.exports = {\n URLSearchParams: URLSearchParamsConstructor,\n getState: getInternalParamsState\n};\n\n\n/***/ }),\n\n/***/ 285:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_177789__) {\n\n\"use strict\";\n\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\n__nested_webpack_require_177789__(8783);\nvar $ = __nested_webpack_require_177789__(2109);\nvar DESCRIPTORS = __nested_webpack_require_177789__(9781);\nvar USE_NATIVE_URL = __nested_webpack_require_177789__(590);\nvar global = __nested_webpack_require_177789__(7854);\nvar defineProperties = __nested_webpack_require_177789__(6048);\nvar redefine = __nested_webpack_require_177789__(1320);\nvar anInstance = __nested_webpack_require_177789__(5787);\nvar has = __nested_webpack_require_177789__(6656);\nvar assign = __nested_webpack_require_177789__(1574);\nvar arrayFrom = __nested_webpack_require_177789__(8457);\nvar codeAt = __nested_webpack_require_177789__(8710).codeAt;\nvar toASCII = __nested_webpack_require_177789__(3197);\nvar setToStringTag = __nested_webpack_require_177789__(8003);\nvar URLSearchParamsModule = __nested_webpack_require_177789__(1637);\nvar InternalStateModule = __nested_webpack_require_177789__(9909);\n\nvar NativeURL = global.URL;\nvar URLSearchParams = URLSearchParamsModule.URLSearchParams;\nvar getInternalSearchParamsState = URLSearchParamsModule.getState;\nvar setInternalState = InternalStateModule.set;\nvar getInternalURLState = InternalStateModule.getterFor('URL');\nvar floor = Math.floor;\nvar pow = Math.pow;\n\nvar INVALID_AUTHORITY = 'Invalid authority';\nvar INVALID_SCHEME = 'Invalid scheme';\nvar INVALID_HOST = 'Invalid host';\nvar INVALID_PORT = 'Invalid port';\n\nvar ALPHA = /[A-Za-z]/;\nvar ALPHANUMERIC = /[\\d+-.A-Za-z]/;\nvar DIGIT = /\\d/;\nvar HEX_START = /^(0x|0X)/;\nvar OCT = /^[0-7]+$/;\nvar DEC = /^\\d+$/;\nvar HEX = /^[\\dA-Fa-f]+$/;\n/* eslint-disable no-control-regex -- safe */\nvar FORBIDDEN_HOST_CODE_POINT = /[\\u0000\\t\\u000A\\u000D #%/:?@[\\\\]]/;\nvar FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\\u0000\\t\\u000A\\u000D #/:?@[\\\\]]/;\nvar LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g;\nvar TAB_AND_NEW_LINE = /[\\t\\u000A\\u000D]/g;\n/* eslint-enable no-control-regex -- safe */\nvar EOF;\n\nvar parseHost = function (url, input) {\n var result, codePoints, index;\n if (input.charAt(0) == '[') {\n if (input.charAt(input.length - 1) != ']') return INVALID_HOST;\n result = parseIPv6(input.slice(1, -1));\n if (!result) return INVALID_HOST;\n url.host = result;\n // opaque host\n } else if (!isSpecial(url)) {\n if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST;\n result = '';\n codePoints = arrayFrom(input);\n for (index = 0; index < codePoints.length; index++) {\n result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);\n }\n url.host = result;\n } else {\n input = toASCII(input);\n if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST;\n result = parseIPv4(input);\n if (result === null) return INVALID_HOST;\n url.host = result;\n }\n};\n\nvar parseIPv4 = function (input) {\n var parts = input.split('.');\n var partsLength, numbers, index, part, radix, number, ipv4;\n if (parts.length && parts[parts.length - 1] == '') {\n parts.pop();\n }\n partsLength = parts.length;\n if (partsLength > 4) return input;\n numbers = [];\n for (index = 0; index < partsLength; index++) {\n part = parts[index];\n if (part == '') return input;\n radix = 10;\n if (part.length > 1 && part.charAt(0) == '0') {\n radix = HEX_START.test(part) ? 16 : 8;\n part = part.slice(radix == 8 ? 1 : 2);\n }\n if (part === '') {\n number = 0;\n } else {\n if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input;\n number = parseInt(part, radix);\n }\n numbers.push(number);\n }\n for (index = 0; index < partsLength; index++) {\n number = numbers[index];\n if (index == partsLength - 1) {\n if (number >= pow(256, 5 - partsLength)) return null;\n } else if (number > 255) return null;\n }\n ipv4 = numbers.pop();\n for (index = 0; index < numbers.length; index++) {\n ipv4 += numbers[index] * pow(256, 3 - index);\n }\n return ipv4;\n};\n\n// eslint-disable-next-line max-statements -- TODO\nvar parseIPv6 = function (input) {\n var address = [0, 0, 0, 0, 0, 0, 0, 0];\n var pieceIndex = 0;\n var compress = null;\n var pointer = 0;\n var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n var char = function () {\n return input.charAt(pointer);\n };\n\n if (char() == ':') {\n if (input.charAt(1) != ':') return;\n pointer += 2;\n pieceIndex++;\n compress = pieceIndex;\n }\n while (char()) {\n if (pieceIndex == 8) return;\n if (char() == ':') {\n if (compress !== null) return;\n pointer++;\n pieceIndex++;\n compress = pieceIndex;\n continue;\n }\n value = length = 0;\n while (length < 4 && HEX.test(char())) {\n value = value * 16 + parseInt(char(), 16);\n pointer++;\n length++;\n }\n if (char() == '.') {\n if (length == 0) return;\n pointer -= length;\n if (pieceIndex > 6) return;\n numbersSeen = 0;\n while (char()) {\n ipv4Piece = null;\n if (numbersSeen > 0) {\n if (char() == '.' && numbersSeen < 4) pointer++;\n else return;\n }\n if (!DIGIT.test(char())) return;\n while (DIGIT.test(char())) {\n number = parseInt(char(), 10);\n if (ipv4Piece === null) ipv4Piece = number;\n else if (ipv4Piece == 0) return;\n else ipv4Piece = ipv4Piece * 10 + number;\n if (ipv4Piece > 255) return;\n pointer++;\n }\n address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n numbersSeen++;\n if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;\n }\n if (numbersSeen != 4) return;\n break;\n } else if (char() == ':') {\n pointer++;\n if (!char()) return;\n } else if (char()) return;\n address[pieceIndex++] = value;\n }\n if (compress !== null) {\n swaps = pieceIndex - compress;\n pieceIndex = 7;\n while (pieceIndex != 0 && swaps > 0) {\n swap = address[pieceIndex];\n address[pieceIndex--] = address[compress + swaps - 1];\n address[compress + --swaps] = swap;\n }\n } else if (pieceIndex != 8) return;\n return address;\n};\n\nvar findLongestZeroSequence = function (ipv6) {\n var maxIndex = null;\n var maxLength = 1;\n var currStart = null;\n var currLength = 0;\n var index = 0;\n for (; index < 8; index++) {\n if (ipv6[index] !== 0) {\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n currStart = null;\n currLength = 0;\n } else {\n if (currStart === null) currStart = index;\n ++currLength;\n }\n }\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n return maxIndex;\n};\n\nvar serializeHost = function (host) {\n var result, index, compress, ignore0;\n // ipv4\n if (typeof host == 'number') {\n result = [];\n for (index = 0; index < 4; index++) {\n result.unshift(host % 256);\n host = floor(host / 256);\n } return result.join('.');\n // ipv6\n } else if (typeof host == 'object') {\n result = '';\n compress = findLongestZeroSequence(host);\n for (index = 0; index < 8; index++) {\n if (ignore0 && host[index] === 0) continue;\n if (ignore0) ignore0 = false;\n if (compress === index) {\n result += index ? ':' : '::';\n ignore0 = true;\n } else {\n result += host[index].toString(16);\n if (index < 7) result += ':';\n }\n }\n return '[' + result + ']';\n } return host;\n};\n\nvar C0ControlPercentEncodeSet = {};\nvar fragmentPercentEncodeSet = assign({}, C0ControlPercentEncodeSet, {\n ' ': 1, '\"': 1, '<': 1, '>': 1, '`': 1\n});\nvar pathPercentEncodeSet = assign({}, fragmentPercentEncodeSet, {\n '#': 1, '?': 1, '{': 1, '}': 1\n});\nvar userinfoPercentEncodeSet = assign({}, pathPercentEncodeSet, {\n '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\\\': 1, ']': 1, '^': 1, '|': 1\n});\n\nvar percentEncode = function (char, set) {\n var code = codeAt(char, 0);\n return code > 0x20 && code < 0x7F && !has(set, char) ? char : encodeURIComponent(char);\n};\n\nvar specialSchemes = {\n ftp: 21,\n file: null,\n http: 80,\n https: 443,\n ws: 80,\n wss: 443\n};\n\nvar isSpecial = function (url) {\n return has(specialSchemes, url.scheme);\n};\n\nvar includesCredentials = function (url) {\n return url.username != '' || url.password != '';\n};\n\nvar cannotHaveUsernamePasswordPort = function (url) {\n return !url.host || url.cannotBeABaseURL || url.scheme == 'file';\n};\n\nvar isWindowsDriveLetter = function (string, normalized) {\n var second;\n return string.length == 2 && ALPHA.test(string.charAt(0))\n && ((second = string.charAt(1)) == ':' || (!normalized && second == '|'));\n};\n\nvar startsWithWindowsDriveLetter = function (string) {\n var third;\n return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && (\n string.length == 2 ||\n ((third = string.charAt(2)) === '/' || third === '\\\\' || third === '?' || third === '#')\n );\n};\n\nvar shortenURLsPath = function (url) {\n var path = url.path;\n var pathSize = path.length;\n if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {\n path.pop();\n }\n};\n\nvar isSingleDot = function (segment) {\n return segment === '.' || segment.toLowerCase() === '%2e';\n};\n\nvar isDoubleDot = function (segment) {\n segment = segment.toLowerCase();\n return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n};\n\n// States:\nvar SCHEME_START = {};\nvar SCHEME = {};\nvar NO_SCHEME = {};\nvar SPECIAL_RELATIVE_OR_AUTHORITY = {};\nvar PATH_OR_AUTHORITY = {};\nvar RELATIVE = {};\nvar RELATIVE_SLASH = {};\nvar SPECIAL_AUTHORITY_SLASHES = {};\nvar SPECIAL_AUTHORITY_IGNORE_SLASHES = {};\nvar AUTHORITY = {};\nvar HOST = {};\nvar HOSTNAME = {};\nvar PORT = {};\nvar FILE = {};\nvar FILE_SLASH = {};\nvar FILE_HOST = {};\nvar PATH_START = {};\nvar PATH = {};\nvar CANNOT_BE_A_BASE_URL_PATH = {};\nvar QUERY = {};\nvar FRAGMENT = {};\n\n// eslint-disable-next-line max-statements -- TODO\nvar parseURL = function (url, input, stateOverride, base) {\n var state = stateOverride || SCHEME_START;\n var pointer = 0;\n var buffer = '';\n var seenAt = false;\n var seenBracket = false;\n var seenPasswordToken = false;\n var codePoints, char, bufferCodePoints, failure;\n\n if (!stateOverride) {\n url.scheme = '';\n url.username = '';\n url.password = '';\n url.host = null;\n url.port = null;\n url.path = [];\n url.query = null;\n url.fragment = null;\n url.cannotBeABaseURL = false;\n input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');\n }\n\n input = input.replace(TAB_AND_NEW_LINE, '');\n\n codePoints = arrayFrom(input);\n\n while (pointer <= codePoints.length) {\n char = codePoints[pointer];\n switch (state) {\n case SCHEME_START:\n if (char && ALPHA.test(char)) {\n buffer += char.toLowerCase();\n state = SCHEME;\n } else if (!stateOverride) {\n state = NO_SCHEME;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case SCHEME:\n if (char && (ALPHANUMERIC.test(char) || char == '+' || char == '-' || char == '.')) {\n buffer += char.toLowerCase();\n } else if (char == ':') {\n if (stateOverride && (\n (isSpecial(url) != has(specialSchemes, buffer)) ||\n (buffer == 'file' && (includesCredentials(url) || url.port !== null)) ||\n (url.scheme == 'file' && !url.host)\n )) return;\n url.scheme = buffer;\n if (stateOverride) {\n if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null;\n return;\n }\n buffer = '';\n if (url.scheme == 'file') {\n state = FILE;\n } else if (isSpecial(url) && base && base.scheme == url.scheme) {\n state = SPECIAL_RELATIVE_OR_AUTHORITY;\n } else if (isSpecial(url)) {\n state = SPECIAL_AUTHORITY_SLASHES;\n } else if (codePoints[pointer + 1] == '/') {\n state = PATH_OR_AUTHORITY;\n pointer++;\n } else {\n url.cannotBeABaseURL = true;\n url.path.push('');\n state = CANNOT_BE_A_BASE_URL_PATH;\n }\n } else if (!stateOverride) {\n buffer = '';\n state = NO_SCHEME;\n pointer = 0;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case NO_SCHEME:\n if (!base || (base.cannotBeABaseURL && char != '#')) return INVALID_SCHEME;\n if (base.cannotBeABaseURL && char == '#') {\n url.scheme = base.scheme;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n url.cannotBeABaseURL = true;\n state = FRAGMENT;\n break;\n }\n state = base.scheme == 'file' ? FILE : RELATIVE;\n continue;\n\n case SPECIAL_RELATIVE_OR_AUTHORITY:\n if (char == '/' && codePoints[pointer + 1] == '/') {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n pointer++;\n } else {\n state = RELATIVE;\n continue;\n } break;\n\n case PATH_OR_AUTHORITY:\n if (char == '/') {\n state = AUTHORITY;\n break;\n } else {\n state = PATH;\n continue;\n }\n\n case RELATIVE:\n url.scheme = base.scheme;\n if (char == EOF) {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '/' || (char == '\\\\' && isSpecial(url))) {\n state = RELATIVE_SLASH;\n } else if (char == '?') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.path.pop();\n state = PATH;\n continue;\n } break;\n\n case RELATIVE_SLASH:\n if (isSpecial(url) && (char == '/' || char == '\\\\')) {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n } else if (char == '/') {\n state = AUTHORITY;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n state = PATH;\n continue;\n } break;\n\n case SPECIAL_AUTHORITY_SLASHES:\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n if (char != '/' || buffer.charAt(pointer + 1) != '/') continue;\n pointer++;\n break;\n\n case SPECIAL_AUTHORITY_IGNORE_SLASHES:\n if (char != '/' && char != '\\\\') {\n state = AUTHORITY;\n continue;\n } break;\n\n case AUTHORITY:\n if (char == '@') {\n if (seenAt) buffer = '%40' + buffer;\n seenAt = true;\n bufferCodePoints = arrayFrom(buffer);\n for (var i = 0; i < bufferCodePoints.length; i++) {\n var codePoint = bufferCodePoints[i];\n if (codePoint == ':' && !seenPasswordToken) {\n seenPasswordToken = true;\n continue;\n }\n var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);\n if (seenPasswordToken) url.password += encodedCodePoints;\n else url.username += encodedCodePoints;\n }\n buffer = '';\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (seenAt && buffer == '') return INVALID_AUTHORITY;\n pointer -= arrayFrom(buffer).length + 1;\n buffer = '';\n state = HOST;\n } else buffer += char;\n break;\n\n case HOST:\n case HOSTNAME:\n if (stateOverride && url.scheme == 'file') {\n state = FILE_HOST;\n continue;\n } else if (char == ':' && !seenBracket) {\n if (buffer == '') return INVALID_HOST;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PORT;\n if (stateOverride == HOSTNAME) return;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (isSpecial(url) && buffer == '') return INVALID_HOST;\n if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PATH_START;\n if (stateOverride) return;\n continue;\n } else {\n if (char == '[') seenBracket = true;\n else if (char == ']') seenBracket = false;\n buffer += char;\n } break;\n\n case PORT:\n if (DIGIT.test(char)) {\n buffer += char;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url)) ||\n stateOverride\n ) {\n if (buffer != '') {\n var port = parseInt(buffer, 10);\n if (port > 0xFFFF) return INVALID_PORT;\n url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port;\n buffer = '';\n }\n if (stateOverride) return;\n state = PATH_START;\n continue;\n } else return INVALID_PORT;\n break;\n\n case FILE:\n url.scheme = 'file';\n if (char == '/' || char == '\\\\') state = FILE_SLASH;\n else if (base && base.scheme == 'file') {\n if (char == EOF) {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '?') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n url.host = base.host;\n url.path = base.path.slice();\n shortenURLsPath(url);\n }\n state = PATH;\n continue;\n }\n } else {\n state = PATH;\n continue;\n } break;\n\n case FILE_SLASH:\n if (char == '/' || char == '\\\\') {\n state = FILE_HOST;\n break;\n }\n if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);\n else url.host = base.host;\n }\n state = PATH;\n continue;\n\n case FILE_HOST:\n if (char == EOF || char == '/' || char == '\\\\' || char == '?' || char == '#') {\n if (!stateOverride && isWindowsDriveLetter(buffer)) {\n state = PATH;\n } else if (buffer == '') {\n url.host = '';\n if (stateOverride) return;\n state = PATH_START;\n } else {\n failure = parseHost(url, buffer);\n if (failure) return failure;\n if (url.host == 'localhost') url.host = '';\n if (stateOverride) return;\n buffer = '';\n state = PATH_START;\n } continue;\n } else buffer += char;\n break;\n\n case PATH_START:\n if (isSpecial(url)) {\n state = PATH;\n if (char != '/' && char != '\\\\') continue;\n } else if (!stateOverride && char == '?') {\n url.query = '';\n state = QUERY;\n } else if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n state = PATH;\n if (char != '/') continue;\n } break;\n\n case PATH:\n if (\n char == EOF || char == '/' ||\n (char == '\\\\' && isSpecial(url)) ||\n (!stateOverride && (char == '?' || char == '#'))\n ) {\n if (isDoubleDot(buffer)) {\n shortenURLsPath(url);\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else if (isSingleDot(buffer)) {\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else {\n if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {\n if (url.host) url.host = '';\n buffer = buffer.charAt(0) + ':'; // normalize windows drive letter\n }\n url.path.push(buffer);\n }\n buffer = '';\n if (url.scheme == 'file' && (char == EOF || char == '?' || char == '#')) {\n while (url.path.length > 1 && url.path[0] === '') {\n url.path.shift();\n }\n }\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n }\n } else {\n buffer += percentEncode(char, pathPercentEncodeSet);\n } break;\n\n case CANNOT_BE_A_BASE_URL_PATH:\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n url.path[0] += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case QUERY:\n if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n if (char == \"'\" && isSpecial(url)) url.query += '%27';\n else if (char == '#') url.query += '%23';\n else url.query += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case FRAGMENT:\n if (char != EOF) url.fragment += percentEncode(char, fragmentPercentEncodeSet);\n break;\n }\n\n pointer++;\n }\n};\n\n// `URL` constructor\n// https://url.spec.whatwg.org/#url-class\nvar URLConstructor = function URL(url /* , base */) {\n var that = anInstance(this, URLConstructor, 'URL');\n var base = arguments.length > 1 ? arguments[1] : undefined;\n var urlString = String(url);\n var state = setInternalState(that, { type: 'URL' });\n var baseState, failure;\n if (base !== undefined) {\n if (base instanceof URLConstructor) baseState = getInternalURLState(base);\n else {\n failure = parseURL(baseState = {}, String(base));\n if (failure) throw TypeError(failure);\n }\n }\n failure = parseURL(state, urlString, null, baseState);\n if (failure) throw TypeError(failure);\n var searchParams = state.searchParams = new URLSearchParams();\n var searchParamsState = getInternalSearchParamsState(searchParams);\n searchParamsState.updateSearchParams(state.query);\n searchParamsState.updateURL = function () {\n state.query = String(searchParams) || null;\n };\n if (!DESCRIPTORS) {\n that.href = serializeURL.call(that);\n that.origin = getOrigin.call(that);\n that.protocol = getProtocol.call(that);\n that.username = getUsername.call(that);\n that.password = getPassword.call(that);\n that.host = getHost.call(that);\n that.hostname = getHostname.call(that);\n that.port = getPort.call(that);\n that.pathname = getPathname.call(that);\n that.search = getSearch.call(that);\n that.searchParams = getSearchParams.call(that);\n that.hash = getHash.call(that);\n }\n};\n\nvar URLPrototype = URLConstructor.prototype;\n\nvar serializeURL = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var username = url.username;\n var password = url.password;\n var host = url.host;\n var port = url.port;\n var path = url.path;\n var query = url.query;\n var fragment = url.fragment;\n var output = scheme + ':';\n if (host !== null) {\n output += '//';\n if (includesCredentials(url)) {\n output += username + (password ? ':' + password : '') + '@';\n }\n output += serializeHost(host);\n if (port !== null) output += ':' + port;\n } else if (scheme == 'file') output += '//';\n output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n if (query !== null) output += '?' + query;\n if (fragment !== null) output += '#' + fragment;\n return output;\n};\n\nvar getOrigin = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var port = url.port;\n if (scheme == 'blob') try {\n return new URL(scheme.path[0]).origin;\n } catch (error) {\n return 'null';\n }\n if (scheme == 'file' || !isSpecial(url)) return 'null';\n return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : '');\n};\n\nvar getProtocol = function () {\n return getInternalURLState(this).scheme + ':';\n};\n\nvar getUsername = function () {\n return getInternalURLState(this).username;\n};\n\nvar getPassword = function () {\n return getInternalURLState(this).password;\n};\n\nvar getHost = function () {\n var url = getInternalURLState(this);\n var host = url.host;\n var port = url.port;\n return host === null ? ''\n : port === null ? serializeHost(host)\n : serializeHost(host) + ':' + port;\n};\n\nvar getHostname = function () {\n var host = getInternalURLState(this).host;\n return host === null ? '' : serializeHost(host);\n};\n\nvar getPort = function () {\n var port = getInternalURLState(this).port;\n return port === null ? '' : String(port);\n};\n\nvar getPathname = function () {\n var url = getInternalURLState(this);\n var path = url.path;\n return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n};\n\nvar getSearch = function () {\n var query = getInternalURLState(this).query;\n return query ? '?' + query : '';\n};\n\nvar getSearchParams = function () {\n return getInternalURLState(this).searchParams;\n};\n\nvar getHash = function () {\n var fragment = getInternalURLState(this).fragment;\n return fragment ? '#' + fragment : '';\n};\n\nvar accessorDescriptor = function (getter, setter) {\n return { get: getter, set: setter, configurable: true, enumerable: true };\n};\n\nif (DESCRIPTORS) {\n defineProperties(URLPrototype, {\n // `URL.prototype.href` accessors pair\n // https://url.spec.whatwg.org/#dom-url-href\n href: accessorDescriptor(serializeURL, function (href) {\n var url = getInternalURLState(this);\n var urlString = String(href);\n var failure = parseURL(url, urlString);\n if (failure) throw TypeError(failure);\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.origin` getter\n // https://url.spec.whatwg.org/#dom-url-origin\n origin: accessorDescriptor(getOrigin),\n // `URL.prototype.protocol` accessors pair\n // https://url.spec.whatwg.org/#dom-url-protocol\n protocol: accessorDescriptor(getProtocol, function (protocol) {\n var url = getInternalURLState(this);\n parseURL(url, String(protocol) + ':', SCHEME_START);\n }),\n // `URL.prototype.username` accessors pair\n // https://url.spec.whatwg.org/#dom-url-username\n username: accessorDescriptor(getUsername, function (username) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(username));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.username = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.password` accessors pair\n // https://url.spec.whatwg.org/#dom-url-password\n password: accessorDescriptor(getPassword, function (password) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(password));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.password = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.host` accessors pair\n // https://url.spec.whatwg.org/#dom-url-host\n host: accessorDescriptor(getHost, function (host) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(host), HOST);\n }),\n // `URL.prototype.hostname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hostname\n hostname: accessorDescriptor(getHostname, function (hostname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(hostname), HOSTNAME);\n }),\n // `URL.prototype.port` accessors pair\n // https://url.spec.whatwg.org/#dom-url-port\n port: accessorDescriptor(getPort, function (port) {\n var url = getInternalURLState(this);\n if (cannotHaveUsernamePasswordPort(url)) return;\n port = String(port);\n if (port == '') url.port = null;\n else parseURL(url, port, PORT);\n }),\n // `URL.prototype.pathname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-pathname\n pathname: accessorDescriptor(getPathname, function (pathname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n url.path = [];\n parseURL(url, pathname + '', PATH_START);\n }),\n // `URL.prototype.search` accessors pair\n // https://url.spec.whatwg.org/#dom-url-search\n search: accessorDescriptor(getSearch, function (search) {\n var url = getInternalURLState(this);\n search = String(search);\n if (search == '') {\n url.query = null;\n } else {\n if ('?' == search.charAt(0)) search = search.slice(1);\n url.query = '';\n parseURL(url, search, QUERY);\n }\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.searchParams` getter\n // https://url.spec.whatwg.org/#dom-url-searchparams\n searchParams: accessorDescriptor(getSearchParams),\n // `URL.prototype.hash` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hash\n hash: accessorDescriptor(getHash, function (hash) {\n var url = getInternalURLState(this);\n hash = String(hash);\n if (hash == '') {\n url.fragment = null;\n return;\n }\n if ('#' == hash.charAt(0)) hash = hash.slice(1);\n url.fragment = '';\n parseURL(url, hash, FRAGMENT);\n })\n });\n}\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\nredefine(URLPrototype, 'toJSON', function toJSON() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\n// `URL.prototype.toString` method\n// https://url.spec.whatwg.org/#URL-stringification-behavior\nredefine(URLPrototype, 'toString', function toString() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\nif (NativeURL) {\n var nativeCreateObjectURL = NativeURL.createObjectURL;\n var nativeRevokeObjectURL = NativeURL.revokeObjectURL;\n // `URL.createObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) {\n return nativeCreateObjectURL.apply(NativeURL, arguments);\n });\n // `URL.revokeObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) {\n return nativeRevokeObjectURL.apply(NativeURL, arguments);\n });\n}\n\nsetToStringTag(URLConstructor, 'URL');\n\n$({ global: true, forced: !USE_NATIVE_URL, sham: !DESCRIPTORS }, {\n URL: URLConstructor\n});\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __nested_webpack_require_210484__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __nested_webpack_require_210484__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__nested_webpack_require_210484__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__nested_webpack_require_210484__.o(definition, key) && !__nested_webpack_require_210484__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/global */\n/******/ \t!function() {\n/******/ \t\t__nested_webpack_require_210484__.g = (function() {\n/******/ \t\t\tif (typeof globalThis === 'object') return globalThis;\n/******/ \t\t\ttry {\n/******/ \t\t\t\treturn this || new Function('return this')();\n/******/ \t\t\t} catch (e) {\n/******/ \t\t\t\tif (typeof window === 'object') return window;\n/******/ \t\t\t}\n/******/ \t\t})();\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__nested_webpack_require_210484__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/make namespace object */\n/******/ \t!function() {\n/******/ \t\t// define __esModule on exports\n/******/ \t\t__nested_webpack_require_210484__.r = function(exports) {\n/******/ \t\t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t\t}\n/******/ \t\t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/************************************************************************/\nvar __nested_webpack_exports__ = {};\n// This entry need to be wrapped in an IIFE because it need to be in strict mode.\n!function() {\n\"use strict\";\n// ESM COMPAT FLAG\n__nested_webpack_require_210484__.r(__nested_webpack_exports__);\n\n// EXPORTS\n__nested_webpack_require_210484__.d(__nested_webpack_exports__, {\n \"Dropzone\": function() { return /* reexport */ Dropzone; },\n \"default\": function() { return /* binding */ dropzone_dist; }\n});\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.concat.js\nvar es_array_concat = __nested_webpack_require_210484__(2222);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.filter.js\nvar es_array_filter = __nested_webpack_require_210484__(7327);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.index-of.js\nvar es_array_index_of = __nested_webpack_require_210484__(2772);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.iterator.js\nvar es_array_iterator = __nested_webpack_require_210484__(6992);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.map.js\nvar es_array_map = __nested_webpack_require_210484__(1249);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.slice.js\nvar es_array_slice = __nested_webpack_require_210484__(7042);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.splice.js\nvar es_array_splice = __nested_webpack_require_210484__(561);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array-buffer.constructor.js\nvar es_array_buffer_constructor = __nested_webpack_require_210484__(8264);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.function.name.js\nvar es_function_name = __nested_webpack_require_210484__(8309);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.object.get-prototype-of.js\nvar es_object_get_prototype_of = __nested_webpack_require_210484__(489);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.object.to-string.js\nvar es_object_to_string = __nested_webpack_require_210484__(1539);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.regexp.exec.js\nvar es_regexp_exec = __nested_webpack_require_210484__(4916);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.regexp.to-string.js\nvar es_regexp_to_string = __nested_webpack_require_210484__(9714);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.string.iterator.js\nvar es_string_iterator = __nested_webpack_require_210484__(8783);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.string.match.js\nvar es_string_match = __nested_webpack_require_210484__(4723);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.string.replace.js\nvar es_string_replace = __nested_webpack_require_210484__(5306);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.string.split.js\nvar es_string_split = __nested_webpack_require_210484__(3123);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.string.trim.js\nvar es_string_trim = __nested_webpack_require_210484__(3210);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.uint8-array.js\nvar es_typed_array_uint8_array = __nested_webpack_require_210484__(2472);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.copy-within.js\nvar es_typed_array_copy_within = __nested_webpack_require_210484__(2990);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.every.js\nvar es_typed_array_every = __nested_webpack_require_210484__(8927);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.fill.js\nvar es_typed_array_fill = __nested_webpack_require_210484__(3105);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.filter.js\nvar es_typed_array_filter = __nested_webpack_require_210484__(5035);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.find.js\nvar es_typed_array_find = __nested_webpack_require_210484__(4345);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.find-index.js\nvar es_typed_array_find_index = __nested_webpack_require_210484__(7174);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.for-each.js\nvar es_typed_array_for_each = __nested_webpack_require_210484__(2846);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.includes.js\nvar es_typed_array_includes = __nested_webpack_require_210484__(4731);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.index-of.js\nvar es_typed_array_index_of = __nested_webpack_require_210484__(7209);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.iterator.js\nvar es_typed_array_iterator = __nested_webpack_require_210484__(6319);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.join.js\nvar es_typed_array_join = __nested_webpack_require_210484__(8867);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.last-index-of.js\nvar es_typed_array_last_index_of = __nested_webpack_require_210484__(7789);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.map.js\nvar es_typed_array_map = __nested_webpack_require_210484__(3739);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.reduce.js\nvar es_typed_array_reduce = __nested_webpack_require_210484__(9368);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.reduce-right.js\nvar es_typed_array_reduce_right = __nested_webpack_require_210484__(4483);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.reverse.js\nvar es_typed_array_reverse = __nested_webpack_require_210484__(2056);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.set.js\nvar es_typed_array_set = __nested_webpack_require_210484__(3462);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.slice.js\nvar es_typed_array_slice = __nested_webpack_require_210484__(678);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.some.js\nvar es_typed_array_some = __nested_webpack_require_210484__(7462);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.sort.js\nvar es_typed_array_sort = __nested_webpack_require_210484__(3824);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.subarray.js\nvar es_typed_array_subarray = __nested_webpack_require_210484__(5021);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.to-locale-string.js\nvar es_typed_array_to_locale_string = __nested_webpack_require_210484__(2974);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.to-string.js\nvar es_typed_array_to_string = __nested_webpack_require_210484__(5016);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.dom-collections.for-each.js\nvar web_dom_collections_for_each = __nested_webpack_require_210484__(4747);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.dom-collections.iterator.js\nvar web_dom_collections_iterator = __nested_webpack_require_210484__(3948);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.url.js\nvar web_url = __nested_webpack_require_210484__(285);\n;// CONCATENATED MODULE: ./src/emitter.js\n\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n// The Emitter class provides the ability to call `.on()` on Dropzone to listen\n// to events.\n// It is strongly based on component's emitter class, and I removed the\n// functionality because of the dependency hell with different frameworks.\nvar Emitter = /*#__PURE__*/function () {\n function Emitter() {\n _classCallCheck(this, Emitter);\n }\n\n _createClass(Emitter, [{\n key: \"on\",\n value: // Add an event listener for given event\n function on(event, fn) {\n this._callbacks = this._callbacks || {}; // Create namespace for this event\n\n if (!this._callbacks[event]) {\n this._callbacks[event] = [];\n }\n\n this._callbacks[event].push(fn);\n\n return this;\n }\n }, {\n key: \"emit\",\n value: function emit(event) {\n this._callbacks = this._callbacks || {};\n var callbacks = this._callbacks[event];\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n if (callbacks) {\n var _iterator = _createForOfIteratorHelper(callbacks, true),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var callback = _step.value;\n callback.apply(this, args);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n } // trigger a corresponding DOM event\n\n\n if (this.element) {\n this.element.dispatchEvent(this.makeEvent(\"dropzone:\" + event, {\n args: args\n }));\n }\n\n return this;\n }\n }, {\n key: \"makeEvent\",\n value: function makeEvent(eventName, detail) {\n var params = {\n bubbles: true,\n cancelable: true,\n detail: detail\n };\n\n if (typeof window.CustomEvent === \"function\") {\n return new CustomEvent(eventName, params);\n } else {\n // IE 11 support\n // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent\n var evt = document.createEvent(\"CustomEvent\");\n evt.initCustomEvent(eventName, params.bubbles, params.cancelable, params.detail);\n return evt;\n }\n } // Remove event listener for given event. If fn is not provided, all event\n // listeners for that event will be removed. If neither is provided, all\n // event listeners will be removed.\n\n }, {\n key: \"off\",\n value: function off(event, fn) {\n if (!this._callbacks || arguments.length === 0) {\n this._callbacks = {};\n return this;\n } // specific event\n\n\n var callbacks = this._callbacks[event];\n\n if (!callbacks) {\n return this;\n } // remove all handlers\n\n\n if (arguments.length === 1) {\n delete this._callbacks[event];\n return this;\n } // remove specific handler\n\n\n for (var i = 0; i < callbacks.length; i++) {\n var callback = callbacks[i];\n\n if (callback === fn) {\n callbacks.splice(i, 1);\n break;\n }\n }\n\n return this;\n }\n }]);\n\n return Emitter;\n}();\n\n\n;// CONCATENATED MODULE: ./src/preview-template.html\n// Module\nvar code = \"
    Check
    Error
    \";\n// Exports\n/* harmony default export */ var preview_template = (code);\n;// CONCATENATED MODULE: ./src/options.js\n\n\n\n\n\nfunction options_createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = options_unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\n\nfunction options_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return options_arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return options_arrayLikeToArray(o, minLen); }\n\nfunction options_arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n\n\nvar defaultOptions = {\n /**\n * Has to be specified on elements other than form (or when the form\n * doesn't have an `action` attribute). You can also\n * provide a function that will be called with `files` and\n * must return the url (since `v3.12.0`)\n */\n url: null,\n\n /**\n * Can be changed to `\"put\"` if necessary. You can also provide a function\n * that will be called with `files` and must return the method (since `v3.12.0`).\n */\n method: \"post\",\n\n /**\n * Will be set on the XHRequest.\n */\n withCredentials: false,\n\n /**\n * The timeout for the XHR requests in milliseconds (since `v4.4.0`).\n * If set to null or 0, no timeout is going to be set.\n */\n timeout: null,\n\n /**\n * How many file uploads to process in parallel (See the\n * Enqueuing file uploads documentation section for more info)\n */\n parallelUploads: 2,\n\n /**\n * Whether to send multiple files in one request. If\n * this it set to true, then the fallback file input element will\n * have the `multiple` attribute as well. This option will\n * also trigger additional events (like `processingmultiple`). See the events\n * documentation section for more information.\n */\n uploadMultiple: false,\n\n /**\n * Whether you want files to be uploaded in chunks to your server. This can't be\n * used in combination with `uploadMultiple`.\n *\n * See [chunksUploaded](#config-chunksUploaded) for the callback to finalise an upload.\n */\n chunking: false,\n\n /**\n * If `chunking` is enabled, this defines whether **every** file should be chunked,\n * even if the file size is below chunkSize. This means, that the additional chunk\n * form data will be submitted and the `chunksUploaded` callback will be invoked.\n */\n forceChunking: false,\n\n /**\n * If `chunking` is `true`, then this defines the chunk size in bytes.\n */\n chunkSize: 2000000,\n\n /**\n * If `true`, the individual chunks of a file are being uploaded simultaneously.\n */\n parallelChunkUploads: false,\n\n /**\n * Whether a chunk should be retried if it fails.\n */\n retryChunks: false,\n\n /**\n * If `retryChunks` is true, how many times should it be retried.\n */\n retryChunksLimit: 3,\n\n /**\n * The maximum filesize (in bytes) that is allowed to be uploaded.\n */\n maxFilesize: 256,\n\n /**\n * The name of the file param that gets transferred.\n * **NOTE**: If you have the option `uploadMultiple` set to `true`, then\n * Dropzone will append `[]` to the name.\n */\n paramName: \"file\",\n\n /**\n * Whether thumbnails for images should be generated\n */\n createImageThumbnails: true,\n\n /**\n * In MB. When the filename exceeds this limit, the thumbnail will not be generated.\n */\n maxThumbnailFilesize: 10,\n\n /**\n * If `null`, the ratio of the image will be used to calculate it.\n */\n thumbnailWidth: 120,\n\n /**\n * The same as `thumbnailWidth`. If both are null, images will not be resized.\n */\n thumbnailHeight: 120,\n\n /**\n * How the images should be scaled down in case both, `thumbnailWidth` and `thumbnailHeight` are provided.\n * Can be either `contain` or `crop`.\n */\n thumbnailMethod: \"crop\",\n\n /**\n * If set, images will be resized to these dimensions before being **uploaded**.\n * If only one, `resizeWidth` **or** `resizeHeight` is provided, the original aspect\n * ratio of the file will be preserved.\n *\n * The `options.transformFile` function uses these options, so if the `transformFile` function\n * is overridden, these options don't do anything.\n */\n resizeWidth: null,\n\n /**\n * See `resizeWidth`.\n */\n resizeHeight: null,\n\n /**\n * The mime type of the resized image (before it gets uploaded to the server).\n * If `null` the original mime type will be used. To force jpeg, for example, use `image/jpeg`.\n * See `resizeWidth` for more information.\n */\n resizeMimeType: null,\n\n /**\n * The quality of the resized images. See `resizeWidth`.\n */\n resizeQuality: 0.8,\n\n /**\n * How the images should be scaled down in case both, `resizeWidth` and `resizeHeight` are provided.\n * Can be either `contain` or `crop`.\n */\n resizeMethod: \"contain\",\n\n /**\n * The base that is used to calculate the **displayed** filesize. You can\n * change this to 1024 if you would rather display kibibytes, mebibytes,\n * etc... 1024 is technically incorrect, because `1024 bytes` are `1 kibibyte`\n * not `1 kilobyte`. You can change this to `1024` if you don't care about\n * validity.\n */\n filesizeBase: 1000,\n\n /**\n * If not `null` defines how many files this Dropzone handles. If it exceeds,\n * the event `maxfilesexceeded` will be called. The dropzone element gets the\n * class `dz-max-files-reached` accordingly so you can provide visual\n * feedback.\n */\n maxFiles: null,\n\n /**\n * An optional object to send additional headers to the server. Eg:\n * `{ \"My-Awesome-Header\": \"header value\" }`\n */\n headers: null,\n\n /**\n * If `true`, the dropzone element itself will be clickable, if `false`\n * nothing will be clickable.\n *\n * You can also pass an HTML element, a CSS selector (for multiple elements)\n * or an array of those. In that case, all of those elements will trigger an\n * upload when clicked.\n */\n clickable: true,\n\n /**\n * Whether hidden files in directories should be ignored.\n */\n ignoreHiddenFiles: true,\n\n /**\n * The default implementation of `accept` checks the file's mime type or\n * extension against this list. This is a comma separated list of mime\n * types or file extensions.\n *\n * Eg.: `image/*,application/pdf,.psd`\n *\n * If the Dropzone is `clickable` this option will also be used as\n * [`accept`](https://developer.mozilla.org/en-US/docs/HTML/Element/input#attr-accept)\n * parameter on the hidden file input as well.\n */\n acceptedFiles: null,\n\n /**\n * **Deprecated!**\n * Use acceptedFiles instead.\n */\n acceptedMimeTypes: null,\n\n /**\n * If false, files will be added to the queue but the queue will not be\n * processed automatically.\n * This can be useful if you need some additional user input before sending\n * files (or if you want want all files sent at once).\n * If you're ready to send the file simply call `myDropzone.processQueue()`.\n *\n * See the [enqueuing file uploads](#enqueuing-file-uploads) documentation\n * section for more information.\n */\n autoProcessQueue: true,\n\n /**\n * If false, files added to the dropzone will not be queued by default.\n * You'll have to call `enqueueFile(file)` manually.\n */\n autoQueue: true,\n\n /**\n * If `true`, this will add a link to every file preview to remove or cancel (if\n * already uploading) the file. The `dictCancelUpload`, `dictCancelUploadConfirmation`\n * and `dictRemoveFile` options are used for the wording.\n */\n addRemoveLinks: false,\n\n /**\n * Defines where to display the file previews – if `null` the\n * Dropzone element itself is used. Can be a plain `HTMLElement` or a CSS\n * selector. The element should have the `dropzone-previews` class so\n * the previews are displayed properly.\n */\n previewsContainer: null,\n\n /**\n * Set this to `true` if you don't want previews to be shown.\n */\n disablePreviews: false,\n\n /**\n * This is the element the hidden input field (which is used when clicking on the\n * dropzone to trigger file selection) will be appended to. This might\n * be important in case you use frameworks to switch the content of your page.\n *\n * Can be a selector string, or an element directly.\n */\n hiddenInputContainer: \"body\",\n\n /**\n * If null, no capture type will be specified\n * If camera, mobile devices will skip the file selection and choose camera\n * If microphone, mobile devices will skip the file selection and choose the microphone\n * If camcorder, mobile devices will skip the file selection and choose the camera in video mode\n * On apple devices multiple must be set to false. AcceptedFiles may need to\n * be set to an appropriate mime type (e.g. \"image/*\", \"audio/*\", or \"video/*\").\n */\n capture: null,\n\n /**\n * **Deprecated**. Use `renameFile` instead.\n */\n renameFilename: null,\n\n /**\n * A function that is invoked before the file is uploaded to the server and renames the file.\n * This function gets the `File` as argument and can use the `file.name`. The actual name of the\n * file that gets used during the upload can be accessed through `file.upload.filename`.\n */\n renameFile: null,\n\n /**\n * If `true` the fallback will be forced. This is very useful to test your server\n * implementations first and make sure that everything works as\n * expected without dropzone if you experience problems, and to test\n * how your fallbacks will look.\n */\n forceFallback: false,\n\n /**\n * The text used before any files are dropped.\n */\n dictDefaultMessage: \"Drop files here to upload\",\n\n /**\n * The text that replaces the default message text it the browser is not supported.\n */\n dictFallbackMessage: \"Your browser does not support drag'n'drop file uploads.\",\n\n /**\n * The text that will be added before the fallback form.\n * If you provide a fallback element yourself, or if this option is `null` this will\n * be ignored.\n */\n dictFallbackText: \"Please use the fallback form below to upload your files like in the olden days.\",\n\n /**\n * If the filesize is too big.\n * `{{filesize}}` and `{{maxFilesize}}` will be replaced with the respective configuration values.\n */\n dictFileTooBig: \"File is too big ({{filesize}}MiB). Max filesize: {{maxFilesize}}MiB.\",\n\n /**\n * If the file doesn't match the file type.\n */\n dictInvalidFileType: \"You can't upload files of this type.\",\n\n /**\n * If the server response was invalid.\n * `{{statusCode}}` will be replaced with the servers status code.\n */\n dictResponseError: \"Server responded with {{statusCode}} code.\",\n\n /**\n * If `addRemoveLinks` is true, the text to be used for the cancel upload link.\n */\n dictCancelUpload: \"Cancel upload\",\n\n /**\n * The text that is displayed if an upload was manually canceled\n */\n dictUploadCanceled: \"Upload canceled.\",\n\n /**\n * If `addRemoveLinks` is true, the text to be used for confirmation when cancelling upload.\n */\n dictCancelUploadConfirmation: \"Are you sure you want to cancel this upload?\",\n\n /**\n * If `addRemoveLinks` is true, the text to be used to remove a file.\n */\n dictRemoveFile: \"Remove file\",\n\n /**\n * If this is not null, then the user will be prompted before removing a file.\n */\n dictRemoveFileConfirmation: null,\n\n /**\n * Displayed if `maxFiles` is st and exceeded.\n * The string `{{maxFiles}}` will be replaced by the configuration value.\n */\n dictMaxFilesExceeded: \"You can not upload any more files.\",\n\n /**\n * Allows you to translate the different units. Starting with `tb` for terabytes and going down to\n * `b` for bytes.\n */\n dictFileSizeUnits: {\n tb: \"TB\",\n gb: \"GB\",\n mb: \"MB\",\n kb: \"KB\",\n b: \"b\"\n },\n\n /**\n * Called when dropzone initialized\n * You can add event listeners here\n */\n init: function init() {},\n\n /**\n * Can be an **object** of additional parameters to transfer to the server, **or** a `Function`\n * that gets invoked with the `files`, `xhr` and, if it's a chunked upload, `chunk` arguments. In case\n * of a function, this needs to return a map.\n *\n * The default implementation does nothing for normal uploads, but adds relevant information for\n * chunked uploads.\n *\n * This is the same as adding hidden input fields in the form element.\n */\n params: function params(files, xhr, chunk) {\n if (chunk) {\n return {\n dzuuid: chunk.file.upload.uuid,\n dzchunkindex: chunk.index,\n dztotalfilesize: chunk.file.size,\n dzchunksize: this.options.chunkSize,\n dztotalchunkcount: chunk.file.upload.totalChunkCount,\n dzchunkbyteoffset: chunk.index * this.options.chunkSize\n };\n }\n },\n\n /**\n * A function that gets a [file](https://developer.mozilla.org/en-US/docs/DOM/File)\n * and a `done` function as parameters.\n *\n * If the done function is invoked without arguments, the file is \"accepted\" and will\n * be processed. If you pass an error message, the file is rejected, and the error\n * message will be displayed.\n * This function will not be called if the file is too big or doesn't match the mime types.\n */\n accept: function accept(file, done) {\n return done();\n },\n\n /**\n * The callback that will be invoked when all chunks have been uploaded for a file.\n * It gets the file for which the chunks have been uploaded as the first parameter,\n * and the `done` function as second. `done()` needs to be invoked when everything\n * needed to finish the upload process is done.\n */\n chunksUploaded: function chunksUploaded(file, done) {\n done();\n },\n\n /**\n * Gets called when the browser is not supported.\n * The default implementation shows the fallback input field and adds\n * a text.\n */\n fallback: function fallback() {\n // This code should pass in IE7... :(\n var messageElement;\n this.element.className = \"\".concat(this.element.className, \" dz-browser-not-supported\");\n\n var _iterator = options_createForOfIteratorHelper(this.element.getElementsByTagName(\"div\"), true),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var child = _step.value;\n\n if (/(^| )dz-message($| )/.test(child.className)) {\n messageElement = child;\n child.className = \"dz-message\"; // Removes the 'dz-default' class\n\n break;\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n if (!messageElement) {\n messageElement = Dropzone.createElement('
    ');\n this.element.appendChild(messageElement);\n }\n\n var span = messageElement.getElementsByTagName(\"span\")[0];\n\n if (span) {\n if (span.textContent != null) {\n span.textContent = this.options.dictFallbackMessage;\n } else if (span.innerText != null) {\n span.innerText = this.options.dictFallbackMessage;\n }\n }\n\n return this.element.appendChild(this.getFallbackForm());\n },\n\n /**\n * Gets called to calculate the thumbnail dimensions.\n *\n * It gets `file`, `width` and `height` (both may be `null`) as parameters and must return an object containing:\n *\n * - `srcWidth` & `srcHeight` (required)\n * - `trgWidth` & `trgHeight` (required)\n * - `srcX` & `srcY` (optional, default `0`)\n * - `trgX` & `trgY` (optional, default `0`)\n *\n * Those values are going to be used by `ctx.drawImage()`.\n */\n resize: function resize(file, width, height, resizeMethod) {\n var info = {\n srcX: 0,\n srcY: 0,\n srcWidth: file.width,\n srcHeight: file.height\n };\n var srcRatio = file.width / file.height; // Automatically calculate dimensions if not specified\n\n if (width == null && height == null) {\n width = info.srcWidth;\n height = info.srcHeight;\n } else if (width == null) {\n width = height * srcRatio;\n } else if (height == null) {\n height = width / srcRatio;\n } // Make sure images aren't upscaled\n\n\n width = Math.min(width, info.srcWidth);\n height = Math.min(height, info.srcHeight);\n var trgRatio = width / height;\n\n if (info.srcWidth > width || info.srcHeight > height) {\n // Image is bigger and needs rescaling\n if (resizeMethod === \"crop\") {\n if (srcRatio > trgRatio) {\n info.srcHeight = file.height;\n info.srcWidth = info.srcHeight * trgRatio;\n } else {\n info.srcWidth = file.width;\n info.srcHeight = info.srcWidth / trgRatio;\n }\n } else if (resizeMethod === \"contain\") {\n // Method 'contain'\n if (srcRatio > trgRatio) {\n height = width / srcRatio;\n } else {\n width = height * srcRatio;\n }\n } else {\n throw new Error(\"Unknown resizeMethod '\".concat(resizeMethod, \"'\"));\n }\n }\n\n info.srcX = (file.width - info.srcWidth) / 2;\n info.srcY = (file.height - info.srcHeight) / 2;\n info.trgWidth = width;\n info.trgHeight = height;\n return info;\n },\n\n /**\n * Can be used to transform the file (for example, resize an image if necessary).\n *\n * The default implementation uses `resizeWidth` and `resizeHeight` (if provided) and resizes\n * images according to those dimensions.\n *\n * Gets the `file` as the first parameter, and a `done()` function as the second, that needs\n * to be invoked with the file when the transformation is done.\n */\n transformFile: function transformFile(file, done) {\n if ((this.options.resizeWidth || this.options.resizeHeight) && file.type.match(/image.*/)) {\n return this.resizeImage(file, this.options.resizeWidth, this.options.resizeHeight, this.options.resizeMethod, done);\n } else {\n return done(file);\n }\n },\n\n /**\n * A string that contains the template used for each dropped\n * file. Change it to fulfill your needs but make sure to properly\n * provide all elements.\n *\n * If you want to use an actual HTML element instead of providing a String\n * as a config option, you could create a div with the id `tpl`,\n * put the template inside it and provide the element like this:\n *\n * document\n * .querySelector('#tpl')\n * .innerHTML\n *\n */\n previewTemplate: preview_template,\n\n /*\n Those functions register themselves to the events on init and handle all\n the user interface specific stuff. Overwriting them won't break the upload\n but can break the way it's displayed.\n You can overwrite them if you don't like the default behavior. If you just\n want to add an additional event handler, register it on the dropzone object\n and don't overwrite those options.\n */\n // Those are self explanatory and simply concern the DragnDrop.\n drop: function drop(e) {\n return this.element.classList.remove(\"dz-drag-hover\");\n },\n dragstart: function dragstart(e) {},\n dragend: function dragend(e) {\n return this.element.classList.remove(\"dz-drag-hover\");\n },\n dragenter: function dragenter(e) {\n return this.element.classList.add(\"dz-drag-hover\");\n },\n dragover: function dragover(e) {\n return this.element.classList.add(\"dz-drag-hover\");\n },\n dragleave: function dragleave(e) {\n return this.element.classList.remove(\"dz-drag-hover\");\n },\n paste: function paste(e) {},\n // Called whenever there are no files left in the dropzone anymore, and the\n // dropzone should be displayed as if in the initial state.\n reset: function reset() {\n return this.element.classList.remove(\"dz-started\");\n },\n // Called when a file is added to the queue\n // Receives `file`\n addedfile: function addedfile(file) {\n var _this = this;\n\n if (this.element === this.previewsContainer) {\n this.element.classList.add(\"dz-started\");\n }\n\n if (this.previewsContainer && !this.options.disablePreviews) {\n file.previewElement = Dropzone.createElement(this.options.previewTemplate.trim());\n file.previewTemplate = file.previewElement; // Backwards compatibility\n\n this.previewsContainer.appendChild(file.previewElement);\n\n var _iterator2 = options_createForOfIteratorHelper(file.previewElement.querySelectorAll(\"[data-dz-name]\"), true),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var node = _step2.value;\n node.textContent = file.name;\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n var _iterator3 = options_createForOfIteratorHelper(file.previewElement.querySelectorAll(\"[data-dz-size]\"), true),\n _step3;\n\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n node = _step3.value;\n node.innerHTML = this.filesize(file.size);\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n\n if (this.options.addRemoveLinks) {\n file._removeLink = Dropzone.createElement(\"
    \".concat(this.options.dictRemoveFile, \"\"));\n file.previewElement.appendChild(file._removeLink);\n }\n\n var removeFileEvent = function removeFileEvent(e) {\n e.preventDefault();\n e.stopPropagation();\n\n if (file.status === Dropzone.UPLOADING) {\n return Dropzone.confirm(_this.options.dictCancelUploadConfirmation, function () {\n return _this.removeFile(file);\n });\n } else {\n if (_this.options.dictRemoveFileConfirmation) {\n return Dropzone.confirm(_this.options.dictRemoveFileConfirmation, function () {\n return _this.removeFile(file);\n });\n } else {\n return _this.removeFile(file);\n }\n }\n };\n\n var _iterator4 = options_createForOfIteratorHelper(file.previewElement.querySelectorAll(\"[data-dz-remove]\"), true),\n _step4;\n\n try {\n for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n var removeLink = _step4.value;\n removeLink.addEventListener(\"click\", removeFileEvent);\n }\n } catch (err) {\n _iterator4.e(err);\n } finally {\n _iterator4.f();\n }\n }\n },\n // Called whenever a file is removed.\n removedfile: function removedfile(file) {\n if (file.previewElement != null && file.previewElement.parentNode != null) {\n file.previewElement.parentNode.removeChild(file.previewElement);\n }\n\n return this._updateMaxFilesReachedClass();\n },\n // Called when a thumbnail has been generated\n // Receives `file` and `dataUrl`\n thumbnail: function thumbnail(file, dataUrl) {\n if (file.previewElement) {\n file.previewElement.classList.remove(\"dz-file-preview\");\n\n var _iterator5 = options_createForOfIteratorHelper(file.previewElement.querySelectorAll(\"[data-dz-thumbnail]\"), true),\n _step5;\n\n try {\n for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {\n var thumbnailElement = _step5.value;\n thumbnailElement.alt = file.name;\n thumbnailElement.src = dataUrl;\n }\n } catch (err) {\n _iterator5.e(err);\n } finally {\n _iterator5.f();\n }\n\n return setTimeout(function () {\n return file.previewElement.classList.add(\"dz-image-preview\");\n }, 1);\n }\n },\n // Called whenever an error occurs\n // Receives `file` and `message`\n error: function error(file, message) {\n if (file.previewElement) {\n file.previewElement.classList.add(\"dz-error\");\n\n if (typeof message !== \"string\" && message.error) {\n message = message.error;\n }\n\n var _iterator6 = options_createForOfIteratorHelper(file.previewElement.querySelectorAll(\"[data-dz-errormessage]\"), true),\n _step6;\n\n try {\n for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {\n var node = _step6.value;\n node.textContent = message;\n }\n } catch (err) {\n _iterator6.e(err);\n } finally {\n _iterator6.f();\n }\n }\n },\n errormultiple: function errormultiple() {},\n // Called when a file gets processed. Since there is a cue, not all added\n // files are processed immediately.\n // Receives `file`\n processing: function processing(file) {\n if (file.previewElement) {\n file.previewElement.classList.add(\"dz-processing\");\n\n if (file._removeLink) {\n return file._removeLink.innerHTML = this.options.dictCancelUpload;\n }\n }\n },\n processingmultiple: function processingmultiple() {},\n // Called whenever the upload progress gets updated.\n // Receives `file`, `progress` (percentage 0-100) and `bytesSent`.\n // To get the total number of bytes of the file, use `file.size`\n uploadprogress: function uploadprogress(file, progress, bytesSent) {\n if (file.previewElement) {\n var _iterator7 = options_createForOfIteratorHelper(file.previewElement.querySelectorAll(\"[data-dz-uploadprogress]\"), true),\n _step7;\n\n try {\n for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {\n var node = _step7.value;\n node.nodeName === \"PROGRESS\" ? node.value = progress : node.style.width = \"\".concat(progress, \"%\");\n }\n } catch (err) {\n _iterator7.e(err);\n } finally {\n _iterator7.f();\n }\n }\n },\n // Called whenever the total upload progress gets updated.\n // Called with totalUploadProgress (0-100), totalBytes and totalBytesSent\n totaluploadprogress: function totaluploadprogress() {},\n // Called just before the file is sent. Gets the `xhr` object as second\n // parameter, so you can modify it (for example to add a CSRF token) and a\n // `formData` object to add additional information.\n sending: function sending() {},\n sendingmultiple: function sendingmultiple() {},\n // When the complete upload is finished and successful\n // Receives `file`\n success: function success(file) {\n if (file.previewElement) {\n return file.previewElement.classList.add(\"dz-success\");\n }\n },\n successmultiple: function successmultiple() {},\n // When the upload is canceled.\n canceled: function canceled(file) {\n return this.emit(\"error\", file, this.options.dictUploadCanceled);\n },\n canceledmultiple: function canceledmultiple() {},\n // When the upload is finished, either with success or an error.\n // Receives `file`\n complete: function complete(file) {\n if (file._removeLink) {\n file._removeLink.innerHTML = this.options.dictRemoveFile;\n }\n\n if (file.previewElement) {\n return file.previewElement.classList.add(\"dz-complete\");\n }\n },\n completemultiple: function completemultiple() {},\n maxfilesexceeded: function maxfilesexceeded() {},\n maxfilesreached: function maxfilesreached() {},\n queuecomplete: function queuecomplete() {},\n addedfiles: function addedfiles() {}\n};\n/* harmony default export */ var src_options = (defaultOptions);\n;// CONCATENATED MODULE: ./src/dropzone.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction dropzone_createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = dropzone_unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\n\nfunction dropzone_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return dropzone_arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return dropzone_arrayLikeToArray(o, minLen); }\n\nfunction dropzone_arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction dropzone_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction dropzone_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction dropzone_createClass(Constructor, protoProps, staticProps) { if (protoProps) dropzone_defineProperties(Constructor.prototype, protoProps); if (staticProps) dropzone_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\nvar Dropzone = /*#__PURE__*/function (_Emitter) {\n _inherits(Dropzone, _Emitter);\n\n var _super = _createSuper(Dropzone);\n\n function Dropzone(el, options) {\n var _this;\n\n dropzone_classCallCheck(this, Dropzone);\n\n _this = _super.call(this);\n var fallback, left;\n _this.element = el; // For backwards compatibility since the version was in the prototype previously\n\n _this.version = Dropzone.version;\n _this.clickableElements = [];\n _this.listeners = [];\n _this.files = []; // All files\n\n if (typeof _this.element === \"string\") {\n _this.element = document.querySelector(_this.element);\n } // Not checking if instance of HTMLElement or Element since IE9 is extremely weird.\n\n\n if (!_this.element || _this.element.nodeType == null) {\n throw new Error(\"Invalid dropzone element.\");\n }\n\n if (_this.element.dropzone) {\n throw new Error(\"Dropzone already attached.\");\n } // Now add this dropzone to the instances.\n\n\n Dropzone.instances.push(_assertThisInitialized(_this)); // Put the dropzone inside the element itself.\n\n _this.element.dropzone = _assertThisInitialized(_this);\n var elementOptions = (left = Dropzone.optionsForElement(_this.element)) != null ? left : {};\n _this.options = Dropzone.extend({}, src_options, elementOptions, options != null ? options : {});\n _this.options.previewTemplate = _this.options.previewTemplate.replace(/\\n*/g, \"\"); // If the browser failed, just call the fallback and leave\n\n if (_this.options.forceFallback || !Dropzone.isBrowserSupported()) {\n return _possibleConstructorReturn(_this, _this.options.fallback.call(_assertThisInitialized(_this)));\n } // @options.url = @element.getAttribute \"action\" unless @options.url?\n\n\n if (_this.options.url == null) {\n _this.options.url = _this.element.getAttribute(\"action\");\n }\n\n if (!_this.options.url) {\n throw new Error(\"No URL provided.\");\n }\n\n if (_this.options.acceptedFiles && _this.options.acceptedMimeTypes) {\n throw new Error(\"You can't provide both 'acceptedFiles' and 'acceptedMimeTypes'. 'acceptedMimeTypes' is deprecated.\");\n }\n\n if (_this.options.uploadMultiple && _this.options.chunking) {\n throw new Error(\"You cannot set both: uploadMultiple and chunking.\");\n } // Backwards compatibility\n\n\n if (_this.options.acceptedMimeTypes) {\n _this.options.acceptedFiles = _this.options.acceptedMimeTypes;\n delete _this.options.acceptedMimeTypes;\n } // Backwards compatibility\n\n\n if (_this.options.renameFilename != null) {\n _this.options.renameFile = function (file) {\n return _this.options.renameFilename.call(_assertThisInitialized(_this), file.name, file);\n };\n }\n\n if (typeof _this.options.method === \"string\") {\n _this.options.method = _this.options.method.toUpperCase();\n }\n\n if ((fallback = _this.getExistingFallback()) && fallback.parentNode) {\n // Remove the fallback\n fallback.parentNode.removeChild(fallback);\n } // Display previews in the previewsContainer element or the Dropzone element unless explicitly set to false\n\n\n if (_this.options.previewsContainer !== false) {\n if (_this.options.previewsContainer) {\n _this.previewsContainer = Dropzone.getElement(_this.options.previewsContainer, \"previewsContainer\");\n } else {\n _this.previewsContainer = _this.element;\n }\n }\n\n if (_this.options.clickable) {\n if (_this.options.clickable === true) {\n _this.clickableElements = [_this.element];\n } else {\n _this.clickableElements = Dropzone.getElements(_this.options.clickable, \"clickable\");\n }\n }\n\n _this.init();\n\n return _this;\n } // Returns all files that have been accepted\n\n\n dropzone_createClass(Dropzone, [{\n key: \"getAcceptedFiles\",\n value: function getAcceptedFiles() {\n return this.files.filter(function (file) {\n return file.accepted;\n }).map(function (file) {\n return file;\n });\n } // Returns all files that have been rejected\n // Not sure when that's going to be useful, but added for completeness.\n\n }, {\n key: \"getRejectedFiles\",\n value: function getRejectedFiles() {\n return this.files.filter(function (file) {\n return !file.accepted;\n }).map(function (file) {\n return file;\n });\n }\n }, {\n key: \"getFilesWithStatus\",\n value: function getFilesWithStatus(status) {\n return this.files.filter(function (file) {\n return file.status === status;\n }).map(function (file) {\n return file;\n });\n } // Returns all files that are in the queue\n\n }, {\n key: \"getQueuedFiles\",\n value: function getQueuedFiles() {\n return this.getFilesWithStatus(Dropzone.QUEUED);\n }\n }, {\n key: \"getUploadingFiles\",\n value: function getUploadingFiles() {\n return this.getFilesWithStatus(Dropzone.UPLOADING);\n }\n }, {\n key: \"getAddedFiles\",\n value: function getAddedFiles() {\n return this.getFilesWithStatus(Dropzone.ADDED);\n } // Files that are either queued or uploading\n\n }, {\n key: \"getActiveFiles\",\n value: function getActiveFiles() {\n return this.files.filter(function (file) {\n return file.status === Dropzone.UPLOADING || file.status === Dropzone.QUEUED;\n }).map(function (file) {\n return file;\n });\n } // The function that gets called when Dropzone is initialized. You\n // can (and should) setup event listeners inside this function.\n\n }, {\n key: \"init\",\n value: function init() {\n var _this2 = this;\n\n // In case it isn't set already\n if (this.element.tagName === \"form\") {\n this.element.setAttribute(\"enctype\", \"multipart/form-data\");\n }\n\n if (this.element.classList.contains(\"dropzone\") && !this.element.querySelector(\".dz-message\")) {\n this.element.appendChild(Dropzone.createElement(\"
    \")));\n }\n\n if (this.clickableElements.length) {\n var setupHiddenFileInput = function setupHiddenFileInput() {\n if (_this2.hiddenFileInput) {\n _this2.hiddenFileInput.parentNode.removeChild(_this2.hiddenFileInput);\n }\n\n _this2.hiddenFileInput = document.createElement(\"input\");\n\n _this2.hiddenFileInput.setAttribute(\"type\", \"file\");\n\n if (_this2.options.maxFiles === null || _this2.options.maxFiles > 1) {\n _this2.hiddenFileInput.setAttribute(\"multiple\", \"multiple\");\n }\n\n _this2.hiddenFileInput.className = \"dz-hidden-input\";\n\n if (_this2.options.acceptedFiles !== null) {\n _this2.hiddenFileInput.setAttribute(\"accept\", _this2.options.acceptedFiles);\n }\n\n if (_this2.options.capture !== null) {\n _this2.hiddenFileInput.setAttribute(\"capture\", _this2.options.capture);\n } // Making sure that no one can \"tab\" into this field.\n\n\n _this2.hiddenFileInput.setAttribute(\"tabindex\", \"-1\"); // Not setting `display=\"none\"` because some browsers don't accept clicks\n // on elements that aren't displayed.\n\n\n _this2.hiddenFileInput.style.visibility = \"hidden\";\n _this2.hiddenFileInput.style.position = \"absolute\";\n _this2.hiddenFileInput.style.top = \"0\";\n _this2.hiddenFileInput.style.left = \"0\";\n _this2.hiddenFileInput.style.height = \"0\";\n _this2.hiddenFileInput.style.width = \"0\";\n Dropzone.getElement(_this2.options.hiddenInputContainer, \"hiddenInputContainer\").appendChild(_this2.hiddenFileInput);\n\n _this2.hiddenFileInput.addEventListener(\"change\", function () {\n var files = _this2.hiddenFileInput.files;\n\n if (files.length) {\n var _iterator = dropzone_createForOfIteratorHelper(files, true),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var file = _step.value;\n\n _this2.addFile(file);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n }\n\n _this2.emit(\"addedfiles\", files);\n\n setupHiddenFileInput();\n });\n };\n\n setupHiddenFileInput();\n }\n\n this.URL = window.URL !== null ? window.URL : window.webkitURL; // Setup all event listeners on the Dropzone object itself.\n // They're not in @setupEventListeners() because they shouldn't be removed\n // again when the dropzone gets disabled.\n\n var _iterator2 = dropzone_createForOfIteratorHelper(this.events, true),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var eventName = _step2.value;\n this.on(eventName, this.options[eventName]);\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n this.on(\"uploadprogress\", function () {\n return _this2.updateTotalUploadProgress();\n });\n this.on(\"removedfile\", function () {\n return _this2.updateTotalUploadProgress();\n });\n this.on(\"canceled\", function (file) {\n return _this2.emit(\"complete\", file);\n }); // Emit a `queuecomplete` event if all files finished uploading.\n\n this.on(\"complete\", function (file) {\n if (_this2.getAddedFiles().length === 0 && _this2.getUploadingFiles().length === 0 && _this2.getQueuedFiles().length === 0) {\n // This needs to be deferred so that `queuecomplete` really triggers after `complete`\n return setTimeout(function () {\n return _this2.emit(\"queuecomplete\");\n }, 0);\n }\n });\n\n var containsFiles = function containsFiles(e) {\n if (e.dataTransfer.types) {\n // Because e.dataTransfer.types is an Object in\n // IE, we need to iterate like this instead of\n // using e.dataTransfer.types.some()\n for (var i = 0; i < e.dataTransfer.types.length; i++) {\n if (e.dataTransfer.types[i] === \"Files\") return true;\n }\n }\n\n return false;\n };\n\n var noPropagation = function noPropagation(e) {\n // If there are no files, we don't want to stop\n // propagation so we don't interfere with other\n // drag and drop behaviour.\n if (!containsFiles(e)) return;\n e.stopPropagation();\n\n if (e.preventDefault) {\n return e.preventDefault();\n } else {\n return e.returnValue = false;\n }\n }; // Create the listeners\n\n\n this.listeners = [{\n element: this.element,\n events: {\n dragstart: function dragstart(e) {\n return _this2.emit(\"dragstart\", e);\n },\n dragenter: function dragenter(e) {\n noPropagation(e);\n return _this2.emit(\"dragenter\", e);\n },\n dragover: function dragover(e) {\n // Makes it possible to drag files from chrome's download bar\n // http://stackoverflow.com/questions/19526430/drag-and-drop-file-uploads-from-chrome-downloads-bar\n // Try is required to prevent bug in Internet Explorer 11 (SCRIPT65535 exception)\n var efct;\n\n try {\n efct = e.dataTransfer.effectAllowed;\n } catch (error) {}\n\n e.dataTransfer.dropEffect = \"move\" === efct || \"linkMove\" === efct ? \"move\" : \"copy\";\n noPropagation(e);\n return _this2.emit(\"dragover\", e);\n },\n dragleave: function dragleave(e) {\n return _this2.emit(\"dragleave\", e);\n },\n drop: function drop(e) {\n noPropagation(e);\n return _this2.drop(e);\n },\n dragend: function dragend(e) {\n return _this2.emit(\"dragend\", e);\n }\n } // This is disabled right now, because the browsers don't implement it properly.\n // \"paste\": (e) =>\n // noPropagation e\n // @paste e\n\n }];\n this.clickableElements.forEach(function (clickableElement) {\n return _this2.listeners.push({\n element: clickableElement,\n events: {\n click: function click(evt) {\n // Only the actual dropzone or the message element should trigger file selection\n if (clickableElement !== _this2.element || evt.target === _this2.element || Dropzone.elementInside(evt.target, _this2.element.querySelector(\".dz-message\"))) {\n _this2.hiddenFileInput.click(); // Forward the click\n\n }\n\n return true;\n }\n }\n });\n });\n this.enable();\n return this.options.init.call(this);\n } // Not fully tested yet\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.disable();\n this.removeAllFiles(true);\n\n if (this.hiddenFileInput != null ? this.hiddenFileInput.parentNode : undefined) {\n this.hiddenFileInput.parentNode.removeChild(this.hiddenFileInput);\n this.hiddenFileInput = null;\n }\n\n delete this.element.dropzone;\n return Dropzone.instances.splice(Dropzone.instances.indexOf(this), 1);\n }\n }, {\n key: \"updateTotalUploadProgress\",\n value: function updateTotalUploadProgress() {\n var totalUploadProgress;\n var totalBytesSent = 0;\n var totalBytes = 0;\n var activeFiles = this.getActiveFiles();\n\n if (activeFiles.length) {\n var _iterator3 = dropzone_createForOfIteratorHelper(this.getActiveFiles(), true),\n _step3;\n\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n var file = _step3.value;\n totalBytesSent += file.upload.bytesSent;\n totalBytes += file.upload.total;\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n\n totalUploadProgress = 100 * totalBytesSent / totalBytes;\n } else {\n totalUploadProgress = 100;\n }\n\n return this.emit(\"totaluploadprogress\", totalUploadProgress, totalBytes, totalBytesSent);\n } // @options.paramName can be a function taking one parameter rather than a string.\n // A parameter name for a file is obtained simply by calling this with an index number.\n\n }, {\n key: \"_getParamName\",\n value: function _getParamName(n) {\n if (typeof this.options.paramName === \"function\") {\n return this.options.paramName(n);\n } else {\n return \"\".concat(this.options.paramName).concat(this.options.uploadMultiple ? \"[\".concat(n, \"]\") : \"\");\n }\n } // If @options.renameFile is a function,\n // the function will be used to rename the file.name before appending it to the formData\n\n }, {\n key: \"_renameFile\",\n value: function _renameFile(file) {\n if (typeof this.options.renameFile !== \"function\") {\n return file.name;\n }\n\n return this.options.renameFile(file);\n } // Returns a form that can be used as fallback if the browser does not support DragnDrop\n //\n // If the dropzone is already a form, only the input field and button are returned. Otherwise a complete form element is provided.\n // This code has to pass in IE7 :(\n\n }, {\n key: \"getFallbackForm\",\n value: function getFallbackForm() {\n var existingFallback, form;\n\n if (existingFallback = this.getExistingFallback()) {\n return existingFallback;\n }\n\n var fieldsString = '
    ';\n\n if (this.options.dictFallbackText) {\n fieldsString += \"

    \".concat(this.options.dictFallbackText, \"

    \");\n }\n\n fieldsString += \"
    \");\n var fields = Dropzone.createElement(fieldsString);\n\n if (this.element.tagName !== \"FORM\") {\n form = Dropzone.createElement(\"
    \"));\n form.appendChild(fields);\n } else {\n // Make sure that the enctype and method attributes are set properly\n this.element.setAttribute(\"enctype\", \"multipart/form-data\");\n this.element.setAttribute(\"method\", this.options.method);\n }\n\n return form != null ? form : fields;\n } // Returns the fallback elements if they exist already\n //\n // This code has to pass in IE7 :(\n\n }, {\n key: \"getExistingFallback\",\n value: function getExistingFallback() {\n var getFallback = function getFallback(elements) {\n var _iterator4 = dropzone_createForOfIteratorHelper(elements, true),\n _step4;\n\n try {\n for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n var el = _step4.value;\n\n if (/(^| )fallback($| )/.test(el.className)) {\n return el;\n }\n }\n } catch (err) {\n _iterator4.e(err);\n } finally {\n _iterator4.f();\n }\n };\n\n for (var _i = 0, _arr = [\"div\", \"form\"]; _i < _arr.length; _i++) {\n var tagName = _arr[_i];\n var fallback;\n\n if (fallback = getFallback(this.element.getElementsByTagName(tagName))) {\n return fallback;\n }\n }\n } // Activates all listeners stored in @listeners\n\n }, {\n key: \"setupEventListeners\",\n value: function setupEventListeners() {\n return this.listeners.map(function (elementListeners) {\n return function () {\n var result = [];\n\n for (var event in elementListeners.events) {\n var listener = elementListeners.events[event];\n result.push(elementListeners.element.addEventListener(event, listener, false));\n }\n\n return result;\n }();\n });\n } // Deactivates all listeners stored in @listeners\n\n }, {\n key: \"removeEventListeners\",\n value: function removeEventListeners() {\n return this.listeners.map(function (elementListeners) {\n return function () {\n var result = [];\n\n for (var event in elementListeners.events) {\n var listener = elementListeners.events[event];\n result.push(elementListeners.element.removeEventListener(event, listener, false));\n }\n\n return result;\n }();\n });\n } // Removes all event listeners and cancels all files in the queue or being processed.\n\n }, {\n key: \"disable\",\n value: function disable() {\n var _this3 = this;\n\n this.clickableElements.forEach(function (element) {\n return element.classList.remove(\"dz-clickable\");\n });\n this.removeEventListeners();\n this.disabled = true;\n return this.files.map(function (file) {\n return _this3.cancelUpload(file);\n });\n }\n }, {\n key: \"enable\",\n value: function enable() {\n delete this.disabled;\n this.clickableElements.forEach(function (element) {\n return element.classList.add(\"dz-clickable\");\n });\n return this.setupEventListeners();\n } // Returns a nicely formatted filesize\n\n }, {\n key: \"filesize\",\n value: function filesize(size) {\n var selectedSize = 0;\n var selectedUnit = \"b\";\n\n if (size > 0) {\n var units = [\"tb\", \"gb\", \"mb\", \"kb\", \"b\"];\n\n for (var i = 0; i < units.length; i++) {\n var unit = units[i];\n var cutoff = Math.pow(this.options.filesizeBase, 4 - i) / 10;\n\n if (size >= cutoff) {\n selectedSize = size / Math.pow(this.options.filesizeBase, 4 - i);\n selectedUnit = unit;\n break;\n }\n }\n\n selectedSize = Math.round(10 * selectedSize) / 10; // Cutting of digits\n }\n\n return \"\".concat(selectedSize, \" \").concat(this.options.dictFileSizeUnits[selectedUnit]);\n } // Adds or removes the `dz-max-files-reached` class from the form.\n\n }, {\n key: \"_updateMaxFilesReachedClass\",\n value: function _updateMaxFilesReachedClass() {\n if (this.options.maxFiles != null && this.getAcceptedFiles().length >= this.options.maxFiles) {\n if (this.getAcceptedFiles().length === this.options.maxFiles) {\n this.emit(\"maxfilesreached\", this.files);\n }\n\n return this.element.classList.add(\"dz-max-files-reached\");\n } else {\n return this.element.classList.remove(\"dz-max-files-reached\");\n }\n }\n }, {\n key: \"drop\",\n value: function drop(e) {\n if (!e.dataTransfer) {\n return;\n }\n\n this.emit(\"drop\", e); // Convert the FileList to an Array\n // This is necessary for IE11\n\n var files = [];\n\n for (var i = 0; i < e.dataTransfer.files.length; i++) {\n files[i] = e.dataTransfer.files[i];\n } // Even if it's a folder, files.length will contain the folders.\n\n\n if (files.length) {\n var items = e.dataTransfer.items;\n\n if (items && items.length && items[0].webkitGetAsEntry != null) {\n // The browser supports dropping of folders, so handle items instead of files\n this._addFilesFromItems(items);\n } else {\n this.handleFiles(files);\n }\n }\n\n this.emit(\"addedfiles\", files);\n }\n }, {\n key: \"paste\",\n value: function paste(e) {\n if (__guard__(e != null ? e.clipboardData : undefined, function (x) {\n return x.items;\n }) == null) {\n return;\n }\n\n this.emit(\"paste\", e);\n var items = e.clipboardData.items;\n\n if (items.length) {\n return this._addFilesFromItems(items);\n }\n }\n }, {\n key: \"handleFiles\",\n value: function handleFiles(files) {\n var _iterator5 = dropzone_createForOfIteratorHelper(files, true),\n _step5;\n\n try {\n for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {\n var file = _step5.value;\n this.addFile(file);\n }\n } catch (err) {\n _iterator5.e(err);\n } finally {\n _iterator5.f();\n }\n } // When a folder is dropped (or files are pasted), items must be handled\n // instead of files.\n\n }, {\n key: \"_addFilesFromItems\",\n value: function _addFilesFromItems(items) {\n var _this4 = this;\n\n return function () {\n var result = [];\n\n var _iterator6 = dropzone_createForOfIteratorHelper(items, true),\n _step6;\n\n try {\n for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {\n var item = _step6.value;\n var entry;\n\n if (item.webkitGetAsEntry != null && (entry = item.webkitGetAsEntry())) {\n if (entry.isFile) {\n result.push(_this4.addFile(item.getAsFile()));\n } else if (entry.isDirectory) {\n // Append all files from that directory to files\n result.push(_this4._addFilesFromDirectory(entry, entry.name));\n } else {\n result.push(undefined);\n }\n } else if (item.getAsFile != null) {\n if (item.kind == null || item.kind === \"file\") {\n result.push(_this4.addFile(item.getAsFile()));\n } else {\n result.push(undefined);\n }\n } else {\n result.push(undefined);\n }\n }\n } catch (err) {\n _iterator6.e(err);\n } finally {\n _iterator6.f();\n }\n\n return result;\n }();\n } // Goes through the directory, and adds each file it finds recursively\n\n }, {\n key: \"_addFilesFromDirectory\",\n value: function _addFilesFromDirectory(directory, path) {\n var _this5 = this;\n\n var dirReader = directory.createReader();\n\n var errorHandler = function errorHandler(error) {\n return __guardMethod__(console, \"log\", function (o) {\n return o.log(error);\n });\n };\n\n var readEntries = function readEntries() {\n return dirReader.readEntries(function (entries) {\n if (entries.length > 0) {\n var _iterator7 = dropzone_createForOfIteratorHelper(entries, true),\n _step7;\n\n try {\n for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {\n var entry = _step7.value;\n\n if (entry.isFile) {\n entry.file(function (file) {\n if (_this5.options.ignoreHiddenFiles && file.name.substring(0, 1) === \".\") {\n return;\n }\n\n file.fullPath = \"\".concat(path, \"/\").concat(file.name);\n return _this5.addFile(file);\n });\n } else if (entry.isDirectory) {\n _this5._addFilesFromDirectory(entry, \"\".concat(path, \"/\").concat(entry.name));\n }\n } // Recursively call readEntries() again, since browser only handle\n // the first 100 entries.\n // See: https://developer.mozilla.org/en-US/docs/Web/API/DirectoryReader#readEntries\n\n } catch (err) {\n _iterator7.e(err);\n } finally {\n _iterator7.f();\n }\n\n readEntries();\n }\n\n return null;\n }, errorHandler);\n };\n\n return readEntries();\n } // If `done()` is called without argument the file is accepted\n // If you call it with an error message, the file is rejected\n // (This allows for asynchronous validation)\n //\n // This function checks the filesize, and if the file.type passes the\n // `acceptedFiles` check.\n\n }, {\n key: \"accept\",\n value: function accept(file, done) {\n if (this.options.maxFilesize && file.size > this.options.maxFilesize * 1024 * 1024) {\n done(this.options.dictFileTooBig.replace(\"{{filesize}}\", Math.round(file.size / 1024 / 10.24) / 100).replace(\"{{maxFilesize}}\", this.options.maxFilesize));\n } else if (!Dropzone.isValidFile(file, this.options.acceptedFiles)) {\n done(this.options.dictInvalidFileType);\n } else if (this.options.maxFiles != null && this.getAcceptedFiles().length >= this.options.maxFiles) {\n done(this.options.dictMaxFilesExceeded.replace(\"{{maxFiles}}\", this.options.maxFiles));\n this.emit(\"maxfilesexceeded\", file);\n } else {\n this.options.accept.call(this, file, done);\n }\n }\n }, {\n key: \"addFile\",\n value: function addFile(file) {\n var _this6 = this;\n\n file.upload = {\n uuid: Dropzone.uuidv4(),\n progress: 0,\n // Setting the total upload size to file.size for the beginning\n // It's actual different than the size to be transmitted.\n total: file.size,\n bytesSent: 0,\n filename: this._renameFile(file) // Not setting chunking information here, because the acutal data — and\n // thus the chunks — might change if `options.transformFile` is set\n // and does something to the data.\n\n };\n this.files.push(file);\n file.status = Dropzone.ADDED;\n this.emit(\"addedfile\", file);\n\n this._enqueueThumbnail(file);\n\n this.accept(file, function (error) {\n if (error) {\n file.accepted = false;\n\n _this6._errorProcessing([file], error); // Will set the file.status\n\n } else {\n file.accepted = true;\n\n if (_this6.options.autoQueue) {\n _this6.enqueueFile(file);\n } // Will set .accepted = true\n\n }\n\n _this6._updateMaxFilesReachedClass();\n });\n } // Wrapper for enqueueFile\n\n }, {\n key: \"enqueueFiles\",\n value: function enqueueFiles(files) {\n var _iterator8 = dropzone_createForOfIteratorHelper(files, true),\n _step8;\n\n try {\n for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {\n var file = _step8.value;\n this.enqueueFile(file);\n }\n } catch (err) {\n _iterator8.e(err);\n } finally {\n _iterator8.f();\n }\n\n return null;\n }\n }, {\n key: \"enqueueFile\",\n value: function enqueueFile(file) {\n var _this7 = this;\n\n if (file.status === Dropzone.ADDED && file.accepted === true) {\n file.status = Dropzone.QUEUED;\n\n if (this.options.autoProcessQueue) {\n return setTimeout(function () {\n return _this7.processQueue();\n }, 0); // Deferring the call\n }\n } else {\n throw new Error(\"This file can't be queued because it has already been processed or was rejected.\");\n }\n }\n }, {\n key: \"_enqueueThumbnail\",\n value: function _enqueueThumbnail(file) {\n var _this8 = this;\n\n if (this.options.createImageThumbnails && file.type.match(/image.*/) && file.size <= this.options.maxThumbnailFilesize * 1024 * 1024) {\n this._thumbnailQueue.push(file);\n\n return setTimeout(function () {\n return _this8._processThumbnailQueue();\n }, 0); // Deferring the call\n }\n }\n }, {\n key: \"_processThumbnailQueue\",\n value: function _processThumbnailQueue() {\n var _this9 = this;\n\n if (this._processingThumbnail || this._thumbnailQueue.length === 0) {\n return;\n }\n\n this._processingThumbnail = true;\n\n var file = this._thumbnailQueue.shift();\n\n return this.createThumbnail(file, this.options.thumbnailWidth, this.options.thumbnailHeight, this.options.thumbnailMethod, true, function (dataUrl) {\n _this9.emit(\"thumbnail\", file, dataUrl);\n\n _this9._processingThumbnail = false;\n return _this9._processThumbnailQueue();\n });\n } // Can be called by the user to remove a file\n\n }, {\n key: \"removeFile\",\n value: function removeFile(file) {\n if (file.status === Dropzone.UPLOADING) {\n this.cancelUpload(file);\n }\n\n this.files = without(this.files, file);\n this.emit(\"removedfile\", file);\n\n if (this.files.length === 0) {\n return this.emit(\"reset\");\n }\n } // Removes all files that aren't currently processed from the list\n\n }, {\n key: \"removeAllFiles\",\n value: function removeAllFiles(cancelIfNecessary) {\n // Create a copy of files since removeFile() changes the @files array.\n if (cancelIfNecessary == null) {\n cancelIfNecessary = false;\n }\n\n var _iterator9 = dropzone_createForOfIteratorHelper(this.files.slice(), true),\n _step9;\n\n try {\n for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {\n var file = _step9.value;\n\n if (file.status !== Dropzone.UPLOADING || cancelIfNecessary) {\n this.removeFile(file);\n }\n }\n } catch (err) {\n _iterator9.e(err);\n } finally {\n _iterator9.f();\n }\n\n return null;\n } // Resizes an image before it gets sent to the server. This function is the default behavior of\n // `options.transformFile` if `resizeWidth` or `resizeHeight` are set. The callback is invoked with\n // the resized blob.\n\n }, {\n key: \"resizeImage\",\n value: function resizeImage(file, width, height, resizeMethod, callback) {\n var _this10 = this;\n\n return this.createThumbnail(file, width, height, resizeMethod, true, function (dataUrl, canvas) {\n if (canvas == null) {\n // The image has not been resized\n return callback(file);\n } else {\n var resizeMimeType = _this10.options.resizeMimeType;\n\n if (resizeMimeType == null) {\n resizeMimeType = file.type;\n }\n\n var resizedDataURL = canvas.toDataURL(resizeMimeType, _this10.options.resizeQuality);\n\n if (resizeMimeType === \"image/jpeg\" || resizeMimeType === \"image/jpg\") {\n // Now add the original EXIF information\n resizedDataURL = ExifRestore.restore(file.dataURL, resizedDataURL);\n }\n\n return callback(Dropzone.dataURItoBlob(resizedDataURL));\n }\n });\n }\n }, {\n key: \"createThumbnail\",\n value: function createThumbnail(file, width, height, resizeMethod, fixOrientation, callback) {\n var _this11 = this;\n\n var fileReader = new FileReader();\n\n fileReader.onload = function () {\n file.dataURL = fileReader.result; // Don't bother creating a thumbnail for SVG images since they're vector\n\n if (file.type === \"image/svg+xml\") {\n if (callback != null) {\n callback(fileReader.result);\n }\n\n return;\n }\n\n _this11.createThumbnailFromUrl(file, width, height, resizeMethod, fixOrientation, callback);\n };\n\n fileReader.readAsDataURL(file);\n } // `mockFile` needs to have these attributes:\n //\n // { name: 'name', size: 12345, imageUrl: '' }\n //\n // `callback` will be invoked when the image has been downloaded and displayed.\n // `crossOrigin` will be added to the `img` tag when accessing the file.\n\n }, {\n key: \"displayExistingFile\",\n value: function displayExistingFile(mockFile, imageUrl, callback, crossOrigin) {\n var _this12 = this;\n\n var resizeThumbnail = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n this.emit(\"addedfile\", mockFile);\n this.emit(\"complete\", mockFile);\n\n if (!resizeThumbnail) {\n this.emit(\"thumbnail\", mockFile, imageUrl);\n if (callback) callback();\n } else {\n var onDone = function onDone(thumbnail) {\n _this12.emit(\"thumbnail\", mockFile, thumbnail);\n\n if (callback) callback();\n };\n\n mockFile.dataURL = imageUrl;\n this.createThumbnailFromUrl(mockFile, this.options.thumbnailWidth, this.options.thumbnailHeight, this.options.thumbnailMethod, this.options.fixOrientation, onDone, crossOrigin);\n }\n }\n }, {\n key: \"createThumbnailFromUrl\",\n value: function createThumbnailFromUrl(file, width, height, resizeMethod, fixOrientation, callback, crossOrigin) {\n var _this13 = this;\n\n // Not using `new Image` here because of a bug in latest Chrome versions.\n // See https://github.com/enyo/dropzone/pull/226\n var img = document.createElement(\"img\");\n\n if (crossOrigin) {\n img.crossOrigin = crossOrigin;\n } // fixOrientation is not needed anymore with browsers handling imageOrientation\n\n\n fixOrientation = getComputedStyle(document.body)[\"imageOrientation\"] == \"from-image\" ? false : fixOrientation;\n\n img.onload = function () {\n var loadExif = function loadExif(callback) {\n return callback(1);\n };\n\n if (typeof EXIF !== \"undefined\" && EXIF !== null && fixOrientation) {\n loadExif = function loadExif(callback) {\n return EXIF.getData(img, function () {\n return callback(EXIF.getTag(this, \"Orientation\"));\n });\n };\n }\n\n return loadExif(function (orientation) {\n file.width = img.width;\n file.height = img.height;\n\n var resizeInfo = _this13.options.resize.call(_this13, file, width, height, resizeMethod);\n\n var canvas = document.createElement(\"canvas\");\n var ctx = canvas.getContext(\"2d\");\n canvas.width = resizeInfo.trgWidth;\n canvas.height = resizeInfo.trgHeight;\n\n if (orientation > 4) {\n canvas.width = resizeInfo.trgHeight;\n canvas.height = resizeInfo.trgWidth;\n }\n\n switch (orientation) {\n case 2:\n // horizontal flip\n ctx.translate(canvas.width, 0);\n ctx.scale(-1, 1);\n break;\n\n case 3:\n // 180° rotate left\n ctx.translate(canvas.width, canvas.height);\n ctx.rotate(Math.PI);\n break;\n\n case 4:\n // vertical flip\n ctx.translate(0, canvas.height);\n ctx.scale(1, -1);\n break;\n\n case 5:\n // vertical flip + 90 rotate right\n ctx.rotate(0.5 * Math.PI);\n ctx.scale(1, -1);\n break;\n\n case 6:\n // 90° rotate right\n ctx.rotate(0.5 * Math.PI);\n ctx.translate(0, -canvas.width);\n break;\n\n case 7:\n // horizontal flip + 90 rotate right\n ctx.rotate(0.5 * Math.PI);\n ctx.translate(canvas.height, -canvas.width);\n ctx.scale(-1, 1);\n break;\n\n case 8:\n // 90° rotate left\n ctx.rotate(-0.5 * Math.PI);\n ctx.translate(-canvas.height, 0);\n break;\n } // This is a bugfix for iOS' scaling bug.\n\n\n drawImageIOSFix(ctx, img, resizeInfo.srcX != null ? resizeInfo.srcX : 0, resizeInfo.srcY != null ? resizeInfo.srcY : 0, resizeInfo.srcWidth, resizeInfo.srcHeight, resizeInfo.trgX != null ? resizeInfo.trgX : 0, resizeInfo.trgY != null ? resizeInfo.trgY : 0, resizeInfo.trgWidth, resizeInfo.trgHeight);\n var thumbnail = canvas.toDataURL(\"image/png\");\n\n if (callback != null) {\n return callback(thumbnail, canvas);\n }\n });\n };\n\n if (callback != null) {\n img.onerror = callback;\n }\n\n return img.src = file.dataURL;\n } // Goes through the queue and processes files if there aren't too many already.\n\n }, {\n key: \"processQueue\",\n value: function processQueue() {\n var parallelUploads = this.options.parallelUploads;\n var processingLength = this.getUploadingFiles().length;\n var i = processingLength; // There are already at least as many files uploading than should be\n\n if (processingLength >= parallelUploads) {\n return;\n }\n\n var queuedFiles = this.getQueuedFiles();\n\n if (!(queuedFiles.length > 0)) {\n return;\n }\n\n if (this.options.uploadMultiple) {\n // The files should be uploaded in one request\n return this.processFiles(queuedFiles.slice(0, parallelUploads - processingLength));\n } else {\n while (i < parallelUploads) {\n if (!queuedFiles.length) {\n return;\n } // Nothing left to process\n\n\n this.processFile(queuedFiles.shift());\n i++;\n }\n }\n } // Wrapper for `processFiles`\n\n }, {\n key: \"processFile\",\n value: function processFile(file) {\n return this.processFiles([file]);\n } // Loads the file, then calls finishedLoading()\n\n }, {\n key: \"processFiles\",\n value: function processFiles(files) {\n var _iterator10 = dropzone_createForOfIteratorHelper(files, true),\n _step10;\n\n try {\n for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {\n var file = _step10.value;\n file.processing = true; // Backwards compatibility\n\n file.status = Dropzone.UPLOADING;\n this.emit(\"processing\", file);\n }\n } catch (err) {\n _iterator10.e(err);\n } finally {\n _iterator10.f();\n }\n\n if (this.options.uploadMultiple) {\n this.emit(\"processingmultiple\", files);\n }\n\n return this.uploadFiles(files);\n }\n }, {\n key: \"_getFilesWithXhr\",\n value: function _getFilesWithXhr(xhr) {\n var files;\n return files = this.files.filter(function (file) {\n return file.xhr === xhr;\n }).map(function (file) {\n return file;\n });\n } // Cancels the file upload and sets the status to CANCELED\n // **if** the file is actually being uploaded.\n // If it's still in the queue, the file is being removed from it and the status\n // set to CANCELED.\n\n }, {\n key: \"cancelUpload\",\n value: function cancelUpload(file) {\n if (file.status === Dropzone.UPLOADING) {\n var groupedFiles = this._getFilesWithXhr(file.xhr);\n\n var _iterator11 = dropzone_createForOfIteratorHelper(groupedFiles, true),\n _step11;\n\n try {\n for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) {\n var groupedFile = _step11.value;\n groupedFile.status = Dropzone.CANCELED;\n }\n } catch (err) {\n _iterator11.e(err);\n } finally {\n _iterator11.f();\n }\n\n if (typeof file.xhr !== \"undefined\") {\n file.xhr.abort();\n }\n\n var _iterator12 = dropzone_createForOfIteratorHelper(groupedFiles, true),\n _step12;\n\n try {\n for (_iterator12.s(); !(_step12 = _iterator12.n()).done;) {\n var _groupedFile = _step12.value;\n this.emit(\"canceled\", _groupedFile);\n }\n } catch (err) {\n _iterator12.e(err);\n } finally {\n _iterator12.f();\n }\n\n if (this.options.uploadMultiple) {\n this.emit(\"canceledmultiple\", groupedFiles);\n }\n } else if (file.status === Dropzone.ADDED || file.status === Dropzone.QUEUED) {\n file.status = Dropzone.CANCELED;\n this.emit(\"canceled\", file);\n\n if (this.options.uploadMultiple) {\n this.emit(\"canceledmultiple\", [file]);\n }\n }\n\n if (this.options.autoProcessQueue) {\n return this.processQueue();\n }\n }\n }, {\n key: \"resolveOption\",\n value: function resolveOption(option) {\n if (typeof option === \"function\") {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return option.apply(this, args);\n }\n\n return option;\n }\n }, {\n key: \"uploadFile\",\n value: function uploadFile(file) {\n return this.uploadFiles([file]);\n }\n }, {\n key: \"uploadFiles\",\n value: function uploadFiles(files) {\n var _this14 = this;\n\n this._transformFiles(files, function (transformedFiles) {\n if (_this14.options.chunking) {\n // Chunking is not allowed to be used with `uploadMultiple` so we know\n // that there is only __one__file.\n var transformedFile = transformedFiles[0];\n files[0].upload.chunked = _this14.options.chunking && (_this14.options.forceChunking || transformedFile.size > _this14.options.chunkSize);\n files[0].upload.totalChunkCount = Math.ceil(transformedFile.size / _this14.options.chunkSize);\n }\n\n if (files[0].upload.chunked) {\n // This file should be sent in chunks!\n // If the chunking option is set, we **know** that there can only be **one** file, since\n // uploadMultiple is not allowed with this option.\n var file = files[0];\n var _transformedFile = transformedFiles[0];\n var startedChunkCount = 0;\n file.upload.chunks = [];\n\n var handleNextChunk = function handleNextChunk() {\n var chunkIndex = 0; // Find the next item in file.upload.chunks that is not defined yet.\n\n while (file.upload.chunks[chunkIndex] !== undefined) {\n chunkIndex++;\n } // This means, that all chunks have already been started.\n\n\n if (chunkIndex >= file.upload.totalChunkCount) return;\n startedChunkCount++;\n var start = chunkIndex * _this14.options.chunkSize;\n var end = Math.min(start + _this14.options.chunkSize, _transformedFile.size);\n var dataBlock = {\n name: _this14._getParamName(0),\n data: _transformedFile.webkitSlice ? _transformedFile.webkitSlice(start, end) : _transformedFile.slice(start, end),\n filename: file.upload.filename,\n chunkIndex: chunkIndex\n };\n file.upload.chunks[chunkIndex] = {\n file: file,\n index: chunkIndex,\n dataBlock: dataBlock,\n // In case we want to retry.\n status: Dropzone.UPLOADING,\n progress: 0,\n retries: 0 // The number of times this block has been retried.\n\n };\n\n _this14._uploadData(files, [dataBlock]);\n };\n\n file.upload.finishedChunkUpload = function (chunk, response) {\n var allFinished = true;\n chunk.status = Dropzone.SUCCESS; // Clear the data from the chunk\n\n chunk.dataBlock = null; // Leaving this reference to xhr intact here will cause memory leaks in some browsers\n\n chunk.xhr = null;\n\n for (var i = 0; i < file.upload.totalChunkCount; i++) {\n if (file.upload.chunks[i] === undefined) {\n return handleNextChunk();\n }\n\n if (file.upload.chunks[i].status !== Dropzone.SUCCESS) {\n allFinished = false;\n }\n }\n\n if (allFinished) {\n _this14.options.chunksUploaded(file, function () {\n _this14._finished(files, response, null);\n });\n }\n };\n\n if (_this14.options.parallelChunkUploads) {\n for (var i = 0; i < file.upload.totalChunkCount; i++) {\n handleNextChunk();\n }\n } else {\n handleNextChunk();\n }\n } else {\n var dataBlocks = [];\n\n for (var _i2 = 0; _i2 < files.length; _i2++) {\n dataBlocks[_i2] = {\n name: _this14._getParamName(_i2),\n data: transformedFiles[_i2],\n filename: files[_i2].upload.filename\n };\n }\n\n _this14._uploadData(files, dataBlocks);\n }\n });\n } /// Returns the right chunk for given file and xhr\n\n }, {\n key: \"_getChunk\",\n value: function _getChunk(file, xhr) {\n for (var i = 0; i < file.upload.totalChunkCount; i++) {\n if (file.upload.chunks[i] !== undefined && file.upload.chunks[i].xhr === xhr) {\n return file.upload.chunks[i];\n }\n }\n } // This function actually uploads the file(s) to the server.\n // If dataBlocks contains the actual data to upload (meaning, that this could either be transformed\n // files, or individual chunks for chunked upload).\n\n }, {\n key: \"_uploadData\",\n value: function _uploadData(files, dataBlocks) {\n var _this15 = this;\n\n var xhr = new XMLHttpRequest(); // Put the xhr object in the file objects to be able to reference it later.\n\n var _iterator13 = dropzone_createForOfIteratorHelper(files, true),\n _step13;\n\n try {\n for (_iterator13.s(); !(_step13 = _iterator13.n()).done;) {\n var file = _step13.value;\n file.xhr = xhr;\n }\n } catch (err) {\n _iterator13.e(err);\n } finally {\n _iterator13.f();\n }\n\n if (files[0].upload.chunked) {\n // Put the xhr object in the right chunk object, so it can be associated later, and found with _getChunk\n files[0].upload.chunks[dataBlocks[0].chunkIndex].xhr = xhr;\n }\n\n var method = this.resolveOption(this.options.method, files);\n var url = this.resolveOption(this.options.url, files);\n xhr.open(method, url, true); // Setting the timeout after open because of IE11 issue: https://gitlab.com/meno/dropzone/issues/8\n\n var timeout = this.resolveOption(this.options.timeout, files);\n if (timeout) xhr.timeout = this.resolveOption(this.options.timeout, files); // Has to be after `.open()`. See https://github.com/enyo/dropzone/issues/179\n\n xhr.withCredentials = !!this.options.withCredentials;\n\n xhr.onload = function (e) {\n _this15._finishedUploading(files, xhr, e);\n };\n\n xhr.ontimeout = function () {\n _this15._handleUploadError(files, xhr, \"Request timedout after \".concat(_this15.options.timeout / 1000, \" seconds\"));\n };\n\n xhr.onerror = function () {\n _this15._handleUploadError(files, xhr);\n }; // Some browsers do not have the .upload property\n\n\n var progressObj = xhr.upload != null ? xhr.upload : xhr;\n\n progressObj.onprogress = function (e) {\n return _this15._updateFilesUploadProgress(files, xhr, e);\n };\n\n var headers = {\n Accept: \"application/json\",\n \"Cache-Control\": \"no-cache\",\n \"X-Requested-With\": \"XMLHttpRequest\"\n };\n\n if (this.options.headers) {\n Dropzone.extend(headers, this.options.headers);\n }\n\n for (var headerName in headers) {\n var headerValue = headers[headerName];\n\n if (headerValue) {\n xhr.setRequestHeader(headerName, headerValue);\n }\n }\n\n var formData = new FormData(); // Adding all @options parameters\n\n if (this.options.params) {\n var additionalParams = this.options.params;\n\n if (typeof additionalParams === \"function\") {\n additionalParams = additionalParams.call(this, files, xhr, files[0].upload.chunked ? this._getChunk(files[0], xhr) : null);\n }\n\n for (var key in additionalParams) {\n var value = additionalParams[key];\n\n if (Array.isArray(value)) {\n // The additional parameter contains an array,\n // so lets iterate over it to attach each value\n // individually.\n for (var i = 0; i < value.length; i++) {\n formData.append(key, value[i]);\n }\n } else {\n formData.append(key, value);\n }\n }\n } // Let the user add additional data if necessary\n\n\n var _iterator14 = dropzone_createForOfIteratorHelper(files, true),\n _step14;\n\n try {\n for (_iterator14.s(); !(_step14 = _iterator14.n()).done;) {\n var _file = _step14.value;\n this.emit(\"sending\", _file, xhr, formData);\n }\n } catch (err) {\n _iterator14.e(err);\n } finally {\n _iterator14.f();\n }\n\n if (this.options.uploadMultiple) {\n this.emit(\"sendingmultiple\", files, xhr, formData);\n }\n\n this._addFormElementData(formData); // Finally add the files\n // Has to be last because some servers (eg: S3) expect the file to be the last parameter\n\n\n for (var _i3 = 0; _i3 < dataBlocks.length; _i3++) {\n var dataBlock = dataBlocks[_i3];\n formData.append(dataBlock.name, dataBlock.data, dataBlock.filename);\n }\n\n this.submitRequest(xhr, formData, files);\n } // Transforms all files with this.options.transformFile and invokes done with the transformed files when done.\n\n }, {\n key: \"_transformFiles\",\n value: function _transformFiles(files, done) {\n var _this16 = this;\n\n var transformedFiles = []; // Clumsy way of handling asynchronous calls, until I get to add a proper Future library.\n\n var doneCounter = 0;\n\n var _loop = function _loop(i) {\n _this16.options.transformFile.call(_this16, files[i], function (transformedFile) {\n transformedFiles[i] = transformedFile;\n\n if (++doneCounter === files.length) {\n done(transformedFiles);\n }\n });\n };\n\n for (var i = 0; i < files.length; i++) {\n _loop(i);\n }\n } // Takes care of adding other input elements of the form to the AJAX request\n\n }, {\n key: \"_addFormElementData\",\n value: function _addFormElementData(formData) {\n // Take care of other input elements\n if (this.element.tagName === \"FORM\") {\n var _iterator15 = dropzone_createForOfIteratorHelper(this.element.querySelectorAll(\"input, textarea, select, button\"), true),\n _step15;\n\n try {\n for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) {\n var input = _step15.value;\n var inputName = input.getAttribute(\"name\");\n var inputType = input.getAttribute(\"type\");\n if (inputType) inputType = inputType.toLowerCase(); // If the input doesn't have a name, we can't use it.\n\n if (typeof inputName === \"undefined\" || inputName === null) continue;\n\n if (input.tagName === \"SELECT\" && input.hasAttribute(\"multiple\")) {\n // Possibly multiple values\n var _iterator16 = dropzone_createForOfIteratorHelper(input.options, true),\n _step16;\n\n try {\n for (_iterator16.s(); !(_step16 = _iterator16.n()).done;) {\n var option = _step16.value;\n\n if (option.selected) {\n formData.append(inputName, option.value);\n }\n }\n } catch (err) {\n _iterator16.e(err);\n } finally {\n _iterator16.f();\n }\n } else if (!inputType || inputType !== \"checkbox\" && inputType !== \"radio\" || input.checked) {\n formData.append(inputName, input.value);\n }\n }\n } catch (err) {\n _iterator15.e(err);\n } finally {\n _iterator15.f();\n }\n }\n } // Invoked when there is new progress information about given files.\n // If e is not provided, it is assumed that the upload is finished.\n\n }, {\n key: \"_updateFilesUploadProgress\",\n value: function _updateFilesUploadProgress(files, xhr, e) {\n if (!files[0].upload.chunked) {\n // Handle file uploads without chunking\n var _iterator17 = dropzone_createForOfIteratorHelper(files, true),\n _step17;\n\n try {\n for (_iterator17.s(); !(_step17 = _iterator17.n()).done;) {\n var file = _step17.value;\n\n if (file.upload.total && file.upload.bytesSent && file.upload.bytesSent == file.upload.total) {\n // If both, the `total` and `bytesSent` have already been set, and\n // they are equal (meaning progress is at 100%), we can skip this\n // file, since an upload progress shouldn't go down.\n continue;\n }\n\n if (e) {\n file.upload.progress = 100 * e.loaded / e.total;\n file.upload.total = e.total;\n file.upload.bytesSent = e.loaded;\n } else {\n // No event, so we're at 100%\n file.upload.progress = 100;\n file.upload.bytesSent = file.upload.total;\n }\n\n this.emit(\"uploadprogress\", file, file.upload.progress, file.upload.bytesSent);\n }\n } catch (err) {\n _iterator17.e(err);\n } finally {\n _iterator17.f();\n }\n } else {\n // Handle chunked file uploads\n // Chunked upload is not compatible with uploading multiple files in one\n // request, so we know there's only one file.\n var _file2 = files[0]; // Since this is a chunked upload, we need to update the appropriate chunk\n // progress.\n\n var chunk = this._getChunk(_file2, xhr);\n\n if (e) {\n chunk.progress = 100 * e.loaded / e.total;\n chunk.total = e.total;\n chunk.bytesSent = e.loaded;\n } else {\n // No event, so we're at 100%\n chunk.progress = 100;\n chunk.bytesSent = chunk.total;\n } // Now tally the *file* upload progress from its individual chunks\n\n\n _file2.upload.progress = 0;\n _file2.upload.total = 0;\n _file2.upload.bytesSent = 0;\n\n for (var i = 0; i < _file2.upload.totalChunkCount; i++) {\n if (_file2.upload.chunks[i] && typeof _file2.upload.chunks[i].progress !== \"undefined\") {\n _file2.upload.progress += _file2.upload.chunks[i].progress;\n _file2.upload.total += _file2.upload.chunks[i].total;\n _file2.upload.bytesSent += _file2.upload.chunks[i].bytesSent;\n }\n } // Since the process is a percentage, we need to divide by the amount of\n // chunks we've used.\n\n\n _file2.upload.progress = _file2.upload.progress / _file2.upload.totalChunkCount;\n this.emit(\"uploadprogress\", _file2, _file2.upload.progress, _file2.upload.bytesSent);\n }\n }\n }, {\n key: \"_finishedUploading\",\n value: function _finishedUploading(files, xhr, e) {\n var response;\n\n if (files[0].status === Dropzone.CANCELED) {\n return;\n }\n\n if (xhr.readyState !== 4) {\n return;\n }\n\n if (xhr.responseType !== \"arraybuffer\" && xhr.responseType !== \"blob\") {\n response = xhr.responseText;\n\n if (xhr.getResponseHeader(\"content-type\") && ~xhr.getResponseHeader(\"content-type\").indexOf(\"application/json\")) {\n try {\n response = JSON.parse(response);\n } catch (error) {\n e = error;\n response = \"Invalid JSON response from server.\";\n }\n }\n }\n\n this._updateFilesUploadProgress(files, xhr);\n\n if (!(200 <= xhr.status && xhr.status < 300)) {\n this._handleUploadError(files, xhr, response);\n } else {\n if (files[0].upload.chunked) {\n files[0].upload.finishedChunkUpload(this._getChunk(files[0], xhr), response);\n } else {\n this._finished(files, response, e);\n }\n }\n }\n }, {\n key: \"_handleUploadError\",\n value: function _handleUploadError(files, xhr, response) {\n if (files[0].status === Dropzone.CANCELED) {\n return;\n }\n\n if (files[0].upload.chunked && this.options.retryChunks) {\n var chunk = this._getChunk(files[0], xhr);\n\n if (chunk.retries++ < this.options.retryChunksLimit) {\n this._uploadData(files, [chunk.dataBlock]);\n\n return;\n } else {\n console.warn(\"Retried this chunk too often. Giving up.\");\n }\n }\n\n this._errorProcessing(files, response || this.options.dictResponseError.replace(\"{{statusCode}}\", xhr.status), xhr);\n }\n }, {\n key: \"submitRequest\",\n value: function submitRequest(xhr, formData, files) {\n if (xhr.readyState != 1) {\n console.warn(\"Cannot send this request because the XMLHttpRequest.readyState is not OPENED.\");\n return;\n }\n\n xhr.send(formData);\n } // Called internally when processing is finished.\n // Individual callbacks have to be called in the appropriate sections.\n\n }, {\n key: \"_finished\",\n value: function _finished(files, responseText, e) {\n var _iterator18 = dropzone_createForOfIteratorHelper(files, true),\n _step18;\n\n try {\n for (_iterator18.s(); !(_step18 = _iterator18.n()).done;) {\n var file = _step18.value;\n file.status = Dropzone.SUCCESS;\n this.emit(\"success\", file, responseText, e);\n this.emit(\"complete\", file);\n }\n } catch (err) {\n _iterator18.e(err);\n } finally {\n _iterator18.f();\n }\n\n if (this.options.uploadMultiple) {\n this.emit(\"successmultiple\", files, responseText, e);\n this.emit(\"completemultiple\", files);\n }\n\n if (this.options.autoProcessQueue) {\n return this.processQueue();\n }\n } // Called internally when processing is finished.\n // Individual callbacks have to be called in the appropriate sections.\n\n }, {\n key: \"_errorProcessing\",\n value: function _errorProcessing(files, message, xhr) {\n var _iterator19 = dropzone_createForOfIteratorHelper(files, true),\n _step19;\n\n try {\n for (_iterator19.s(); !(_step19 = _iterator19.n()).done;) {\n var file = _step19.value;\n file.status = Dropzone.ERROR;\n this.emit(\"error\", file, message, xhr);\n this.emit(\"complete\", file);\n }\n } catch (err) {\n _iterator19.e(err);\n } finally {\n _iterator19.f();\n }\n\n if (this.options.uploadMultiple) {\n this.emit(\"errormultiple\", files, message, xhr);\n this.emit(\"completemultiple\", files);\n }\n\n if (this.options.autoProcessQueue) {\n return this.processQueue();\n }\n }\n }], [{\n key: \"initClass\",\n value: function initClass() {\n // Exposing the emitter class, mainly for tests\n this.prototype.Emitter = Emitter;\n /*\n This is a list of all available events you can register on a dropzone object.\n You can register an event handler like this:\n dropzone.on(\"dragEnter\", function() { });\n */\n\n this.prototype.events = [\"drop\", \"dragstart\", \"dragend\", \"dragenter\", \"dragover\", \"dragleave\", \"addedfile\", \"addedfiles\", \"removedfile\", \"thumbnail\", \"error\", \"errormultiple\", \"processing\", \"processingmultiple\", \"uploadprogress\", \"totaluploadprogress\", \"sending\", \"sendingmultiple\", \"success\", \"successmultiple\", \"canceled\", \"canceledmultiple\", \"complete\", \"completemultiple\", \"reset\", \"maxfilesexceeded\", \"maxfilesreached\", \"queuecomplete\"];\n this.prototype._thumbnailQueue = [];\n this.prototype._processingThumbnail = false;\n } // global utility\n\n }, {\n key: \"extend\",\n value: function extend(target) {\n for (var _len2 = arguments.length, objects = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n objects[_key2 - 1] = arguments[_key2];\n }\n\n for (var _i4 = 0, _objects = objects; _i4 < _objects.length; _i4++) {\n var object = _objects[_i4];\n\n for (var key in object) {\n var val = object[key];\n target[key] = val;\n }\n }\n\n return target;\n }\n }, {\n key: \"uuidv4\",\n value: function uuidv4() {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function (c) {\n var r = Math.random() * 16 | 0,\n v = c === \"x\" ? r : r & 0x3 | 0x8;\n return v.toString(16);\n });\n }\n }]);\n\n return Dropzone;\n}(Emitter);\n\n\nDropzone.initClass();\nDropzone.version = \"5.9.3\"; // This is a map of options for your different dropzones. Add configurations\n// to this object for your different dropzone elemens.\n//\n// Example:\n//\n// Dropzone.options.myDropzoneElementId = { maxFilesize: 1 };\n//\n// To disable autoDiscover for a specific element, you can set `false` as an option:\n//\n// Dropzone.options.myDisabledElementId = false;\n//\n// And in html:\n//\n//
    \n\nDropzone.options = {}; // Returns the options for an element or undefined if none available.\n\nDropzone.optionsForElement = function (element) {\n // Get the `Dropzone.options.elementId` for this element if it exists\n if (element.getAttribute(\"id\")) {\n return Dropzone.options[camelize(element.getAttribute(\"id\"))];\n } else {\n return undefined;\n }\n}; // Holds a list of all dropzone instances\n\n\nDropzone.instances = []; // Returns the dropzone for given element if any\n\nDropzone.forElement = function (element) {\n if (typeof element === \"string\") {\n element = document.querySelector(element);\n }\n\n if ((element != null ? element.dropzone : undefined) == null) {\n throw new Error(\"No Dropzone found for given element. This is probably because you're trying to access it before Dropzone had the time to initialize. Use the `init` option to setup any additional observers on your Dropzone.\");\n }\n\n return element.dropzone;\n}; // Set to false if you don't want Dropzone to automatically find and attach to .dropzone elements.\n\n\nDropzone.autoDiscover = true; // Looks for all .dropzone elements and creates a dropzone for them\n\nDropzone.discover = function () {\n var dropzones;\n\n if (document.querySelectorAll) {\n dropzones = document.querySelectorAll(\".dropzone\");\n } else {\n dropzones = []; // IE :(\n\n var checkElements = function checkElements(elements) {\n return function () {\n var result = [];\n\n var _iterator20 = dropzone_createForOfIteratorHelper(elements, true),\n _step20;\n\n try {\n for (_iterator20.s(); !(_step20 = _iterator20.n()).done;) {\n var el = _step20.value;\n\n if (/(^| )dropzone($| )/.test(el.className)) {\n result.push(dropzones.push(el));\n } else {\n result.push(undefined);\n }\n }\n } catch (err) {\n _iterator20.e(err);\n } finally {\n _iterator20.f();\n }\n\n return result;\n }();\n };\n\n checkElements(document.getElementsByTagName(\"div\"));\n checkElements(document.getElementsByTagName(\"form\"));\n }\n\n return function () {\n var result = [];\n\n var _iterator21 = dropzone_createForOfIteratorHelper(dropzones, true),\n _step21;\n\n try {\n for (_iterator21.s(); !(_step21 = _iterator21.n()).done;) {\n var dropzone = _step21.value;\n\n // Create a dropzone unless auto discover has been disabled for specific element\n if (Dropzone.optionsForElement(dropzone) !== false) {\n result.push(new Dropzone(dropzone));\n } else {\n result.push(undefined);\n }\n }\n } catch (err) {\n _iterator21.e(err);\n } finally {\n _iterator21.f();\n }\n\n return result;\n }();\n}; // Some browsers support drag and drog functionality, but not correctly.\n//\n// So I created a blocklist of userAgents. Yes, yes. Browser sniffing, I know.\n// But what to do when browsers *theoretically* support an API, but crash\n// when using it.\n//\n// This is a list of regular expressions tested against navigator.userAgent\n//\n// ** It should only be used on browser that *do* support the API, but\n// incorrectly **\n\n\nDropzone.blockedBrowsers = [// The mac os and windows phone version of opera 12 seems to have a problem with the File drag'n'drop API.\n/opera.*(Macintosh|Windows Phone).*version\\/12/i]; // Checks if the browser is supported\n\nDropzone.isBrowserSupported = function () {\n var capableBrowser = true;\n\n if (window.File && window.FileReader && window.FileList && window.Blob && window.FormData && document.querySelector) {\n if (!(\"classList\" in document.createElement(\"a\"))) {\n capableBrowser = false;\n } else {\n if (Dropzone.blacklistedBrowsers !== undefined) {\n // Since this has been renamed, this makes sure we don't break older\n // configuration.\n Dropzone.blockedBrowsers = Dropzone.blacklistedBrowsers;\n } // The browser supports the API, but may be blocked.\n\n\n var _iterator22 = dropzone_createForOfIteratorHelper(Dropzone.blockedBrowsers, true),\n _step22;\n\n try {\n for (_iterator22.s(); !(_step22 = _iterator22.n()).done;) {\n var regex = _step22.value;\n\n if (regex.test(navigator.userAgent)) {\n capableBrowser = false;\n continue;\n }\n }\n } catch (err) {\n _iterator22.e(err);\n } finally {\n _iterator22.f();\n }\n }\n } else {\n capableBrowser = false;\n }\n\n return capableBrowser;\n};\n\nDropzone.dataURItoBlob = function (dataURI) {\n // convert base64 to raw binary data held in a string\n // doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this\n var byteString = atob(dataURI.split(\",\")[1]); // separate out the mime component\n\n var mimeString = dataURI.split(\",\")[0].split(\":\")[1].split(\";\")[0]; // write the bytes of the string to an ArrayBuffer\n\n var ab = new ArrayBuffer(byteString.length);\n var ia = new Uint8Array(ab);\n\n for (var i = 0, end = byteString.length, asc = 0 <= end; asc ? i <= end : i >= end; asc ? i++ : i--) {\n ia[i] = byteString.charCodeAt(i);\n } // write the ArrayBuffer to a blob\n\n\n return new Blob([ab], {\n type: mimeString\n });\n}; // Returns an array without the rejected item\n\n\nvar without = function without(list, rejectedItem) {\n return list.filter(function (item) {\n return item !== rejectedItem;\n }).map(function (item) {\n return item;\n });\n}; // abc-def_ghi -> abcDefGhi\n\n\nvar camelize = function camelize(str) {\n return str.replace(/[\\-_](\\w)/g, function (match) {\n return match.charAt(1).toUpperCase();\n });\n}; // Creates an element from string\n\n\nDropzone.createElement = function (string) {\n var div = document.createElement(\"div\");\n div.innerHTML = string;\n return div.childNodes[0];\n}; // Tests if given element is inside (or simply is) the container\n\n\nDropzone.elementInside = function (element, container) {\n if (element === container) {\n return true;\n } // Coffeescript doesn't support do/while loops\n\n\n while (element = element.parentNode) {\n if (element === container) {\n return true;\n }\n }\n\n return false;\n};\n\nDropzone.getElement = function (el, name) {\n var element;\n\n if (typeof el === \"string\") {\n element = document.querySelector(el);\n } else if (el.nodeType != null) {\n element = el;\n }\n\n if (element == null) {\n throw new Error(\"Invalid `\".concat(name, \"` option provided. Please provide a CSS selector or a plain HTML element.\"));\n }\n\n return element;\n};\n\nDropzone.getElements = function (els, name) {\n var el, elements;\n\n if (els instanceof Array) {\n elements = [];\n\n try {\n var _iterator23 = dropzone_createForOfIteratorHelper(els, true),\n _step23;\n\n try {\n for (_iterator23.s(); !(_step23 = _iterator23.n()).done;) {\n el = _step23.value;\n elements.push(this.getElement(el, name));\n }\n } catch (err) {\n _iterator23.e(err);\n } finally {\n _iterator23.f();\n }\n } catch (e) {\n elements = null;\n }\n } else if (typeof els === \"string\") {\n elements = [];\n\n var _iterator24 = dropzone_createForOfIteratorHelper(document.querySelectorAll(els), true),\n _step24;\n\n try {\n for (_iterator24.s(); !(_step24 = _iterator24.n()).done;) {\n el = _step24.value;\n elements.push(el);\n }\n } catch (err) {\n _iterator24.e(err);\n } finally {\n _iterator24.f();\n }\n } else if (els.nodeType != null) {\n elements = [els];\n }\n\n if (elements == null || !elements.length) {\n throw new Error(\"Invalid `\".concat(name, \"` option provided. Please provide a CSS selector, a plain HTML element or a list of those.\"));\n }\n\n return elements;\n}; // Asks the user the question and calls accepted or rejected accordingly\n//\n// The default implementation just uses `window.confirm` and then calls the\n// appropriate callback.\n\n\nDropzone.confirm = function (question, accepted, rejected) {\n if (window.confirm(question)) {\n return accepted();\n } else if (rejected != null) {\n return rejected();\n }\n}; // Validates the mime type like this:\n//\n// https://developer.mozilla.org/en-US/docs/HTML/Element/input#attr-accept\n\n\nDropzone.isValidFile = function (file, acceptedFiles) {\n if (!acceptedFiles) {\n return true;\n } // If there are no accepted mime types, it's OK\n\n\n acceptedFiles = acceptedFiles.split(\",\");\n var mimeType = file.type;\n var baseMimeType = mimeType.replace(/\\/.*$/, \"\");\n\n var _iterator25 = dropzone_createForOfIteratorHelper(acceptedFiles, true),\n _step25;\n\n try {\n for (_iterator25.s(); !(_step25 = _iterator25.n()).done;) {\n var validType = _step25.value;\n validType = validType.trim();\n\n if (validType.charAt(0) === \".\") {\n if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) {\n return true;\n }\n } else if (/\\/\\*$/.test(validType)) {\n // This is something like a image/* mime type\n if (baseMimeType === validType.replace(/\\/.*$/, \"\")) {\n return true;\n }\n } else {\n if (mimeType === validType) {\n return true;\n }\n }\n }\n } catch (err) {\n _iterator25.e(err);\n } finally {\n _iterator25.f();\n }\n\n return false;\n}; // Augment jQuery\n\n\nif (typeof jQuery !== \"undefined\" && jQuery !== null) {\n jQuery.fn.dropzone = function (options) {\n return this.each(function () {\n return new Dropzone(this, options);\n });\n };\n} // Dropzone file status codes\n\n\nDropzone.ADDED = \"added\";\nDropzone.QUEUED = \"queued\"; // For backwards compatibility. Now, if a file is accepted, it's either queued\n// or uploading.\n\nDropzone.ACCEPTED = Dropzone.QUEUED;\nDropzone.UPLOADING = \"uploading\";\nDropzone.PROCESSING = Dropzone.UPLOADING; // alias\n\nDropzone.CANCELED = \"canceled\";\nDropzone.ERROR = \"error\";\nDropzone.SUCCESS = \"success\";\n/*\n\n Bugfix for iOS 6 and 7\n Source: http://stackoverflow.com/questions/11929099/html5-canvas-drawimage-ratio-bug-ios\n based on the work of https://github.com/stomita/ios-imagefile-megapixel\n\n */\n// Detecting vertical squash in loaded image.\n// Fixes a bug which squash image vertically while drawing into canvas for some images.\n// This is a bug in iOS6 devices. This function from https://github.com/stomita/ios-imagefile-megapixel\n\nvar detectVerticalSquash = function detectVerticalSquash(img) {\n var iw = img.naturalWidth;\n var ih = img.naturalHeight;\n var canvas = document.createElement(\"canvas\");\n canvas.width = 1;\n canvas.height = ih;\n var ctx = canvas.getContext(\"2d\");\n ctx.drawImage(img, 0, 0);\n\n var _ctx$getImageData = ctx.getImageData(1, 0, 1, ih),\n data = _ctx$getImageData.data; // search image edge pixel position in case it is squashed vertically.\n\n\n var sy = 0;\n var ey = ih;\n var py = ih;\n\n while (py > sy) {\n var alpha = data[(py - 1) * 4 + 3];\n\n if (alpha === 0) {\n ey = py;\n } else {\n sy = py;\n }\n\n py = ey + sy >> 1;\n }\n\n var ratio = py / ih;\n\n if (ratio === 0) {\n return 1;\n } else {\n return ratio;\n }\n}; // A replacement for context.drawImage\n// (args are for source and destination).\n\n\nvar drawImageIOSFix = function drawImageIOSFix(ctx, img, sx, sy, sw, sh, dx, dy, dw, dh) {\n var vertSquashRatio = detectVerticalSquash(img);\n return ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh / vertSquashRatio);\n}; // Based on MinifyJpeg\n// Source: http://www.perry.cz/files/ExifRestorer.js\n// http://elicon.blog57.fc2.com/blog-entry-206.html\n\n\nvar ExifRestore = /*#__PURE__*/function () {\n function ExifRestore() {\n dropzone_classCallCheck(this, ExifRestore);\n }\n\n dropzone_createClass(ExifRestore, null, [{\n key: \"initClass\",\n value: function initClass() {\n this.KEY_STR = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n }\n }, {\n key: \"encode64\",\n value: function encode64(input) {\n var output = \"\";\n var chr1 = undefined;\n var chr2 = undefined;\n var chr3 = \"\";\n var enc1 = undefined;\n var enc2 = undefined;\n var enc3 = undefined;\n var enc4 = \"\";\n var i = 0;\n\n while (true) {\n chr1 = input[i++];\n chr2 = input[i++];\n chr3 = input[i++];\n enc1 = chr1 >> 2;\n enc2 = (chr1 & 3) << 4 | chr2 >> 4;\n enc3 = (chr2 & 15) << 2 | chr3 >> 6;\n enc4 = chr3 & 63;\n\n if (isNaN(chr2)) {\n enc3 = enc4 = 64;\n } else if (isNaN(chr3)) {\n enc4 = 64;\n }\n\n output = output + this.KEY_STR.charAt(enc1) + this.KEY_STR.charAt(enc2) + this.KEY_STR.charAt(enc3) + this.KEY_STR.charAt(enc4);\n chr1 = chr2 = chr3 = \"\";\n enc1 = enc2 = enc3 = enc4 = \"\";\n\n if (!(i < input.length)) {\n break;\n }\n }\n\n return output;\n }\n }, {\n key: \"restore\",\n value: function restore(origFileBase64, resizedFileBase64) {\n if (!origFileBase64.match(\"data:image/jpeg;base64,\")) {\n return resizedFileBase64;\n }\n\n var rawImage = this.decode64(origFileBase64.replace(\"data:image/jpeg;base64,\", \"\"));\n var segments = this.slice2Segments(rawImage);\n var image = this.exifManipulation(resizedFileBase64, segments);\n return \"data:image/jpeg;base64,\".concat(this.encode64(image));\n }\n }, {\n key: \"exifManipulation\",\n value: function exifManipulation(resizedFileBase64, segments) {\n var exifArray = this.getExifArray(segments);\n var newImageArray = this.insertExif(resizedFileBase64, exifArray);\n var aBuffer = new Uint8Array(newImageArray);\n return aBuffer;\n }\n }, {\n key: \"getExifArray\",\n value: function getExifArray(segments) {\n var seg = undefined;\n var x = 0;\n\n while (x < segments.length) {\n seg = segments[x];\n\n if (seg[0] === 255 & seg[1] === 225) {\n return seg;\n }\n\n x++;\n }\n\n return [];\n }\n }, {\n key: \"insertExif\",\n value: function insertExif(resizedFileBase64, exifArray) {\n var imageData = resizedFileBase64.replace(\"data:image/jpeg;base64,\", \"\");\n var buf = this.decode64(imageData);\n var separatePoint = buf.indexOf(255, 3);\n var mae = buf.slice(0, separatePoint);\n var ato = buf.slice(separatePoint);\n var array = mae;\n array = array.concat(exifArray);\n array = array.concat(ato);\n return array;\n }\n }, {\n key: \"slice2Segments\",\n value: function slice2Segments(rawImageArray) {\n var head = 0;\n var segments = [];\n\n while (true) {\n var length;\n\n if (rawImageArray[head] === 255 & rawImageArray[head + 1] === 218) {\n break;\n }\n\n if (rawImageArray[head] === 255 & rawImageArray[head + 1] === 216) {\n head += 2;\n } else {\n length = rawImageArray[head + 2] * 256 + rawImageArray[head + 3];\n var endPoint = head + length + 2;\n var seg = rawImageArray.slice(head, endPoint);\n segments.push(seg);\n head = endPoint;\n }\n\n if (head > rawImageArray.length) {\n break;\n }\n }\n\n return segments;\n }\n }, {\n key: \"decode64\",\n value: function decode64(input) {\n var output = \"\";\n var chr1 = undefined;\n var chr2 = undefined;\n var chr3 = \"\";\n var enc1 = undefined;\n var enc2 = undefined;\n var enc3 = undefined;\n var enc4 = \"\";\n var i = 0;\n var buf = []; // remove all characters that are not A-Z, a-z, 0-9, +, /, or =\n\n var base64test = /[^A-Za-z0-9\\+\\/\\=]/g;\n\n if (base64test.exec(input)) {\n console.warn(\"There were invalid base64 characters in the input text.\\nValid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\\nExpect errors in decoding.\");\n }\n\n input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\n\n while (true) {\n enc1 = this.KEY_STR.indexOf(input.charAt(i++));\n enc2 = this.KEY_STR.indexOf(input.charAt(i++));\n enc3 = this.KEY_STR.indexOf(input.charAt(i++));\n enc4 = this.KEY_STR.indexOf(input.charAt(i++));\n chr1 = enc1 << 2 | enc2 >> 4;\n chr2 = (enc2 & 15) << 4 | enc3 >> 2;\n chr3 = (enc3 & 3) << 6 | enc4;\n buf.push(chr1);\n\n if (enc3 !== 64) {\n buf.push(chr2);\n }\n\n if (enc4 !== 64) {\n buf.push(chr3);\n }\n\n chr1 = chr2 = chr3 = \"\";\n enc1 = enc2 = enc3 = enc4 = \"\";\n\n if (!(i < input.length)) {\n break;\n }\n }\n\n return buf;\n }\n }]);\n\n return ExifRestore;\n}();\n\nExifRestore.initClass();\n/*\n * contentloaded.js\n *\n * Author: Diego Perini (diego.perini at gmail.com)\n * Summary: cross-browser wrapper for DOMContentLoaded\n * Updated: 20101020\n * License: MIT\n * Version: 1.2\n *\n * URL:\n * http://javascript.nwbox.com/ContentLoaded/\n * http://javascript.nwbox.com/ContentLoaded/MIT-LICENSE\n */\n// @win window reference\n// @fn function reference\n\nvar contentLoaded = function contentLoaded(win, fn) {\n var done = false;\n var top = true;\n var doc = win.document;\n var root = doc.documentElement;\n var add = doc.addEventListener ? \"addEventListener\" : \"attachEvent\";\n var rem = doc.addEventListener ? \"removeEventListener\" : \"detachEvent\";\n var pre = doc.addEventListener ? \"\" : \"on\";\n\n var init = function init(e) {\n if (e.type === \"readystatechange\" && doc.readyState !== \"complete\") {\n return;\n }\n\n (e.type === \"load\" ? win : doc)[rem](pre + e.type, init, false);\n\n if (!done && (done = true)) {\n return fn.call(win, e.type || e);\n }\n };\n\n var poll = function poll() {\n try {\n root.doScroll(\"left\");\n } catch (e) {\n setTimeout(poll, 50);\n return;\n }\n\n return init(\"poll\");\n };\n\n if (doc.readyState !== \"complete\") {\n if (doc.createEventObject && root.doScroll) {\n try {\n top = !win.frameElement;\n } catch (error) {}\n\n if (top) {\n poll();\n }\n }\n\n doc[add](pre + \"DOMContentLoaded\", init, false);\n doc[add](pre + \"readystatechange\", init, false);\n return win[add](pre + \"load\", init, false);\n }\n}; // As a single function to be able to write tests.\n\n\nDropzone._autoDiscoverFunction = function () {\n if (Dropzone.autoDiscover) {\n return Dropzone.discover();\n }\n};\n\ncontentLoaded(window, Dropzone._autoDiscoverFunction);\n\nfunction __guard__(value, transform) {\n return typeof value !== \"undefined\" && value !== null ? transform(value) : undefined;\n}\n\nfunction __guardMethod__(obj, methodName, transform) {\n if (typeof obj !== \"undefined\" && obj !== null && typeof obj[methodName] === \"function\") {\n return transform(obj, methodName);\n } else {\n return undefined;\n }\n}\n\n\n;// CONCATENATED MODULE: ./tool/dropzone.dist.js\n /// Make Dropzone a global variable.\n\nwindow.Dropzone = Dropzone;\n/* harmony default export */ var dropzone_dist = (Dropzone);\n\n}();\n/******/ \treturn __nested_webpack_exports__;\n/******/ })()\n;\n});\n\n//# sourceURL=webpack://django-filer/./node_modules/dropzone/dist/dropzone.js?\n}"); + +/***/ }, + +/***/ "./node_modules/mediator-js/lib/mediator.js" +/*!**************************************************!*\ + !*** ./node_modules/mediator-js/lib/mediator.js ***! + \**************************************************/ +(module, exports) { + +eval("{var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*jslint bitwise: true, nomen: true, plusplus: true, white: true */\n\n/*!\n* Mediator.js Library v0.11.0\n* https://github.com/ajacksified/Mediator.js\n*\n* Copyright 2018, Jack Lawson\n* MIT Licensed (http://www.opensource.org/licenses/mit-license.php)\n*\n* For more information: http://thejacklawson.com/2011/06/mediators-for-modularized-asynchronous-programming-in-javascript/index.html\n* Project on GitHub: https://github.com/ajacksified/Mediator.js\n*\n* Last update: 22 Mar 2018\n*/\n\n(function(global, factory) {\n 'use strict';\n\n if (true) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n global.Mediator = factory();\n return global.Mediator;\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else // removed by dead control flow\n{}\n}(this, function() {\n 'use strict';\n\n // We'll generate guids for class instances for easy referencing later on.\n // Subscriber instances will have an id that can be refernced for quick\n // lookups.\n\n function guidGenerator() {\n var S4 = function() {\n return (((1+Math.random())*0x10000)|0).toString(16).substring(1);\n };\n\n return (S4()+S4()+\"-\"+S4()+\"-\"+S4()+\"-\"+S4()+\"-\"+S4()+S4()+S4());\n }\n\n // Subscribers are instances of Mediator Channel registrations. We generate\n // an object instance so that it can be updated later on without having to\n // unregister and re-register. Subscribers are constructed with a function\n // to be called, options object, and context.\n\n function Subscriber(fn, options, context) {\n if (!(this instanceof Subscriber)) {\n return new Subscriber(fn, options, context);\n }\n\n this.id = guidGenerator();\n this.fn = fn;\n this.options = options;\n this.context = context;\n this.channel = null;\n }\n\n // Mediator.update on a subscriber instance can update its function,context,\n // or options object. It takes in an object and looks for fn, context, or\n // options keys.\n Subscriber.prototype.update = function(options) {\n if (options) {\n this.fn = options.fn || this.fn;\n this.context = options.context || this.context;\n this.options = options.options || this.options;\n if (this.channel && this.options && this.options.priority !== undefined) {\n this.channel.setPriority(this.id, this.options.priority);\n }\n }\n }\n\n // A Mediator channel holds a list of sub-channels and subscribers to be fired\n // when Mediator.publish is called on the Mediator instance. It also contains\n // some methods to manipulate its lists of data; only setPriority and\n // StopPropagation are meant to be used. The other methods should be accessed\n // through the Mediator instance.\n\n function Channel(namespace, parent) {\n if (!(this instanceof Channel)) {\n return new Channel(namespace);\n }\n\n this.namespace = namespace || \"\";\n this._subscribers = [];\n this._channels = {};\n this._parent = parent;\n this.stopped = false;\n }\n\n // Sort function for sorting the channels based on their priority. The sort will\n // place the channel with the highest priority in the first place of the array,\n // all other channels will be added in descending order. i.g. a channel with a\n // priority of 9 will be placed before a channel with a priority of 3\n Channel.prototype.channelPrioritySort = function(a, b) {\n if (a.options.priority > b.options.priority) {\n return -1;\n } else if (a.options.priority < b.options.priority) {\n return 1;\n }\n return 0;\n };\n\n Channel.prototype.addSubscriber = function(fn, options, context){\n // Make sure there is always an options object\n if (!options) {\n options = { priority: 0 };\n }\n\n // Cheap hack to either parse as an int or turn it into 0. Runs faster\n // in many browsers than parseInt with the benefit that it won't\n // return a NaN.\n options.priority = options.priority | 0;\n\n var subscriber = new Subscriber(fn, options, context);\n subscriber.channel = this;\n\n this._subscribers.push(subscriber);\n this._subscribers.sort(this.channelPrioritySort);\n\n return subscriber;\n }\n\n // The channel instance is passed as an argument to the mediator subscriber,\n // and further subscriber propagation can be called with\n // channel.StopPropagation().\n Channel.prototype.stopPropagation = function() {\n this.stopped = true;\n }\n\n Channel.prototype.getSubscriber = function(identifier) {\n var x = 0,\n y = this._subscribers.length;\n\n for(x, y; x < y; x++) {\n if (this._subscribers[x].id === identifier || this._subscribers[x].fn === identifier) {\n return this._subscribers[x];\n }\n }\n }\n\n // Channel.setPriority is useful in updating the order in which Subscribers\n // are called, and takes an identifier (subscriber id or named function) and\n // an array index. It will not search recursively through subchannels.\n\n Channel.prototype.setPriority = function(identifier, priority) {\n var x = 0,\n y = this._subscribers.length;\n\n for(; x= 0; x--) {\n if(this._subscribers[x].fn === identifier || this._subscribers[x].id === identifier){\n this._subscribers[x].channel = null;\n this._subscribers.splice(x,1);\n }\n }\n }\n\n // Check if we should attempt to automatically clean up the channel\n if (autoCleanup) {\n this.autoCleanChannel();\n }\n\n var x = this._subscribers.length - 1;\n\n // If we don't pass in an id, we're clearing all\n if (!identifier) {\n this._subscribers = [];\n return;\n }\n\n // Going backwards makes splicing a whole lot easier.\n for(x; x >= 0; x--) {\n if (this._subscribers[x].fn === identifier || this._subscribers[x].id === identifier) {\n this._subscribers[x].channel = null;\n this._subscribers.splice(x,1);\n }\n }\n }\n\n Channel.prototype.autoCleanChannel = function() {\n // First make sure there are no more subscribers, if there are we\n // can stop processing the channel any further\n if (this._subscribers.length !== 0) {\n return;\n }\n\n // Next we need to make sure there are no more sub-channels that\n // have this channel as its parent channel. We try to iterate over the\n // properties of _channels and as soon as we find a property we've\n // set we will stop processing the channel any further\n for (var key in this._channels) {\n if (this._channels.hasOwnProperty(key)) {\n return;\n }\n }\n\n // The last check before we can remove the channel is to see if it\n // has a parent. If there is no parent we don't want to remove this\n // channel\n if (this._parent != null) {\n // We need the ID by which this channel is known to its parent, it should\n // be the last part of the namespace. We need split the namespace up and\n // take its last element to pass along to the removeChannel method\n var path = this.namespace.split(':'),\n channelName = path[path.length - 1];\n // The parent of the current channel to remove this channel\n this._parent.removeChannel(channelName);\n }\n }\n\n Channel.prototype.removeChannel = function(channelName) {\n if (this.hasChannel(channelName)) {\n this._channels[channelName] = null;\n delete this._channels[channelName];\n // After removing a sub-channel we can check if that makes this channel\n // suitable for auto clean up\n this.autoCleanChannel();\n }\n };\n\n\n // This will publish arbitrary arguments to a subscriber and then to parent\n // channels.\n\n Channel.prototype.publish = function(data) {\n var x = 0,\n y = this._subscribers.length,\n shouldCall = false,\n subscriber, l,\n subsBefore,subsAfter;\n\n // Priority is preserved in the _subscribers index.\n for(x, y; x < y; x++) {\n // By default set the flag to false\n shouldCall = false;\n subscriber = this._subscribers[x];\n\n if (!this.stopped) {\n subsBefore = this._subscribers.length;\n if (subscriber.options !== undefined && typeof subscriber.options.predicate === \"function\") {\n if (subscriber.options.predicate.apply(subscriber.context, data)) {\n // The predicate matches, the callback function should be called\n shouldCall = true;\n }\n }else{\n // There is no predicate to match, the callback should always be called\n shouldCall = true;\n }\n }\n\n // Check if the callback should be called\n if (shouldCall) {\n // Check if the subscriber has options and if this include the calls options\n if (subscriber.options && subscriber.options.calls !== undefined) {\n // Decrease the number of calls left by one\n subscriber.options.calls--;\n // Once the number of calls left reaches zero or less we need to remove the subscriber\n if (subscriber.options.calls < 1) {\n this.removeSubscriber(subscriber.id);\n }\n }\n // Now we call the callback, if this in turns publishes to the same channel it will no longer\n // cause the callback to be called as we just removed it as a subscriber\n subscriber.fn.apply(subscriber.context, data);\n\n subsAfter = this._subscribers.length;\n y = subsAfter;\n if (subsAfter === subsBefore - 1) {\n x--;\n }\n }\n }\n\n if (this._parent) {\n this._parent.publish(data);\n }\n\n this.stopped = false;\n }\n\n function Mediator() {\n if (!(this instanceof Mediator)) {\n return new Mediator();\n }\n\n this._channels = new Channel('');\n }\n\n // A Mediator instance is the interface through which events are registered\n // and removed from publish channels.\n\n // Returns a channel instance based on namespace, for example\n // application:chat:message:received. If readOnly is true we\n // will refrain from creating non existing channels.\n Mediator.prototype.getChannel = function(namespace, readOnly) {\n var channel = this._channels,\n namespaceHierarchy = namespace.split(':'),\n x = 0,\n y = namespaceHierarchy.length;\n\n if (namespace === '') {\n return channel;\n }\n\n if (namespaceHierarchy.length > 0) {\n for(x, y; x < y; x++) {\n\n if (!channel.hasChannel(namespaceHierarchy[x])) {\n if (readOnly) {\n break;\n } else {\n channel.addChannel(namespaceHierarchy[x]);\n }\n }\n\n channel = channel.returnChannel(namespaceHierarchy[x]);\n }\n }\n\n return channel;\n }\n\n // Pass in a channel namespace, function to be called, options, and context\n // to call the function in to Subscribe. It will create a channel if one\n // does not exist. Options can include a predicate to determine if it\n // should be called (based on the data published to it) and a priority\n // index.\n\n Mediator.prototype.subscribe = function(channelName, fn, options, context) {\n var channel = this.getChannel(channelName || \"\", false);\n\n options = options || {};\n context = context || {};\n\n return channel.addSubscriber(fn, options, context);\n }\n\n // Pass in a channel namespace, function to be called, options, and context\n // to call the function in to Subscribe. It will create a channel if one\n // does not exist. Options can include a predicate to determine if it\n // should be called (based on the data published to it) and a priority\n // index.\n\n Mediator.prototype.once = function(channelName, fn, options, context) {\n options = options || {};\n options.calls = 1;\n\n return this.subscribe(channelName, fn, options, context);\n }\n\n // Returns a subscriber for a given subscriber id / named function and\n // channel namespace\n\n Mediator.prototype.getSubscriber = function(identifier, channelName) {\n var channel = this.getChannel(channelName || \"\", true);\n // We have to check if channel within the hierarchy exists and if it is\n // an exact match for the requested channel\n if (channel.namespace !== channelName) {\n return null;\n }\n\n return channel.getSubscriber(identifier);\n }\n\n // Remove a subscriber from a given channel namespace recursively based on\n // a passed-in subscriber id or named function.\n\n Mediator.prototype.remove = function(channelName, identifier, autoClean) {\n var channel = this.getChannel(channelName || \"\", true);\n\n if (channel.namespace !== channelName) {\n return false;\n }\n\n channel.removeSubscriber(identifier, autoClean);\n }\n\n\n // Publishes arbitrary data to a given channel namespace. Channels are\n // called recursively downwards; a post to application:chat will post to\n // application:chat:receive and application:chat:derp:test:beta:bananas.\n // Called using Mediator.publish(\"application:chat\", [ args ]);\n\n Mediator.prototype.publish = function(channelName) {\n var channel = this.getChannel(channelName || \"\", false);\n if (channel.namespace !== channelName) {\n return null;\n }\n\n var args = Array.prototype.slice.call(arguments, 1);\n\n args.push(channel);\n\n channel.publish(args);\n }\n\n // Alias some common names for easy interop\n Mediator.prototype.on = Mediator.prototype.subscribe;\n Mediator.prototype.bind = Mediator.prototype.subscribe;\n Mediator.prototype.emit = Mediator.prototype.publish;\n Mediator.prototype.trigger = Mediator.prototype.publish;\n Mediator.prototype.off = Mediator.prototype.remove;\n\n // Finally, expose it all.\n\n Mediator.Channel = Channel;\n Mediator.Subscriber = Subscriber;\n Mediator.version = \"0.10.1\";\n\n return Mediator;\n}));\n\n\n//# sourceURL=webpack://django-filer/./node_modules/mediator-js/lib/mediator.js?\n}"); + +/***/ } + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ id: moduleId, +/******/ loaded: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ if (!(moduleId in __webpack_modules__)) { +/******/ delete __webpack_module_cache__[moduleId]; +/******/ var e = new Error("Cannot find module '" + moduleId + "'"); +/******/ e.code = 'MODULE_NOT_FOUND'; +/******/ throw e; +/******/ } +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/harmony module decorator */ +/******/ (() => { +/******/ __webpack_require__.hmd = (module) => { +/******/ module = Object.create(module); +/******/ if (!module.children) module.children = []; +/******/ Object.defineProperty(module, 'exports', { +/******/ enumerable: true, +/******/ set: () => { +/******/ throw new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id); +/******/ } +/******/ }); +/******/ return module; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module can't be inlined because the eval devtool is used. +/******/ var __webpack_exports__ = __webpack_require__("./filer/static/filer/js/base.js"); +/******/ +/******/ })() +; \ No newline at end of file From 8ab90d46bf94f893e1be09732f60e4df87a1c04a Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Tue, 9 Jun 2026 15:46:57 +0300 Subject: [PATCH 692/715] BEN-2954: debug --- filer/admin/folderadmin.py | 57 +++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 31 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 916a55e49..2a792350c 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -703,7 +703,7 @@ def response_action(self, request, files_queryset, folders_queryset): action = action_form.cleaned_data['action'] select_across = action_form.cleaned_data['select_across'] func, name, description = self.get_actions(request)[action] - logger.warning("[Action] Dispatching action=%s, func=%s", action, func.__name__) + print("[Action] Dispatching action=%s, func=%s" % (action, func.__name__)) # Get the list of selected PKs. If nothing's selected, we can't # perform an action on it, so bail. Except we want to perform @@ -731,11 +731,10 @@ def response_action(self, request, files_queryset, folders_queryset): files_queryset = files_queryset.filter(pk__in=selected_files) folders_queryset = folders_queryset.filter( pk__in=selected_folders) - logger.warning("[Action] selected_files=%s, selected_folders=%s", - selected_files, selected_folders) + print("[Action] selected_files=%s, selected_folders=%s" % (selected_files, selected_folders)) - logger.warning("[Action] Calling %s with files_qs count=%d, folders_qs count=%d", - name, files_queryset.count(), folders_queryset.count()) + print("[Action] Calling %s with files_qs count=%d, folders_qs count=%d" % ( + name, files_queryset.count(), folders_queryset.count())) response = func(self, request, files_queryset, folders_queryset) # Actions may return an HttpResponse, which will be used as the @@ -1251,18 +1250,14 @@ def rename_files(self, request, files_queryset, folders_queryset): def extract_files(self, request, files_queryset, folders_queryset): if request.method != 'POST': - logger.warning("[Extract] Skipping: request.method=%s (not POST)", request.method) return None from ..models import Archive success_format = "Successfully extracted archive {}." - logger.warning("[Extract] Starting extract_files action") - logger.warning("[Extract] files_queryset count=%d, pks=%s", - files_queryset.count(), - list(files_queryset.values_list('pk', flat=True))) - logger.warning("[Extract] files in queryset: %s", - list(files_queryset.values_list('pk', 'original_filename', 'file', 'polymorphic_ctype_id'))) + # DEBUG: print to stdout (bypasses logging config) + file_data = list(files_queryset.values_list('pk', 'original_filename', 'file', 'polymorphic_ctype_id')) + print("[Extract] files_queryset count=%d, data=%s" % (files_queryset.count(), file_data)) # Filter by zip file extension rather than polymorphic_ctype, # because zip files may have been uploaded as plain File instances @@ -1274,35 +1269,35 @@ def extract_files(self, request, files_queryset, folders_queryset): extension_filter |= Q(file__iendswith=ext) files_queryset = files_queryset.filter(extension_filter) - logger.warning("[Extract] After extension filter: count=%d, pks=%s", - files_queryset.count(), - list(files_queryset.values_list('pk', 'original_filename', 'file'))) + filtered_data = list(files_queryset.values_list('pk', 'original_filename', 'file')) + print("[Extract] After extension filter: count=%d, data=%s" % (files_queryset.count(), filtered_data)) if not files_queryset.exists(): - logger.warning("[Extract] No archive files found after filtering. " - "Extension filter used: %s", zip_extensions) - self.message_user(request, _("No archive files were selected.")) + # Show the user exactly what files were selected and why they didn't match + debug_msg = ("No archive files were selected. " + "DEBUG: Selected files: %s. " + "Looking for extensions: %s" % (file_data, zip_extensions)) + print("[Extract] " + debug_msg) + self.message_user(request, debug_msg, level=messages.WARNING) return None # cannot extract in unfiled files folder if files_queryset.filter(folder__isnull=True).exists(): - logger.warning("[Extract] Cannot extract in unfiled files folder") + print("[Extract] Cannot extract in unfiled files folder") raise PermissionDenied if not has_multi_file_action_permission(request, files_queryset, Folder.objects.none()): - logger.warning("[Extract] Permission denied for multi file action") + print("[Extract] Permission denied for multi file action") raise PermissionDenied def _as_archive(filer_file): """Convert a File instance to Archive so extract methods work.""" if isinstance(filer_file, Archive): - logger.warning("[Extract] File pk=%s is already an Archive instance", filer_file.pk) + print("[Extract] File pk=%s is already an Archive" % filer_file.pk) return filer_file - logger.warning("[Extract] Converting File pk=%s (%s) to Archive instance " - "(polymorphic_ctype=%s)", - filer_file.pk, filer_file.original_filename, - filer_file.polymorphic_ctype) + print("[Extract] Converting File pk=%s (%s) to Archive (ctype=%s)" % ( + filer_file.pk, filer_file.original_filename, filer_file.polymorphic_ctype)) archive = Archive() archive.__dict__.update(filer_file.__dict__) archive.extract_errors = [] @@ -1310,7 +1305,7 @@ def _as_archive(filer_file): def is_valid_archive(filer_file): is_valid = filer_file.is_valid() - logger.warning("[Extract] is_valid_archive pk=%s: %s", filer_file.pk, is_valid) + print("[Extract] is_valid pk=%s: %s" % (filer_file.pk, is_valid)) if not is_valid: error_format = "{} is not a valid zip file" message = error_format.format(filer_file.clean_actual_name) @@ -1319,7 +1314,7 @@ def is_valid_archive(filer_file): def has_collisions(filer_file): collisions = filer_file.collisions() - logger.warning("[Extract] has_collisions pk=%s: %s", filer_file.pk, collisions) + print("[Extract] collisions pk=%s: %s" % (filer_file.pk, collisions)) if collisions: error_format = "Files/Folders from {archive} with names:" error_format += "{names} already exist." @@ -1335,16 +1330,16 @@ def has_collisions(filer_file): for f in files_queryset: f = _as_archive(f) if not is_valid_archive(f) or has_collisions(f): - logger.warning("[Extract] Skipping file pk=%s (invalid or collisions)", f.pk) + print("[Extract] Skipping pk=%s (invalid or collisions)" % f.pk) continue - logger.warning("[Extract] Extracting file pk=%s (%s)", f.pk, f.original_filename) + print("[Extract] Extracting pk=%s (%s)" % (f.pk, f.original_filename)) try: f.extract() message = success_format.format(f.actual_name) - logger.warning("[Extract] Success: %s", message) + print("[Extract] Success: %s" % message) self.message_user(request, _(message)) for err_msg in f.extract_errors: - logger.warning("[Extract] Extract warning for %s: %s", f.actual_name, err_msg) + print("[Extract] Warning: %s: %s" % (f.actual_name, err_msg)) messages.warning( request, _("%s: %s" % (f.actual_name, err_msg)) From 13ec1b95aabe394c3d358e4390e0f6cddb4bb961 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Tue, 9 Jun 2026 15:51:28 +0300 Subject: [PATCH 693/715] BEN-2954: test --- filer/static/filer/js/addons/dropzone.init.js | 2 +- .../static/filer/js/addons/table-dropzone.js | 2 +- .../static/filer/js/dist/filer-base.bundle.js | 264 +----------------- 3 files changed, 4 insertions(+), 264 deletions(-) diff --git a/filer/static/filer/js/addons/dropzone.init.js b/filer/static/filer/js/addons/dropzone.init.js index 6c35f9768..e2f19e0e7 100644 --- a/filer/static/filer/js/addons/dropzone.init.js +++ b/filer/static/filer/js/addons/dropzone.init.js @@ -10,7 +10,7 @@ if (Dropzone) { document.addEventListener('DOMContentLoaded', () => { const previewImageSelector = '.js-img-preview'; - const dropzoneSelector = '.js-filer-dropzone'; + const dropzoneSelector = '.js-filer-dropzone:not(.js-filer-dropzone-base):not(.js-filer-dropzone-folder):not(.js-filer-dropzone-info-message)'; const dropzones = document.querySelectorAll(dropzoneSelector); const messageSelector = '.js-filer-dropzone-message'; const lookupButtonSelector = '.js-related-lookup'; diff --git a/filer/static/filer/js/addons/table-dropzone.js b/filer/static/filer/js/addons/table-dropzone.js index c031213b2..2a6633370 100644 --- a/filer/static/filer/js/addons/table-dropzone.js +++ b/filer/static/filer/js/addons/table-dropzone.js @@ -86,7 +86,7 @@ document.addEventListener('DOMContentLoaded', () => { body.dataset.url = baseUrl; body.dataset.folderName = baseFolderTitle; body.dataset.maxFiles = dropzoneBase.dataset.maxFiles; - body.dataset.maxFilesize = dropzoneBase.dataset.maxFiles; + body.dataset.maxFilesize = dropzoneBase.dataset.maxFilesize; body.classList.add('js-filer-dropzone'); console.log('[Filer DnD] dropzoneBase found, url:', baseUrl, 'folder:', baseFolderTitle); } else { diff --git a/filer/static/filer/js/dist/filer-base.bundle.js b/filer/static/filer/js/dist/filer-base.bundle.js index f5ed60fd6..ff1695c57 100644 --- a/filer/static/filer/js/dist/filer-base.bundle.js +++ b/filer/static/filer/js/dist/filer-base.bundle.js @@ -1,262 +1,2 @@ -/* - * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development"). - * This devtool is neither made for production nor for readable output files. - * It uses "eval()" calls to create a separate source file in the browser devtools. - * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) - * or disable the default devtool with "devtool: false". - * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). - */ -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ "./filer/static/filer/js/addons/copy-move-files.js" -/*!*********************************************************!*\ - !*** ./filer/static/filer/js/addons/copy-move-files.js ***! - \*********************************************************/ -() { - -"use strict"; -eval("{\n/* global Cl */\n\n/*\n This functionality is used in folder/choose_copy_destination.html template\n to disable submit if there is only one folder to copy\n*/\n\ndocument.addEventListener('DOMContentLoaded', () => {\n const destination = document.getElementById('destination');\n if (!destination) {\n return;\n }\n\n const destinationOptions = destination.querySelectorAll('option');\n const destinationOptionLength = destinationOptions.length;\n const submit = document.querySelector('.js-submit-copy-move');\n const tooltip = document.querySelector('.js-disabled-btn-tooltip');\n\n if (destinationOptionLength === 1 && destinationOptions[0].disabled) {\n if (submit) {\n submit.style.display = 'none';\n }\n if (tooltip) {\n tooltip.style.display = 'inline-block';\n }\n }\n\n if (Cl.filerTooltip) {\n Cl.filerTooltip();\n }\n});\n\n\n//# sourceURL=webpack://django-filer/./filer/static/filer/js/addons/copy-move-files.js?\n}"); - -/***/ }, - -/***/ "./filer/static/filer/js/addons/dropdown-menu.js" -/*!*******************************************************!*\ - !*** ./filer/static/filer/js/addons/dropdown-menu.js ***! - \*******************************************************/ -() { - -"use strict"; -eval("{/* ========================================================================\n * Bootstrap: dropdown.js v3.3.6\n * http://getbootstrap.com/javascript/#dropdowns\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n(() => {\n // DROPDOWN CLASS DEFINITION\n // =========================\n\n const backdropClass = 'filer-dropdown-backdrop';\n const toggleSelector = '[data-toggle=\"filer-dropdown\"]';\n\n class Dropdown {\n constructor(element) {\n this.element = element;\n element.addEventListener('click', () => this.toggle());\n }\n\n toggle() {\n const element = this.element;\n const parent = getParent(element);\n const isActive = parent.classList.contains('open');\n const relatedTarget = { relatedTarget: element };\n\n if (element.disabled || element.classList.contains('disabled')) {\n return false;\n }\n\n clearMenus();\n\n if (!isActive) {\n if ('ontouchstart' in document.documentElement && !parent.closest('.navbar-nav')) {\n // if mobile we use a backdrop because click events don't delegate\n const backdrop = document.createElement('div');\n backdrop.className = backdropClass;\n element.parentNode.insertBefore(backdrop, element.nextSibling);\n backdrop.addEventListener('click', clearMenus);\n }\n\n const showEvent = new CustomEvent('show.bs.filer-dropdown', {\n bubbles: true,\n cancelable: true,\n detail: relatedTarget\n });\n parent.dispatchEvent(showEvent);\n\n if (showEvent.defaultPrevented) {\n return false;\n }\n\n element.focus();\n element.setAttribute('aria-expanded', 'true');\n parent.classList.add('open');\n\n const shownEvent = new CustomEvent('shown.bs.filer-dropdown', {\n bubbles: true,\n detail: relatedTarget\n });\n parent.dispatchEvent(shownEvent);\n }\n\n return false;\n }\n\n keydown(e) {\n const element = this.element;\n const parent = getParent(element);\n const isActive = parent.classList.contains('open');\n const desc = ' li:not(.disabled):visible a';\n const items = Array.from(parent.querySelectorAll(`.filer-dropdown-menu${desc}`))\n .filter(item => item.offsetParent !== null); // visible check\n const index = items.indexOf(e.target);\n\n if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n if (element.disabled || element.classList.contains('disabled')) {\n return;\n }\n\n if ((!isActive && e.which !== 27) || (isActive && e.which === 27)) {\n if (e.which === 27) {\n parent.querySelector(toggleSelector)?.focus();\n }\n return element.click();\n }\n\n if (!items.length) {\n return;\n }\n\n let newIndex = index;\n if (e.which === 38 && index > 0) {\n newIndex--; // up\n }\n if (e.which === 40 && index < items.length - 1) {\n newIndex++; // down\n }\n if (newIndex === -1) {\n newIndex = 0;\n }\n\n items[newIndex]?.focus();\n }\n }\n\n function getParent(element) {\n let selector = element.getAttribute('data-target');\n let parent = selector ? document.querySelector(selector) : null;\n\n if (!selector) {\n selector = element.getAttribute('href');\n selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, ''); // strip for ie7\n parent = selector ? document.querySelector(selector) : null;\n }\n\n return parent && parent.parentNode ? parent : element.parentNode;\n }\n\n function clearMenus(e) {\n if (e && e.which === 3) {\n return;\n }\n\n // Remove all backdrops\n document.querySelectorAll(`.${backdropClass}`).forEach(el => el.remove());\n\n document.querySelectorAll(toggleSelector).forEach((toggle) => {\n const parent = getParent(toggle);\n const relatedTarget = { relatedTarget: toggle };\n\n if (!parent.classList.contains('open')) {\n return;\n }\n\n if (e && e.type === 'click' && /input|textarea/i.test(e.target.tagName) && parent.contains(e.target)) {\n return;\n }\n\n const hideEvent = new CustomEvent('hide.bs.filer-dropdown', {\n bubbles: true,\n cancelable: true,\n detail: relatedTarget\n });\n parent.dispatchEvent(hideEvent);\n\n if (hideEvent.defaultPrevented) {\n return;\n }\n\n toggle.setAttribute('aria-expanded', 'false');\n parent.classList.remove('open');\n\n const hiddenEvent = new CustomEvent('hidden.bs.filer-dropdown', {\n bubbles: true,\n detail: relatedTarget\n });\n parent.dispatchEvent(hiddenEvent);\n });\n }\n\n // DROPDOWN PLUGIN DEFINITION\n // ==========================\n\n function Plugin(option) {\n this.forEach((element) => {\n let data = element._filerDropdownInstance;\n\n if (!data) {\n data = new Dropdown(element);\n element._filerDropdownInstance = data;\n }\n if (typeof option === 'string') {\n data[option].call(element);\n }\n });\n return this;\n }\n\n // Extend NodeList and HTMLCollection with dropdown method\n if (!NodeList.prototype.dropdown) {\n NodeList.prototype.dropdown = function(option) {\n return Plugin.call(this, option);\n };\n }\n if (!HTMLCollection.prototype.dropdown) {\n HTMLCollection.prototype.dropdown = function(option) {\n return Plugin.call(this, option);\n };\n }\n\n // APPLY TO STANDARD DROPDOWN ELEMENTS\n // ===================================\n\n document.addEventListener('click', clearMenus);\n\n document.addEventListener('click', (e) => {\n if (e.target.closest('.filer-dropdown form')) {\n e.stopPropagation();\n }\n });\n\n document.addEventListener('click', (e) => {\n const toggle = e.target.closest(toggleSelector);\n if (toggle) {\n const instance = toggle._filerDropdownInstance || new Dropdown(toggle);\n if (!toggle._filerDropdownInstance) {\n toggle._filerDropdownInstance = instance;\n }\n instance.toggle(e);\n }\n });\n\n document.addEventListener('keydown', (e) => {\n const toggle = e.target.closest(toggleSelector);\n if (toggle) {\n const instance = toggle._filerDropdownInstance || new Dropdown(toggle);\n if (!toggle._filerDropdownInstance) {\n toggle._filerDropdownInstance = instance;\n }\n instance.keydown(e);\n }\n });\n\n document.addEventListener('keydown', (e) => {\n const menu = e.target.closest('.filer-dropdown-menu');\n if (menu) {\n const toggle = menu.parentNode.querySelector(toggleSelector);\n if (toggle) {\n const instance = toggle._filerDropdownInstance || new Dropdown(toggle);\n if (!toggle._filerDropdownInstance) {\n toggle._filerDropdownInstance = instance;\n }\n instance.keydown(e);\n }\n }\n });\n\n // Export for compatibility\n window.FilerDropdown = Dropdown;\n})();\n\n\n//# sourceURL=webpack://django-filer/./filer/static/filer/js/addons/dropdown-menu.js?\n}"); - -/***/ }, - -/***/ "./filer/static/filer/js/addons/dropzone.init.js" -/*!*******************************************************!*\ - !*** ./filer/static/filer/js/addons/dropzone.init.js ***! - \*******************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var dropzone__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! dropzone */ \"./node_modules/dropzone/dist/dropzone.js\");\n/* harmony import */ var dropzone__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(dropzone__WEBPACK_IMPORTED_MODULE_0__);\n// #DROPZONE#\n// This script implements the dropzone settings\n\n\n\n\nif ((dropzone__WEBPACK_IMPORTED_MODULE_0___default())) {\n (dropzone__WEBPACK_IMPORTED_MODULE_0___default().autoDiscover) = false;\n}\n\ndocument.addEventListener('DOMContentLoaded', () => {\n const previewImageSelector = '.js-img-preview';\n const dropzoneSelector = '.js-filer-dropzone';\n const dropzones = document.querySelectorAll(dropzoneSelector);\n const messageSelector = '.js-filer-dropzone-message';\n const lookupButtonSelector = '.js-related-lookup';\n const editButtonSelector = '.js-related-edit';\n const dropzoneTemplate = '.js-filer-dropzone-template';\n const progressSelector = '.js-filer-dropzone-progress';\n const previewImageWrapperSelector = '.js-img-wrapper';\n const filerClearerSelector = '.filerClearer';\n const fileChooseSelector = '.js-file-selector';\n const fileIdInputSelector = '.vForeignKeyRawIdAdminField';\n const dragHoverClass = 'dz-drag-hover';\n const hiddenClass = 'hidden';\n const mobileClass = 'filer-dropzone-mobile';\n const objectAttachedClass = 'js-object-attached';\n const minWidth = 500;\n\n const checkMinWidth = (element) => {\n const width = element.offsetWidth;\n if (width < minWidth) {\n element.classList.add(mobileClass);\n } else {\n element.classList.remove(mobileClass);\n }\n };\n\n const showError = (message) => {\n try {\n window.parent.CMS.API.Messages.open({\n message: message\n });\n } catch {\n if (window.filerShowError) {\n window.filerShowError(message);\n } else {\n alert(message);\n }\n }\n };\n\n const createDropzone = function (dropzone) {\n const dropzoneUrl = dropzone.dataset.url;\n const inputId = dropzone.querySelector(fileIdInputSelector);\n const isImage = inputId?.getAttribute('name') === 'image';\n const lookupButton = dropzone.querySelector(lookupButtonSelector);\n const editButton = dropzone.querySelector(editButtonSelector);\n const message = dropzone.querySelector(messageSelector);\n const clearButton = dropzone.querySelector(filerClearerSelector);\n const fileChoose = dropzone.querySelector(fileChooseSelector);\n\n if (dropzone.dropzone) {\n return;\n }\n\n const resizeHandler = () => {\n checkMinWidth(dropzone);\n };\n window.addEventListener('resize', resizeHandler);\n\n new (dropzone__WEBPACK_IMPORTED_MODULE_0___default())(dropzone, {\n url: dropzoneUrl,\n paramName: 'file',\n maxFiles: 1,\n maxFilesize: dropzone.dataset.maxFilesize,\n previewTemplate: document.querySelector(dropzoneTemplate)?.innerHTML || '
    ',\n clickable: false,\n addRemoveLinks: false,\n init: function () {\n checkMinWidth(dropzone);\n\n this.on('removedfile', () => {\n if (fileChoose) {\n fileChoose.style.display = '';\n }\n dropzone.classList.remove(objectAttachedClass);\n this.removeAllFiles();\n clearButton?.click();\n });\n\n const images = this.element.querySelectorAll('img');\n images.forEach((img) => {\n img.addEventListener('dragstart', (event) => {\n event.preventDefault();\n });\n });\n\n if (clearButton) {\n clearButton.addEventListener('click', () => {\n dropzone.classList.remove(objectAttachedClass);\n // const changeEvent = new Event('change', { bubbles: true });\n // inputId?.dispatchEvent(changeEvent);\n });\n }\n },\n maxfilesexceeded: function () {\n this.removeAllFiles(true);\n },\n drop: function () {\n this.removeAllFiles(true);\n clearButton?.click();\n const progressEl = dropzone.querySelector(progressSelector);\n if (progressEl) {\n progressEl.classList.remove(hiddenClass);\n }\n if (fileChoose) {\n fileChoose.style.display = 'block';\n }\n lookupButton?.classList.add('related-lookup-change');\n editButton?.classList.add('related-lookup-change');\n message?.classList.add(hiddenClass);\n dropzone.classList.remove(dragHoverClass);\n dropzone.classList.add(objectAttachedClass);\n },\n success: function (file, response) {\n const progressEl = dropzone.querySelector(progressSelector);\n if (progressEl) {\n progressEl.classList.add(hiddenClass);\n }\n\n if (file && file.status === 'success' && response) {\n if (response.file_id && inputId) {\n inputId.value = response.file_id;\n const changeEvent = new Event('change', { bubbles: true });\n inputId.dispatchEvent(changeEvent);\n }\n if (response.thumbnail_180 && isImage) {\n const previewImg = dropzone.querySelector(previewImageSelector);\n if (previewImg) {\n previewImg.style.backgroundImage = `url(${response.thumbnail_180})`;\n }\n const wrapper = dropzone.querySelector(previewImageWrapperSelector);\n if (wrapper) {\n wrapper.classList.remove(hiddenClass);\n }\n }\n } else {\n if (response && response.error) {\n showError(`${file.name}: ${response.error}`);\n }\n this.removeAllFiles(true);\n }\n\n const images = this.element.querySelectorAll('img');\n images.forEach((img) => {\n img.addEventListener('dragstart', (event) => {\n event.preventDefault();\n });\n });\n },\n error: function (file, msg, response) {\n if (response && response.error) {\n msg += ` ; ${response.error}`;\n }\n showError(`${file.name}: ${msg}`);\n this.removeAllFiles(true);\n },\n reset: function () {\n if (isImage) {\n const wrapper = dropzone.querySelector(previewImageWrapperSelector);\n if (wrapper) {\n wrapper.classList.add(hiddenClass);\n }\n const previewImg = dropzone.querySelector(previewImageSelector);\n if (previewImg) {\n previewImg.style.backgroundImage = 'none';\n }\n }\n dropzone.classList.remove(objectAttachedClass);\n if (inputId) {\n inputId.value = '';\n }\n lookupButton?.classList.remove('related-lookup-change');\n editButton?.classList.remove('related-lookup-change');\n message?.classList.remove(hiddenClass);\n if (inputId) {\n const changeEvent = new Event('change', { bubbles: true });\n inputId.dispatchEvent(changeEvent);\n }\n }\n });\n };\n\n if (dropzones.length && (dropzone__WEBPACK_IMPORTED_MODULE_0___default())) {\n if (!window.filerDropzoneInitialized) {\n window.filerDropzoneInitialized = true;\n (dropzone__WEBPACK_IMPORTED_MODULE_0___default().autoDiscover) = false;\n }\n dropzones.forEach(createDropzone);\n\n // Handle initialization of the dropzone on dynamic formsets (i.e. Django admin inlines)\n document.addEventListener('formset:added', (event) => {\n let dropzones;\n let rowIdx;\n let row;\n\n if (event.detail && event.detail.formsetName) {\n /*\n Django 4.1 changed the event type being fired when adding\n a new formset from a jQuery to a vanilla JavaScript event.\n https://docs.djangoproject.com/en/4.1/ref/contrib/admin/javascript/\n\n In this case we find the newly added row and initialize the\n dropzone on any dropzoneSelector on that row.\n */\n\n rowIdx = parseInt(\n document.getElementById(\n `id_${event.detail.formsetName}-TOTAL_FORMS`\n ).value, 10\n ) - 1;\n row = document.getElementById(`${event.detail.formsetName}-${rowIdx}`);\n dropzones = row?.querySelectorAll(dropzoneSelector) || [];\n } else {\n // Fallback for older jQuery event format\n row = event.target;\n dropzones = row?.querySelectorAll(dropzoneSelector) || [];\n }\n\n dropzones?.forEach(createDropzone);\n });\n }\n});\n\n\n//# sourceURL=webpack://django-filer/./filer/static/filer/js/addons/dropzone.init.js?\n}"); - -/***/ }, - -/***/ "./filer/static/filer/js/addons/filer_popup_response.js" -/*!**************************************************************!*\ - !*** ./filer/static/filer/js/addons/filer_popup_response.js ***! - \**************************************************************/ -() { - -eval("{/*global opener */\n(function () {\n 'use strict';\n const dataElement = document.getElementById('django-admin-popup-response-constants');\n let initData;\n\n if (dataElement) {\n initData = JSON.parse(dataElement.dataset.popupResponse);\n switch (initData.action) {\n case 'change':\n // Specific function for file editing popup opened from widget\n opener.dismissRelatedImageLookupPopup(window, initData.new_value, null, initData.obj, null);\n break;\n case 'delete':\n opener.dismissDeleteRelatedObjectPopup(window, initData.value);\n break;\n default:\n opener.dismissAddRelatedObjectPopup(window, initData.value, initData.obj);\n break;\n }\n }\n})();\n\n\n//# sourceURL=webpack://django-filer/./filer/static/filer/js/addons/filer_popup_response.js?\n}"); - -/***/ }, - -/***/ "./filer/static/filer/js/addons/focal-point.js" -/*!*****************************************************!*\ - !*** ./filer/static/filer/js/addons/focal-point.js ***! - \*****************************************************/ -(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* module decorator */ module = __webpack_require__.hmd(module);\n// #FOCAL POINT#\n// This script implements the image focal point setting\n\n\nwindow.Cl = window.Cl || {};\n\n(() => {\n class FocalPoint {\n constructor(options = {}) {\n this.options = {\n containerSelector: '.js-focal-point',\n imageSelector: '.js-focal-point-image',\n circleSelector: '.js-focal-point-circle',\n locationSelector: '.js-focal-point-location',\n draggableClass: 'draggable',\n hiddenClass: 'hidden',\n dataLocation: 'locationSelector',\n ...options\n };\n this.focalPointInstances = [];\n this._init = this._init.bind(this);\n }\n\n _init(container) {\n const focalPointInstance = new FocalPointConstructor(container, this.options);\n this.focalPointInstances.push(focalPointInstance);\n }\n\n initialize() {\n const containers = document.querySelectorAll(this.options.containerSelector);\n containers.forEach((container) => {\n this._init(container);\n });\n\n if (window.Cl.mediator) {\n window.Cl.mediator.subscribe('focal-point:init', this._init);\n }\n }\n\n destroy() {\n if (window.Cl.mediator) {\n window.Cl.mediator.remove('focal-point:init', this._init);\n }\n\n this.focalPointInstances.forEach((focalPointInstance) => {\n focalPointInstance.destroy();\n });\n\n this.focalPointInstances = [];\n }\n }\n\n class FocalPointConstructor {\n constructor(container, options = {}) {\n this.options = {\n imageSelector: '.js-focal-point-image',\n circleSelector: '.js-focal-point-circle',\n locationSelector: '.js-focal-point-location',\n draggableClass: 'draggable',\n hiddenClass: 'hidden',\n dataLocation: 'locationSelector',\n ...options\n };\n\n this.container = container;\n this.image = this.container.querySelector(this.options.imageSelector);\n this.circle = this.container.querySelector(this.options.circleSelector);\n this.ratio = parseFloat(this.image?.dataset.ratio || 1);\n this.location = this._getLocation();\n this.isDragging = false;\n this.dragStartX = 0;\n this.dragStartY = 0;\n this.circleStartX = 0;\n this.circleStartY = 0;\n\n this._onImageLoaded = this._onImageLoaded.bind(this);\n this._onMouseDown = this._onMouseDown.bind(this);\n this._onMouseMove = this._onMouseMove.bind(this);\n this._onMouseUp = this._onMouseUp.bind(this);\n\n if (this.image?.complete) {\n this._onImageLoaded();\n } else if (this.image) {\n this.image.addEventListener('load', this._onImageLoaded);\n }\n }\n\n _updateLocationValue(x, y) {\n const locationValue = `${Math.round(x * this.ratio)},${Math.round(y * this.ratio)}`;\n if (this.location) {\n this.location.value = locationValue;\n }\n }\n\n _getLocation() {\n const locationSelector = this.container.dataset[this.options.dataLocation];\n if (locationSelector) {\n const newLocation = document.querySelector(locationSelector);\n if (newLocation) {\n return newLocation;\n }\n }\n return this.container.querySelector(this.options.locationSelector);\n }\n\n _makeDraggable() {\n if (!this.circle) {\n return;\n }\n\n this.circle.classList.add(this.options.draggableClass);\n this.circle.addEventListener('mousedown', this._onMouseDown);\n this.circle.addEventListener('touchstart', this._onMouseDown, { passive: false });\n }\n\n _onMouseDown(event) {\n event.preventDefault();\n this.isDragging = true;\n\n const touch = event.type === 'touchstart' ? event.touches[0] : event;\n\n // Get container bounds\n const containerRect = this.container.getBoundingClientRect();\n\n // Calculate mouse position relative to container\n this.dragStartX = touch.clientX - containerRect.left;\n this.dragStartY = touch.clientY - containerRect.top;\n\n // Get current circle position (center)\n const circleRect = this.circle.getBoundingClientRect();\n this.circleStartX = circleRect.left - containerRect.left + circleRect.width / 2;\n this.circleStartY = circleRect.top - containerRect.top + circleRect.height / 2;\n\n document.addEventListener('mousemove', this._onMouseMove);\n document.addEventListener('mouseup', this._onMouseUp);\n document.addEventListener('touchmove', this._onMouseMove, { passive: false });\n document.addEventListener('touchend', this._onMouseUp);\n }\n\n _onMouseMove(event) {\n if (!this.isDragging) {\n return;\n }\n\n event.preventDefault();\n\n const touch = event.type === 'touchmove' ? event.touches[0] : event;\n\n // Get container bounds\n const containerRect = this.container.getBoundingClientRect();\n\n // Calculate current mouse position relative to container\n const currentX = touch.clientX - containerRect.left;\n const currentY = touch.clientY - containerRect.top;\n\n // Calculate how much the mouse moved\n const deltaX = currentX - this.dragStartX;\n const deltaY = currentY - this.dragStartY;\n\n // Calculate new center position\n let centerX = this.circleStartX + deltaX;\n let centerY = this.circleStartY + deltaY;\n\n // Constrain center to container bounds\n centerX = Math.max(0, Math.min(containerRect.width - 1, centerX));\n centerY = Math.max(0, Math.min(containerRect.height - 1, centerY));\n\n // Position circle by its top-left corner (center - radius)\n this.circle.style.left = `${centerX}px`;\n this.circle.style.top = `${centerY}px`;\n\n // Update location value with center coordinates\n this._updateLocationValue(centerX, centerY);\n }\n\n _onMouseUp() {\n this.isDragging = false;\n document.removeEventListener('mousemove', this._onMouseMove);\n document.removeEventListener('mouseup', this._onMouseUp);\n document.removeEventListener('touchmove', this._onMouseMove);\n document.removeEventListener('touchend', this._onMouseUp);\n }\n\n _onImageLoaded() {\n if (!this.image || this.image.naturalWidth === 0) {\n return;\n }\n\n this.circle?.classList.remove(this.options.hiddenClass);\n\n const locationValue = this.location?.value || '';\n const imageWidth = this.image.offsetWidth;\n const imageHeight = this.image.offsetHeight;\n\n let x, y;\n\n if (locationValue.length) {\n const coords = locationValue.split(',');\n x = Math.round(Number(coords[0]) / this.ratio);\n y = Math.round(Number(coords[1]) / this.ratio);\n } else {\n x = imageWidth / 2;\n y = imageHeight / 2;\n }\n\n if (isNaN(x) || isNaN(y)) {\n return;\n }\n\n // Position circle (accounting for circle size)\n if (this.circle) {\n this.circle.style.left = `${x}px`;\n this.circle.style.top = `${y}px`;\n }\n\n this._makeDraggable();\n this._updateLocationValue(x, y);\n }\n\n destroy() {\n if (this.circle?.classList.contains(this.options.draggableClass)) {\n this.circle.removeEventListener('mousedown', this._onMouseDown);\n this.circle.removeEventListener('touchstart', this._onMouseDown);\n }\n\n document.removeEventListener('mousemove', this._onMouseMove);\n document.removeEventListener('mouseup', this._onMouseUp);\n document.removeEventListener('touchmove', this._onMouseMove);\n document.removeEventListener('touchend', this._onMouseUp);\n\n if (this.image) {\n this.image.removeEventListener('load', this._onImageLoaded);\n }\n\n this.options = null;\n this.container = null;\n this.image = null;\n this.circle = null;\n this.location = null;\n this.ratio = null;\n }\n }\n\n window.Cl.FocalPoint = FocalPoint;\n window.Cl.FocalPointConstructor = FocalPointConstructor;\n\n // Export for ES6 module usage\n if ( true && module.exports) {\n module.exports = FocalPoint;\n }\n})();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (window.Cl.FocalPoint);\n\n\n//# sourceURL=webpack://django-filer/./filer/static/filer/js/addons/focal-point.js?\n}"); - -/***/ }, - -/***/ "./filer/static/filer/js/addons/popup_handling.js" -/*!********************************************************!*\ - !*** ./filer/static/filer/js/addons/popup_handling.js ***! - \********************************************************/ -() { - -"use strict"; -eval("{\n\nconst windowname_to_id = (text) => {\n text = text.replace(/__dot__/g, '.');\n text = text.replace(/__dash__/g, '-');\n const last = text.lastIndexOf('__');\n return last === -1 ? text : text.substring(0, last);\n};\n\nwindow.dismissPopupAndReload = (win) => {\n document.location.reload();\n win.close();\n};\n\nwindow.dismissRelatedImageLookupPopup = (\n win,\n chosenId,\n chosenThumbnailUrl,\n chosenDescriptionTxt,\n chosenAdminChangeUrl\n) => {\n const id = windowname_to_id(win.name);\n const lookup = document.getElementById(id);\n if (!lookup) {\n return;\n }\n const container = lookup.closest('.filerFile');\n if (!container) {\n return;\n }\n const edit = container.querySelector('.edit');\n const image = container.querySelector('.thumbnail_img');\n const descriptionText = container.querySelector('.description_text');\n const clearer = container.querySelector('.filerClearer');\n const dropzoneMessage = container.parentElement.querySelector('.dz-message');\n const element = container.querySelector('input');\n const oldId = element.value;\n\n element.value = chosenId;\n const dropzone = element.closest('.js-filer-dropzone');\n if (dropzone) {\n dropzone.classList.add('js-object-attached');\n }\n if (chosenThumbnailUrl && image) {\n image.src = chosenThumbnailUrl;\n image.classList.remove('hidden');\n image.removeAttribute('srcset');\n }\n if (descriptionText) {\n descriptionText.textContent = chosenDescriptionTxt;\n }\n if (clearer) {\n clearer.classList.remove('hidden');\n }\n lookup.classList.add('related-lookup-change');\n if (edit) {\n edit.classList.add('related-lookup-change');\n }\n if (chosenAdminChangeUrl && edit) {\n edit.setAttribute('href', `${chosenAdminChangeUrl}?_edit_from_widget=1`);\n }\n if (dropzoneMessage) {\n dropzoneMessage.classList.add('hidden');\n }\n\n if (oldId !== chosenId) {\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n win.close();\n};\nwindow.dismissRelatedFolderLookupPopup = (win, chosenId, chosenName) => {\n const id = windowname_to_id(win.name);\n const lookup = document.getElementById(id);\n if (!lookup) {\n return;\n }\n const container = lookup.closest('.filerFile');\n if (!container) {\n return;\n }\n const image = container.querySelector('.thumbnail_img');\n const clearButton = document.getElementById(`id_${id}_clear`);\n const input = document.getElementById(`id_${id}`);\n const folderName = container.querySelector('.description_text');\n const addFolderButton = document.getElementById(id);\n\n if (input) {\n input.value = chosenId;\n }\n if (image) {\n image.classList.remove('hidden');\n }\n if (folderName) {\n folderName.textContent = chosenName;\n }\n if (clearButton) {\n clearButton.classList.remove('hidden');\n }\n if (addFolderButton) {\n addFolderButton.classList.add('hidden');\n }\n win.close();\n};\n\n// Handle popup dismiss links (for folder/image selection in popups)\ndocument.addEventListener('DOMContentLoaded', () => {\n document.querySelectorAll('.js-dismiss-popup').forEach((link) => {\n link.addEventListener('click', function (e) {\n e.preventDefault();\n\n const fileId = this.dataset.fileId;\n const iconUrl = this.dataset.iconUrl;\n const label = this.dataset.label;\n\n if (this.classList.contains('js-dismiss-image')) {\n const changeUrl = this.dataset.changeUrl || '';\n window.opener.dismissRelatedImageLookupPopup(\n window,\n fileId,\n iconUrl,\n label,\n changeUrl\n );\n } else if (this.classList.contains('js-dismiss-folder')) {\n window.opener.dismissRelatedFolderLookupPopup(window, fileId, label);\n }\n });\n });\n\n // Auto-dismiss popup on page load (for dismiss_popup.html)\n const popupData = document.getElementById('popup-dismiss-data');\n if (popupData && window.opener) {\n const pk = popupData.dataset.pk;\n const label = popupData.dataset.label;\n window.opener.dismissRelatedPopup(window, pk, label);\n }\n});\n\n\n//# sourceURL=webpack://django-filer/./filer/static/filer/js/addons/popup_handling.js?\n}"); - -/***/ }, - -/***/ "./filer/static/filer/js/addons/table-dropzone.js" -/*!********************************************************!*\ - !*** ./filer/static/filer/js/addons/table-dropzone.js ***! - \********************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var dropzone__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! dropzone */ \"./node_modules/dropzone/dist/dropzone.js\");\n/* harmony import */ var dropzone__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(dropzone__WEBPACK_IMPORTED_MODULE_0__);\n// #DROPZONE#\n// This script implements the dropzone settings\n\n\n\n\n\n/* globals Cl */\ndocument.addEventListener('DOMContentLoaded', () => {\n let submitNum = 0;\n let maxSubmitNum = 0;\n const dropzoneInstances = [];\n const dropzoneBase = document.querySelector('.js-filer-dropzone-base');\n const dropzoneSelector = '.js-filer-dropzone';\n let dropzones;\n const infoMessageClass = 'js-filer-dropzone-info-message';\n const infoMessage = document.querySelector(`.${infoMessageClass}`);\n const folderName = document.querySelector('.js-filer-dropzone-folder-name');\n const uploadInfoContainer = document.querySelector('.js-filer-dropzone-upload-info-container');\n const uploadInfo = document.querySelector('.js-filer-dropzone-upload-info');\n const uploadWelcome = document.querySelector('.js-filer-dropzone-upload-welcome');\n const uploadNumber = document.querySelector('.js-filer-dropzone-upload-number');\n const uploadCount = document.querySelector('.js-filer-upload-count');\n const uploadText = document.querySelector('.js-filer-upload-text');\n const uploadFileNameSelector = '.js-filer-dropzone-file-name';\n const uploadProgressSelector = '.js-filer-dropzone-progress';\n const uploadSuccess = document.querySelector('.js-filer-dropzone-upload-success');\n const uploadCanceled = document.querySelector('.js-filer-dropzone-upload-canceled');\n const cancelUpload = document.querySelector('.js-filer-dropzone-cancel');\n const dragHoverClass = 'dz-drag-hover';\n const dataUploaderConnections = 'max-uploader-connections';\n const dragHoverBorder = document.querySelector('.drag-hover-border');\n const hiddenClass = 'hidden';\n let hideMessageTimeout;\n let hasErrors = false;\n let baseUrl;\n let baseFolderTitle;\n\n // utility to update query string (same as upload-button)\n const updateQuery = (uri, key, value) => {\n const re = new RegExp(`([?&])${key}=.*?(&|$)`, 'i');\n const separator = uri.indexOf('?') !== -1 ? '&' : '?';\n const hash = window.location.hash;\n uri = uri.replace(/#.*$/, '');\n if (uri.match(re)) {\n return uri.replace(re, `$1${key}=${value}$2`) + hash;\n } else {\n return uri + separator + key + '=' + value + hash;\n }\n };\n\n const reloadOrdered = () => {\n const uri = window.location.toString();\n window.location.replace(updateQuery(uri, 'order_by', '-modified_at'));\n };\n\n const updateUploadNumber = () => {\n if (uploadNumber) {\n uploadNumber.textContent = `${maxSubmitNum - submitNum}/${maxSubmitNum}`;\n }\n if (uploadText) {\n uploadText.classList.remove('hidden');\n }\n if (uploadCount) {\n uploadCount.classList.remove('hidden');\n }\n };\n\n const destroyDropzones = () => {\n dropzoneInstances.forEach((instance) => {\n instance.destroy();\n });\n };\n\n const getElementByFile = (file, url) => {\n return document.getElementById(\n `file-${encodeURIComponent(file.name)}${file.size}${file.lastModified}${url}`\n );\n };\n\n if (dropzoneBase) {\n baseUrl = dropzoneBase.dataset.url;\n baseFolderTitle = dropzoneBase.dataset.folderName;\n\n const body = document.body;\n body.dataset.url = baseUrl;\n body.dataset.folderName = baseFolderTitle;\n body.dataset.maxFiles = dropzoneBase.dataset.maxFiles;\n body.dataset.maxFilesize = dropzoneBase.dataset.maxFiles;\n body.classList.add('js-filer-dropzone');\n console.log('[Filer DnD] dropzoneBase found, url:', baseUrl, 'folder:', baseFolderTitle);\n } else {\n console.log('[Filer DnD] No .js-filer-dropzone-base element found on page');\n }\n\n Cl.mediator.subscribe('filer-upload-in-progress', destroyDropzones);\n\n dropzones = document.querySelectorAll(dropzoneSelector);\n console.log('[Filer DnD] Found', dropzones.length, 'dropzone elements (.js-filer-dropzone)');\n\n if (dropzones.length && (dropzone__WEBPACK_IMPORTED_MODULE_0___default())) {\n (dropzone__WEBPACK_IMPORTED_MODULE_0___default().autoDiscover) = false;\n dropzones.forEach((dropzoneElement) => {\n if (dropzoneElement.dropzone) {\n console.log('[Filer DnD] Skipping element (already has dropzone):', dropzoneElement.tagName, dropzoneElement.className);\n return;\n }\n const dropzoneUrl = dropzoneElement.dataset.url;\n console.log('[Filer DnD] Creating Dropzone instance for', dropzoneElement.tagName,\n 'url:', dropzoneUrl, 'maxFiles:', dropzoneElement.dataset.maxFiles,\n 'maxFilesize:', dropzoneElement.dataset.maxFilesize);\n const dropzoneInstance = new (dropzone__WEBPACK_IMPORTED_MODULE_0___default())(dropzoneElement, {\n url: dropzoneUrl,\n paramName: 'file',\n maxFiles: parseInt(dropzoneElement.dataset.maxFiles) || 100,\n maxFilesize: parseInt(dropzoneElement.dataset.maxFilesize), // no default\n previewTemplate: '
    ',\n clickable: false,\n addRemoveLinks: false,\n parallelUploads: dropzoneElement.dataset[dataUploaderConnections] || 3,\n accept: (file, done) => {\n let uploadInfoClone;\n console.log('[Filer DnD] accept:', file.name, 'url:', dropzoneUrl);\n\n Cl.mediator.remove('filer-upload-in-progress', destroyDropzones);\n Cl.mediator.publish('filer-upload-in-progress');\n\n clearTimeout(hideMessageTimeout);\n clearTimeout(hideMessageTimeout);\n if (uploadWelcome) {\n uploadWelcome.classList.add(hiddenClass);\n }\n if (cancelUpload) {\n cancelUpload.classList.remove(hiddenClass);\n }\n\n if (getElementByFile(file, dropzoneUrl)) {\n done('duplicate');\n } else {\n uploadInfoClone = uploadInfo.cloneNode(true);\n\n const fileNameEl = uploadInfoClone.querySelector(uploadFileNameSelector);\n if (fileNameEl) {\n fileNameEl.textContent = file.name;\n }\n const progressEl = uploadInfoClone.querySelector(uploadProgressSelector);\n if (progressEl) {\n progressEl.style.width = '0';\n }\n uploadInfoClone.setAttribute(\n 'id',\n `file-${encodeURIComponent(file.name)}${file.size}${file.lastModified}${dropzoneUrl}`\n );\n if (uploadInfoContainer) {\n uploadInfoContainer.appendChild(uploadInfoClone);\n }\n\n submitNum++;\n maxSubmitNum++;\n console.log('[Filer DnD] file accepted, submitNum:', submitNum, 'maxSubmitNum:', maxSubmitNum);\n updateUploadNumber();\n done();\n }\n\n dropzones.forEach((dz) => dz.classList.remove('reset-hover'));\n if (infoMessage) {\n infoMessage.classList.remove(hiddenClass);\n }\n dropzones.forEach((dz) => dz.classList.remove(dragHoverClass));\n },\n dragover: (dragEvent) => {\n const target = dragEvent.target.closest(dropzoneSelector);\n const folderTitle = target?.dataset.folderName;\n const dropzoneFolder = dropzoneElement.classList.contains('js-filer-dropzone-folder');\n const dropzoneBoundingRect = dropzoneElement.getBoundingClientRect();\n const borderStyle = dragHoverBorder ? window.getComputedStyle(dragHoverBorder) : null;\n const topBorderSize = borderStyle ? borderStyle.borderTopWidth : '0px';\n const leftBorderSize = borderStyle ? borderStyle.borderLeftWidth : '0px';\n const dropzonePosition = {\n top: `${dropzoneBoundingRect.top}px`,\n bottom: `${dropzoneBoundingRect.bottom}px`,\n left: `${dropzoneBoundingRect.left}px`,\n right: `${dropzoneBoundingRect.right}px`,\n width: `${dropzoneBoundingRect.width - parseInt(leftBorderSize, 10) * 2}px`,\n height: `${dropzoneBoundingRect.height - parseInt(topBorderSize, 10) * 2}px`,\n display: 'block'\n };\n if (dropzoneFolder && dragHoverBorder) {\n Object.assign(dragHoverBorder.style, dropzonePosition);\n }\n\n dropzones.forEach((dz) => dz.classList.add('reset-hover'));\n if (uploadSuccess) {\n uploadSuccess.classList.add(hiddenClass);\n }\n if (infoMessage) {\n infoMessage.classList.remove(hiddenClass);\n }\n dropzoneElement.classList.add(dragHoverClass);\n dropzoneElement.classList.remove('reset-hover');\n\n if (folderName && folderTitle) {\n folderName.textContent = folderTitle;\n }\n },\n dragend: () => {\n clearTimeout(hideMessageTimeout);\n hideMessageTimeout = setTimeout(() => {\n if (infoMessage) {\n infoMessage.classList.add(hiddenClass);\n }\n }, 1000);\n\n if (infoMessage) {\n infoMessage.classList.remove(hiddenClass);\n }\n dropzones.forEach((dz) => dz.classList.remove(dragHoverClass));\n if (dragHoverBorder) {\n Object.assign(dragHoverBorder.style, { top: '0', bottom: '0', width: '0', height: '0' });\n }\n },\n dragleave: () => {\n clearTimeout(hideMessageTimeout);\n hideMessageTimeout = setTimeout(() => {\n if (infoMessage) {\n infoMessage.classList.add(hiddenClass);\n }\n }, 1000);\n\n if (infoMessage) {\n infoMessage.classList.remove(hiddenClass);\n }\n dropzones.forEach((dz) => dz.classList.remove(dragHoverClass));\n if (dragHoverBorder) {\n Object.assign(dragHoverBorder.style, { top: '0', bottom: '0', width: '0', height: '0' });\n }\n },\n sending: (file) => {\n console.log('[Filer DnD] sending:', file.name, 'to:', dropzoneUrl);\n const fileEl = getElementByFile(file, dropzoneUrl);\n if (fileEl) {\n fileEl.classList.remove(hiddenClass);\n }\n },\n uploadprogress: (file, progress) => {\n const fileEl = getElementByFile(file, dropzoneUrl);\n if (fileEl) {\n const progressEl = fileEl.querySelector(uploadProgressSelector);\n if (progressEl) {\n progressEl.style.width = `${progress}%`;\n }\n }\n },\n success: (file, response) => {\n submitNum--;\n console.log('[Filer DnD] success:', file.name, 'submitNum:', submitNum, 'response:', response);\n updateUploadNumber();\n const fileEl = getElementByFile(file, dropzoneUrl);\n if (fileEl) {\n fileEl.remove();\n }\n },\n queuecomplete: () => {\n console.log('[Filer DnD] queuecomplete: submitNum:', submitNum, 'hasErrors:', hasErrors);\n if (submitNum !== 0) {\n console.warn('[Filer DnD] queuecomplete: submitNum is not 0, skipping reload');\n return;\n }\n\n updateUploadNumber();\n\n if (cancelUpload) {\n cancelUpload.classList.add(hiddenClass);\n }\n if (uploadInfo) {\n uploadInfo.classList.add(hiddenClass);\n }\n\n if (hasErrors) {\n if (uploadNumber) {\n uploadNumber.classList.add(hiddenClass);\n }\n console.log('[Filer DnD] reloading after errors (1s delay)');\n setTimeout(() => {\n reloadOrdered();\n }, 1000);\n } else {\n if (uploadSuccess) {\n uploadSuccess.classList.remove(hiddenClass);\n }\n console.log('[Filer DnD] reloading now via reloadOrdered');\n reloadOrdered();\n }\n },\n error: (file, error) => {\n console.error('[Filer DnD] error:', file.name, 'error:', error, 'submitNum:', submitNum);\n if (error === 'duplicate') {\n // submitNum was never incremented for duplicates\n console.log('[Filer DnD] duplicate file, ignoring');\n return;\n }\n submitNum--;\n console.log('[Filer DnD] after error decrement, submitNum:', submitNum);\n updateUploadNumber();\n const fileEl = getElementByFile(file, dropzoneUrl);\n if (fileEl) {\n fileEl.remove();\n }\n hasErrors = true;\n if (window.filerShowError) {\n window.filerShowError(`${file.name}: ${error.message || error}`);\n }\n }\n });\n dropzoneInstances.push(dropzoneInstance);\n if (cancelUpload) {\n cancelUpload.addEventListener('click', (clickEvent) => {\n clickEvent.preventDefault();\n cancelUpload.classList.add(hiddenClass);\n if (uploadCanceled) {\n uploadCanceled.classList.remove(hiddenClass);\n }\n dropzoneInstance.removeAllFiles(true);\n });\n }\n });\n } else {\n console.warn('[Filer DnD] No dropzone instances created. dropzones.length:', dropzones.length, 'Dropzone:', !!(dropzone__WEBPACK_IMPORTED_MODULE_0___default()));\n }\n});\n\n\n//# sourceURL=webpack://django-filer/./filer/static/filer/js/addons/table-dropzone.js?\n}"); - -/***/ }, - -/***/ "./filer/static/filer/js/addons/toggler.js" -/*!*************************************************!*\ - !*** ./filer/static/filer/js/addons/toggler.js ***! - \*************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n// #TOGGLER#\n// This script implements the simple element toggle\n\n\nwindow.Cl = window.Cl || {};\n\nclass Toggler {\n constructor(options = {}) {\n this.options = {\n linksSelector: '.js-toggler-link',\n dataHeaderSelector: 'toggler-header-selector',\n dataContentSelector: 'toggler-content-selector',\n collapsedClass: 'js-collapsed',\n expandedClass: 'js-expanded',\n hiddenClass: 'hidden',\n ...options\n };\n\n this.togglerInstances = [];\n\n const links = document.querySelectorAll(this.options.linksSelector);\n links.forEach(link => {\n const togglerInstance = new TogglerConstructor(link, this.options);\n this.togglerInstances.push(togglerInstance);\n });\n }\n\n destroy() {\n this.links = null;\n this.togglerInstances.forEach(togglerInstance => togglerInstance.destroy());\n this.togglerInstances = [];\n }\n}\n\nclass TogglerConstructor {\n constructor(link, options = {}) {\n this.options = { ...options };\n this.link = link;\n this.headerSelector = this.link.dataset[this.options.dataHeaderSelector];\n this.contentSelector = this.link.dataset[this.options.dataContentSelector];\n this.header = document.querySelector(this.headerSelector);\n this.header = this.header || this.link;\n this.content = document.querySelector(this.contentSelector);\n\n if (!this.content) {\n return;\n }\n\n this._initLink();\n }\n\n _updateClasses() {\n if (this.content.classList.contains(this.options.hiddenClass)) {\n this.header.classList.remove(this.options.expandedClass);\n this.header.classList.add(this.options.collapsedClass);\n } else {\n this.header.classList.add(this.options.expandedClass);\n this.header.classList.remove(this.options.collapsedClass);\n }\n }\n\n _onTogglerClick(clickEvent) {\n this.content.classList.toggle(this.options.hiddenClass);\n this._updateClasses();\n clickEvent.preventDefault();\n }\n\n _initLink() {\n this._updateClasses();\n this.link.addEventListener('click', e => this._onTogglerClick(e));\n }\n\n destroy() {\n this.options = null;\n this.link = null;\n }\n}\n\nCl.Toggler = Toggler;\nCl.TogglerConstructor = TogglerConstructor;\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Toggler);\n\n\n//# sourceURL=webpack://django-filer/./filer/static/filer/js/addons/toggler.js?\n}"); - -/***/ }, - -/***/ "./filer/static/filer/js/addons/tooltip.js" -/*!*************************************************!*\ - !*** ./filer/static/filer/js/addons/tooltip.js ***! - \*************************************************/ -() { - -"use strict"; -eval("{\nwindow.Cl = window.Cl || {};\n\nCl.filerTooltip = () => {\n const tooltipSelector = '.js-filer-tooltip';\n const tooltips = document.querySelectorAll(tooltipSelector);\n\n tooltips.forEach((element) => {\n element.addEventListener('mouseover', function () {\n const title = this.getAttribute('title');\n if (!title) {\n return;\n }\n\n this.dataset.filerTooltip = title;\n this.removeAttribute('title');\n\n const tooltip = document.createElement('p');\n tooltip.className = 'filer-tooltip';\n tooltip.textContent = title;\n\n const container = document.querySelector(tooltipSelector);\n if (container) {\n container.appendChild(tooltip);\n }\n });\n\n element.addEventListener('mouseout', function () {\n const title = this.dataset.filerTooltip;\n if (title) {\n this.setAttribute('title', title);\n }\n\n const existingTooltips = document.querySelectorAll('.filer-tooltip');\n existingTooltips.forEach((t) => {\n t.remove();\n });\n });\n });\n};\n\n\n//# sourceURL=webpack://django-filer/./filer/static/filer/js/addons/tooltip.js?\n}"); - -/***/ }, - -/***/ "./filer/static/filer/js/addons/upload-button.js" -/*!*******************************************************!*\ - !*** ./filer/static/filer/js/addons/upload-button.js ***! - \*******************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var dropzone__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! dropzone */ \"./node_modules/dropzone/dist/dropzone.js\");\n/* harmony import */ var dropzone__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(dropzone__WEBPACK_IMPORTED_MODULE_0__);\n// #UPLOAD BUTTON#\n// This script implements the upload button logic\n\n\n\n\n/* globals Cl */\n\ndocument.addEventListener('DOMContentLoaded', () => {\n let submitNum = 0;\n let maxSubmitNum = 1;\n const uploadButton = document.querySelector('.js-upload-button');\n if (!uploadButton) {\n return;\n }\n\n const uploadButtonDisabled = document.querySelector('.js-upload-button-disabled');\n const uploadUrl = uploadButton.dataset.url;\n\n if (!uploadUrl) {\n return;\n }\n\n const uploadWelcome = document.querySelector('.js-filer-dropzone-upload-welcome');\n const uploadInfoContainer = document.querySelector('.js-filer-dropzone-upload-info-container');\n const uploadInfo = document.querySelector('.js-filer-dropzone-upload-info');\n const uploadNumber = document.querySelector('.js-filer-dropzone-upload-number');\n const uploadFileNameSelector = '.js-filer-dropzone-file-name';\n const uploadProgressSelector = '.js-filer-dropzone-progress';\n const uploadSuccess = document.querySelector('.js-filer-dropzone-upload-success');\n const uploadCanceled = document.querySelector('.js-filer-dropzone-upload-canceled');\n const uploadCancel = document.querySelector('.js-filer-dropzone-cancel');\n const infoMessage = document.querySelector('.js-filer-dropzone-info-message');\n const hiddenClass = 'hidden';\n const maxUploaderConnections = parseInt(uploadButton.dataset.maxUploaderConnections || 3, 10);\n const maxFilesize = parseInt(uploadButton.dataset.maxFilesize || 0, 10);\n let hasErrors = false;\n\n const updateUploadNumber = () => {\n if (uploadNumber) {\n uploadNumber.textContent = `${maxSubmitNum - submitNum}/${maxSubmitNum}`;\n }\n };\n\n const removeButton = () => {\n if (uploadButton) {\n uploadButton.remove();\n }\n };\n\n // utility\n const updateQuery = (uri, key, value) => {\n const re = new RegExp(`([?&])${key}=.*?(&|$)`, 'i');\n const separator = uri.indexOf('?') !== -1 ? '&' : '?';\n const hash = window.location.hash;\n uri = uri.replace(/#.*$/, '');\n if (uri.match(re)) {\n return uri.replace(re, `$1${key}=${value}$2`) + hash;\n } else {\n return uri + separator + key + '=' + value + hash;\n }\n };\n\n const reloadOrdered = () => {\n const uri = window.location.toString();\n window.location.replace(updateQuery(uri, 'order_by', '-modified_at'));\n };\n\n Cl.mediator.subscribe('filer-upload-in-progress', removeButton);\n\n // Prevent default navigation which can interfere with the file dialog\n uploadButton.addEventListener('click', (evt) => {\n evt.preventDefault();\n });\n\n // Initialize Dropzone on the upload button\n (dropzone__WEBPACK_IMPORTED_MODULE_0___default().autoDiscover) = false;\n\n let dropzone;\n try {\n dropzone = new (dropzone__WEBPACK_IMPORTED_MODULE_0___default())(uploadButton, {\n url: uploadUrl,\n paramName: 'file',\n maxFilesize: maxFilesize, // already in MB\n parallelUploads: maxUploaderConnections,\n clickable: uploadButton,\n previewTemplate: '
    ',\n addRemoveLinks: false,\n autoProcessQueue: true\n });\n } catch (e) {\n console.error('[Filer Upload] Failed to create Dropzone instance:', e);\n return;\n }\n\n dropzone.on('addedfile', (file) => {\n Cl.mediator.remove('filer-upload-in-progress', removeButton);\n Cl.mediator.publish('filer-upload-in-progress');\n submitNum++;\n\n maxSubmitNum = dropzone.files.length;\n\n if (infoMessage) {\n infoMessage.classList.remove(hiddenClass);\n }\n if (uploadWelcome) {\n uploadWelcome.classList.add(hiddenClass);\n }\n if (uploadSuccess) {\n uploadSuccess.classList.add(hiddenClass);\n }\n if (uploadInfoContainer) {\n uploadInfoContainer.classList.remove(hiddenClass);\n }\n if (uploadCancel) {\n uploadCancel.classList.remove(hiddenClass);\n }\n if (uploadCanceled) {\n uploadCanceled.classList.add(hiddenClass);\n }\n\n updateUploadNumber();\n });\n\n dropzone.on('uploadprogress', (file, progress) => {\n const percent = Math.round(progress);\n const fileId = `file-${encodeURIComponent(file.name)}${file.size}${file.lastModified}`;\n const fileItem = document.getElementById(fileId);\n let uploadInfoClone;\n\n if (fileItem) {\n const progressBar = fileItem.querySelector(uploadProgressSelector);\n if (progressBar) {\n progressBar.style.width = `${percent}%`;\n }\n } else if (uploadInfo) {\n uploadInfoClone = uploadInfo.cloneNode(true);\n\n const fileNameEl = uploadInfoClone.querySelector(uploadFileNameSelector);\n if (fileNameEl) {\n fileNameEl.textContent = file.name;\n }\n const progressEl = uploadInfoClone.querySelector(uploadProgressSelector);\n if (progressEl) {\n progressEl.style.width = `${percent}%`;\n }\n uploadInfoClone.classList.remove(hiddenClass);\n uploadInfoClone.setAttribute('id', fileId);\n if (uploadInfoContainer) {\n uploadInfoContainer.appendChild(uploadInfoClone);\n }\n }\n });\n\n dropzone.on('success', (file, response) => {\n const fileId = `file-${encodeURIComponent(file.name)}${file.size}${file.lastModified}`;\n const fileEl = document.getElementById(fileId);\n if (fileEl) {\n fileEl.remove();\n }\n\n if (response.error) {\n hasErrors = true;\n window.filerShowError(`${file.name}: ${response.error}`);\n }\n\n submitNum--;\n updateUploadNumber();\n\n if (submitNum === 0) {\n maxSubmitNum = 1;\n\n if (uploadWelcome) {\n uploadWelcome.classList.add(hiddenClass);\n }\n if (uploadNumber) {\n uploadNumber.classList.add(hiddenClass);\n }\n if (uploadCanceled) {\n uploadCanceled.classList.add(hiddenClass);\n }\n if (uploadCancel) {\n uploadCancel.classList.add(hiddenClass);\n }\n if (uploadSuccess) {\n uploadSuccess.classList.remove(hiddenClass);\n }\n\n if (hasErrors) {\n setTimeout(reloadOrdered, 1000);\n } else {\n reloadOrdered();\n }\n }\n });\n\n dropzone.on('error', (file, errorMessage) => {\n const fileId = `file-${encodeURIComponent(file.name)}${file.size}${file.lastModified}`;\n const fileEl = document.getElementById(fileId);\n if (fileEl) {\n fileEl.remove();\n }\n\n hasErrors = true;\n window.filerShowError(`${file.name}: ${errorMessage}`);\n\n submitNum--;\n updateUploadNumber();\n\n if (submitNum === 0) {\n maxSubmitNum = 1;\n\n if (uploadWelcome) {\n uploadWelcome.classList.add(hiddenClass);\n }\n if (uploadNumber) {\n uploadNumber.classList.add(hiddenClass);\n }\n if (uploadCanceled) {\n uploadCanceled.classList.add(hiddenClass);\n }\n if (uploadCancel) {\n uploadCancel.classList.add(hiddenClass);\n }\n if (uploadSuccess) {\n uploadSuccess.classList.remove(hiddenClass);\n }\n\n setTimeout(reloadOrdered, 1000);\n }\n });\n\n if (uploadCancel) {\n uploadCancel.addEventListener('click', (clickEvent) => {\n clickEvent.preventDefault();\n uploadCancel.classList.add(hiddenClass);\n if (uploadNumber) {\n uploadNumber.classList.add(hiddenClass);\n }\n if (uploadInfoContainer) {\n uploadInfoContainer.classList.add(hiddenClass);\n }\n if (uploadCanceled) {\n uploadCanceled.classList.remove(hiddenClass);\n }\n\n setTimeout(() => {\n window.location.reload();\n }, 1000);\n });\n }\n\n if (uploadButtonDisabled && Cl.filerTooltip) {\n Cl.filerTooltip();\n }\n\n // Fire custom event after scripts have been executed\n document.dispatchEvent(new Event('filer-upload-scripts-executed'));\n});\n\n\n//# sourceURL=webpack://django-filer/./filer/static/filer/js/addons/upload-button.js?\n}"); - -/***/ }, - -/***/ "./filer/static/filer/js/addons/widget.js" -/*!************************************************!*\ - !*** ./filer/static/filer/js/addons/widget.js ***! - \************************************************/ -() { - -"use strict"; -eval("{\n\ndocument.addEventListener('DOMContentLoaded', () => {\n const filer_clear = (ev) => {\n ev.preventDefault();\n\n const clearer = ev.currentTarget;\n const container = clearer.closest('.filerFile');\n if (!container) {\n return;\n }\n\n const input = container.querySelector('input');\n const thumbnail = container.querySelector('.thumbnail_img');\n const description = container.querySelector('.description_text');\n const addImageButton = container.querySelector('.lookup');\n const editImageButton = container.querySelector('.edit');\n const dropzoneMessage = container.parentElement.querySelector('.dz-message');\n const hiddenClass = 'hidden';\n\n clearer.classList.add(hiddenClass);\n if (input) {\n input.value = '';\n }\n if (thumbnail) {\n thumbnail.classList.add(hiddenClass);\n var thumbnailLink = thumbnail.parentElement;\n if (thumbnailLink.tagName === 'A') {\n thumbnailLink.removeAttribute('href');\n }\n }\n if (addImageButton) {\n addImageButton.classList.remove('related-lookup-change');\n }\n if (editImageButton) {\n editImageButton.classList.remove('related-lookup-change');\n }\n if (dropzoneMessage) {\n dropzoneMessage.classList.remove(hiddenClass);\n }\n if (description) {\n description.textContent = '';\n }\n };\n\n const foreignKeyFields = document.querySelectorAll('.filerFile .vForeignKeyRawIdAdminField');\n foreignKeyFields.forEach((field) => {\n field.setAttribute('type', 'hidden');\n });\n\n // Remove any existing handlers and add new ones\n const clearers = document.querySelectorAll('.filerFile .filerClearer');\n clearers.forEach((clearer) => {\n clearer.addEventListener('click', filer_clear);\n });\n});\n\n\n//# sourceURL=webpack://django-filer/./filer/static/filer/js/addons/widget.js?\n}"); - -/***/ }, - -/***/ "./filer/static/filer/js/base.js" -/*!***************************************!*\ - !*** ./filer/static/filer/js/base.js ***! - \***************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var mediator_js_lib_mediator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! mediator-js/lib/mediator */ \"./node_modules/mediator-js/lib/mediator.js\");\n/* harmony import */ var mediator_js_lib_mediator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(mediator_js_lib_mediator__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _addons_focal_point__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./addons/focal-point */ \"./filer/static/filer/js/addons/focal-point.js\");\n/* harmony import */ var _addons_toggler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./addons/toggler */ \"./filer/static/filer/js/addons/toggler.js\");\n/* harmony import */ var _addons_dropdown_menu__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./addons/dropdown-menu */ \"./filer/static/filer/js/addons/dropdown-menu.js\");\n/* harmony import */ var _addons_dropdown_menu__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_addons_dropdown_menu__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _addons_upload_button__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./addons/upload-button */ \"./filer/static/filer/js/addons/upload-button.js\");\n/* harmony import */ var _addons_dropzone_init__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./addons/dropzone.init */ \"./filer/static/filer/js/addons/dropzone.init.js\");\n/* harmony import */ var _addons_table_dropzone__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./addons/table-dropzone */ \"./filer/static/filer/js/addons/table-dropzone.js\");\n/* harmony import */ var _addons_copy_move_files__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./addons/copy-move-files */ \"./filer/static/filer/js/addons/copy-move-files.js\");\n/* harmony import */ var _addons_copy_move_files__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_addons_copy_move_files__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _addons_tooltip__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./addons/tooltip */ \"./filer/static/filer/js/addons/tooltip.js\");\n/* harmony import */ var _addons_tooltip__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_addons_tooltip__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _addons_widget__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./addons/widget */ \"./filer/static/filer/js/addons/widget.js\");\n/* harmony import */ var _addons_widget__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_addons_widget__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _addons_popup_handling__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./addons/popup_handling */ \"./filer/static/filer/js/addons/popup_handling.js\");\n/* harmony import */ var _addons_popup_handling__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_addons_popup_handling__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _addons_filer_popup_response__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./addons/filer_popup_response */ \"./filer/static/filer/js/addons/filer_popup_response.js\");\n/* harmony import */ var _addons_filer_popup_response__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_addons_filer_popup_response__WEBPACK_IMPORTED_MODULE_11__);\n// #####################################################################################################################\n// #BASE#\n// Basic logic django filer\n\n\n\n\n\n\n// Import self-initializing addons so they are included in the bundle\n\n\n\n\n\n\n\n\n\n\nwindow.Cl = window.Cl || {};\nCl.mediator = new (mediator_js_lib_mediator__WEBPACK_IMPORTED_MODULE_0___default())(); // mediator init\nCl.FocalPoint = _addons_focal_point__WEBPACK_IMPORTED_MODULE_1__[\"default\"];\nCl.Toggler = _addons_toggler__WEBPACK_IMPORTED_MODULE_2__[\"default\"];\n\n\ndocument.addEventListener('DOMContentLoaded', () => {\n let showErrorTimeout;\n\n window.filerShowError = (message) => {\n const messages = document.querySelector('.messagelist');\n const header = document.querySelector('#header');\n const filerErrorClass = 'js-filer-error';\n const tpl = `
    • {msg}
    `;\n const msg = tpl.replace('{msg}', message);\n\n if (messages) {\n messages.outerHTML = msg;\n } else if (header) {\n header.insertAdjacentHTML('afterend', msg);\n }\n\n if (showErrorTimeout) {\n clearTimeout(showErrorTimeout);\n }\n\n showErrorTimeout = setTimeout(() => {\n const errorEl = document.querySelector(`.${filerErrorClass}`);\n if (errorEl) {\n errorEl.remove();\n }\n }, 5000);\n };\n\n const filterFiles = document.querySelector('.js-filter-files');\n if (filterFiles) {\n\n filterFiles.addEventListener('focus', (event) => {\n const container = event.target.closest('.navigator-top-nav');\n if (container) {\n container.classList.add('search-is-focused');\n }\n });\n\n filterFiles.addEventListener('blur', (event) => {\n const container = event.target.closest('.navigator-top-nav');\n if (container) {\n const dropdownTrigger = container.querySelector('.dropdown-container a');\n if (!dropdownTrigger || event.relatedTarget !== dropdownTrigger) {\n container.classList.remove('search-is-focused');\n }\n }\n });\n }\n\n // Search form submission logging\n const searchForm = document.querySelector('.js-filter-files-container');\n if (searchForm) {\n searchForm.addEventListener('submit', (event) => {\n // form submit handling\n });\n }\n\n // Focus on the search field on page load\n (() => {\n const filter = document.querySelector('.js-filter-files');\n const containerSelector = '.navigator-top-nav';\n const container = document.querySelector(containerSelector);\n const searchDropdown = container?.querySelector('.filter-search-wrapper .filer-dropdown-container');\n\n if (filter) {\n filter.addEventListener('keydown', function (event) {\n if (event.key === 'Enter') {\n // Enter key pressed\n }\n const navContainer = this.closest(containerSelector);\n if (navContainer) {\n navContainer.classList.add('search-is-focused');\n }\n });\n\n if (searchDropdown) {\n searchDropdown.addEventListener('show.bs.filer-dropdown', () => {\n if (container) {\n container.classList.add('search-is-focused');\n }\n });\n searchDropdown.addEventListener('hide.bs.filer-dropdown', () => {\n if (container) {\n container.classList.remove('search-is-focused');\n }\n });\n }\n }\n })();\n\n // show counter if file is selected\n (() => {\n const navigatorTable = document.querySelectorAll('.navigator-table tr, .navigator-list .list-item');\n const actionList = document.querySelector('.actions-wrapper');\n const actionSelect = document.querySelectorAll(\n '.action-select, #action-toggle, #files-action-toggle, #folders-action-toggle, .actions .clear a'\n );\n\n // timeout is needed to wait until table row has class selected.\n setTimeout(() => {\n // Set classes for checked items\n actionSelect.forEach((el) => {\n if (el.checked) {\n const listItem = el.closest('.list-item');\n if (listItem) {\n listItem.classList.add('selected');\n }\n }\n });\n const hasSelected = Array.from(navigatorTable).some((el) =>\n el.classList.contains('selected')\n );\n if (hasSelected && actionList) {\n actionList.classList.add('action-selected');\n }\n }, 100);\n\n actionSelect.forEach((el) => {\n el.addEventListener('change', function () {\n // Mark element selected (for table view this is done by Django admin js - we do it ourselves\n const listItem = this.closest('.list-item');\n if (listItem) {\n if (this.checked) {\n listItem.classList.add('selected');\n } else {\n listItem.classList.remove('selected');\n }\n }\n // setTimeout makes sure that change event fires before click event which is reliable to admin\n setTimeout(() => {\n const hasSelected = Array.from(navigatorTable).some((el) =>\n el.classList.contains('selected')\n );\n if (actionList) {\n if (hasSelected) {\n actionList.classList.add('action-selected');\n } else {\n actionList.classList.remove('action-selected');\n }\n }\n }, 0);\n });\n });\n })();\n\n (() => {\n const actionsMenu = document.querySelector('.js-actions-menu');\n if (!actionsMenu) {\n return;\n }\n\n const dropdown = actionsMenu.querySelector('.filer-dropdown-menu');\n const actionsSelect = document.querySelector('.actions select[name=\"action\"]');\n const actionsSelectOptions = actionsSelect?.querySelectorAll('option') || [];\n const actionsGo = document.querySelector('.actions button[type=\"submit\"]');\n const actionDelete = document.querySelector('.js-action-delete');\n const actionCopy = document.querySelector('.js-action-copy');\n const actionMove = document.querySelector('.js-action-move');\n const valueDelete = 'delete_files_or_folders';\n const valueCopy = 'copy_files_and_folders';\n const valueMove = 'move_files_and_folders';\n const navigatorTable = document.querySelectorAll('.navigator-table tr, .navigator-list .list-item');\n\n // triggers delete copy and move actions on separate buttons\n const actionsButton = (optionValue, actionButton) => {\n if (!actionButton) {\n return;\n }\n actionsSelectOptions.forEach((option) => {\n if (option.value === optionValue) {\n actionButton.style.display = '';\n actionButton.addEventListener('click', (e) => {\n e.preventDefault();\n const hasSelected = Array.from(navigatorTable).some((el) =>\n el.classList.contains('selected')\n );\n if (hasSelected && actionsSelect && actionsGo) {\n actionsSelect.value = optionValue;\n const targetOption = actionsSelect.querySelector(`option[value=\"${optionValue}\"]`);\n if (targetOption) {\n targetOption.selected = true;\n }\n actionsGo.click();\n }\n });\n }\n });\n };\n actionsButton(valueDelete, actionDelete);\n actionsButton(valueCopy, actionCopy);\n actionsButton(valueMove, actionMove);\n\n // mocking the action buttons to work in frontend UI\n actionsSelectOptions.forEach((option, index) => {\n if (index !== 0) {\n const li = document.createElement('li');\n const a = document.createElement('a');\n a.href = '#';\n a.textContent = option.textContent;\n\n if (option.value === valueDelete || option.value === valueCopy || option.value === valueMove) {\n a.classList.add('hidden');\n }\n\n li.appendChild(a);\n if (dropdown) {\n dropdown.appendChild(li);\n }\n }\n });\n if (dropdown) {\n\n dropdown.addEventListener('click', (clickEvent) => {\n if (clickEvent.target.tagName === 'A') {\n const li = clickEvent.target.closest('li');\n const targetIndex = Array.from(dropdown.querySelectorAll('li')).indexOf(li) + 1;\n\n clickEvent.preventDefault();\n\n if (actionsSelect && actionsGo) {\n const options = actionsSelect.querySelectorAll('option');\n if (options[targetIndex]) {\n actionsSelect.value = options[targetIndex].value;\n options[targetIndex].selected = true;\n }\n actionsGo.click();\n }\n }\n });\n }\n\n actionsMenu.addEventListener('click', (e) => {\n const hasSelected = Array.from(navigatorTable).some((el) =>\n el.classList.contains('selected')\n );\n if (!hasSelected) {\n e.preventDefault();\n e.stopPropagation();\n }\n });\n })();\n\n // breaks header if breadcrumbs name reaches a width of 80px\n (() => {\n const minBreadcrumbWidth = 80;\n const header = document.querySelector('.navigator-top-nav');\n\n if (!header) {\n return;\n }\n\n const breadcrumbContainer = document.querySelector('.breadcrumbs-container');\n if (!breadcrumbContainer) {\n return;\n }\n\n const breadcrumbFolder = breadcrumbContainer.querySelector('.navigator-breadcrumbs');\n const breadcrumbDropdown = breadcrumbContainer.querySelector('.filer-dropdown-container');\n const filterFilesContainer = document.querySelector('.filter-files-container');\n const actionsWrapper = document.querySelector('.actions-wrapper');\n const navigatorButtonWrapper = document.querySelector('.navigator-button-wrapper');\n\n const breadcrumbFolderWidth = breadcrumbFolder?.offsetWidth || 0;\n const breadcrumbDropdownWidth = breadcrumbDropdown?.offsetWidth || 0;\n const searchWidth = filterFilesContainer?.offsetWidth || 0;\n const actionsWidth = actionsWrapper?.offsetWidth || 0;\n const buttonsWidth = navigatorButtonWrapper?.offsetWidth || 0;\n\n const headerStyles = window.getComputedStyle(header);\n const headerPadding = parseInt(headerStyles.paddingLeft, 10) + parseInt(headerStyles.paddingRight, 10);\n\n let headerWidth = header.offsetWidth;\n const fullHeaderWidth = minBreadcrumbWidth + breadcrumbFolderWidth +\n breadcrumbDropdownWidth + searchWidth + actionsWidth + buttonsWidth + headerPadding;\n\n const breadcrumbSizeHandlerClassName = 'breadcrumb-min-width';\n\n const breadcrumbSizeHandler = () => {\n if (headerWidth < fullHeaderWidth) {\n header.classList.add(breadcrumbSizeHandlerClassName);\n } else {\n header.classList.remove(breadcrumbSizeHandlerClassName);\n }\n };\n\n breadcrumbSizeHandler();\n\n window.addEventListener('resize', () => {\n headerWidth = header.offsetWidth;\n breadcrumbSizeHandler();\n });\n })();\n // thumbnail folder admin view\n (() => {\n const actionEls = document.querySelectorAll('.navigator-list .list-item input.action-select');\n const foldersActionCheckboxes = '.navigator-list .navigator-folders-body .list-item input.action-select';\n const filesActionCheckboxes = '.navigator-list .navigator-files-body .list-item input.action-select';\n const allFilesToggle = document.querySelector('#files-action-toggle');\n const allFoldersToggle = document.querySelector('#folders-action-toggle');\n\n if (allFoldersToggle) {\n allFoldersToggle.addEventListener('click', function () {\n const checkboxes = document.querySelectorAll(foldersActionCheckboxes);\n if (this.checked) {\n checkboxes.forEach((cb) => {\n if (!cb.checked) {\n cb.click();\n }\n });\n } else {\n checkboxes.forEach((cb) => {\n if (cb.checked) {\n cb.click();\n }\n });\n }\n });\n }\n\n if (allFilesToggle) {\n allFilesToggle.addEventListener('click', function () {\n const checkboxes = document.querySelectorAll(filesActionCheckboxes);\n if (this.checked) {\n checkboxes.forEach((cb) => {\n if (!cb.checked) {\n cb.click();\n }\n });\n } else {\n checkboxes.forEach((cb) => {\n if (cb.checked) {\n cb.click();\n }\n });\n }\n });\n }\n\n actionEls.forEach((el) => {\n el.addEventListener('click', function () {\n const filesCheckboxes = document.querySelectorAll(filesActionCheckboxes);\n const foldersCheckboxes = document.querySelectorAll(foldersActionCheckboxes);\n\n if (!this.checked) {\n const hasUncheckedFiles = Array.from(filesCheckboxes).some((cb) => !cb.checked);\n const hasUncheckedFolders = Array.from(foldersCheckboxes).some((cb) => !cb.checked);\n\n if (hasUncheckedFiles && allFilesToggle) {\n allFilesToggle.checked = false;\n }\n if (hasUncheckedFolders && allFoldersToggle) {\n allFoldersToggle.checked = false;\n }\n } else {\n const allFilesChecked = Array.from(filesCheckboxes).every((cb) => cb.checked);\n const allFoldersChecked = Array.from(foldersCheckboxes).every((cb) => cb.checked);\n\n if (allFilesChecked && allFilesToggle) {\n allFilesToggle.checked = true;\n }\n if (allFoldersChecked && allFoldersToggle) {\n allFoldersToggle.checked = true;\n }\n }\n });\n });\n\n const clearLink = document.querySelector('.navigator .actions .clear a');\n if (clearLink) {\n clearLink.addEventListener('click', () => {\n if (allFoldersToggle) {\n allFoldersToggle.checked = false;\n }\n if (allFilesToggle) {\n allFilesToggle.checked = false;\n }\n });\n }\n })();\n\n const copyUrlButtons = document.querySelectorAll('.js-copy-url');\n copyUrlButtons.forEach((button) => {\n button.addEventListener('click', function (e) {\n const url = new URL(this.dataset.url, document.location.href);\n const msg = this.dataset.msg || 'URL copied to clipboard';\n const infobox = document.createElement('template');\n e.preventDefault();\n\n const existingTooltips = document.querySelectorAll('.info.filer-tooltip');\n existingTooltips.forEach((el) => {\n el.remove();\n });\n\n navigator.clipboard.writeText(url.href);\n infobox.innerHTML = `
    ${msg}
    `;\n this.classList.add('filer-tooltip-wrapper');\n this.appendChild(infobox.content.firstChild);\n\n const self = this;\n setTimeout(() => {\n const tooltip = self.querySelector('.info');\n if (tooltip) {\n tooltip.remove();\n }\n }, 1200);\n });\n });\n\n // Initialize FocalPoint\n const focalPoint = new _addons_focal_point__WEBPACK_IMPORTED_MODULE_1__[\"default\"]();\n focalPoint.initialize();\n\n // Initialize Toggler (auto-initializes in constructor)\n new _addons_toggler__WEBPACK_IMPORTED_MODULE_2__[\"default\"]();\n});\n\n\n//# sourceURL=webpack://django-filer/./filer/static/filer/js/base.js?\n}"); - -/***/ }, - -/***/ "./node_modules/dropzone/dist/dropzone.js" -/*!************************************************!*\ - !*** ./node_modules/dropzone/dist/dropzone.js ***! - \************************************************/ -(module) { - -eval("{(function webpackUniversalModuleDefinition(root, factory) {\n\tif(true)\n\t\tmodule.exports = factory();\n\telse // removed by dead control flow\n{ var i, a; }\n})(self, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 3099:\n/***/ (function(module) {\n\nmodule.exports = function (it) {\n if (typeof it != 'function') {\n throw TypeError(String(it) + ' is not a function');\n } return it;\n};\n\n\n/***/ }),\n\n/***/ 6077:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_703__) {\n\nvar isObject = __nested_webpack_require_703__(111);\n\nmodule.exports = function (it) {\n if (!isObject(it) && it !== null) {\n throw TypeError(\"Can't set \" + String(it) + ' as a prototype');\n } return it;\n};\n\n\n/***/ }),\n\n/***/ 1223:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_1001__) {\n\nvar wellKnownSymbol = __nested_webpack_require_1001__(5112);\nvar create = __nested_webpack_require_1001__(30);\nvar definePropertyModule = __nested_webpack_require_1001__(3070);\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n definePropertyModule.f(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n\n\n/***/ }),\n\n/***/ 1530:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_1715__) {\n\n\"use strict\";\n\nvar charAt = __nested_webpack_require_1715__(8710).charAt;\n\n// `AdvanceStringIndex` abstract operation\n// https://tc39.es/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? charAt(S, index).length : 1);\n};\n\n\n/***/ }),\n\n/***/ 5787:\n/***/ (function(module) {\n\nmodule.exports = function (it, Constructor, name) {\n if (!(it instanceof Constructor)) {\n throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n } return it;\n};\n\n\n/***/ }),\n\n/***/ 9670:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_2317__) {\n\nvar isObject = __nested_webpack_require_2317__(111);\n\nmodule.exports = function (it) {\n if (!isObject(it)) {\n throw TypeError(String(it) + ' is not an object');\n } return it;\n};\n\n\n/***/ }),\n\n/***/ 4019:\n/***/ (function(module) {\n\nmodule.exports = typeof ArrayBuffer !== 'undefined' && typeof DataView !== 'undefined';\n\n\n/***/ }),\n\n/***/ 260:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_2726__) {\n\n\"use strict\";\n\nvar NATIVE_ARRAY_BUFFER = __nested_webpack_require_2726__(4019);\nvar DESCRIPTORS = __nested_webpack_require_2726__(9781);\nvar global = __nested_webpack_require_2726__(7854);\nvar isObject = __nested_webpack_require_2726__(111);\nvar has = __nested_webpack_require_2726__(6656);\nvar classof = __nested_webpack_require_2726__(648);\nvar createNonEnumerableProperty = __nested_webpack_require_2726__(8880);\nvar redefine = __nested_webpack_require_2726__(1320);\nvar defineProperty = __nested_webpack_require_2726__(3070).f;\nvar getPrototypeOf = __nested_webpack_require_2726__(9518);\nvar setPrototypeOf = __nested_webpack_require_2726__(7674);\nvar wellKnownSymbol = __nested_webpack_require_2726__(5112);\nvar uid = __nested_webpack_require_2726__(9711);\n\nvar Int8Array = global.Int8Array;\nvar Int8ArrayPrototype = Int8Array && Int8Array.prototype;\nvar Uint8ClampedArray = global.Uint8ClampedArray;\nvar Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype;\nvar TypedArray = Int8Array && getPrototypeOf(Int8Array);\nvar TypedArrayPrototype = Int8ArrayPrototype && getPrototypeOf(Int8ArrayPrototype);\nvar ObjectPrototype = Object.prototype;\nvar isPrototypeOf = ObjectPrototype.isPrototypeOf;\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG');\n// Fixing native typed arrays in Opera Presto crashes the browser, see #595\nvar NATIVE_ARRAY_BUFFER_VIEWS = NATIVE_ARRAY_BUFFER && !!setPrototypeOf && classof(global.opera) !== 'Opera';\nvar TYPED_ARRAY_TAG_REQIRED = false;\nvar NAME;\n\nvar TypedArrayConstructorsList = {\n Int8Array: 1,\n Uint8Array: 1,\n Uint8ClampedArray: 1,\n Int16Array: 2,\n Uint16Array: 2,\n Int32Array: 4,\n Uint32Array: 4,\n Float32Array: 4,\n Float64Array: 8\n};\n\nvar BigIntArrayConstructorsList = {\n BigInt64Array: 8,\n BigUint64Array: 8\n};\n\nvar isView = function isView(it) {\n if (!isObject(it)) return false;\n var klass = classof(it);\n return klass === 'DataView'\n || has(TypedArrayConstructorsList, klass)\n || has(BigIntArrayConstructorsList, klass);\n};\n\nvar isTypedArray = function (it) {\n if (!isObject(it)) return false;\n var klass = classof(it);\n return has(TypedArrayConstructorsList, klass)\n || has(BigIntArrayConstructorsList, klass);\n};\n\nvar aTypedArray = function (it) {\n if (isTypedArray(it)) return it;\n throw TypeError('Target is not a typed array');\n};\n\nvar aTypedArrayConstructor = function (C) {\n if (setPrototypeOf) {\n if (isPrototypeOf.call(TypedArray, C)) return C;\n } else for (var ARRAY in TypedArrayConstructorsList) if (has(TypedArrayConstructorsList, NAME)) {\n var TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && (C === TypedArrayConstructor || isPrototypeOf.call(TypedArrayConstructor, C))) {\n return C;\n }\n } throw TypeError('Target is not a typed array constructor');\n};\n\nvar exportTypedArrayMethod = function (KEY, property, forced) {\n if (!DESCRIPTORS) return;\n if (forced) for (var ARRAY in TypedArrayConstructorsList) {\n var TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && has(TypedArrayConstructor.prototype, KEY)) {\n delete TypedArrayConstructor.prototype[KEY];\n }\n }\n if (!TypedArrayPrototype[KEY] || forced) {\n redefine(TypedArrayPrototype, KEY, forced ? property\n : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property);\n }\n};\n\nvar exportTypedArrayStaticMethod = function (KEY, property, forced) {\n var ARRAY, TypedArrayConstructor;\n if (!DESCRIPTORS) return;\n if (setPrototypeOf) {\n if (forced) for (ARRAY in TypedArrayConstructorsList) {\n TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && has(TypedArrayConstructor, KEY)) {\n delete TypedArrayConstructor[KEY];\n }\n }\n if (!TypedArray[KEY] || forced) {\n // V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable\n try {\n return redefine(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && Int8Array[KEY] || property);\n } catch (error) { /* empty */ }\n } else return;\n }\n for (ARRAY in TypedArrayConstructorsList) {\n TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) {\n redefine(TypedArrayConstructor, KEY, property);\n }\n }\n};\n\nfor (NAME in TypedArrayConstructorsList) {\n if (!global[NAME]) NATIVE_ARRAY_BUFFER_VIEWS = false;\n}\n\n// WebKit bug - typed arrays constructors prototype is Object.prototype\nif (!NATIVE_ARRAY_BUFFER_VIEWS || typeof TypedArray != 'function' || TypedArray === Function.prototype) {\n // eslint-disable-next-line no-shadow -- safe\n TypedArray = function TypedArray() {\n throw TypeError('Incorrect invocation');\n };\n if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {\n if (global[NAME]) setPrototypeOf(global[NAME], TypedArray);\n }\n}\n\nif (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype) {\n TypedArrayPrototype = TypedArray.prototype;\n if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {\n if (global[NAME]) setPrototypeOf(global[NAME].prototype, TypedArrayPrototype);\n }\n}\n\n// WebKit bug - one more object in Uint8ClampedArray prototype chain\nif (NATIVE_ARRAY_BUFFER_VIEWS && getPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) {\n setPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype);\n}\n\nif (DESCRIPTORS && !has(TypedArrayPrototype, TO_STRING_TAG)) {\n TYPED_ARRAY_TAG_REQIRED = true;\n defineProperty(TypedArrayPrototype, TO_STRING_TAG, { get: function () {\n return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined;\n } });\n for (NAME in TypedArrayConstructorsList) if (global[NAME]) {\n createNonEnumerableProperty(global[NAME], TYPED_ARRAY_TAG, NAME);\n }\n}\n\nmodule.exports = {\n NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS,\n TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQIRED && TYPED_ARRAY_TAG,\n aTypedArray: aTypedArray,\n aTypedArrayConstructor: aTypedArrayConstructor,\n exportTypedArrayMethod: exportTypedArrayMethod,\n exportTypedArrayStaticMethod: exportTypedArrayStaticMethod,\n isView: isView,\n isTypedArray: isTypedArray,\n TypedArray: TypedArray,\n TypedArrayPrototype: TypedArrayPrototype\n};\n\n\n/***/ }),\n\n/***/ 3331:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_8934__) {\n\n\"use strict\";\n\nvar global = __nested_webpack_require_8934__(7854);\nvar DESCRIPTORS = __nested_webpack_require_8934__(9781);\nvar NATIVE_ARRAY_BUFFER = __nested_webpack_require_8934__(4019);\nvar createNonEnumerableProperty = __nested_webpack_require_8934__(8880);\nvar redefineAll = __nested_webpack_require_8934__(2248);\nvar fails = __nested_webpack_require_8934__(7293);\nvar anInstance = __nested_webpack_require_8934__(5787);\nvar toInteger = __nested_webpack_require_8934__(9958);\nvar toLength = __nested_webpack_require_8934__(7466);\nvar toIndex = __nested_webpack_require_8934__(7067);\nvar IEEE754 = __nested_webpack_require_8934__(1179);\nvar getPrototypeOf = __nested_webpack_require_8934__(9518);\nvar setPrototypeOf = __nested_webpack_require_8934__(7674);\nvar getOwnPropertyNames = __nested_webpack_require_8934__(8006).f;\nvar defineProperty = __nested_webpack_require_8934__(3070).f;\nvar arrayFill = __nested_webpack_require_8934__(1285);\nvar setToStringTag = __nested_webpack_require_8934__(8003);\nvar InternalStateModule = __nested_webpack_require_8934__(9909);\n\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length';\nvar WRONG_INDEX = 'Wrong index';\nvar NativeArrayBuffer = global[ARRAY_BUFFER];\nvar $ArrayBuffer = NativeArrayBuffer;\nvar $DataView = global[DATA_VIEW];\nvar $DataViewPrototype = $DataView && $DataView[PROTOTYPE];\nvar ObjectPrototype = Object.prototype;\nvar RangeError = global.RangeError;\n\nvar packIEEE754 = IEEE754.pack;\nvar unpackIEEE754 = IEEE754.unpack;\n\nvar packInt8 = function (number) {\n return [number & 0xFF];\n};\n\nvar packInt16 = function (number) {\n return [number & 0xFF, number >> 8 & 0xFF];\n};\n\nvar packInt32 = function (number) {\n return [number & 0xFF, number >> 8 & 0xFF, number >> 16 & 0xFF, number >> 24 & 0xFF];\n};\n\nvar unpackInt32 = function (buffer) {\n return buffer[3] << 24 | buffer[2] << 16 | buffer[1] << 8 | buffer[0];\n};\n\nvar packFloat32 = function (number) {\n return packIEEE754(number, 23, 4);\n};\n\nvar packFloat64 = function (number) {\n return packIEEE754(number, 52, 8);\n};\n\nvar addGetter = function (Constructor, key) {\n defineProperty(Constructor[PROTOTYPE], key, { get: function () { return getInternalState(this)[key]; } });\n};\n\nvar get = function (view, count, index, isLittleEndian) {\n var intIndex = toIndex(index);\n var store = getInternalState(view);\n if (intIndex + count > store.byteLength) throw RangeError(WRONG_INDEX);\n var bytes = getInternalState(store.buffer).bytes;\n var start = intIndex + store.byteOffset;\n var pack = bytes.slice(start, start + count);\n return isLittleEndian ? pack : pack.reverse();\n};\n\nvar set = function (view, count, index, conversion, value, isLittleEndian) {\n var intIndex = toIndex(index);\n var store = getInternalState(view);\n if (intIndex + count > store.byteLength) throw RangeError(WRONG_INDEX);\n var bytes = getInternalState(store.buffer).bytes;\n var start = intIndex + store.byteOffset;\n var pack = conversion(+value);\n for (var i = 0; i < count; i++) bytes[start + i] = pack[isLittleEndian ? i : count - i - 1];\n};\n\nif (!NATIVE_ARRAY_BUFFER) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n var byteLength = toIndex(length);\n setInternalState(this, {\n bytes: arrayFill.call(new Array(byteLength), 0),\n byteLength: byteLength\n });\n if (!DESCRIPTORS) this.byteLength = byteLength;\n };\n\n $DataView = function DataView(buffer, byteOffset, byteLength) {\n anInstance(this, $DataView, DATA_VIEW);\n anInstance(buffer, $ArrayBuffer, DATA_VIEW);\n var bufferLength = getInternalState(buffer).byteLength;\n var offset = toInteger(byteOffset);\n if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset');\n byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);\n setInternalState(this, {\n buffer: buffer,\n byteLength: byteLength,\n byteOffset: offset\n });\n if (!DESCRIPTORS) {\n this.buffer = buffer;\n this.byteLength = byteLength;\n this.byteOffset = offset;\n }\n };\n\n if (DESCRIPTORS) {\n addGetter($ArrayBuffer, 'byteLength');\n addGetter($DataView, 'buffer');\n addGetter($DataView, 'byteLength');\n addGetter($DataView, 'byteOffset');\n }\n\n redefineAll($DataView[PROTOTYPE], {\n getInt8: function getInt8(byteOffset) {\n return get(this, 1, byteOffset)[0] << 24 >> 24;\n },\n getUint8: function getUint8(byteOffset) {\n return get(this, 1, byteOffset)[0];\n },\n getInt16: function getInt16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);\n return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n },\n getUint16: function getUint16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);\n return bytes[1] << 8 | bytes[0];\n },\n getInt32: function getInt32(byteOffset /* , littleEndian */) {\n return unpackInt32(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined));\n },\n getUint32: function getUint32(byteOffset /* , littleEndian */) {\n return unpackInt32(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined)) >>> 0;\n },\n getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 23);\n },\n getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 8, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 52);\n },\n setInt8: function setInt8(byteOffset, value) {\n set(this, 1, byteOffset, packInt8, value);\n },\n setUint8: function setUint8(byteOffset, value) {\n set(this, 1, byteOffset, packInt8, value);\n },\n setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packFloat32, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n set(this, 8, byteOffset, packFloat64, value, arguments.length > 2 ? arguments[2] : undefined);\n }\n });\n} else {\n /* eslint-disable no-new -- required for testing */\n if (!fails(function () {\n NativeArrayBuffer(1);\n }) || !fails(function () {\n new NativeArrayBuffer(-1);\n }) || fails(function () {\n new NativeArrayBuffer();\n new NativeArrayBuffer(1.5);\n new NativeArrayBuffer(NaN);\n return NativeArrayBuffer.name != ARRAY_BUFFER;\n })) {\n /* eslint-enable no-new -- required for testing */\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer);\n return new NativeArrayBuffer(toIndex(length));\n };\n var ArrayBufferPrototype = $ArrayBuffer[PROTOTYPE] = NativeArrayBuffer[PROTOTYPE];\n for (var keys = getOwnPropertyNames(NativeArrayBuffer), j = 0, key; keys.length > j;) {\n if (!((key = keys[j++]) in $ArrayBuffer)) {\n createNonEnumerableProperty($ArrayBuffer, key, NativeArrayBuffer[key]);\n }\n }\n ArrayBufferPrototype.constructor = $ArrayBuffer;\n }\n\n // WebKit bug - the same parent prototype for typed arrays and data view\n if (setPrototypeOf && getPrototypeOf($DataViewPrototype) !== ObjectPrototype) {\n setPrototypeOf($DataViewPrototype, ObjectPrototype);\n }\n\n // iOS Safari 7.x bug\n var testView = new $DataView(new $ArrayBuffer(2));\n var nativeSetInt8 = $DataViewPrototype.setInt8;\n testView.setInt8(0, 2147483648);\n testView.setInt8(1, 2147483649);\n if (testView.getInt8(0) || !testView.getInt8(1)) redefineAll($DataViewPrototype, {\n setInt8: function setInt8(byteOffset, value) {\n nativeSetInt8.call(this, byteOffset, value << 24 >> 24);\n },\n setUint8: function setUint8(byteOffset, value) {\n nativeSetInt8.call(this, byteOffset, value << 24 >> 24);\n }\n }, { unsafe: true });\n}\n\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\n\nmodule.exports = {\n ArrayBuffer: $ArrayBuffer,\n DataView: $DataView\n};\n\n\n/***/ }),\n\n/***/ 1048:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_17881__) {\n\n\"use strict\";\n\nvar toObject = __nested_webpack_require_17881__(7908);\nvar toAbsoluteIndex = __nested_webpack_require_17881__(1400);\nvar toLength = __nested_webpack_require_17881__(7466);\n\nvar min = Math.min;\n\n// `Array.prototype.copyWithin` method implementation\n// https://tc39.es/ecma262/#sec-array.prototype.copywithin\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var to = toAbsoluteIndex(target, len);\n var from = toAbsoluteIndex(start, len);\n var end = arguments.length > 2 ? arguments[2] : undefined;\n var count = min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n var inc = 1;\n if (from < to && to < from + count) {\n inc = -1;\n from += count - 1;\n to += count - 1;\n }\n while (count-- > 0) {\n if (from in O) O[to] = O[from];\n else delete O[to];\n to += inc;\n from += inc;\n } return O;\n};\n\n\n/***/ }),\n\n/***/ 1285:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_18911__) {\n\n\"use strict\";\n\nvar toObject = __nested_webpack_require_18911__(7908);\nvar toAbsoluteIndex = __nested_webpack_require_18911__(1400);\nvar toLength = __nested_webpack_require_18911__(7466);\n\n// `Array.prototype.fill` method implementation\n// https://tc39.es/ecma262/#sec-array.prototype.fill\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n var O = toObject(this);\n var length = toLength(O.length);\n var argumentsLength = arguments.length;\n var index = toAbsoluteIndex(argumentsLength > 1 ? arguments[1] : undefined, length);\n var end = argumentsLength > 2 ? arguments[2] : undefined;\n var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n while (endPos > index) O[index++] = value;\n return O;\n};\n\n\n/***/ }),\n\n/***/ 8533:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_19717__) {\n\n\"use strict\";\n\nvar $forEach = __nested_webpack_require_19717__(2092).forEach;\nvar arrayMethodIsStrict = __nested_webpack_require_19717__(9341);\n\nvar STRICT_METHOD = arrayMethodIsStrict('forEach');\n\n// `Array.prototype.forEach` method implementation\n// https://tc39.es/ecma262/#sec-array.prototype.foreach\nmodule.exports = !STRICT_METHOD ? function forEach(callbackfn /* , thisArg */) {\n return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n} : [].forEach;\n\n\n/***/ }),\n\n/***/ 8457:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_20278__) {\n\n\"use strict\";\n\nvar bind = __nested_webpack_require_20278__(9974);\nvar toObject = __nested_webpack_require_20278__(7908);\nvar callWithSafeIterationClosing = __nested_webpack_require_20278__(3411);\nvar isArrayIteratorMethod = __nested_webpack_require_20278__(7659);\nvar toLength = __nested_webpack_require_20278__(7466);\nvar createProperty = __nested_webpack_require_20278__(6135);\nvar getIteratorMethod = __nested_webpack_require_20278__(1246);\n\n// `Array.from` method implementation\n// https://tc39.es/ecma262/#sec-array.from\nmodule.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var index = 0;\n var length, result, step, iterator, next, value;\n if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);\n // if the target is not iterable or it's an array with the default iterator - use a simple case\n if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {\n iterator = iteratorMethod.call(O);\n next = iterator.next;\n result = new C();\n for (;!(step = next.call(iterator)).done; index++) {\n value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n createProperty(result, index, value);\n }\n } else {\n length = toLength(O.length);\n result = new C(length);\n for (;length > index; index++) {\n value = mapping ? mapfn(O[index], index) : O[index];\n createProperty(result, index, value);\n }\n }\n result.length = index;\n return result;\n};\n\n\n/***/ }),\n\n/***/ 1318:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_22092__) {\n\nvar toIndexedObject = __nested_webpack_require_22092__(5656);\nvar toLength = __nested_webpack_require_22092__(7466);\nvar toAbsoluteIndex = __nested_webpack_require_22092__(1400);\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare -- NaN check\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare -- NaN check\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.es/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.es/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n\n\n/***/ }),\n\n/***/ 2092:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_23446__) {\n\nvar bind = __nested_webpack_require_23446__(9974);\nvar IndexedObject = __nested_webpack_require_23446__(8361);\nvar toObject = __nested_webpack_require_23446__(7908);\nvar toLength = __nested_webpack_require_23446__(7466);\nvar arraySpeciesCreate = __nested_webpack_require_23446__(5417);\n\nvar push = [].push;\n\n// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterOut }` methods implementation\nvar createMethod = function (TYPE) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var IS_FILTER_OUT = TYPE == 7;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n return function ($this, callbackfn, that, specificCreate) {\n var O = toObject($this);\n var self = IndexedObject(O);\n var boundFunction = bind(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var create = specificCreate || arraySpeciesCreate;\n var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_OUT ? create($this, 0) : undefined;\n var value, result;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n value = self[index];\n result = boundFunction(value, index, O);\n if (TYPE) {\n if (IS_MAP) target[index] = result; // map\n else if (result) switch (TYPE) {\n case 3: return true; // some\n case 5: return value; // find\n case 6: return index; // findIndex\n case 2: push.call(target, value); // filter\n } else switch (TYPE) {\n case 4: return false; // every\n case 7: push.call(target, value); // filterOut\n }\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.forEach` method\n // https://tc39.es/ecma262/#sec-array.prototype.foreach\n forEach: createMethod(0),\n // `Array.prototype.map` method\n // https://tc39.es/ecma262/#sec-array.prototype.map\n map: createMethod(1),\n // `Array.prototype.filter` method\n // https://tc39.es/ecma262/#sec-array.prototype.filter\n filter: createMethod(2),\n // `Array.prototype.some` method\n // https://tc39.es/ecma262/#sec-array.prototype.some\n some: createMethod(3),\n // `Array.prototype.every` method\n // https://tc39.es/ecma262/#sec-array.prototype.every\n every: createMethod(4),\n // `Array.prototype.find` method\n // https://tc39.es/ecma262/#sec-array.prototype.find\n find: createMethod(5),\n // `Array.prototype.findIndex` method\n // https://tc39.es/ecma262/#sec-array.prototype.findIndex\n findIndex: createMethod(6),\n // `Array.prototype.filterOut` method\n // https://github.com/tc39/proposal-array-filtering\n filterOut: createMethod(7)\n};\n\n\n/***/ }),\n\n/***/ 6583:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_26271__) {\n\n\"use strict\";\n\nvar toIndexedObject = __nested_webpack_require_26271__(5656);\nvar toInteger = __nested_webpack_require_26271__(9958);\nvar toLength = __nested_webpack_require_26271__(7466);\nvar arrayMethodIsStrict = __nested_webpack_require_26271__(9341);\n\nvar min = Math.min;\nvar nativeLastIndexOf = [].lastIndexOf;\nvar NEGATIVE_ZERO = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;\nvar STRICT_METHOD = arrayMethodIsStrict('lastIndexOf');\nvar FORCED = NEGATIVE_ZERO || !STRICT_METHOD;\n\n// `Array.prototype.lastIndexOf` method implementation\n// https://tc39.es/ecma262/#sec-array.prototype.lastindexof\nmodule.exports = FORCED ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n // convert -0 to +0\n if (NEGATIVE_ZERO) return nativeLastIndexOf.apply(this, arguments) || 0;\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var index = length - 1;\n if (arguments.length > 1) index = min(index, toInteger(arguments[1]));\n if (index < 0) index = length + index;\n for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;\n return -1;\n} : nativeLastIndexOf;\n\n\n/***/ }),\n\n/***/ 1194:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_27452__) {\n\nvar fails = __nested_webpack_require_27452__(7293);\nvar wellKnownSymbol = __nested_webpack_require_27452__(5112);\nvar V8_VERSION = __nested_webpack_require_27452__(7392);\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (METHOD_NAME) {\n // We can't use this feature detection in V8 since it causes\n // deoptimization and serious performance degradation\n // https://github.com/zloirock/core-js/issues/677\n return V8_VERSION >= 51 || !fails(function () {\n var array = [];\n var constructor = array.constructor = {};\n constructor[SPECIES] = function () {\n return { foo: 1 };\n };\n return array[METHOD_NAME](Boolean).foo !== 1;\n });\n};\n\n\n/***/ }),\n\n/***/ 9341:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_28188__) {\n\n\"use strict\";\n\nvar fails = __nested_webpack_require_28188__(7293);\n\nmodule.exports = function (METHOD_NAME, argument) {\n var method = [][METHOD_NAME];\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call,no-throw-literal -- required for testing\n method.call(null, argument || function () { throw 1; }, 1);\n });\n};\n\n\n/***/ }),\n\n/***/ 3671:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_28629__) {\n\nvar aFunction = __nested_webpack_require_28629__(3099);\nvar toObject = __nested_webpack_require_28629__(7908);\nvar IndexedObject = __nested_webpack_require_28629__(8361);\nvar toLength = __nested_webpack_require_28629__(7466);\n\n// `Array.prototype.{ reduce, reduceRight }` methods implementation\nvar createMethod = function (IS_RIGHT) {\n return function (that, callbackfn, argumentsLength, memo) {\n aFunction(callbackfn);\n var O = toObject(that);\n var self = IndexedObject(O);\n var length = toLength(O.length);\n var index = IS_RIGHT ? length - 1 : 0;\n var i = IS_RIGHT ? -1 : 1;\n if (argumentsLength < 2) while (true) {\n if (index in self) {\n memo = self[index];\n index += i;\n break;\n }\n index += i;\n if (IS_RIGHT ? index < 0 : length <= index) {\n throw TypeError('Reduce of empty array with no initial value');\n }\n }\n for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n memo = callbackfn(memo, self[index], index, O);\n }\n return memo;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.reduce` method\n // https://tc39.es/ecma262/#sec-array.prototype.reduce\n left: createMethod(false),\n // `Array.prototype.reduceRight` method\n // https://tc39.es/ecma262/#sec-array.prototype.reduceright\n right: createMethod(true)\n};\n\n\n/***/ }),\n\n/***/ 5417:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_30017__) {\n\nvar isObject = __nested_webpack_require_30017__(111);\nvar isArray = __nested_webpack_require_30017__(3157);\nvar wellKnownSymbol = __nested_webpack_require_30017__(5112);\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.es/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray, length) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n};\n\n\n/***/ }),\n\n/***/ 3411:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_30798__) {\n\nvar anObject = __nested_webpack_require_30798__(9670);\nvar iteratorClose = __nested_webpack_require_30798__(9212);\n\n// call something on iterator step with safe closing on error\nmodule.exports = function (iterator, fn, value, ENTRIES) {\n try {\n return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (error) {\n iteratorClose(iterator);\n throw error;\n }\n};\n\n\n/***/ }),\n\n/***/ 7072:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_31303__) {\n\nvar wellKnownSymbol = __nested_webpack_require_31303__(5112);\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line no-throw-literal -- required for testing\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n\n\n/***/ }),\n\n/***/ 4326:\n/***/ (function(module) {\n\nvar toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n\n\n/***/ }),\n\n/***/ 648:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_32503__) {\n\nvar TO_STRING_TAG_SUPPORT = __nested_webpack_require_32503__(1694);\nvar classofRaw = __nested_webpack_require_32503__(4326);\nvar wellKnownSymbol = __nested_webpack_require_32503__(5112);\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n};\n\n\n/***/ }),\n\n/***/ 9920:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_33565__) {\n\nvar has = __nested_webpack_require_33565__(6656);\nvar ownKeys = __nested_webpack_require_33565__(3887);\nvar getOwnPropertyDescriptorModule = __nested_webpack_require_33565__(1236);\nvar definePropertyModule = __nested_webpack_require_33565__(3070);\n\nmodule.exports = function (target, source) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n};\n\n\n/***/ }),\n\n/***/ 8544:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_34217__) {\n\nvar fails = __nested_webpack_require_34217__(7293);\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n\n\n/***/ }),\n\n/***/ 4994:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_34520__) {\n\n\"use strict\";\n\nvar IteratorPrototype = __nested_webpack_require_34520__(3383).IteratorPrototype;\nvar create = __nested_webpack_require_34520__(30);\nvar createPropertyDescriptor = __nested_webpack_require_34520__(9114);\nvar setToStringTag = __nested_webpack_require_34520__(8003);\nvar Iterators = __nested_webpack_require_34520__(7497);\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n Iterators[TO_STRING_TAG] = returnThis;\n return IteratorConstructor;\n};\n\n\n/***/ }),\n\n/***/ 8880:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_35290__) {\n\nvar DESCRIPTORS = __nested_webpack_require_35290__(9781);\nvar definePropertyModule = __nested_webpack_require_35290__(3070);\nvar createPropertyDescriptor = __nested_webpack_require_35290__(9114);\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n\n\n/***/ }),\n\n/***/ 9114:\n/***/ (function(module) {\n\nmodule.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n\n\n/***/ }),\n\n/***/ 6135:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_35996__) {\n\n\"use strict\";\n\nvar toPrimitive = __nested_webpack_require_35996__(7593);\nvar definePropertyModule = __nested_webpack_require_35996__(3070);\nvar createPropertyDescriptor = __nested_webpack_require_35996__(9114);\n\nmodule.exports = function (object, key, value) {\n var propertyKey = toPrimitive(key);\n if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));\n else object[propertyKey] = value;\n};\n\n\n/***/ }),\n\n/***/ 654:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_36503__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_36503__(2109);\nvar createIteratorConstructor = __nested_webpack_require_36503__(4994);\nvar getPrototypeOf = __nested_webpack_require_36503__(9518);\nvar setPrototypeOf = __nested_webpack_require_36503__(7674);\nvar setToStringTag = __nested_webpack_require_36503__(8003);\nvar createNonEnumerableProperty = __nested_webpack_require_36503__(8880);\nvar redefine = __nested_webpack_require_36503__(1320);\nvar wellKnownSymbol = __nested_webpack_require_36503__(5112);\nvar IS_PURE = __nested_webpack_require_36503__(1913);\nvar Iterators = __nested_webpack_require_36503__(7497);\nvar IteratorsCore = __nested_webpack_require_36503__(3383);\n\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n } return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n if (setPrototypeOf) {\n setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') {\n createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR, returnThis);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n }\n }\n\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return nativeIterator.call(this); };\n }\n\n // define iterator\n if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n createNonEnumerableProperty(IterablePrototype, ITERATOR, defaultIterator);\n }\n Iterators[NAME] = defaultIterator;\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n redefine(IterablePrototype, KEY, methods[KEY]);\n }\n } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n }\n\n return methods;\n};\n\n\n/***/ }),\n\n/***/ 9781:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_40475__) {\n\nvar fails = __nested_webpack_require_40475__(7293);\n\n// Detect IE8's incomplete defineProperty implementation\nmodule.exports = !fails(function () {\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n\n\n/***/ }),\n\n/***/ 317:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_40795__) {\n\nvar global = __nested_webpack_require_40795__(7854);\nvar isObject = __nested_webpack_require_40795__(111);\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n\n\n/***/ }),\n\n/***/ 8324:\n/***/ (function(module) {\n\n// iterable DOM collections\n// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\nmodule.exports = {\n CSSRuleList: 0,\n CSSStyleDeclaration: 0,\n CSSValueList: 0,\n ClientRectList: 0,\n DOMRectList: 0,\n DOMStringList: 0,\n DOMTokenList: 1,\n DataTransferItemList: 0,\n FileList: 0,\n HTMLAllCollection: 0,\n HTMLCollection: 0,\n HTMLFormElement: 0,\n HTMLSelectElement: 0,\n MediaList: 0,\n MimeTypeArray: 0,\n NamedNodeMap: 0,\n NodeList: 1,\n PaintRequestList: 0,\n Plugin: 0,\n PluginArray: 0,\n SVGLengthList: 0,\n SVGNumberList: 0,\n SVGPathSegList: 0,\n SVGPointList: 0,\n SVGStringList: 0,\n SVGTransformList: 0,\n SourceBufferList: 0,\n StyleSheetList: 0,\n TextTrackCueList: 0,\n TextTrackList: 0,\n TouchList: 0\n};\n\n\n/***/ }),\n\n/***/ 8113:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_42025__) {\n\nvar getBuiltIn = __nested_webpack_require_42025__(5005);\n\nmodule.exports = getBuiltIn('navigator', 'userAgent') || '';\n\n\n/***/ }),\n\n/***/ 7392:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_42230__) {\n\nvar global = __nested_webpack_require_42230__(7854);\nvar userAgent = __nested_webpack_require_42230__(8113);\n\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n version = match[0] + match[1];\n} else if (userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = match[1];\n }\n}\n\nmodule.exports = version && +version;\n\n\n/***/ }),\n\n/***/ 748:\n/***/ (function(module) {\n\n// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n\n\n/***/ }),\n\n/***/ 2109:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_43065__) {\n\nvar global = __nested_webpack_require_43065__(7854);\nvar getOwnPropertyDescriptor = __nested_webpack_require_43065__(1236).f;\nvar createNonEnumerableProperty = __nested_webpack_require_43065__(8880);\nvar redefine = __nested_webpack_require_43065__(1320);\nvar setGlobal = __nested_webpack_require_43065__(3505);\nvar copyConstructorProperties = __nested_webpack_require_43065__(9920);\nvar isForced = __nested_webpack_require_43065__(4705);\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.noTargetGet - prevent calling a getter on target\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || setGlobal(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.noTargetGet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty === typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n // extend global\n redefine(target, key, sourceProperty, options);\n }\n};\n\n\n/***/ }),\n\n/***/ 7293:\n/***/ (function(module) {\n\nmodule.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n\n\n/***/ }),\n\n/***/ 7007:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_45726__) {\n\n\"use strict\";\n\n// TODO: Remove from `core-js@4` since it's moved to entry points\n__nested_webpack_require_45726__(4916);\nvar redefine = __nested_webpack_require_45726__(1320);\nvar fails = __nested_webpack_require_45726__(7293);\nvar wellKnownSymbol = __nested_webpack_require_45726__(5112);\nvar regexpExec = __nested_webpack_require_45726__(2261);\nvar createNonEnumerableProperty = __nested_webpack_require_45726__(8880);\n\nvar SPECIES = wellKnownSymbol('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$
    ') !== '7';\n});\n\n// IE <= 11 replaces $0 with the whole match, as if it was $&\n// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\nvar REPLACE_KEEPS_$0 = (function () {\n return 'a'.replace(/./, '$0') === '$0';\n})();\n\nvar REPLACE = wellKnownSymbol('replace');\n// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\nvar REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\n if (/./[REPLACE]) {\n return /./[REPLACE]('a', '$0') === '';\n }\n return false;\n})();\n\n// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n// Weex JS has frozen built-in prototypes, so use try / catch wrapper\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n // eslint-disable-next-line regexp/no-empty-group -- required for testing\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n});\n\nmodule.exports = function (KEY, length, exec, sham) {\n var SYMBOL = wellKnownSymbol(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n\n if (KEY === 'split') {\n // We can't use real regex here since it causes deoptimization\n // and serious performance degradation in V8\n // https://github.com/zloirock/core-js/issues/306\n re = {};\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n re.flags = '';\n re[SYMBOL] = /./[SYMBOL];\n }\n\n re.exec = function () { execCalled = true; return null; };\n\n re[SYMBOL]('');\n return !execCalled;\n });\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !(\n REPLACE_SUPPORTS_NAMED_GROUPS &&\n REPLACE_KEEPS_$0 &&\n !REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n )) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }, {\n REPLACE_KEEPS_$0: REPLACE_KEEPS_$0,\n REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n });\n var stringMethod = methods[0];\n var regexMethod = methods[1];\n\n redefine(String.prototype, KEY, stringMethod);\n redefine(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return regexMethod.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return regexMethod.call(string, this); }\n );\n }\n\n if (sham) createNonEnumerableProperty(RegExp.prototype[SYMBOL], 'sham', true);\n};\n\n\n/***/ }),\n\n/***/ 9974:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_50488__) {\n\nvar aFunction = __nested_webpack_require_50488__(3099);\n\n// optional / simple context binding\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 0: return function () {\n return fn.call(that);\n };\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n\n\n/***/ }),\n\n/***/ 5005:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_51177__) {\n\nvar path = __nested_webpack_require_51177__(857);\nvar global = __nested_webpack_require_51177__(7854);\n\nvar aFunction = function (variable) {\n return typeof variable == 'function' ? variable : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace])\n : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method];\n};\n\n\n/***/ }),\n\n/***/ 1246:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_51701__) {\n\nvar classof = __nested_webpack_require_51701__(648);\nvar Iterators = __nested_webpack_require_51701__(7497);\nvar wellKnownSymbol = __nested_webpack_require_51701__(5112);\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n\n\n/***/ }),\n\n/***/ 8554:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_52112__) {\n\nvar anObject = __nested_webpack_require_52112__(9670);\nvar getIteratorMethod = __nested_webpack_require_52112__(1246);\n\nmodule.exports = function (it) {\n var iteratorMethod = getIteratorMethod(it);\n if (typeof iteratorMethod != 'function') {\n throw TypeError(String(it) + ' is not iterable');\n } return anObject(iteratorMethod.call(it));\n};\n\n\n/***/ }),\n\n/***/ 647:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_52531__) {\n\nvar toObject = __nested_webpack_require_52531__(7908);\n\nvar floor = Math.floor;\nvar replace = ''.replace;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d\\d?)/g;\n\n// https://tc39.es/ecma262/#sec-getsubstitution\nmodule.exports = function (matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return replace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n};\n\n\n/***/ }),\n\n/***/ 7854:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_53970__) {\n\nvar check = function (it) {\n return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n /* global globalThis -- safe */\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n check(typeof self == 'object' && self) ||\n check(typeof __nested_webpack_require_53970__.g == 'object' && __nested_webpack_require_53970__.g) ||\n // eslint-disable-next-line no-new-func -- fallback\n (function () { return this; })() || Function('return this')();\n\n\n/***/ }),\n\n/***/ 6656:\n/***/ (function(module) {\n\nvar hasOwnProperty = {}.hasOwnProperty;\n\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n\n\n/***/ }),\n\n/***/ 3501:\n/***/ (function(module) {\n\nmodule.exports = {};\n\n\n/***/ }),\n\n/***/ 490:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_54852__) {\n\nvar getBuiltIn = __nested_webpack_require_54852__(5005);\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n\n\n/***/ }),\n\n/***/ 4664:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_55056__) {\n\nvar DESCRIPTORS = __nested_webpack_require_55056__(9781);\nvar fails = __nested_webpack_require_55056__(7293);\nvar createElement = __nested_webpack_require_55056__(317);\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n\n\n/***/ }),\n\n/***/ 1179:\n/***/ (function(module) {\n\n// IEEE754 conversions based on https://github.com/feross/ieee754\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\n\nvar pack = function (number, mantissaLength, bytes) {\n var buffer = new Array(bytes);\n var exponentLength = bytes * 8 - mantissaLength - 1;\n var eMax = (1 << exponentLength) - 1;\n var eBias = eMax >> 1;\n var rt = mantissaLength === 23 ? pow(2, -24) - pow(2, -77) : 0;\n var sign = number < 0 || number === 0 && 1 / number < 0 ? 1 : 0;\n var index = 0;\n var exponent, mantissa, c;\n number = abs(number);\n // eslint-disable-next-line no-self-compare -- NaN check\n if (number != number || number === Infinity) {\n // eslint-disable-next-line no-self-compare -- NaN check\n mantissa = number != number ? 1 : 0;\n exponent = eMax;\n } else {\n exponent = floor(log(number) / LN2);\n if (number * (c = pow(2, -exponent)) < 1) {\n exponent--;\n c *= 2;\n }\n if (exponent + eBias >= 1) {\n number += rt / c;\n } else {\n number += rt * pow(2, 1 - eBias);\n }\n if (number * c >= 2) {\n exponent++;\n c /= 2;\n }\n if (exponent + eBias >= eMax) {\n mantissa = 0;\n exponent = eMax;\n } else if (exponent + eBias >= 1) {\n mantissa = (number * c - 1) * pow(2, mantissaLength);\n exponent = exponent + eBias;\n } else {\n mantissa = number * pow(2, eBias - 1) * pow(2, mantissaLength);\n exponent = 0;\n }\n }\n for (; mantissaLength >= 8; buffer[index++] = mantissa & 255, mantissa /= 256, mantissaLength -= 8);\n exponent = exponent << mantissaLength | mantissa;\n exponentLength += mantissaLength;\n for (; exponentLength > 0; buffer[index++] = exponent & 255, exponent /= 256, exponentLength -= 8);\n buffer[--index] |= sign * 128;\n return buffer;\n};\n\nvar unpack = function (buffer, mantissaLength) {\n var bytes = buffer.length;\n var exponentLength = bytes * 8 - mantissaLength - 1;\n var eMax = (1 << exponentLength) - 1;\n var eBias = eMax >> 1;\n var nBits = exponentLength - 7;\n var index = bytes - 1;\n var sign = buffer[index--];\n var exponent = sign & 127;\n var mantissa;\n sign >>= 7;\n for (; nBits > 0; exponent = exponent * 256 + buffer[index], index--, nBits -= 8);\n mantissa = exponent & (1 << -nBits) - 1;\n exponent >>= -nBits;\n nBits += mantissaLength;\n for (; nBits > 0; mantissa = mantissa * 256 + buffer[index], index--, nBits -= 8);\n if (exponent === 0) {\n exponent = 1 - eBias;\n } else if (exponent === eMax) {\n return mantissa ? NaN : sign ? -Infinity : Infinity;\n } else {\n mantissa = mantissa + pow(2, mantissaLength);\n exponent = exponent - eBias;\n } return (sign ? -1 : 1) * mantissa * pow(2, exponent - mantissaLength);\n};\n\nmodule.exports = {\n pack: pack,\n unpack: unpack\n};\n\n\n/***/ }),\n\n/***/ 8361:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_58329__) {\n\nvar fails = __nested_webpack_require_58329__(7293);\nvar classof = __nested_webpack_require_58329__(4326);\n\nvar split = ''.split;\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins -- safe\n return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split.call(it, '') : Object(it);\n} : Object;\n\n\n/***/ }),\n\n/***/ 9587:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_58925__) {\n\nvar isObject = __nested_webpack_require_58925__(111);\nvar setPrototypeOf = __nested_webpack_require_58925__(7674);\n\n// makes subclassing work correct for wrapped built-ins\nmodule.exports = function ($this, dummy, Wrapper) {\n var NewTarget, NewTargetPrototype;\n if (\n // it can work only with native `setPrototypeOf`\n setPrototypeOf &&\n // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n typeof (NewTarget = dummy.constructor) == 'function' &&\n NewTarget !== Wrapper &&\n isObject(NewTargetPrototype = NewTarget.prototype) &&\n NewTargetPrototype !== Wrapper.prototype\n ) setPrototypeOf($this, NewTargetPrototype);\n return $this;\n};\n\n\n/***/ }),\n\n/***/ 2788:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_59686__) {\n\nvar store = __nested_webpack_require_59686__(5465);\n\nvar functionToString = Function.toString;\n\n// this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper\nif (typeof store.inspectSource != 'function') {\n store.inspectSource = function (it) {\n return functionToString.call(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n\n\n/***/ }),\n\n/***/ 9909:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_60112__) {\n\nvar NATIVE_WEAK_MAP = __nested_webpack_require_60112__(8536);\nvar global = __nested_webpack_require_60112__(7854);\nvar isObject = __nested_webpack_require_60112__(111);\nvar createNonEnumerableProperty = __nested_webpack_require_60112__(8880);\nvar objectHas = __nested_webpack_require_60112__(6656);\nvar shared = __nested_webpack_require_60112__(5465);\nvar sharedKey = __nested_webpack_require_60112__(6200);\nvar hiddenKeys = __nested_webpack_require_60112__(3501);\n\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP) {\n var store = shared.state || (shared.state = new WeakMap());\n var wmget = store.get;\n var wmhas = store.has;\n var wmset = store.set;\n set = function (it, metadata) {\n metadata.facade = it;\n wmset.call(store, it, metadata);\n return metadata;\n };\n get = function (it) {\n return wmget.call(store, it) || {};\n };\n has = function (it) {\n return wmhas.call(store, it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return objectHas(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return objectHas(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n\n\n/***/ }),\n\n/***/ 7659:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_61804__) {\n\nvar wellKnownSymbol = __nested_webpack_require_61804__(5112);\nvar Iterators = __nested_webpack_require_61804__(7497);\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n\n\n/***/ }),\n\n/***/ 3157:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_62240__) {\n\nvar classof = __nested_webpack_require_62240__(4326);\n\n// `IsArray` abstract operation\n// https://tc39.es/ecma262/#sec-isarray\nmodule.exports = Array.isArray || function isArray(arg) {\n return classof(arg) == 'Array';\n};\n\n\n/***/ }),\n\n/***/ 4705:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_62548__) {\n\nvar fails = __nested_webpack_require_62548__(7293);\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : typeof detection == 'function' ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n\n\n/***/ }),\n\n/***/ 111:\n/***/ (function(module) {\n\nmodule.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n\n\n/***/ }),\n\n/***/ 1913:\n/***/ (function(module) {\n\nmodule.exports = false;\n\n\n/***/ }),\n\n/***/ 7850:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_63453__) {\n\nvar isObject = __nested_webpack_require_63453__(111);\nvar classof = __nested_webpack_require_63453__(4326);\nvar wellKnownSymbol = __nested_webpack_require_63453__(5112);\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.es/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');\n};\n\n\n/***/ }),\n\n/***/ 9212:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_63953__) {\n\nvar anObject = __nested_webpack_require_63953__(9670);\n\nmodule.exports = function (iterator) {\n var returnMethod = iterator['return'];\n if (returnMethod !== undefined) {\n return anObject(returnMethod.call(iterator)).value;\n }\n};\n\n\n/***/ }),\n\n/***/ 3383:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_64274__) {\n\n\"use strict\";\n\nvar fails = __nested_webpack_require_64274__(7293);\nvar getPrototypeOf = __nested_webpack_require_64274__(9518);\nvar createNonEnumerableProperty = __nested_webpack_require_64274__(8880);\nvar has = __nested_webpack_require_64274__(6656);\nvar wellKnownSymbol = __nested_webpack_require_64274__(5112);\nvar IS_PURE = __nested_webpack_require_64274__(1913);\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\nvar returnThis = function () { return this; };\n\n// `%IteratorPrototype%` object\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nvar NEW_ITERATOR_PROTOTYPE = IteratorPrototype == undefined || fails(function () {\n var test = {};\n // FF44- legacy iterators case\n return IteratorPrototype[ITERATOR].call(test) !== test;\n});\n\nif (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nif ((!IS_PURE || NEW_ITERATOR_PROTOTYPE) && !has(IteratorPrototype, ITERATOR)) {\n createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis);\n}\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n\n\n/***/ }),\n\n/***/ 7497:\n/***/ (function(module) {\n\nmodule.exports = {};\n\n\n/***/ }),\n\n/***/ 133:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_65970__) {\n\nvar fails = __nested_webpack_require_65970__(7293);\n\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n // Chrome 38 Symbol has incorrect toString conversion\n /* global Symbol -- required for testing */\n return !String(Symbol());\n});\n\n\n/***/ }),\n\n/***/ 590:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_66314__) {\n\nvar fails = __nested_webpack_require_66314__(7293);\nvar wellKnownSymbol = __nested_webpack_require_66314__(5112);\nvar IS_PURE = __nested_webpack_require_66314__(1913);\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = !fails(function () {\n var url = new URL('b?a=1&b=2&c=3', 'http://a');\n var searchParams = url.searchParams;\n var result = '';\n url.pathname = 'c%20d';\n searchParams.forEach(function (value, key) {\n searchParams['delete']('b');\n result += key + value;\n });\n return (IS_PURE && !url.toJSON)\n || !searchParams.sort\n || url.href !== 'http://a/c%20d?a=1&c=3'\n || searchParams.get('c') !== '3'\n || String(new URLSearchParams('?a=1')) !== 'a=1'\n || !searchParams[ITERATOR]\n // throws in Edge\n || new URL('https://a@b').username !== 'a'\n || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n // not punycoded in Edge\n || new URL('http://тест').host !== 'xn--e1aybc'\n // not escaped in Chrome 62-\n || new URL('http://a#б').hash !== '#%D0%B1'\n // fails in Chrome 66-\n || result !== 'a1c3'\n // throws in Safari\n || new URL('http://x', undefined).host !== 'x';\n});\n\n\n/***/ }),\n\n/***/ 8536:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_67534__) {\n\nvar global = __nested_webpack_require_67534__(7854);\nvar inspectSource = __nested_webpack_require_67534__(2788);\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = typeof WeakMap === 'function' && /native code/.test(inspectSource(WeakMap));\n\n\n/***/ }),\n\n/***/ 1574:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_67846__) {\n\n\"use strict\";\n\nvar DESCRIPTORS = __nested_webpack_require_67846__(9781);\nvar fails = __nested_webpack_require_67846__(7293);\nvar objectKeys = __nested_webpack_require_67846__(1956);\nvar getOwnPropertySymbolsModule = __nested_webpack_require_67846__(5181);\nvar propertyIsEnumerableModule = __nested_webpack_require_67846__(5296);\nvar toObject = __nested_webpack_require_67846__(7908);\nvar IndexedObject = __nested_webpack_require_67846__(8361);\n\nvar nativeAssign = Object.assign;\nvar defineProperty = Object.defineProperty;\n\n// `Object.assign` method\n// https://tc39.es/ecma262/#sec-object.assign\nmodule.exports = !nativeAssign || fails(function () {\n // should have correct order of operations (Edge bug)\n if (DESCRIPTORS && nativeAssign({ b: 1 }, nativeAssign(defineProperty({}, 'a', {\n enumerable: true,\n get: function () {\n defineProperty(this, 'b', {\n value: 3,\n enumerable: false\n });\n }\n }), { b: 2 })).b !== 1) return true;\n // should work with symbols and should have deterministic property order (V8 bug)\n var A = {};\n var B = {};\n /* global Symbol -- required for testing */\n var symbol = Symbol();\n var alphabet = 'abcdefghijklmnopqrst';\n A[symbol] = 7;\n alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars -- required for `.length`\n var T = toObject(target);\n var argumentsLength = arguments.length;\n var index = 1;\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n var propertyIsEnumerable = propertyIsEnumerableModule.f;\n while (argumentsLength > index) {\n var S = IndexedObject(arguments[index++]);\n var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(S, key)) T[key] = S[key];\n }\n } return T;\n} : nativeAssign;\n\n\n/***/ }),\n\n/***/ 30:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_69941__) {\n\nvar anObject = __nested_webpack_require_69941__(9670);\nvar defineProperties = __nested_webpack_require_69941__(6048);\nvar enumBugKeys = __nested_webpack_require_69941__(748);\nvar hiddenKeys = __nested_webpack_require_69941__(3501);\nvar html = __nested_webpack_require_69941__(490);\nvar documentCreateElement = __nested_webpack_require_69941__(317);\nvar sharedKey = __nested_webpack_require_69941__(6200);\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n activeXDocument = null; // avoid memory leak\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n /* global ActiveXObject -- old IE */\n activeXDocument = document.domain && new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame();\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.es/ecma262/#sec-object.create\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : defineProperties(result, Properties);\n};\n\n\n/***/ }),\n\n/***/ 6048:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_72835__) {\n\nvar DESCRIPTORS = __nested_webpack_require_72835__(9781);\nvar definePropertyModule = __nested_webpack_require_72835__(3070);\nvar anObject = __nested_webpack_require_72835__(9670);\nvar objectKeys = __nested_webpack_require_72835__(1956);\n\n// `Object.defineProperties` method\n// https://tc39.es/ecma262/#sec-object.defineproperties\nmodule.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], Properties[key]);\n return O;\n};\n\n\n/***/ }),\n\n/***/ 3070:\n/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_73525__) {\n\nvar DESCRIPTORS = __nested_webpack_require_73525__(9781);\nvar IE8_DOM_DEFINE = __nested_webpack_require_73525__(4664);\nvar anObject = __nested_webpack_require_73525__(9670);\nvar toPrimitive = __nested_webpack_require_73525__(7593);\n\nvar nativeDefineProperty = Object.defineProperty;\n\n// `Object.defineProperty` method\n// https://tc39.es/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return nativeDefineProperty(O, P, Attributes);\n } catch (error) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n\n\n/***/ }),\n\n/***/ 1236:\n/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_74380__) {\n\nvar DESCRIPTORS = __nested_webpack_require_74380__(9781);\nvar propertyIsEnumerableModule = __nested_webpack_require_74380__(5296);\nvar createPropertyDescriptor = __nested_webpack_require_74380__(9114);\nvar toIndexedObject = __nested_webpack_require_74380__(5656);\nvar toPrimitive = __nested_webpack_require_74380__(7593);\nvar has = __nested_webpack_require_74380__(6656);\nvar IE8_DOM_DEFINE = __nested_webpack_require_74380__(4664);\n\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return nativeGetOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);\n};\n\n\n/***/ }),\n\n/***/ 8006:\n/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_75368__) {\n\nvar internalObjectKeys = __nested_webpack_require_75368__(6324);\nvar enumBugKeys = __nested_webpack_require_75368__(748);\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.es/ecma262/#sec-object.getownpropertynames\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n\n\n/***/ }),\n\n/***/ 5181:\n/***/ (function(__unused_webpack_module, exports) {\n\nexports.f = Object.getOwnPropertySymbols;\n\n\n/***/ }),\n\n/***/ 9518:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_75966__) {\n\nvar has = __nested_webpack_require_75966__(6656);\nvar toObject = __nested_webpack_require_75966__(7908);\nvar sharedKey = __nested_webpack_require_75966__(6200);\nvar CORRECT_PROTOTYPE_GETTER = __nested_webpack_require_75966__(8544);\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar ObjectPrototype = Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.getprototypeof\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectPrototype : null;\n};\n\n\n/***/ }),\n\n/***/ 6324:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_76729__) {\n\nvar has = __nested_webpack_require_76729__(6656);\nvar toIndexedObject = __nested_webpack_require_76729__(5656);\nvar indexOf = __nested_webpack_require_76729__(1318).indexOf;\nvar hiddenKeys = __nested_webpack_require_76729__(3501);\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~indexOf(result, key) || result.push(key);\n }\n return result;\n};\n\n\n/***/ }),\n\n/***/ 1956:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_77369__) {\n\nvar internalObjectKeys = __nested_webpack_require_77369__(6324);\nvar enumBugKeys = __nested_webpack_require_77369__(748);\n\n// `Object.keys` method\n// https://tc39.es/ecma262/#sec-object.keys\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n\n\n/***/ }),\n\n/***/ 5296:\n/***/ (function(__unused_webpack_module, exports) {\n\n\"use strict\";\n\nvar nativePropertyIsEnumerable = {}.propertyIsEnumerable;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : nativePropertyIsEnumerable;\n\n\n/***/ }),\n\n/***/ 7674:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_78394__) {\n\n/* eslint-disable no-proto -- safe */\nvar anObject = __nested_webpack_require_78394__(9670);\nvar aPossiblePrototype = __nested_webpack_require_78394__(6077);\n\n// `Object.setPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n setter.call(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n anObject(O);\n aPossiblePrototype(proto);\n if (CORRECT_SETTER) setter.call(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n\n\n/***/ }),\n\n/***/ 288:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_79325__) {\n\n\"use strict\";\n\nvar TO_STRING_TAG_SUPPORT = __nested_webpack_require_79325__(1694);\nvar classof = __nested_webpack_require_79325__(648);\n\n// `Object.prototype.toString` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.tostring\nmodule.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() {\n return '[object ' + classof(this) + ']';\n};\n\n\n/***/ }),\n\n/***/ 3887:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_79769__) {\n\nvar getBuiltIn = __nested_webpack_require_79769__(5005);\nvar getOwnPropertyNamesModule = __nested_webpack_require_79769__(8006);\nvar getOwnPropertySymbolsModule = __nested_webpack_require_79769__(5181);\nvar anObject = __nested_webpack_require_79769__(9670);\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n};\n\n\n/***/ }),\n\n/***/ 857:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_80406__) {\n\nvar global = __nested_webpack_require_80406__(7854);\n\nmodule.exports = global;\n\n\n/***/ }),\n\n/***/ 2248:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_80571__) {\n\nvar redefine = __nested_webpack_require_80571__(1320);\n\nmodule.exports = function (target, src, options) {\n for (var key in src) redefine(target, key, src[key], options);\n return target;\n};\n\n\n/***/ }),\n\n/***/ 1320:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_80849__) {\n\nvar global = __nested_webpack_require_80849__(7854);\nvar createNonEnumerableProperty = __nested_webpack_require_80849__(8880);\nvar has = __nested_webpack_require_80849__(6656);\nvar setGlobal = __nested_webpack_require_80849__(3505);\nvar inspectSource = __nested_webpack_require_80849__(2788);\nvar InternalStateModule = __nested_webpack_require_80849__(9909);\n\nvar getInternalState = InternalStateModule.get;\nvar enforceInternalState = InternalStateModule.enforce;\nvar TEMPLATE = String(String).split('String');\n\n(module.exports = function (O, key, value, options) {\n var unsafe = options ? !!options.unsafe : false;\n var simple = options ? !!options.enumerable : false;\n var noTargetGet = options ? !!options.noTargetGet : false;\n var state;\n if (typeof value == 'function') {\n if (typeof key == 'string' && !has(value, 'name')) {\n createNonEnumerableProperty(value, 'name', key);\n }\n state = enforceInternalState(value);\n if (!state.source) {\n state.source = TEMPLATE.join(typeof key == 'string' ? key : '');\n }\n }\n if (O === global) {\n if (simple) O[key] = value;\n else setGlobal(key, value);\n return;\n } else if (!unsafe) {\n delete O[key];\n } else if (!noTargetGet && O[key]) {\n simple = true;\n }\n if (simple) O[key] = value;\n else createNonEnumerableProperty(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n return typeof this == 'function' && getInternalState(this).source || inspectSource(this);\n});\n\n\n/***/ }),\n\n/***/ 7651:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_82466__) {\n\nvar classof = __nested_webpack_require_82466__(4326);\nvar regexpExec = __nested_webpack_require_82466__(2261);\n\n// `RegExpExec` abstract operation\n// https://tc39.es/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n\n if (classof(R) !== 'RegExp') {\n throw TypeError('RegExp#exec called on incompatible receiver');\n }\n\n return regexpExec.call(R, S);\n};\n\n\n\n/***/ }),\n\n/***/ 2261:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_83158__) {\n\n\"use strict\";\n\nvar regexpFlags = __nested_webpack_require_83158__(7066);\nvar stickyHelpers = __nested_webpack_require_83158__(2999);\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/;\n var re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n})();\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y || stickyHelpers.BROKEN_CARET;\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\n// eslint-disable-next-line regexp/no-assertion-capturing-group, regexp/no-empty-group -- required for testing\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n var sticky = UNSUPPORTED_Y && re.sticky;\n var flags = regexpFlags.call(re);\n var source = re.source;\n var charsAdded = 0;\n var strCopy = str;\n\n if (sticky) {\n flags = flags.replace('y', '');\n if (flags.indexOf('g') === -1) {\n flags += 'g';\n }\n\n strCopy = String(str).slice(re.lastIndex);\n // Support anchored sticky behavior.\n if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\\n')) {\n source = '(?: ' + source + ')';\n strCopy = ' ' + strCopy;\n charsAdded++;\n }\n // ^(? + rx + ) is needed, in combination with some str slicing, to\n // simulate the 'y' flag.\n reCopy = new RegExp('^(?:' + source + ')', flags);\n }\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n match = nativeExec.call(sticky ? reCopy : re, strCopy);\n\n if (sticky) {\n if (match) {\n match.input = match.input.slice(charsAdded);\n match[0] = match[0].slice(charsAdded);\n match.index = re.lastIndex;\n re.lastIndex += match[0].length;\n } else re.lastIndex = 0;\n } else if (UPDATES_LAST_INDEX_WRONG && match) {\n re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n\n\n/***/ }),\n\n/***/ 7066:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_86176__) {\n\n\"use strict\";\n\nvar anObject = __nested_webpack_require_86176__(9670);\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.dotAll) result += 's';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n\n\n/***/ }),\n\n/***/ 2999:\n/***/ (function(__unused_webpack_module, exports, __nested_webpack_require_86753__) {\n\n\"use strict\";\n\n\nvar fails = __nested_webpack_require_86753__(7293);\n\n// babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError,\n// so we use an intermediate function.\nfunction RE(s, f) {\n return RegExp(s, f);\n}\n\nexports.UNSUPPORTED_Y = fails(function () {\n // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\n var re = RE('a', 'y');\n re.lastIndex = 2;\n return re.exec('abcd') != null;\n});\n\nexports.BROKEN_CARET = fails(function () {\n // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n var re = RE('^r', 'gy');\n re.lastIndex = 2;\n return re.exec('str') != null;\n});\n\n\n/***/ }),\n\n/***/ 4488:\n/***/ (function(module) {\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n\n\n/***/ }),\n\n/***/ 3505:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_87737__) {\n\nvar global = __nested_webpack_require_87737__(7854);\nvar createNonEnumerableProperty = __nested_webpack_require_87737__(8880);\n\nmodule.exports = function (key, value) {\n try {\n createNonEnumerableProperty(global, key, value);\n } catch (error) {\n global[key] = value;\n } return value;\n};\n\n\n/***/ }),\n\n/***/ 6340:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_88106__) {\n\n\"use strict\";\n\nvar getBuiltIn = __nested_webpack_require_88106__(5005);\nvar definePropertyModule = __nested_webpack_require_88106__(3070);\nvar wellKnownSymbol = __nested_webpack_require_88106__(5112);\nvar DESCRIPTORS = __nested_webpack_require_88106__(9781);\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n var defineProperty = definePropertyModule.f;\n\n if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {\n defineProperty(Constructor, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n }\n};\n\n\n/***/ }),\n\n/***/ 8003:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_88786__) {\n\nvar defineProperty = __nested_webpack_require_88786__(3070).f;\nvar has = __nested_webpack_require_88786__(6656);\nvar wellKnownSymbol = __nested_webpack_require_88786__(5112);\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (it, TAG, STATIC) {\n if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {\n defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n\n\n/***/ }),\n\n/***/ 6200:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_89271__) {\n\nvar shared = __nested_webpack_require_89271__(2309);\nvar uid = __nested_webpack_require_89271__(9711);\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n\n\n/***/ }),\n\n/***/ 5465:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_89559__) {\n\nvar global = __nested_webpack_require_89559__(7854);\nvar setGlobal = __nested_webpack_require_89559__(3505);\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || setGlobal(SHARED, {});\n\nmodule.exports = store;\n\n\n/***/ }),\n\n/***/ 2309:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_89855__) {\n\nvar IS_PURE = __nested_webpack_require_89855__(1913);\nvar store = __nested_webpack_require_89855__(5465);\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.9.0',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2021 Denis Pushkarev (zloirock.ru)'\n});\n\n\n/***/ }),\n\n/***/ 6707:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_90288__) {\n\nvar anObject = __nested_webpack_require_90288__(9670);\nvar aFunction = __nested_webpack_require_90288__(3099);\nvar wellKnownSymbol = __nested_webpack_require_90288__(5112);\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.es/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aFunction(S);\n};\n\n\n/***/ }),\n\n/***/ 8710:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_90863__) {\n\nvar toInteger = __nested_webpack_require_90863__(9958);\nvar requireObjectCoercible = __nested_webpack_require_90863__(4488);\n\n// `String.prototype.{ codePointAt, at }` methods implementation\nvar createMethod = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = String(requireObjectCoercible($this));\n var position = toInteger(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = S.charCodeAt(position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING ? S.charAt(position) : first\n : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n};\n\nmodule.exports = {\n // `String.prototype.codePointAt` method\n // https://tc39.es/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod(true)\n};\n\n\n/***/ }),\n\n/***/ 3197:\n/***/ (function(module) {\n\n\"use strict\";\n\n// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\nvar maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\nvar base = 36;\nvar tMin = 1;\nvar tMax = 26;\nvar skew = 38;\nvar damp = 700;\nvar initialBias = 72;\nvar initialN = 128; // 0x80\nvar delimiter = '-'; // '\\x2D'\nvar regexNonASCII = /[^\\0-\\u007E]/; // non-ASCII chars\nvar regexSeparators = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\nvar OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';\nvar baseMinusTMin = base - tMin;\nvar floor = Math.floor;\nvar stringFromCharCode = String.fromCharCode;\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n */\nvar ucs2decode = function (string) {\n var output = [];\n var counter = 0;\n var length = string.length;\n while (counter < length) {\n var value = string.charCodeAt(counter++);\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n // It's a high surrogate, and there is a next character.\n var extra = string.charCodeAt(counter++);\n if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n */\nvar digitToBasic = function (digit) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n */\nvar adapt = function (delta, numPoints, firstTime) {\n var k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n for (; delta > baseMinusTMin * tMax >> 1; k += base) {\n delta = floor(delta / baseMinusTMin);\n }\n return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n */\n// eslint-disable-next-line max-statements -- TODO\nvar encode = function (input) {\n var output = [];\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n input = ucs2decode(input);\n\n // Cache the length.\n var inputLength = input.length;\n\n // Initialize the state.\n var n = initialN;\n var delta = 0;\n var bias = initialBias;\n var i, currentValue;\n\n // Handle the basic code points.\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue));\n }\n }\n\n var basicLength = output.length; // number of basic code points.\n var handledCPCount = basicLength; // number of code points that have been handled;\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n output.push(delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next larger one:\n var m = maxInt;\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's state to , but guard against overflow.\n var handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n throw RangeError(OVERFLOW_ERROR);\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < n && ++delta > maxInt) {\n throw RangeError(OVERFLOW_ERROR);\n }\n if (currentValue == n) {\n // Represent delta as a generalized variable-length integer.\n var q = delta;\n for (var k = base; /* no condition */; k += base) {\n var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n if (q < t) break;\n var qMinusT = q - t;\n var baseMinusT = base - t;\n output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT)));\n q = floor(qMinusT / baseMinusT);\n }\n\n output.push(stringFromCharCode(digitToBasic(q)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n delta = 0;\n ++handledCPCount;\n }\n }\n\n ++delta;\n ++n;\n }\n return output.join('');\n};\n\nmodule.exports = function (input) {\n var encoded = [];\n var labels = input.toLowerCase().replace(regexSeparators, '\\u002E').split('.');\n var i, label;\n for (i = 0; i < labels.length; i++) {\n label = labels[i];\n encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label);\n }\n return encoded.join('.');\n};\n\n\n/***/ }),\n\n/***/ 6091:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_97360__) {\n\nvar fails = __nested_webpack_require_97360__(7293);\nvar whitespaces = __nested_webpack_require_97360__(1361);\n\nvar non = '\\u200B\\u0085\\u180E';\n\n// check that a method works with the correct list\n// of whitespaces and has a correct name\nmodule.exports = function (METHOD_NAME) {\n return fails(function () {\n return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME;\n });\n};\n\n\n/***/ }),\n\n/***/ 3111:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_97868__) {\n\nvar requireObjectCoercible = __nested_webpack_require_97868__(4488);\nvar whitespaces = __nested_webpack_require_97868__(1361);\n\nvar whitespace = '[' + whitespaces + ']';\nvar ltrim = RegExp('^' + whitespace + whitespace + '*');\nvar rtrim = RegExp(whitespace + whitespace + '*$');\n\n// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\nvar createMethod = function (TYPE) {\n return function ($this) {\n var string = String(requireObjectCoercible($this));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n };\n};\n\nmodule.exports = {\n // `String.prototype.{ trimLeft, trimStart }` methods\n // https://tc39.es/ecma262/#sec-string.prototype.trimstart\n start: createMethod(1),\n // `String.prototype.{ trimRight, trimEnd }` methods\n // https://tc39.es/ecma262/#sec-string.prototype.trimend\n end: createMethod(2),\n // `String.prototype.trim` method\n // https://tc39.es/ecma262/#sec-string.prototype.trim\n trim: createMethod(3)\n};\n\n\n/***/ }),\n\n/***/ 1400:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_98992__) {\n\nvar toInteger = __nested_webpack_require_98992__(9958);\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toInteger(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n\n\n/***/ }),\n\n/***/ 7067:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_99521__) {\n\nvar toInteger = __nested_webpack_require_99521__(9958);\nvar toLength = __nested_webpack_require_99521__(7466);\n\n// `ToIndex` abstract operation\n// https://tc39.es/ecma262/#sec-toindex\nmodule.exports = function (it) {\n if (it === undefined) return 0;\n var number = toInteger(it);\n var length = toLength(number);\n if (number !== length) throw RangeError('Wrong length or index');\n return length;\n};\n\n\n/***/ }),\n\n/***/ 5656:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_99996__) {\n\n// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = __nested_webpack_require_99996__(8361);\nvar requireObjectCoercible = __nested_webpack_require_99996__(4488);\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n\n\n/***/ }),\n\n/***/ 9958:\n/***/ (function(module) {\n\nvar ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `ToInteger` abstract operation\n// https://tc39.es/ecma262/#sec-tointeger\nmodule.exports = function (argument) {\n return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n};\n\n\n/***/ }),\n\n/***/ 7466:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_100645__) {\n\nvar toInteger = __nested_webpack_require_100645__(9958);\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.es/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n\n\n/***/ }),\n\n/***/ 7908:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_101032__) {\n\nvar requireObjectCoercible = __nested_webpack_require_101032__(4488);\n\n// `ToObject` abstract operation\n// https://tc39.es/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return Object(requireObjectCoercible(argument));\n};\n\n\n/***/ }),\n\n/***/ 4590:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_101355__) {\n\nvar toPositiveInteger = __nested_webpack_require_101355__(3002);\n\nmodule.exports = function (it, BYTES) {\n var offset = toPositiveInteger(it);\n if (offset % BYTES) throw RangeError('Wrong offset');\n return offset;\n};\n\n\n/***/ }),\n\n/***/ 3002:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_101660__) {\n\nvar toInteger = __nested_webpack_require_101660__(9958);\n\nmodule.exports = function (it) {\n var result = toInteger(it);\n if (result < 0) throw RangeError(\"The argument can't be less than 0\");\n return result;\n};\n\n\n/***/ }),\n\n/***/ 7593:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_101959__) {\n\nvar isObject = __nested_webpack_require_101959__(111);\n\n// `ToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-toprimitive\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (input, PREFERRED_STRING) {\n if (!isObject(input)) return input;\n var fn, val;\n if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\n if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n\n\n/***/ }),\n\n/***/ 1694:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_102821__) {\n\nvar wellKnownSymbol = __nested_webpack_require_102821__(5112);\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n\n\n/***/ }),\n\n/***/ 9843:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_103114__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_103114__(2109);\nvar global = __nested_webpack_require_103114__(7854);\nvar DESCRIPTORS = __nested_webpack_require_103114__(9781);\nvar TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS = __nested_webpack_require_103114__(3832);\nvar ArrayBufferViewCore = __nested_webpack_require_103114__(260);\nvar ArrayBufferModule = __nested_webpack_require_103114__(3331);\nvar anInstance = __nested_webpack_require_103114__(5787);\nvar createPropertyDescriptor = __nested_webpack_require_103114__(9114);\nvar createNonEnumerableProperty = __nested_webpack_require_103114__(8880);\nvar toLength = __nested_webpack_require_103114__(7466);\nvar toIndex = __nested_webpack_require_103114__(7067);\nvar toOffset = __nested_webpack_require_103114__(4590);\nvar toPrimitive = __nested_webpack_require_103114__(7593);\nvar has = __nested_webpack_require_103114__(6656);\nvar classof = __nested_webpack_require_103114__(648);\nvar isObject = __nested_webpack_require_103114__(111);\nvar create = __nested_webpack_require_103114__(30);\nvar setPrototypeOf = __nested_webpack_require_103114__(7674);\nvar getOwnPropertyNames = __nested_webpack_require_103114__(8006).f;\nvar typedArrayFrom = __nested_webpack_require_103114__(7321);\nvar forEach = __nested_webpack_require_103114__(2092).forEach;\nvar setSpecies = __nested_webpack_require_103114__(6340);\nvar definePropertyModule = __nested_webpack_require_103114__(3070);\nvar getOwnPropertyDescriptorModule = __nested_webpack_require_103114__(1236);\nvar InternalStateModule = __nested_webpack_require_103114__(9909);\nvar inheritIfRequired = __nested_webpack_require_103114__(9587);\n\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar nativeDefineProperty = definePropertyModule.f;\nvar nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\nvar round = Math.round;\nvar RangeError = global.RangeError;\nvar ArrayBuffer = ArrayBufferModule.ArrayBuffer;\nvar DataView = ArrayBufferModule.DataView;\nvar NATIVE_ARRAY_BUFFER_VIEWS = ArrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS;\nvar TYPED_ARRAY_TAG = ArrayBufferViewCore.TYPED_ARRAY_TAG;\nvar TypedArray = ArrayBufferViewCore.TypedArray;\nvar TypedArrayPrototype = ArrayBufferViewCore.TypedArrayPrototype;\nvar aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;\nvar isTypedArray = ArrayBufferViewCore.isTypedArray;\nvar BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\nvar WRONG_LENGTH = 'Wrong length';\n\nvar fromList = function (C, list) {\n var index = 0;\n var length = list.length;\n var result = new (aTypedArrayConstructor(C))(length);\n while (length > index) result[index] = list[index++];\n return result;\n};\n\nvar addGetter = function (it, key) {\n nativeDefineProperty(it, key, { get: function () {\n return getInternalState(this)[key];\n } });\n};\n\nvar isArrayBuffer = function (it) {\n var klass;\n return it instanceof ArrayBuffer || (klass = classof(it)) == 'ArrayBuffer' || klass == 'SharedArrayBuffer';\n};\n\nvar isTypedArrayIndex = function (target, key) {\n return isTypedArray(target)\n && typeof key != 'symbol'\n && key in target\n && String(+key) == String(key);\n};\n\nvar wrappedGetOwnPropertyDescriptor = function getOwnPropertyDescriptor(target, key) {\n return isTypedArrayIndex(target, key = toPrimitive(key, true))\n ? createPropertyDescriptor(2, target[key])\n : nativeGetOwnPropertyDescriptor(target, key);\n};\n\nvar wrappedDefineProperty = function defineProperty(target, key, descriptor) {\n if (isTypedArrayIndex(target, key = toPrimitive(key, true))\n && isObject(descriptor)\n && has(descriptor, 'value')\n && !has(descriptor, 'get')\n && !has(descriptor, 'set')\n // TODO: add validation descriptor w/o calling accessors\n && !descriptor.configurable\n && (!has(descriptor, 'writable') || descriptor.writable)\n && (!has(descriptor, 'enumerable') || descriptor.enumerable)\n ) {\n target[key] = descriptor.value;\n return target;\n } return nativeDefineProperty(target, key, descriptor);\n};\n\nif (DESCRIPTORS) {\n if (!NATIVE_ARRAY_BUFFER_VIEWS) {\n getOwnPropertyDescriptorModule.f = wrappedGetOwnPropertyDescriptor;\n definePropertyModule.f = wrappedDefineProperty;\n addGetter(TypedArrayPrototype, 'buffer');\n addGetter(TypedArrayPrototype, 'byteOffset');\n addGetter(TypedArrayPrototype, 'byteLength');\n addGetter(TypedArrayPrototype, 'length');\n }\n\n $({ target: 'Object', stat: true, forced: !NATIVE_ARRAY_BUFFER_VIEWS }, {\n getOwnPropertyDescriptor: wrappedGetOwnPropertyDescriptor,\n defineProperty: wrappedDefineProperty\n });\n\n module.exports = function (TYPE, wrapper, CLAMPED) {\n var BYTES = TYPE.match(/\\d+$/)[0] / 8;\n var CONSTRUCTOR_NAME = TYPE + (CLAMPED ? 'Clamped' : '') + 'Array';\n var GETTER = 'get' + TYPE;\n var SETTER = 'set' + TYPE;\n var NativeTypedArrayConstructor = global[CONSTRUCTOR_NAME];\n var TypedArrayConstructor = NativeTypedArrayConstructor;\n var TypedArrayConstructorPrototype = TypedArrayConstructor && TypedArrayConstructor.prototype;\n var exported = {};\n\n var getter = function (that, index) {\n var data = getInternalState(that);\n return data.view[GETTER](index * BYTES + data.byteOffset, true);\n };\n\n var setter = function (that, index, value) {\n var data = getInternalState(that);\n if (CLAMPED) value = (value = round(value)) < 0 ? 0 : value > 0xFF ? 0xFF : value & 0xFF;\n data.view[SETTER](index * BYTES + data.byteOffset, value, true);\n };\n\n var addElement = function (that, index) {\n nativeDefineProperty(that, index, {\n get: function () {\n return getter(this, index);\n },\n set: function (value) {\n return setter(this, index, value);\n },\n enumerable: true\n });\n };\n\n if (!NATIVE_ARRAY_BUFFER_VIEWS) {\n TypedArrayConstructor = wrapper(function (that, data, offset, $length) {\n anInstance(that, TypedArrayConstructor, CONSTRUCTOR_NAME);\n var index = 0;\n var byteOffset = 0;\n var buffer, byteLength, length;\n if (!isObject(data)) {\n length = toIndex(data);\n byteLength = length * BYTES;\n buffer = new ArrayBuffer(byteLength);\n } else if (isArrayBuffer(data)) {\n buffer = data;\n byteOffset = toOffset(offset, BYTES);\n var $len = data.byteLength;\n if ($length === undefined) {\n if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n byteLength = $len - byteOffset;\n if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n } else {\n byteLength = toLength($length) * BYTES;\n if (byteLength + byteOffset > $len) throw RangeError(WRONG_LENGTH);\n }\n length = byteLength / BYTES;\n } else if (isTypedArray(data)) {\n return fromList(TypedArrayConstructor, data);\n } else {\n return typedArrayFrom.call(TypedArrayConstructor, data);\n }\n setInternalState(that, {\n buffer: buffer,\n byteOffset: byteOffset,\n byteLength: byteLength,\n length: length,\n view: new DataView(buffer)\n });\n while (index < length) addElement(that, index++);\n });\n\n if (setPrototypeOf) setPrototypeOf(TypedArrayConstructor, TypedArray);\n TypedArrayConstructorPrototype = TypedArrayConstructor.prototype = create(TypedArrayPrototype);\n } else if (TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS) {\n TypedArrayConstructor = wrapper(function (dummy, data, typedArrayOffset, $length) {\n anInstance(dummy, TypedArrayConstructor, CONSTRUCTOR_NAME);\n return inheritIfRequired(function () {\n if (!isObject(data)) return new NativeTypedArrayConstructor(toIndex(data));\n if (isArrayBuffer(data)) return $length !== undefined\n ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES), $length)\n : typedArrayOffset !== undefined\n ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES))\n : new NativeTypedArrayConstructor(data);\n if (isTypedArray(data)) return fromList(TypedArrayConstructor, data);\n return typedArrayFrom.call(TypedArrayConstructor, data);\n }(), dummy, TypedArrayConstructor);\n });\n\n if (setPrototypeOf) setPrototypeOf(TypedArrayConstructor, TypedArray);\n forEach(getOwnPropertyNames(NativeTypedArrayConstructor), function (key) {\n if (!(key in TypedArrayConstructor)) {\n createNonEnumerableProperty(TypedArrayConstructor, key, NativeTypedArrayConstructor[key]);\n }\n });\n TypedArrayConstructor.prototype = TypedArrayConstructorPrototype;\n }\n\n if (TypedArrayConstructorPrototype.constructor !== TypedArrayConstructor) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, 'constructor', TypedArrayConstructor);\n }\n\n if (TYPED_ARRAY_TAG) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, TYPED_ARRAY_TAG, CONSTRUCTOR_NAME);\n }\n\n exported[CONSTRUCTOR_NAME] = TypedArrayConstructor;\n\n $({\n global: true, forced: TypedArrayConstructor != NativeTypedArrayConstructor, sham: !NATIVE_ARRAY_BUFFER_VIEWS\n }, exported);\n\n if (!(BYTES_PER_ELEMENT in TypedArrayConstructor)) {\n createNonEnumerableProperty(TypedArrayConstructor, BYTES_PER_ELEMENT, BYTES);\n }\n\n if (!(BYTES_PER_ELEMENT in TypedArrayConstructorPrototype)) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, BYTES_PER_ELEMENT, BYTES);\n }\n\n setSpecies(CONSTRUCTOR_NAME);\n };\n} else module.exports = function () { /* empty */ };\n\n\n/***/ }),\n\n/***/ 3832:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_112503__) {\n\n/* eslint-disable no-new -- required for testing */\nvar global = __nested_webpack_require_112503__(7854);\nvar fails = __nested_webpack_require_112503__(7293);\nvar checkCorrectnessOfIteration = __nested_webpack_require_112503__(7072);\nvar NATIVE_ARRAY_BUFFER_VIEWS = __nested_webpack_require_112503__(260).NATIVE_ARRAY_BUFFER_VIEWS;\n\nvar ArrayBuffer = global.ArrayBuffer;\nvar Int8Array = global.Int8Array;\n\nmodule.exports = !NATIVE_ARRAY_BUFFER_VIEWS || !fails(function () {\n Int8Array(1);\n}) || !fails(function () {\n new Int8Array(-1);\n}) || !checkCorrectnessOfIteration(function (iterable) {\n new Int8Array();\n new Int8Array(null);\n new Int8Array(1.5);\n new Int8Array(iterable);\n}, true) || fails(function () {\n // Safari (11+) bug - a reason why even Safari 13 should load a typed array polyfill\n return new Int8Array(new ArrayBuffer(2), 1, undefined).length !== 1;\n});\n\n\n/***/ }),\n\n/***/ 3074:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_113426__) {\n\nvar aTypedArrayConstructor = __nested_webpack_require_113426__(260).aTypedArrayConstructor;\nvar speciesConstructor = __nested_webpack_require_113426__(6707);\n\nmodule.exports = function (instance, list) {\n var C = speciesConstructor(instance, instance.constructor);\n var index = 0;\n var length = list.length;\n var result = new (aTypedArrayConstructor(C))(length);\n while (length > index) result[index] = list[index++];\n return result;\n};\n\n\n/***/ }),\n\n/***/ 7321:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_113940__) {\n\nvar toObject = __nested_webpack_require_113940__(7908);\nvar toLength = __nested_webpack_require_113940__(7466);\nvar getIteratorMethod = __nested_webpack_require_113940__(1246);\nvar isArrayIteratorMethod = __nested_webpack_require_113940__(7659);\nvar bind = __nested_webpack_require_113940__(9974);\nvar aTypedArrayConstructor = __nested_webpack_require_113940__(260).aTypedArrayConstructor;\n\nmodule.exports = function from(source /* , mapfn, thisArg */) {\n var O = toObject(source);\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var i, length, result, step, iterator, next;\n if (iteratorMethod != undefined && !isArrayIteratorMethod(iteratorMethod)) {\n iterator = iteratorMethod.call(O);\n next = iterator.next;\n O = [];\n while (!(step = next.call(iterator)).done) {\n O.push(step.value);\n }\n }\n if (mapping && argumentsLength > 2) {\n mapfn = bind(mapfn, arguments[2], 2);\n }\n length = toLength(O.length);\n result = new (aTypedArrayConstructor(this))(length);\n for (i = 0; length > i; i++) {\n result[i] = mapping ? mapfn(O[i], i) : O[i];\n }\n return result;\n};\n\n\n/***/ }),\n\n/***/ 9711:\n/***/ (function(module) {\n\nvar id = 0;\nvar postfix = Math.random();\n\nmodule.exports = function (key) {\n return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\n};\n\n\n/***/ }),\n\n/***/ 3307:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_115419__) {\n\nvar NATIVE_SYMBOL = __nested_webpack_require_115419__(133);\n\nmodule.exports = NATIVE_SYMBOL\n /* global Symbol -- safe */\n && !Symbol.sham\n && typeof Symbol.iterator == 'symbol';\n\n\n/***/ }),\n\n/***/ 5112:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_115685__) {\n\nvar global = __nested_webpack_require_115685__(7854);\nvar shared = __nested_webpack_require_115685__(2309);\nvar has = __nested_webpack_require_115685__(6656);\nvar uid = __nested_webpack_require_115685__(9711);\nvar NATIVE_SYMBOL = __nested_webpack_require_115685__(133);\nvar USE_SYMBOL_AS_UID = __nested_webpack_require_115685__(3307);\n\nvar WellKnownSymbolsStore = shared('wks');\nvar Symbol = global.Symbol;\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!has(WellKnownSymbolsStore, name)) {\n if (NATIVE_SYMBOL && has(Symbol, name)) WellKnownSymbolsStore[name] = Symbol[name];\n else WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n\n\n/***/ }),\n\n/***/ 1361:\n/***/ (function(module) {\n\n// a string of all valid unicode whitespaces\nmodule.exports = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002' +\n '\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n\n\n/***/ }),\n\n/***/ 8264:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_116785__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_116785__(2109);\nvar global = __nested_webpack_require_116785__(7854);\nvar arrayBufferModule = __nested_webpack_require_116785__(3331);\nvar setSpecies = __nested_webpack_require_116785__(6340);\n\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar ArrayBuffer = arrayBufferModule[ARRAY_BUFFER];\nvar NativeArrayBuffer = global[ARRAY_BUFFER];\n\n// `ArrayBuffer` constructor\n// https://tc39.es/ecma262/#sec-arraybuffer-constructor\n$({ global: true, forced: NativeArrayBuffer !== ArrayBuffer }, {\n ArrayBuffer: ArrayBuffer\n});\n\nsetSpecies(ARRAY_BUFFER);\n\n\n/***/ }),\n\n/***/ 2222:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_117427__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_117427__(2109);\nvar fails = __nested_webpack_require_117427__(7293);\nvar isArray = __nested_webpack_require_117427__(3157);\nvar isObject = __nested_webpack_require_117427__(111);\nvar toObject = __nested_webpack_require_117427__(7908);\nvar toLength = __nested_webpack_require_117427__(7466);\nvar createProperty = __nested_webpack_require_117427__(6135);\nvar arraySpeciesCreate = __nested_webpack_require_117427__(5417);\nvar arrayMethodHasSpeciesSupport = __nested_webpack_require_117427__(1194);\nvar wellKnownSymbol = __nested_webpack_require_117427__(5112);\nvar V8_VERSION = __nested_webpack_require_117427__(7392);\n\nvar IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';\n\n// We can't use this feature detection in V8 since it causes\n// deoptimization and serious performance degradation\n// https://github.com/zloirock/core-js/issues/679\nvar IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails(function () {\n var array = [];\n array[IS_CONCAT_SPREADABLE] = false;\n return array.concat()[0] !== array;\n});\n\nvar SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');\n\nvar isConcatSpreadable = function (O) {\n if (!isObject(O)) return false;\n var spreadable = O[IS_CONCAT_SPREADABLE];\n return spreadable !== undefined ? !!spreadable : isArray(O);\n};\n\nvar FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;\n\n// `Array.prototype.concat` method\n// https://tc39.es/ecma262/#sec-array.prototype.concat\n// with adding support of @@isConcatSpreadable and @@species\n$({ target: 'Array', proto: true, forced: FORCED }, {\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n concat: function concat(arg) {\n var O = toObject(this);\n var A = arraySpeciesCreate(O, 0);\n var n = 0;\n var i, k, length, len, E;\n for (i = -1, length = arguments.length; i < length; i++) {\n E = i === -1 ? O : arguments[i];\n if (isConcatSpreadable(E)) {\n len = toLength(E.length);\n if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\n } else {\n if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n createProperty(A, n++, E);\n }\n }\n A.length = n;\n return A;\n }\n});\n\n\n/***/ }),\n\n/***/ 7327:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_119834__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_119834__(2109);\nvar $filter = __nested_webpack_require_119834__(2092).filter;\nvar arrayMethodHasSpeciesSupport = __nested_webpack_require_119834__(1194);\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('filter');\n\n// `Array.prototype.filter` method\n// https://tc39.es/ecma262/#sec-array.prototype.filter\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {\n filter: function filter(callbackfn /* , thisArg */) {\n return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n\n/***/ }),\n\n/***/ 2772:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_120523__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_120523__(2109);\nvar $indexOf = __nested_webpack_require_120523__(1318).indexOf;\nvar arrayMethodIsStrict = __nested_webpack_require_120523__(9341);\n\nvar nativeIndexOf = [].indexOf;\n\nvar NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;\nvar STRICT_METHOD = arrayMethodIsStrict('indexOf');\n\n// `Array.prototype.indexOf` method\n// https://tc39.es/ecma262/#sec-array.prototype.indexof\n$({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD }, {\n indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n return NEGATIVE_ZERO\n // convert -0 to +0\n ? nativeIndexOf.apply(this, arguments) || 0\n : $indexOf(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n\n/***/ }),\n\n/***/ 6992:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_121364__) {\n\n\"use strict\";\n\nvar toIndexedObject = __nested_webpack_require_121364__(5656);\nvar addToUnscopables = __nested_webpack_require_121364__(1223);\nvar Iterators = __nested_webpack_require_121364__(7497);\nvar InternalStateModule = __nested_webpack_require_121364__(9909);\nvar defineIterator = __nested_webpack_require_121364__(654);\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.es/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.es/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.es/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.es/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n var state = getInternalState(this);\n var target = state.target;\n var kind = state.kind;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = undefined;\n return { value: undefined, done: true };\n }\n if (kind == 'keys') return { value: index, done: false };\n if (kind == 'values') return { value: target[index], done: false };\n return { value: [index, target[index]], done: false };\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.es/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.es/ecma262/#sec-createmappedargumentsobject\nIterators.Arguments = Iterators.Array;\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n\n/***/ }),\n\n/***/ 1249:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_123565__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_123565__(2109);\nvar $map = __nested_webpack_require_123565__(2092).map;\nvar arrayMethodHasSpeciesSupport = __nested_webpack_require_123565__(1194);\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');\n\n// `Array.prototype.map` method\n// https://tc39.es/ecma262/#sec-array.prototype.map\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n\n/***/ }),\n\n/***/ 7042:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_124230__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_124230__(2109);\nvar isObject = __nested_webpack_require_124230__(111);\nvar isArray = __nested_webpack_require_124230__(3157);\nvar toAbsoluteIndex = __nested_webpack_require_124230__(1400);\nvar toLength = __nested_webpack_require_124230__(7466);\nvar toIndexedObject = __nested_webpack_require_124230__(5656);\nvar createProperty = __nested_webpack_require_124230__(6135);\nvar wellKnownSymbol = __nested_webpack_require_124230__(5112);\nvar arrayMethodHasSpeciesSupport = __nested_webpack_require_124230__(1194);\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');\n\nvar SPECIES = wellKnownSymbol('species');\nvar nativeSlice = [].slice;\nvar max = Math.max;\n\n// `Array.prototype.slice` method\n// https://tc39.es/ecma262/#sec-array.prototype.slice\n// fallback for not array-like ES3 strings and DOM objects\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {\n slice: function slice(start, end) {\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var k = toAbsoluteIndex(start, length);\n var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\n var Constructor, result, n;\n if (isArray(O)) {\n Constructor = O.constructor;\n // cross-realm fallback\n if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {\n Constructor = undefined;\n } else if (isObject(Constructor)) {\n Constructor = Constructor[SPECIES];\n if (Constructor === null) Constructor = undefined;\n }\n if (Constructor === Array || Constructor === undefined) {\n return nativeSlice.call(O, k, fin);\n }\n }\n result = new (Constructor === undefined ? Array : Constructor)(max(fin - k, 0));\n for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);\n result.length = n;\n return result;\n }\n});\n\n\n/***/ }),\n\n/***/ 561:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_126211__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_126211__(2109);\nvar toAbsoluteIndex = __nested_webpack_require_126211__(1400);\nvar toInteger = __nested_webpack_require_126211__(9958);\nvar toLength = __nested_webpack_require_126211__(7466);\nvar toObject = __nested_webpack_require_126211__(7908);\nvar arraySpeciesCreate = __nested_webpack_require_126211__(5417);\nvar createProperty = __nested_webpack_require_126211__(6135);\nvar arrayMethodHasSpeciesSupport = __nested_webpack_require_126211__(1194);\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('splice');\n\nvar max = Math.max;\nvar min = Math.min;\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';\n\n// `Array.prototype.splice` method\n// https://tc39.es/ecma262/#sec-array.prototype.splice\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {\n splice: function splice(start, deleteCount /* , ...items */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var actualStart = toAbsoluteIndex(start, len);\n var argumentsLength = arguments.length;\n var insertCount, actualDeleteCount, A, k, from, to;\n if (argumentsLength === 0) {\n insertCount = actualDeleteCount = 0;\n } else if (argumentsLength === 1) {\n insertCount = 0;\n actualDeleteCount = len - actualStart;\n } else {\n insertCount = argumentsLength - 2;\n actualDeleteCount = min(max(toInteger(deleteCount), 0), len - actualStart);\n }\n if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER) {\n throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);\n }\n A = arraySpeciesCreate(O, actualDeleteCount);\n for (k = 0; k < actualDeleteCount; k++) {\n from = actualStart + k;\n if (from in O) createProperty(A, k, O[from]);\n }\n A.length = actualDeleteCount;\n if (insertCount < actualDeleteCount) {\n for (k = actualStart; k < len - actualDeleteCount; k++) {\n from = k + actualDeleteCount;\n to = k + insertCount;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];\n } else if (insertCount > actualDeleteCount) {\n for (k = len - actualDeleteCount; k > actualStart; k--) {\n from = k + actualDeleteCount - 1;\n to = k + insertCount - 1;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n }\n for (k = 0; k < insertCount; k++) {\n O[k + actualStart] = arguments[k + 2];\n }\n O.length = len - actualDeleteCount + insertCount;\n return A;\n }\n});\n\n\n/***/ }),\n\n/***/ 8309:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_128857__) {\n\nvar DESCRIPTORS = __nested_webpack_require_128857__(9781);\nvar defineProperty = __nested_webpack_require_128857__(3070).f;\n\nvar FunctionPrototype = Function.prototype;\nvar FunctionPrototypeToString = FunctionPrototype.toString;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// Function instances `.name` property\n// https://tc39.es/ecma262/#sec-function-instances-name\nif (DESCRIPTORS && !(NAME in FunctionPrototype)) {\n defineProperty(FunctionPrototype, NAME, {\n configurable: true,\n get: function () {\n try {\n return FunctionPrototypeToString.call(this).match(nameRE)[1];\n } catch (error) {\n return '';\n }\n }\n });\n}\n\n\n/***/ }),\n\n/***/ 489:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_129614__) {\n\nvar $ = __nested_webpack_require_129614__(2109);\nvar fails = __nested_webpack_require_129614__(7293);\nvar toObject = __nested_webpack_require_129614__(7908);\nvar nativeGetPrototypeOf = __nested_webpack_require_129614__(9518);\nvar CORRECT_PROTOTYPE_GETTER = __nested_webpack_require_129614__(8544);\n\nvar FAILS_ON_PRIMITIVES = fails(function () { nativeGetPrototypeOf(1); });\n\n// `Object.getPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.getprototypeof\n$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !CORRECT_PROTOTYPE_GETTER }, {\n getPrototypeOf: function getPrototypeOf(it) {\n return nativeGetPrototypeOf(toObject(it));\n }\n});\n\n\n\n/***/ }),\n\n/***/ 1539:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_130327__) {\n\nvar TO_STRING_TAG_SUPPORT = __nested_webpack_require_130327__(1694);\nvar redefine = __nested_webpack_require_130327__(1320);\nvar toString = __nested_webpack_require_130327__(288);\n\n// `Object.prototype.toString` method\n// https://tc39.es/ecma262/#sec-object.prototype.tostring\nif (!TO_STRING_TAG_SUPPORT) {\n redefine(Object.prototype, 'toString', toString, { unsafe: true });\n}\n\n\n/***/ }),\n\n/***/ 4916:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_130780__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_130780__(2109);\nvar exec = __nested_webpack_require_130780__(2261);\n\n// `RegExp.prototype.exec` method\n// https://tc39.es/ecma262/#sec-regexp.prototype.exec\n$({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, {\n exec: exec\n});\n\n\n/***/ }),\n\n/***/ 9714:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_131156__) {\n\n\"use strict\";\n\nvar redefine = __nested_webpack_require_131156__(1320);\nvar anObject = __nested_webpack_require_131156__(9670);\nvar fails = __nested_webpack_require_131156__(7293);\nvar flags = __nested_webpack_require_131156__(7066);\n\nvar TO_STRING = 'toString';\nvar RegExpPrototype = RegExp.prototype;\nvar nativeToString = RegExpPrototype[TO_STRING];\n\nvar NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\n// FF44- RegExp#toString has a wrong name\nvar INCORRECT_NAME = nativeToString.name != TO_STRING;\n\n// `RegExp.prototype.toString` method\n// https://tc39.es/ecma262/#sec-regexp.prototype.tostring\nif (NOT_GENERIC || INCORRECT_NAME) {\n redefine(RegExp.prototype, TO_STRING, function toString() {\n var R = anObject(this);\n var p = String(R.source);\n var rf = R.flags;\n var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? flags.call(R) : rf);\n return '/' + p + '/' + f;\n }, { unsafe: true });\n}\n\n\n/***/ }),\n\n/***/ 8783:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_132221__) {\n\n\"use strict\";\n\nvar charAt = __nested_webpack_require_132221__(8710).charAt;\nvar InternalStateModule = __nested_webpack_require_132221__(9909);\nvar defineIterator = __nested_webpack_require_132221__(654);\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: String(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return { value: undefined, done: true };\n point = charAt(string, index);\n state.index += point.length;\n return { value: point, done: false };\n});\n\n\n/***/ }),\n\n/***/ 4723:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_133333__) {\n\n\"use strict\";\n\nvar fixRegExpWellKnownSymbolLogic = __nested_webpack_require_133333__(7007);\nvar anObject = __nested_webpack_require_133333__(9670);\nvar toLength = __nested_webpack_require_133333__(7466);\nvar requireObjectCoercible = __nested_webpack_require_133333__(4488);\nvar advanceStringIndex = __nested_webpack_require_133333__(1530);\nvar regExpExec = __nested_webpack_require_133333__(7651);\n\n// @@match logic\nfixRegExpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.es/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = requireObjectCoercible(this);\n var matcher = regexp == undefined ? undefined : regexp[MATCH];\n return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.es/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative(nativeMatch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n if (!rx.global) return regExpExec(rx, S);\n\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n\n\n/***/ }),\n\n/***/ 5306:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_134975__) {\n\n\"use strict\";\n\nvar fixRegExpWellKnownSymbolLogic = __nested_webpack_require_134975__(7007);\nvar anObject = __nested_webpack_require_134975__(9670);\nvar toLength = __nested_webpack_require_134975__(7466);\nvar toInteger = __nested_webpack_require_134975__(9958);\nvar requireObjectCoercible = __nested_webpack_require_134975__(4488);\nvar advanceStringIndex = __nested_webpack_require_134975__(1530);\nvar getSubstitution = __nested_webpack_require_134975__(647);\nvar regExpExec = __nested_webpack_require_134975__(7651);\n\nvar max = Math.max;\nvar min = Math.min;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\nfixRegExpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative, reason) {\n var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = reason.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE;\n var REPLACE_KEEPS_$0 = reason.REPLACE_KEEPS_$0;\n var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n return [\n // `String.prototype.replace` method\n // https://tc39.es/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n return replacer !== undefined\n ? replacer.call(searchValue, O, replaceValue)\n : nativeReplace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.es/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n if (\n (!REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE && REPLACE_KEEPS_$0) ||\n (typeof replaceValue === 'string' && replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1)\n ) {\n var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n if (res.done) return res.value;\n }\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regExpExec(rx, S);\n if (result === null) break;\n\n results.push(result);\n if (!global) break;\n\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n var matched = String(result[0]);\n var position = max(min(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n});\n\n\n/***/ }),\n\n/***/ 3123:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_139010__) {\n\n\"use strict\";\n\nvar fixRegExpWellKnownSymbolLogic = __nested_webpack_require_139010__(7007);\nvar isRegExp = __nested_webpack_require_139010__(7850);\nvar anObject = __nested_webpack_require_139010__(9670);\nvar requireObjectCoercible = __nested_webpack_require_139010__(4488);\nvar speciesConstructor = __nested_webpack_require_139010__(6707);\nvar advanceStringIndex = __nested_webpack_require_139010__(1530);\nvar toLength = __nested_webpack_require_139010__(7466);\nvar callRegExpExec = __nested_webpack_require_139010__(7651);\nvar regexpExec = __nested_webpack_require_139010__(2261);\nvar fails = __nested_webpack_require_139010__(7293);\n\nvar arrayPush = [].push;\nvar min = Math.min;\nvar MAX_UINT32 = 0xFFFFFFFF;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\nfixRegExpWellKnownSymbolLogic('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {\n var internalSplit;\n if (\n 'abbc'.split(/(b)*/)[1] == 'c' ||\n // eslint-disable-next-line regexp/no-empty-group -- required for testing\n 'test'.split(/(?:)/, -1).length != 4 ||\n 'ab'.split(/(?:ab)*/).length != 2 ||\n '.'.split(/(.?)(.?)/).length != 4 ||\n // eslint-disable-next-line regexp/no-assertion-capturing-group, regexp/no-empty-group -- required for testing\n '.'.split(/()()/).length > 1 ||\n ''.split(/.?/).length\n ) {\n // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(requireObjectCoercible(this));\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (separator === undefined) return [string];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) {\n return nativeSplit.call(string, separator, lim);\n }\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy.lastIndex;\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\n lastLength = match[0].length;\n lastLastIndex = lastIndex;\n if (output.length >= lim) break;\n }\n if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop\n }\n if (lastLastIndex === string.length) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output.length > lim ? output.slice(0, lim) : output;\n };\n // Chakra, V8\n } else if ('0'.split(undefined, 0).length) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n };\n } else internalSplit = nativeSplit;\n\n return [\n // `String.prototype.split` method\n // https://tc39.es/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = requireObjectCoercible(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.es/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n}, !SUPPORTS_Y);\n\n\n/***/ }),\n\n/***/ 3210:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_144619__) {\n\n\"use strict\";\n\nvar $ = __nested_webpack_require_144619__(2109);\nvar $trim = __nested_webpack_require_144619__(3111).trim;\nvar forcedStringTrimMethod = __nested_webpack_require_144619__(6091);\n\n// `String.prototype.trim` method\n// https://tc39.es/ecma262/#sec-string.prototype.trim\n$({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, {\n trim: function trim() {\n return $trim(this);\n }\n});\n\n\n/***/ }),\n\n/***/ 2990:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_145111__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_145111__(260);\nvar $copyWithin = __nested_webpack_require_145111__(1048);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.copyWithin` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.copywithin\nexportTypedArrayMethod('copyWithin', function copyWithin(target, start /* , end */) {\n return $copyWithin.call(aTypedArray(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 8927:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_145777__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_145777__(260);\nvar $every = __nested_webpack_require_145777__(2092).every;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.every` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.every\nexportTypedArrayMethod('every', function every(callbackfn /* , thisArg */) {\n return $every(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 3105:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_146412__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_146412__(260);\nvar $fill = __nested_webpack_require_146412__(1285);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.fill` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.fill\n// eslint-disable-next-line no-unused-vars -- required for `.length`\nexportTypedArrayMethod('fill', function fill(value /* , start, end */) {\n return $fill.apply(aTypedArray(this), arguments);\n});\n\n\n/***/ }),\n\n/***/ 5035:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_147058__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_147058__(260);\nvar $filter = __nested_webpack_require_147058__(2092).filter;\nvar fromSpeciesAndList = __nested_webpack_require_147058__(3074);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.filter` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.filter\nexportTypedArrayMethod('filter', function filter(callbackfn /* , thisArg */) {\n var list = $filter(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n return fromSpeciesAndList(this, list);\n});\n\n\n/***/ }),\n\n/***/ 7174:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_147797__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_147797__(260);\nvar $findIndex = __nested_webpack_require_147797__(2092).findIndex;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.findIndex` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.findindex\nexportTypedArrayMethod('findIndex', function findIndex(predicate /* , thisArg */) {\n return $findIndex(aTypedArray(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 4345:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_148458__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_148458__(260);\nvar $find = __nested_webpack_require_148458__(2092).find;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.find` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.find\nexportTypedArrayMethod('find', function find(predicate /* , thisArg */) {\n return $find(aTypedArray(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 2846:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_149084__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_149084__(260);\nvar $forEach = __nested_webpack_require_149084__(2092).forEach;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.forEach` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.foreach\nexportTypedArrayMethod('forEach', function forEach(callbackfn /* , thisArg */) {\n $forEach(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 4731:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_149726__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_149726__(260);\nvar $includes = __nested_webpack_require_149726__(1318).includes;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.includes` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.includes\nexportTypedArrayMethod('includes', function includes(searchElement /* , fromIndex */) {\n return $includes(aTypedArray(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 7209:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_150390__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_150390__(260);\nvar $indexOf = __nested_webpack_require_150390__(1318).indexOf;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.indexOf` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.indexof\nexportTypedArrayMethod('indexOf', function indexOf(searchElement /* , fromIndex */) {\n return $indexOf(aTypedArray(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 6319:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_151047__) {\n\n\"use strict\";\n\nvar global = __nested_webpack_require_151047__(7854);\nvar ArrayBufferViewCore = __nested_webpack_require_151047__(260);\nvar ArrayIterators = __nested_webpack_require_151047__(6992);\nvar wellKnownSymbol = __nested_webpack_require_151047__(5112);\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar Uint8Array = global.Uint8Array;\nvar arrayValues = ArrayIterators.values;\nvar arrayKeys = ArrayIterators.keys;\nvar arrayEntries = ArrayIterators.entries;\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar nativeTypedArrayIterator = Uint8Array && Uint8Array.prototype[ITERATOR];\n\nvar CORRECT_ITER_NAME = !!nativeTypedArrayIterator\n && (nativeTypedArrayIterator.name == 'values' || nativeTypedArrayIterator.name == undefined);\n\nvar typedArrayValues = function values() {\n return arrayValues.call(aTypedArray(this));\n};\n\n// `%TypedArray%.prototype.entries` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.entries\nexportTypedArrayMethod('entries', function entries() {\n return arrayEntries.call(aTypedArray(this));\n});\n// `%TypedArray%.prototype.keys` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.keys\nexportTypedArrayMethod('keys', function keys() {\n return arrayKeys.call(aTypedArray(this));\n});\n// `%TypedArray%.prototype.values` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.values\nexportTypedArrayMethod('values', typedArrayValues, !CORRECT_ITER_NAME);\n// `%TypedArray%.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype-@@iterator\nexportTypedArrayMethod(ITERATOR, typedArrayValues, !CORRECT_ITER_NAME);\n\n\n/***/ }),\n\n/***/ 8867:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_152782__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_152782__(260);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $join = [].join;\n\n// `%TypedArray%.prototype.join` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.join\n// eslint-disable-next-line no-unused-vars -- required for `.length`\nexportTypedArrayMethod('join', function join(separator) {\n return $join.apply(aTypedArray(this), arguments);\n});\n\n\n/***/ }),\n\n/***/ 7789:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_153395__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_153395__(260);\nvar $lastIndexOf = __nested_webpack_require_153395__(6583);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.lastIndexOf` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.lastindexof\n// eslint-disable-next-line no-unused-vars -- required for `.length`\nexportTypedArrayMethod('lastIndexOf', function lastIndexOf(searchElement /* , fromIndex */) {\n return $lastIndexOf.apply(aTypedArray(this), arguments);\n});\n\n\n/***/ }),\n\n/***/ 3739:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_154090__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_154090__(260);\nvar $map = __nested_webpack_require_154090__(2092).map;\nvar speciesConstructor = __nested_webpack_require_154090__(6707);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.map` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.map\nexportTypedArrayMethod('map', function map(mapfn /* , thisArg */) {\n return $map(aTypedArray(this), mapfn, arguments.length > 1 ? arguments[1] : undefined, function (O, length) {\n return new (aTypedArrayConstructor(speciesConstructor(O, O.constructor)))(length);\n });\n});\n\n\n/***/ }),\n\n/***/ 4483:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_154941__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_154941__(260);\nvar $reduceRight = __nested_webpack_require_154941__(3671).right;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.reduceRicht` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.reduceright\nexportTypedArrayMethod('reduceRight', function reduceRight(callbackfn /* , initialValue */) {\n return $reduceRight(aTypedArray(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 9368:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_155635__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_155635__(260);\nvar $reduce = __nested_webpack_require_155635__(3671).left;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.reduce` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.reduce\nexportTypedArrayMethod('reduce', function reduce(callbackfn /* , initialValue */) {\n return $reduce(aTypedArray(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 2056:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_156298__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_156298__(260);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar floor = Math.floor;\n\n// `%TypedArray%.prototype.reverse` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.reverse\nexportTypedArrayMethod('reverse', function reverse() {\n var that = this;\n var length = aTypedArray(that).length;\n var middle = floor(length / 2);\n var index = 0;\n var value;\n while (index < middle) {\n value = that[index];\n that[index++] = that[--length];\n that[length] = value;\n } return that;\n});\n\n\n/***/ }),\n\n/***/ 3462:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_157051__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_157051__(260);\nvar toLength = __nested_webpack_require_157051__(7466);\nvar toOffset = __nested_webpack_require_157051__(4590);\nvar toObject = __nested_webpack_require_157051__(7908);\nvar fails = __nested_webpack_require_157051__(7293);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\nvar FORCED = fails(function () {\n /* global Int8Array -- safe */\n new Int8Array(1).set({});\n});\n\n// `%TypedArray%.prototype.set` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.set\nexportTypedArrayMethod('set', function set(arrayLike /* , offset */) {\n aTypedArray(this);\n var offset = toOffset(arguments.length > 1 ? arguments[1] : undefined, 1);\n var length = this.length;\n var src = toObject(arrayLike);\n var len = toLength(src.length);\n var index = 0;\n if (len + offset > length) throw RangeError('Wrong length');\n while (index < len) this[offset + index] = src[index++];\n}, FORCED);\n\n\n/***/ }),\n\n/***/ 678:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_158136__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_158136__(260);\nvar speciesConstructor = __nested_webpack_require_158136__(6707);\nvar fails = __nested_webpack_require_158136__(7293);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $slice = [].slice;\n\nvar FORCED = fails(function () {\n /* global Int8Array -- safe */\n new Int8Array(1).slice();\n});\n\n// `%TypedArray%.prototype.slice` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.slice\nexportTypedArrayMethod('slice', function slice(start, end) {\n var list = $slice.call(aTypedArray(this), start, end);\n var C = speciesConstructor(this, this.constructor);\n var index = 0;\n var length = list.length;\n var result = new (aTypedArrayConstructor(C))(length);\n while (length > index) result[index] = list[index++];\n return result;\n}, FORCED);\n\n\n/***/ }),\n\n/***/ 7462:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_159191__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_159191__(260);\nvar $some = __nested_webpack_require_159191__(2092).some;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.some` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.some\nexportTypedArrayMethod('some', function some(callbackfn /* , thisArg */) {\n return $some(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n});\n\n\n/***/ }),\n\n/***/ 3824:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_159819__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_159819__(260);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $sort = [].sort;\n\n// `%TypedArray%.prototype.sort` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.sort\nexportTypedArrayMethod('sort', function sort(comparefn) {\n return $sort.call(aTypedArray(this), comparefn);\n});\n\n\n/***/ }),\n\n/***/ 5021:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_160362__) {\n\n\"use strict\";\n\nvar ArrayBufferViewCore = __nested_webpack_require_160362__(260);\nvar toLength = __nested_webpack_require_160362__(7466);\nvar toAbsoluteIndex = __nested_webpack_require_160362__(1400);\nvar speciesConstructor = __nested_webpack_require_160362__(6707);\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.subarray` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.subarray\nexportTypedArrayMethod('subarray', function subarray(begin, end) {\n var O = aTypedArray(this);\n var length = O.length;\n var beginIndex = toAbsoluteIndex(begin, length);\n return new (speciesConstructor(O, O.constructor))(\n O.buffer,\n O.byteOffset + beginIndex * O.BYTES_PER_ELEMENT,\n toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - beginIndex)\n );\n});\n\n\n/***/ }),\n\n/***/ 2974:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_161310__) {\n\n\"use strict\";\n\nvar global = __nested_webpack_require_161310__(7854);\nvar ArrayBufferViewCore = __nested_webpack_require_161310__(260);\nvar fails = __nested_webpack_require_161310__(7293);\n\nvar Int8Array = global.Int8Array;\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $toLocaleString = [].toLocaleString;\nvar $slice = [].slice;\n\n// iOS Safari 6.x fails here\nvar TO_LOCALE_STRING_BUG = !!Int8Array && fails(function () {\n $toLocaleString.call(new Int8Array(1));\n});\n\nvar FORCED = fails(function () {\n return [1, 2].toLocaleString() != new Int8Array([1, 2]).toLocaleString();\n}) || !fails(function () {\n Int8Array.prototype.toLocaleString.call([1, 2]);\n});\n\n// `%TypedArray%.prototype.toLocaleString` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.tolocalestring\nexportTypedArrayMethod('toLocaleString', function toLocaleString() {\n return $toLocaleString.apply(TO_LOCALE_STRING_BUG ? $slice.call(aTypedArray(this)) : aTypedArray(this), arguments);\n}, FORCED);\n\n\n/***/ }),\n\n/***/ 5016:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_162445__) {\n\n\"use strict\";\n\nvar exportTypedArrayMethod = __nested_webpack_require_162445__(260).exportTypedArrayMethod;\nvar fails = __nested_webpack_require_162445__(7293);\nvar global = __nested_webpack_require_162445__(7854);\n\nvar Uint8Array = global.Uint8Array;\nvar Uint8ArrayPrototype = Uint8Array && Uint8Array.prototype || {};\nvar arrayToString = [].toString;\nvar arrayJoin = [].join;\n\nif (fails(function () { arrayToString.call({}); })) {\n arrayToString = function toString() {\n return arrayJoin.call(this);\n };\n}\n\nvar IS_NOT_ARRAY_METHOD = Uint8ArrayPrototype.toString != arrayToString;\n\n// `%TypedArray%.prototype.toString` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.tostring\nexportTypedArrayMethod('toString', arrayToString, IS_NOT_ARRAY_METHOD);\n\n\n/***/ }),\n\n/***/ 2472:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_163286__) {\n\nvar createTypedArrayConstructor = __nested_webpack_require_163286__(9843);\n\n// `Uint8Array` constructor\n// https://tc39.es/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Uint8', function (init) {\n return function Uint8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n\n\n/***/ }),\n\n/***/ 4747:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_163713__) {\n\nvar global = __nested_webpack_require_163713__(7854);\nvar DOMIterables = __nested_webpack_require_163713__(8324);\nvar forEach = __nested_webpack_require_163713__(8533);\nvar createNonEnumerableProperty = __nested_webpack_require_163713__(8880);\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try {\n createNonEnumerableProperty(CollectionPrototype, 'forEach', forEach);\n } catch (error) {\n CollectionPrototype.forEach = forEach;\n }\n}\n\n\n/***/ }),\n\n/***/ 3948:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_164461__) {\n\nvar global = __nested_webpack_require_164461__(7854);\nvar DOMIterables = __nested_webpack_require_164461__(8324);\nvar ArrayIteratorMethods = __nested_webpack_require_164461__(6992);\nvar createNonEnumerableProperty = __nested_webpack_require_164461__(8880);\nvar wellKnownSymbol = __nested_webpack_require_164461__(5112);\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar ArrayValues = ArrayIteratorMethods.values;\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n if (CollectionPrototype) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[ITERATOR] !== ArrayValues) try {\n createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues);\n } catch (error) {\n CollectionPrototype[ITERATOR] = ArrayValues;\n }\n if (!CollectionPrototype[TO_STRING_TAG]) {\n createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);\n }\n if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {\n createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);\n } catch (error) {\n CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];\n }\n }\n }\n}\n\n\n/***/ }),\n\n/***/ 1637:\n/***/ (function(module, __unused_webpack_exports, __nested_webpack_require_166049__) {\n\n\"use strict\";\n\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\n__nested_webpack_require_166049__(6992);\nvar $ = __nested_webpack_require_166049__(2109);\nvar getBuiltIn = __nested_webpack_require_166049__(5005);\nvar USE_NATIVE_URL = __nested_webpack_require_166049__(590);\nvar redefine = __nested_webpack_require_166049__(1320);\nvar redefineAll = __nested_webpack_require_166049__(2248);\nvar setToStringTag = __nested_webpack_require_166049__(8003);\nvar createIteratorConstructor = __nested_webpack_require_166049__(4994);\nvar InternalStateModule = __nested_webpack_require_166049__(9909);\nvar anInstance = __nested_webpack_require_166049__(5787);\nvar hasOwn = __nested_webpack_require_166049__(6656);\nvar bind = __nested_webpack_require_166049__(9974);\nvar classof = __nested_webpack_require_166049__(648);\nvar anObject = __nested_webpack_require_166049__(9670);\nvar isObject = __nested_webpack_require_166049__(111);\nvar create = __nested_webpack_require_166049__(30);\nvar createPropertyDescriptor = __nested_webpack_require_166049__(9114);\nvar getIterator = __nested_webpack_require_166049__(8554);\nvar getIteratorMethod = __nested_webpack_require_166049__(1246);\nvar wellKnownSymbol = __nested_webpack_require_166049__(5112);\n\nvar $fetch = getBuiltIn('fetch');\nvar Headers = getBuiltIn('Headers');\nvar ITERATOR = wellKnownSymbol('iterator');\nvar URL_SEARCH_PARAMS = 'URLSearchParams';\nvar URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalParamsState = InternalStateModule.getterFor(URL_SEARCH_PARAMS);\nvar getInternalIteratorState = InternalStateModule.getterFor(URL_SEARCH_PARAMS_ITERATOR);\n\nvar plus = /\\+/g;\nvar sequences = Array(4);\n\nvar percentSequence = function (bytes) {\n return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\\\da-f]{2}){' + bytes + '})', 'gi'));\n};\n\nvar percentDecode = function (sequence) {\n try {\n return decodeURIComponent(sequence);\n } catch (error) {\n return sequence;\n }\n};\n\nvar deserialize = function (it) {\n var result = it.replace(plus, ' ');\n var bytes = 4;\n try {\n return decodeURIComponent(result);\n } catch (error) {\n while (bytes) {\n result = result.replace(percentSequence(bytes--), percentDecode);\n }\n return result;\n }\n};\n\nvar find = /[!'()~]|%20/g;\n\nvar replace = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+'\n};\n\nvar replacer = function (match) {\n return replace[match];\n};\n\nvar serialize = function (it) {\n return encodeURIComponent(it).replace(find, replacer);\n};\n\nvar parseSearchParams = function (result, query) {\n if (query) {\n var attributes = query.split('&');\n var index = 0;\n var attribute, entry;\n while (index < attributes.length) {\n attribute = attributes[index++];\n if (attribute.length) {\n entry = attribute.split('=');\n result.push({\n key: deserialize(entry.shift()),\n value: deserialize(entry.join('='))\n });\n }\n }\n }\n};\n\nvar updateSearchParams = function (query) {\n this.entries.length = 0;\n parseSearchParams(this.entries, query);\n};\n\nvar validateArgumentsLength = function (passed, required) {\n if (passed < required) throw TypeError('Not enough arguments');\n};\n\nvar URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {\n setInternalState(this, {\n type: URL_SEARCH_PARAMS_ITERATOR,\n iterator: getIterator(getInternalParamsState(params).entries),\n kind: kind\n });\n}, 'Iterator', function next() {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var step = state.iterator.next();\n var entry = step.value;\n if (!step.done) {\n step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];\n } return step;\n});\n\n// `URLSearchParams` constructor\n// https://url.spec.whatwg.org/#interface-urlsearchparams\nvar URLSearchParamsConstructor = function URLSearchParams(/* init */) {\n anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n var init = arguments.length > 0 ? arguments[0] : undefined;\n var that = this;\n var entries = [];\n var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key;\n\n setInternalState(that, {\n type: URL_SEARCH_PARAMS,\n entries: entries,\n updateURL: function () { /* empty */ },\n updateSearchParams: updateSearchParams\n });\n\n if (init !== undefined) {\n if (isObject(init)) {\n iteratorMethod = getIteratorMethod(init);\n if (typeof iteratorMethod === 'function') {\n iterator = iteratorMethod.call(init);\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n entryIterator = getIterator(anObject(step.value));\n entryNext = entryIterator.next;\n if (\n (first = entryNext.call(entryIterator)).done ||\n (second = entryNext.call(entryIterator)).done ||\n !entryNext.call(entryIterator).done\n ) throw TypeError('Expected sequence with length 2');\n entries.push({ key: first.value + '', value: second.value + '' });\n }\n } else for (key in init) if (hasOwn(init, key)) entries.push({ key: key, value: init[key] + '' });\n } else {\n parseSearchParams(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + '');\n }\n }\n};\n\nvar URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;\n\nredefineAll(URLSearchParamsPrototype, {\n // `URLSearchParams.prototype.append` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n append: function append(name, value) {\n validateArgumentsLength(arguments.length, 2);\n var state = getInternalParamsState(this);\n state.entries.push({ key: name + '', value: value + '' });\n state.updateURL();\n },\n // `URLSearchParams.prototype.delete` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n 'delete': function (name) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index].key === key) entries.splice(index, 1);\n else index++;\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.get` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n get: function get(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) return entries[index].value;\n }\n return null;\n },\n // `URLSearchParams.prototype.getAll` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n getAll: function getAll(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var result = [];\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) result.push(entries[index].value);\n }\n return result;\n },\n // `URLSearchParams.prototype.has` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n has: function has(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index++].key === key) return true;\n }\n return false;\n },\n // `URLSearchParams.prototype.set` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n set: function set(name, value) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var found = false;\n var key = name + '';\n var val = value + '';\n var index = 0;\n var entry;\n for (; index < entries.length; index++) {\n entry = entries[index];\n if (entry.key === key) {\n if (found) entries.splice(index--, 1);\n else {\n found = true;\n entry.value = val;\n }\n }\n }\n if (!found) entries.push({ key: key, value: val });\n state.updateURL();\n },\n // `URLSearchParams.prototype.sort` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n sort: function sort() {\n var state = getInternalParamsState(this);\n var entries = state.entries;\n // Array#sort is not stable in some engines\n var slice = entries.slice();\n var entry, entriesIndex, sliceIndex;\n entries.length = 0;\n for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) {\n entry = slice[sliceIndex];\n for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) {\n if (entries[entriesIndex].key > entry.key) {\n entries.splice(entriesIndex, 0, entry);\n break;\n }\n }\n if (entriesIndex === sliceIndex) entries.push(entry);\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.forEach` method\n forEach: function forEach(callback /* , thisArg */) {\n var entries = getInternalParamsState(this).entries;\n var boundFunction = bind(callback, arguments.length > 1 ? arguments[1] : undefined, 3);\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n boundFunction(entry.value, entry.key, this);\n }\n },\n // `URLSearchParams.prototype.keys` method\n keys: function keys() {\n return new URLSearchParamsIterator(this, 'keys');\n },\n // `URLSearchParams.prototype.values` method\n values: function values() {\n return new URLSearchParamsIterator(this, 'values');\n },\n // `URLSearchParams.prototype.entries` method\n entries: function entries() {\n return new URLSearchParamsIterator(this, 'entries');\n }\n}, { enumerable: true });\n\n// `URLSearchParams.prototype[@@iterator]` method\nredefine(URLSearchParamsPrototype, ITERATOR, URLSearchParamsPrototype.entries);\n\n// `URLSearchParams.prototype.toString` method\n// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\nredefine(URLSearchParamsPrototype, 'toString', function toString() {\n var entries = getInternalParamsState(this).entries;\n var result = [];\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n result.push(serialize(entry.key) + '=' + serialize(entry.value));\n } return result.join('&');\n}, { enumerable: true });\n\nsetToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\n$({ global: true, forced: !USE_NATIVE_URL }, {\n URLSearchParams: URLSearchParamsConstructor\n});\n\n// Wrap `fetch` for correct work with polyfilled `URLSearchParams`\n// https://github.com/zloirock/core-js/issues/674\nif (!USE_NATIVE_URL && typeof $fetch == 'function' && typeof Headers == 'function') {\n $({ global: true, enumerable: true, forced: true }, {\n fetch: function fetch(input /* , init */) {\n var args = [input];\n var init, body, headers;\n if (arguments.length > 1) {\n init = arguments[1];\n if (isObject(init)) {\n body = init.body;\n if (classof(body) === URL_SEARCH_PARAMS) {\n headers = init.headers ? new Headers(init.headers) : new Headers();\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n init = create(init, {\n body: createPropertyDescriptor(0, String(body)),\n headers: createPropertyDescriptor(0, headers)\n });\n }\n }\n args.push(init);\n } return $fetch.apply(this, args);\n }\n });\n}\n\nmodule.exports = {\n URLSearchParams: URLSearchParamsConstructor,\n getState: getInternalParamsState\n};\n\n\n/***/ }),\n\n/***/ 285:\n/***/ (function(__unused_webpack_module, __unused_webpack_exports, __nested_webpack_require_177789__) {\n\n\"use strict\";\n\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\n__nested_webpack_require_177789__(8783);\nvar $ = __nested_webpack_require_177789__(2109);\nvar DESCRIPTORS = __nested_webpack_require_177789__(9781);\nvar USE_NATIVE_URL = __nested_webpack_require_177789__(590);\nvar global = __nested_webpack_require_177789__(7854);\nvar defineProperties = __nested_webpack_require_177789__(6048);\nvar redefine = __nested_webpack_require_177789__(1320);\nvar anInstance = __nested_webpack_require_177789__(5787);\nvar has = __nested_webpack_require_177789__(6656);\nvar assign = __nested_webpack_require_177789__(1574);\nvar arrayFrom = __nested_webpack_require_177789__(8457);\nvar codeAt = __nested_webpack_require_177789__(8710).codeAt;\nvar toASCII = __nested_webpack_require_177789__(3197);\nvar setToStringTag = __nested_webpack_require_177789__(8003);\nvar URLSearchParamsModule = __nested_webpack_require_177789__(1637);\nvar InternalStateModule = __nested_webpack_require_177789__(9909);\n\nvar NativeURL = global.URL;\nvar URLSearchParams = URLSearchParamsModule.URLSearchParams;\nvar getInternalSearchParamsState = URLSearchParamsModule.getState;\nvar setInternalState = InternalStateModule.set;\nvar getInternalURLState = InternalStateModule.getterFor('URL');\nvar floor = Math.floor;\nvar pow = Math.pow;\n\nvar INVALID_AUTHORITY = 'Invalid authority';\nvar INVALID_SCHEME = 'Invalid scheme';\nvar INVALID_HOST = 'Invalid host';\nvar INVALID_PORT = 'Invalid port';\n\nvar ALPHA = /[A-Za-z]/;\nvar ALPHANUMERIC = /[\\d+-.A-Za-z]/;\nvar DIGIT = /\\d/;\nvar HEX_START = /^(0x|0X)/;\nvar OCT = /^[0-7]+$/;\nvar DEC = /^\\d+$/;\nvar HEX = /^[\\dA-Fa-f]+$/;\n/* eslint-disable no-control-regex -- safe */\nvar FORBIDDEN_HOST_CODE_POINT = /[\\u0000\\t\\u000A\\u000D #%/:?@[\\\\]]/;\nvar FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\\u0000\\t\\u000A\\u000D #/:?@[\\\\]]/;\nvar LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g;\nvar TAB_AND_NEW_LINE = /[\\t\\u000A\\u000D]/g;\n/* eslint-enable no-control-regex -- safe */\nvar EOF;\n\nvar parseHost = function (url, input) {\n var result, codePoints, index;\n if (input.charAt(0) == '[') {\n if (input.charAt(input.length - 1) != ']') return INVALID_HOST;\n result = parseIPv6(input.slice(1, -1));\n if (!result) return INVALID_HOST;\n url.host = result;\n // opaque host\n } else if (!isSpecial(url)) {\n if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST;\n result = '';\n codePoints = arrayFrom(input);\n for (index = 0; index < codePoints.length; index++) {\n result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);\n }\n url.host = result;\n } else {\n input = toASCII(input);\n if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST;\n result = parseIPv4(input);\n if (result === null) return INVALID_HOST;\n url.host = result;\n }\n};\n\nvar parseIPv4 = function (input) {\n var parts = input.split('.');\n var partsLength, numbers, index, part, radix, number, ipv4;\n if (parts.length && parts[parts.length - 1] == '') {\n parts.pop();\n }\n partsLength = parts.length;\n if (partsLength > 4) return input;\n numbers = [];\n for (index = 0; index < partsLength; index++) {\n part = parts[index];\n if (part == '') return input;\n radix = 10;\n if (part.length > 1 && part.charAt(0) == '0') {\n radix = HEX_START.test(part) ? 16 : 8;\n part = part.slice(radix == 8 ? 1 : 2);\n }\n if (part === '') {\n number = 0;\n } else {\n if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input;\n number = parseInt(part, radix);\n }\n numbers.push(number);\n }\n for (index = 0; index < partsLength; index++) {\n number = numbers[index];\n if (index == partsLength - 1) {\n if (number >= pow(256, 5 - partsLength)) return null;\n } else if (number > 255) return null;\n }\n ipv4 = numbers.pop();\n for (index = 0; index < numbers.length; index++) {\n ipv4 += numbers[index] * pow(256, 3 - index);\n }\n return ipv4;\n};\n\n// eslint-disable-next-line max-statements -- TODO\nvar parseIPv6 = function (input) {\n var address = [0, 0, 0, 0, 0, 0, 0, 0];\n var pieceIndex = 0;\n var compress = null;\n var pointer = 0;\n var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n var char = function () {\n return input.charAt(pointer);\n };\n\n if (char() == ':') {\n if (input.charAt(1) != ':') return;\n pointer += 2;\n pieceIndex++;\n compress = pieceIndex;\n }\n while (char()) {\n if (pieceIndex == 8) return;\n if (char() == ':') {\n if (compress !== null) return;\n pointer++;\n pieceIndex++;\n compress = pieceIndex;\n continue;\n }\n value = length = 0;\n while (length < 4 && HEX.test(char())) {\n value = value * 16 + parseInt(char(), 16);\n pointer++;\n length++;\n }\n if (char() == '.') {\n if (length == 0) return;\n pointer -= length;\n if (pieceIndex > 6) return;\n numbersSeen = 0;\n while (char()) {\n ipv4Piece = null;\n if (numbersSeen > 0) {\n if (char() == '.' && numbersSeen < 4) pointer++;\n else return;\n }\n if (!DIGIT.test(char())) return;\n while (DIGIT.test(char())) {\n number = parseInt(char(), 10);\n if (ipv4Piece === null) ipv4Piece = number;\n else if (ipv4Piece == 0) return;\n else ipv4Piece = ipv4Piece * 10 + number;\n if (ipv4Piece > 255) return;\n pointer++;\n }\n address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n numbersSeen++;\n if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;\n }\n if (numbersSeen != 4) return;\n break;\n } else if (char() == ':') {\n pointer++;\n if (!char()) return;\n } else if (char()) return;\n address[pieceIndex++] = value;\n }\n if (compress !== null) {\n swaps = pieceIndex - compress;\n pieceIndex = 7;\n while (pieceIndex != 0 && swaps > 0) {\n swap = address[pieceIndex];\n address[pieceIndex--] = address[compress + swaps - 1];\n address[compress + --swaps] = swap;\n }\n } else if (pieceIndex != 8) return;\n return address;\n};\n\nvar findLongestZeroSequence = function (ipv6) {\n var maxIndex = null;\n var maxLength = 1;\n var currStart = null;\n var currLength = 0;\n var index = 0;\n for (; index < 8; index++) {\n if (ipv6[index] !== 0) {\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n currStart = null;\n currLength = 0;\n } else {\n if (currStart === null) currStart = index;\n ++currLength;\n }\n }\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n return maxIndex;\n};\n\nvar serializeHost = function (host) {\n var result, index, compress, ignore0;\n // ipv4\n if (typeof host == 'number') {\n result = [];\n for (index = 0; index < 4; index++) {\n result.unshift(host % 256);\n host = floor(host / 256);\n } return result.join('.');\n // ipv6\n } else if (typeof host == 'object') {\n result = '';\n compress = findLongestZeroSequence(host);\n for (index = 0; index < 8; index++) {\n if (ignore0 && host[index] === 0) continue;\n if (ignore0) ignore0 = false;\n if (compress === index) {\n result += index ? ':' : '::';\n ignore0 = true;\n } else {\n result += host[index].toString(16);\n if (index < 7) result += ':';\n }\n }\n return '[' + result + ']';\n } return host;\n};\n\nvar C0ControlPercentEncodeSet = {};\nvar fragmentPercentEncodeSet = assign({}, C0ControlPercentEncodeSet, {\n ' ': 1, '\"': 1, '<': 1, '>': 1, '`': 1\n});\nvar pathPercentEncodeSet = assign({}, fragmentPercentEncodeSet, {\n '#': 1, '?': 1, '{': 1, '}': 1\n});\nvar userinfoPercentEncodeSet = assign({}, pathPercentEncodeSet, {\n '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\\\': 1, ']': 1, '^': 1, '|': 1\n});\n\nvar percentEncode = function (char, set) {\n var code = codeAt(char, 0);\n return code > 0x20 && code < 0x7F && !has(set, char) ? char : encodeURIComponent(char);\n};\n\nvar specialSchemes = {\n ftp: 21,\n file: null,\n http: 80,\n https: 443,\n ws: 80,\n wss: 443\n};\n\nvar isSpecial = function (url) {\n return has(specialSchemes, url.scheme);\n};\n\nvar includesCredentials = function (url) {\n return url.username != '' || url.password != '';\n};\n\nvar cannotHaveUsernamePasswordPort = function (url) {\n return !url.host || url.cannotBeABaseURL || url.scheme == 'file';\n};\n\nvar isWindowsDriveLetter = function (string, normalized) {\n var second;\n return string.length == 2 && ALPHA.test(string.charAt(0))\n && ((second = string.charAt(1)) == ':' || (!normalized && second == '|'));\n};\n\nvar startsWithWindowsDriveLetter = function (string) {\n var third;\n return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && (\n string.length == 2 ||\n ((third = string.charAt(2)) === '/' || third === '\\\\' || third === '?' || third === '#')\n );\n};\n\nvar shortenURLsPath = function (url) {\n var path = url.path;\n var pathSize = path.length;\n if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {\n path.pop();\n }\n};\n\nvar isSingleDot = function (segment) {\n return segment === '.' || segment.toLowerCase() === '%2e';\n};\n\nvar isDoubleDot = function (segment) {\n segment = segment.toLowerCase();\n return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n};\n\n// States:\nvar SCHEME_START = {};\nvar SCHEME = {};\nvar NO_SCHEME = {};\nvar SPECIAL_RELATIVE_OR_AUTHORITY = {};\nvar PATH_OR_AUTHORITY = {};\nvar RELATIVE = {};\nvar RELATIVE_SLASH = {};\nvar SPECIAL_AUTHORITY_SLASHES = {};\nvar SPECIAL_AUTHORITY_IGNORE_SLASHES = {};\nvar AUTHORITY = {};\nvar HOST = {};\nvar HOSTNAME = {};\nvar PORT = {};\nvar FILE = {};\nvar FILE_SLASH = {};\nvar FILE_HOST = {};\nvar PATH_START = {};\nvar PATH = {};\nvar CANNOT_BE_A_BASE_URL_PATH = {};\nvar QUERY = {};\nvar FRAGMENT = {};\n\n// eslint-disable-next-line max-statements -- TODO\nvar parseURL = function (url, input, stateOverride, base) {\n var state = stateOverride || SCHEME_START;\n var pointer = 0;\n var buffer = '';\n var seenAt = false;\n var seenBracket = false;\n var seenPasswordToken = false;\n var codePoints, char, bufferCodePoints, failure;\n\n if (!stateOverride) {\n url.scheme = '';\n url.username = '';\n url.password = '';\n url.host = null;\n url.port = null;\n url.path = [];\n url.query = null;\n url.fragment = null;\n url.cannotBeABaseURL = false;\n input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');\n }\n\n input = input.replace(TAB_AND_NEW_LINE, '');\n\n codePoints = arrayFrom(input);\n\n while (pointer <= codePoints.length) {\n char = codePoints[pointer];\n switch (state) {\n case SCHEME_START:\n if (char && ALPHA.test(char)) {\n buffer += char.toLowerCase();\n state = SCHEME;\n } else if (!stateOverride) {\n state = NO_SCHEME;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case SCHEME:\n if (char && (ALPHANUMERIC.test(char) || char == '+' || char == '-' || char == '.')) {\n buffer += char.toLowerCase();\n } else if (char == ':') {\n if (stateOverride && (\n (isSpecial(url) != has(specialSchemes, buffer)) ||\n (buffer == 'file' && (includesCredentials(url) || url.port !== null)) ||\n (url.scheme == 'file' && !url.host)\n )) return;\n url.scheme = buffer;\n if (stateOverride) {\n if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null;\n return;\n }\n buffer = '';\n if (url.scheme == 'file') {\n state = FILE;\n } else if (isSpecial(url) && base && base.scheme == url.scheme) {\n state = SPECIAL_RELATIVE_OR_AUTHORITY;\n } else if (isSpecial(url)) {\n state = SPECIAL_AUTHORITY_SLASHES;\n } else if (codePoints[pointer + 1] == '/') {\n state = PATH_OR_AUTHORITY;\n pointer++;\n } else {\n url.cannotBeABaseURL = true;\n url.path.push('');\n state = CANNOT_BE_A_BASE_URL_PATH;\n }\n } else if (!stateOverride) {\n buffer = '';\n state = NO_SCHEME;\n pointer = 0;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case NO_SCHEME:\n if (!base || (base.cannotBeABaseURL && char != '#')) return INVALID_SCHEME;\n if (base.cannotBeABaseURL && char == '#') {\n url.scheme = base.scheme;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n url.cannotBeABaseURL = true;\n state = FRAGMENT;\n break;\n }\n state = base.scheme == 'file' ? FILE : RELATIVE;\n continue;\n\n case SPECIAL_RELATIVE_OR_AUTHORITY:\n if (char == '/' && codePoints[pointer + 1] == '/') {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n pointer++;\n } else {\n state = RELATIVE;\n continue;\n } break;\n\n case PATH_OR_AUTHORITY:\n if (char == '/') {\n state = AUTHORITY;\n break;\n } else {\n state = PATH;\n continue;\n }\n\n case RELATIVE:\n url.scheme = base.scheme;\n if (char == EOF) {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '/' || (char == '\\\\' && isSpecial(url))) {\n state = RELATIVE_SLASH;\n } else if (char == '?') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.path.pop();\n state = PATH;\n continue;\n } break;\n\n case RELATIVE_SLASH:\n if (isSpecial(url) && (char == '/' || char == '\\\\')) {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n } else if (char == '/') {\n state = AUTHORITY;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n state = PATH;\n continue;\n } break;\n\n case SPECIAL_AUTHORITY_SLASHES:\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n if (char != '/' || buffer.charAt(pointer + 1) != '/') continue;\n pointer++;\n break;\n\n case SPECIAL_AUTHORITY_IGNORE_SLASHES:\n if (char != '/' && char != '\\\\') {\n state = AUTHORITY;\n continue;\n } break;\n\n case AUTHORITY:\n if (char == '@') {\n if (seenAt) buffer = '%40' + buffer;\n seenAt = true;\n bufferCodePoints = arrayFrom(buffer);\n for (var i = 0; i < bufferCodePoints.length; i++) {\n var codePoint = bufferCodePoints[i];\n if (codePoint == ':' && !seenPasswordToken) {\n seenPasswordToken = true;\n continue;\n }\n var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);\n if (seenPasswordToken) url.password += encodedCodePoints;\n else url.username += encodedCodePoints;\n }\n buffer = '';\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (seenAt && buffer == '') return INVALID_AUTHORITY;\n pointer -= arrayFrom(buffer).length + 1;\n buffer = '';\n state = HOST;\n } else buffer += char;\n break;\n\n case HOST:\n case HOSTNAME:\n if (stateOverride && url.scheme == 'file') {\n state = FILE_HOST;\n continue;\n } else if (char == ':' && !seenBracket) {\n if (buffer == '') return INVALID_HOST;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PORT;\n if (stateOverride == HOSTNAME) return;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (isSpecial(url) && buffer == '') return INVALID_HOST;\n if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PATH_START;\n if (stateOverride) return;\n continue;\n } else {\n if (char == '[') seenBracket = true;\n else if (char == ']') seenBracket = false;\n buffer += char;\n } break;\n\n case PORT:\n if (DIGIT.test(char)) {\n buffer += char;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url)) ||\n stateOverride\n ) {\n if (buffer != '') {\n var port = parseInt(buffer, 10);\n if (port > 0xFFFF) return INVALID_PORT;\n url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port;\n buffer = '';\n }\n if (stateOverride) return;\n state = PATH_START;\n continue;\n } else return INVALID_PORT;\n break;\n\n case FILE:\n url.scheme = 'file';\n if (char == '/' || char == '\\\\') state = FILE_SLASH;\n else if (base && base.scheme == 'file') {\n if (char == EOF) {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '?') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n url.host = base.host;\n url.path = base.path.slice();\n shortenURLsPath(url);\n }\n state = PATH;\n continue;\n }\n } else {\n state = PATH;\n continue;\n } break;\n\n case FILE_SLASH:\n if (char == '/' || char == '\\\\') {\n state = FILE_HOST;\n break;\n }\n if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);\n else url.host = base.host;\n }\n state = PATH;\n continue;\n\n case FILE_HOST:\n if (char == EOF || char == '/' || char == '\\\\' || char == '?' || char == '#') {\n if (!stateOverride && isWindowsDriveLetter(buffer)) {\n state = PATH;\n } else if (buffer == '') {\n url.host = '';\n if (stateOverride) return;\n state = PATH_START;\n } else {\n failure = parseHost(url, buffer);\n if (failure) return failure;\n if (url.host == 'localhost') url.host = '';\n if (stateOverride) return;\n buffer = '';\n state = PATH_START;\n } continue;\n } else buffer += char;\n break;\n\n case PATH_START:\n if (isSpecial(url)) {\n state = PATH;\n if (char != '/' && char != '\\\\') continue;\n } else if (!stateOverride && char == '?') {\n url.query = '';\n state = QUERY;\n } else if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n state = PATH;\n if (char != '/') continue;\n } break;\n\n case PATH:\n if (\n char == EOF || char == '/' ||\n (char == '\\\\' && isSpecial(url)) ||\n (!stateOverride && (char == '?' || char == '#'))\n ) {\n if (isDoubleDot(buffer)) {\n shortenURLsPath(url);\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else if (isSingleDot(buffer)) {\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else {\n if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {\n if (url.host) url.host = '';\n buffer = buffer.charAt(0) + ':'; // normalize windows drive letter\n }\n url.path.push(buffer);\n }\n buffer = '';\n if (url.scheme == 'file' && (char == EOF || char == '?' || char == '#')) {\n while (url.path.length > 1 && url.path[0] === '') {\n url.path.shift();\n }\n }\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n }\n } else {\n buffer += percentEncode(char, pathPercentEncodeSet);\n } break;\n\n case CANNOT_BE_A_BASE_URL_PATH:\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n url.path[0] += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case QUERY:\n if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n if (char == \"'\" && isSpecial(url)) url.query += '%27';\n else if (char == '#') url.query += '%23';\n else url.query += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case FRAGMENT:\n if (char != EOF) url.fragment += percentEncode(char, fragmentPercentEncodeSet);\n break;\n }\n\n pointer++;\n }\n};\n\n// `URL` constructor\n// https://url.spec.whatwg.org/#url-class\nvar URLConstructor = function URL(url /* , base */) {\n var that = anInstance(this, URLConstructor, 'URL');\n var base = arguments.length > 1 ? arguments[1] : undefined;\n var urlString = String(url);\n var state = setInternalState(that, { type: 'URL' });\n var baseState, failure;\n if (base !== undefined) {\n if (base instanceof URLConstructor) baseState = getInternalURLState(base);\n else {\n failure = parseURL(baseState = {}, String(base));\n if (failure) throw TypeError(failure);\n }\n }\n failure = parseURL(state, urlString, null, baseState);\n if (failure) throw TypeError(failure);\n var searchParams = state.searchParams = new URLSearchParams();\n var searchParamsState = getInternalSearchParamsState(searchParams);\n searchParamsState.updateSearchParams(state.query);\n searchParamsState.updateURL = function () {\n state.query = String(searchParams) || null;\n };\n if (!DESCRIPTORS) {\n that.href = serializeURL.call(that);\n that.origin = getOrigin.call(that);\n that.protocol = getProtocol.call(that);\n that.username = getUsername.call(that);\n that.password = getPassword.call(that);\n that.host = getHost.call(that);\n that.hostname = getHostname.call(that);\n that.port = getPort.call(that);\n that.pathname = getPathname.call(that);\n that.search = getSearch.call(that);\n that.searchParams = getSearchParams.call(that);\n that.hash = getHash.call(that);\n }\n};\n\nvar URLPrototype = URLConstructor.prototype;\n\nvar serializeURL = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var username = url.username;\n var password = url.password;\n var host = url.host;\n var port = url.port;\n var path = url.path;\n var query = url.query;\n var fragment = url.fragment;\n var output = scheme + ':';\n if (host !== null) {\n output += '//';\n if (includesCredentials(url)) {\n output += username + (password ? ':' + password : '') + '@';\n }\n output += serializeHost(host);\n if (port !== null) output += ':' + port;\n } else if (scheme == 'file') output += '//';\n output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n if (query !== null) output += '?' + query;\n if (fragment !== null) output += '#' + fragment;\n return output;\n};\n\nvar getOrigin = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var port = url.port;\n if (scheme == 'blob') try {\n return new URL(scheme.path[0]).origin;\n } catch (error) {\n return 'null';\n }\n if (scheme == 'file' || !isSpecial(url)) return 'null';\n return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : '');\n};\n\nvar getProtocol = function () {\n return getInternalURLState(this).scheme + ':';\n};\n\nvar getUsername = function () {\n return getInternalURLState(this).username;\n};\n\nvar getPassword = function () {\n return getInternalURLState(this).password;\n};\n\nvar getHost = function () {\n var url = getInternalURLState(this);\n var host = url.host;\n var port = url.port;\n return host === null ? ''\n : port === null ? serializeHost(host)\n : serializeHost(host) + ':' + port;\n};\n\nvar getHostname = function () {\n var host = getInternalURLState(this).host;\n return host === null ? '' : serializeHost(host);\n};\n\nvar getPort = function () {\n var port = getInternalURLState(this).port;\n return port === null ? '' : String(port);\n};\n\nvar getPathname = function () {\n var url = getInternalURLState(this);\n var path = url.path;\n return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n};\n\nvar getSearch = function () {\n var query = getInternalURLState(this).query;\n return query ? '?' + query : '';\n};\n\nvar getSearchParams = function () {\n return getInternalURLState(this).searchParams;\n};\n\nvar getHash = function () {\n var fragment = getInternalURLState(this).fragment;\n return fragment ? '#' + fragment : '';\n};\n\nvar accessorDescriptor = function (getter, setter) {\n return { get: getter, set: setter, configurable: true, enumerable: true };\n};\n\nif (DESCRIPTORS) {\n defineProperties(URLPrototype, {\n // `URL.prototype.href` accessors pair\n // https://url.spec.whatwg.org/#dom-url-href\n href: accessorDescriptor(serializeURL, function (href) {\n var url = getInternalURLState(this);\n var urlString = String(href);\n var failure = parseURL(url, urlString);\n if (failure) throw TypeError(failure);\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.origin` getter\n // https://url.spec.whatwg.org/#dom-url-origin\n origin: accessorDescriptor(getOrigin),\n // `URL.prototype.protocol` accessors pair\n // https://url.spec.whatwg.org/#dom-url-protocol\n protocol: accessorDescriptor(getProtocol, function (protocol) {\n var url = getInternalURLState(this);\n parseURL(url, String(protocol) + ':', SCHEME_START);\n }),\n // `URL.prototype.username` accessors pair\n // https://url.spec.whatwg.org/#dom-url-username\n username: accessorDescriptor(getUsername, function (username) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(username));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.username = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.password` accessors pair\n // https://url.spec.whatwg.org/#dom-url-password\n password: accessorDescriptor(getPassword, function (password) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(password));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.password = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.host` accessors pair\n // https://url.spec.whatwg.org/#dom-url-host\n host: accessorDescriptor(getHost, function (host) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(host), HOST);\n }),\n // `URL.prototype.hostname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hostname\n hostname: accessorDescriptor(getHostname, function (hostname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(hostname), HOSTNAME);\n }),\n // `URL.prototype.port` accessors pair\n // https://url.spec.whatwg.org/#dom-url-port\n port: accessorDescriptor(getPort, function (port) {\n var url = getInternalURLState(this);\n if (cannotHaveUsernamePasswordPort(url)) return;\n port = String(port);\n if (port == '') url.port = null;\n else parseURL(url, port, PORT);\n }),\n // `URL.prototype.pathname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-pathname\n pathname: accessorDescriptor(getPathname, function (pathname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n url.path = [];\n parseURL(url, pathname + '', PATH_START);\n }),\n // `URL.prototype.search` accessors pair\n // https://url.spec.whatwg.org/#dom-url-search\n search: accessorDescriptor(getSearch, function (search) {\n var url = getInternalURLState(this);\n search = String(search);\n if (search == '') {\n url.query = null;\n } else {\n if ('?' == search.charAt(0)) search = search.slice(1);\n url.query = '';\n parseURL(url, search, QUERY);\n }\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.searchParams` getter\n // https://url.spec.whatwg.org/#dom-url-searchparams\n searchParams: accessorDescriptor(getSearchParams),\n // `URL.prototype.hash` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hash\n hash: accessorDescriptor(getHash, function (hash) {\n var url = getInternalURLState(this);\n hash = String(hash);\n if (hash == '') {\n url.fragment = null;\n return;\n }\n if ('#' == hash.charAt(0)) hash = hash.slice(1);\n url.fragment = '';\n parseURL(url, hash, FRAGMENT);\n })\n });\n}\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\nredefine(URLPrototype, 'toJSON', function toJSON() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\n// `URL.prototype.toString` method\n// https://url.spec.whatwg.org/#URL-stringification-behavior\nredefine(URLPrototype, 'toString', function toString() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\nif (NativeURL) {\n var nativeCreateObjectURL = NativeURL.createObjectURL;\n var nativeRevokeObjectURL = NativeURL.revokeObjectURL;\n // `URL.createObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) {\n return nativeCreateObjectURL.apply(NativeURL, arguments);\n });\n // `URL.revokeObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) {\n return nativeRevokeObjectURL.apply(NativeURL, arguments);\n });\n}\n\nsetToStringTag(URLConstructor, 'URL');\n\n$({ global: true, forced: !USE_NATIVE_URL, sham: !DESCRIPTORS }, {\n URL: URLConstructor\n});\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __nested_webpack_require_210484__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __nested_webpack_require_210484__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__nested_webpack_require_210484__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__nested_webpack_require_210484__.o(definition, key) && !__nested_webpack_require_210484__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/global */\n/******/ \t!function() {\n/******/ \t\t__nested_webpack_require_210484__.g = (function() {\n/******/ \t\t\tif (typeof globalThis === 'object') return globalThis;\n/******/ \t\t\ttry {\n/******/ \t\t\t\treturn this || new Function('return this')();\n/******/ \t\t\t} catch (e) {\n/******/ \t\t\t\tif (typeof window === 'object') return window;\n/******/ \t\t\t}\n/******/ \t\t})();\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__nested_webpack_require_210484__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/make namespace object */\n/******/ \t!function() {\n/******/ \t\t// define __esModule on exports\n/******/ \t\t__nested_webpack_require_210484__.r = function(exports) {\n/******/ \t\t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t\t}\n/******/ \t\t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/************************************************************************/\nvar __nested_webpack_exports__ = {};\n// This entry need to be wrapped in an IIFE because it need to be in strict mode.\n!function() {\n\"use strict\";\n// ESM COMPAT FLAG\n__nested_webpack_require_210484__.r(__nested_webpack_exports__);\n\n// EXPORTS\n__nested_webpack_require_210484__.d(__nested_webpack_exports__, {\n \"Dropzone\": function() { return /* reexport */ Dropzone; },\n \"default\": function() { return /* binding */ dropzone_dist; }\n});\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.concat.js\nvar es_array_concat = __nested_webpack_require_210484__(2222);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.filter.js\nvar es_array_filter = __nested_webpack_require_210484__(7327);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.index-of.js\nvar es_array_index_of = __nested_webpack_require_210484__(2772);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.iterator.js\nvar es_array_iterator = __nested_webpack_require_210484__(6992);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.map.js\nvar es_array_map = __nested_webpack_require_210484__(1249);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.slice.js\nvar es_array_slice = __nested_webpack_require_210484__(7042);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.splice.js\nvar es_array_splice = __nested_webpack_require_210484__(561);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array-buffer.constructor.js\nvar es_array_buffer_constructor = __nested_webpack_require_210484__(8264);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.function.name.js\nvar es_function_name = __nested_webpack_require_210484__(8309);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.object.get-prototype-of.js\nvar es_object_get_prototype_of = __nested_webpack_require_210484__(489);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.object.to-string.js\nvar es_object_to_string = __nested_webpack_require_210484__(1539);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.regexp.exec.js\nvar es_regexp_exec = __nested_webpack_require_210484__(4916);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.regexp.to-string.js\nvar es_regexp_to_string = __nested_webpack_require_210484__(9714);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.string.iterator.js\nvar es_string_iterator = __nested_webpack_require_210484__(8783);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.string.match.js\nvar es_string_match = __nested_webpack_require_210484__(4723);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.string.replace.js\nvar es_string_replace = __nested_webpack_require_210484__(5306);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.string.split.js\nvar es_string_split = __nested_webpack_require_210484__(3123);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.string.trim.js\nvar es_string_trim = __nested_webpack_require_210484__(3210);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.uint8-array.js\nvar es_typed_array_uint8_array = __nested_webpack_require_210484__(2472);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.copy-within.js\nvar es_typed_array_copy_within = __nested_webpack_require_210484__(2990);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.every.js\nvar es_typed_array_every = __nested_webpack_require_210484__(8927);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.fill.js\nvar es_typed_array_fill = __nested_webpack_require_210484__(3105);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.filter.js\nvar es_typed_array_filter = __nested_webpack_require_210484__(5035);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.find.js\nvar es_typed_array_find = __nested_webpack_require_210484__(4345);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.find-index.js\nvar es_typed_array_find_index = __nested_webpack_require_210484__(7174);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.for-each.js\nvar es_typed_array_for_each = __nested_webpack_require_210484__(2846);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.includes.js\nvar es_typed_array_includes = __nested_webpack_require_210484__(4731);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.index-of.js\nvar es_typed_array_index_of = __nested_webpack_require_210484__(7209);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.iterator.js\nvar es_typed_array_iterator = __nested_webpack_require_210484__(6319);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.join.js\nvar es_typed_array_join = __nested_webpack_require_210484__(8867);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.last-index-of.js\nvar es_typed_array_last_index_of = __nested_webpack_require_210484__(7789);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.map.js\nvar es_typed_array_map = __nested_webpack_require_210484__(3739);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.reduce.js\nvar es_typed_array_reduce = __nested_webpack_require_210484__(9368);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.reduce-right.js\nvar es_typed_array_reduce_right = __nested_webpack_require_210484__(4483);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.reverse.js\nvar es_typed_array_reverse = __nested_webpack_require_210484__(2056);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.set.js\nvar es_typed_array_set = __nested_webpack_require_210484__(3462);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.slice.js\nvar es_typed_array_slice = __nested_webpack_require_210484__(678);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.some.js\nvar es_typed_array_some = __nested_webpack_require_210484__(7462);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.sort.js\nvar es_typed_array_sort = __nested_webpack_require_210484__(3824);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.subarray.js\nvar es_typed_array_subarray = __nested_webpack_require_210484__(5021);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.to-locale-string.js\nvar es_typed_array_to_locale_string = __nested_webpack_require_210484__(2974);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.to-string.js\nvar es_typed_array_to_string = __nested_webpack_require_210484__(5016);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.dom-collections.for-each.js\nvar web_dom_collections_for_each = __nested_webpack_require_210484__(4747);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.dom-collections.iterator.js\nvar web_dom_collections_iterator = __nested_webpack_require_210484__(3948);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.url.js\nvar web_url = __nested_webpack_require_210484__(285);\n;// CONCATENATED MODULE: ./src/emitter.js\n\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n// The Emitter class provides the ability to call `.on()` on Dropzone to listen\n// to events.\n// It is strongly based on component's emitter class, and I removed the\n// functionality because of the dependency hell with different frameworks.\nvar Emitter = /*#__PURE__*/function () {\n function Emitter() {\n _classCallCheck(this, Emitter);\n }\n\n _createClass(Emitter, [{\n key: \"on\",\n value: // Add an event listener for given event\n function on(event, fn) {\n this._callbacks = this._callbacks || {}; // Create namespace for this event\n\n if (!this._callbacks[event]) {\n this._callbacks[event] = [];\n }\n\n this._callbacks[event].push(fn);\n\n return this;\n }\n }, {\n key: \"emit\",\n value: function emit(event) {\n this._callbacks = this._callbacks || {};\n var callbacks = this._callbacks[event];\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n if (callbacks) {\n var _iterator = _createForOfIteratorHelper(callbacks, true),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var callback = _step.value;\n callback.apply(this, args);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n } // trigger a corresponding DOM event\n\n\n if (this.element) {\n this.element.dispatchEvent(this.makeEvent(\"dropzone:\" + event, {\n args: args\n }));\n }\n\n return this;\n }\n }, {\n key: \"makeEvent\",\n value: function makeEvent(eventName, detail) {\n var params = {\n bubbles: true,\n cancelable: true,\n detail: detail\n };\n\n if (typeof window.CustomEvent === \"function\") {\n return new CustomEvent(eventName, params);\n } else {\n // IE 11 support\n // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent\n var evt = document.createEvent(\"CustomEvent\");\n evt.initCustomEvent(eventName, params.bubbles, params.cancelable, params.detail);\n return evt;\n }\n } // Remove event listener for given event. If fn is not provided, all event\n // listeners for that event will be removed. If neither is provided, all\n // event listeners will be removed.\n\n }, {\n key: \"off\",\n value: function off(event, fn) {\n if (!this._callbacks || arguments.length === 0) {\n this._callbacks = {};\n return this;\n } // specific event\n\n\n var callbacks = this._callbacks[event];\n\n if (!callbacks) {\n return this;\n } // remove all handlers\n\n\n if (arguments.length === 1) {\n delete this._callbacks[event];\n return this;\n } // remove specific handler\n\n\n for (var i = 0; i < callbacks.length; i++) {\n var callback = callbacks[i];\n\n if (callback === fn) {\n callbacks.splice(i, 1);\n break;\n }\n }\n\n return this;\n }\n }]);\n\n return Emitter;\n}();\n\n\n;// CONCATENATED MODULE: ./src/preview-template.html\n// Module\nvar code = \"
    Check
    Error
    \";\n// Exports\n/* harmony default export */ var preview_template = (code);\n;// CONCATENATED MODULE: ./src/options.js\n\n\n\n\n\nfunction options_createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = options_unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\n\nfunction options_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return options_arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return options_arrayLikeToArray(o, minLen); }\n\nfunction options_arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n\n\nvar defaultOptions = {\n /**\n * Has to be specified on elements other than form (or when the form\n * doesn't have an `action` attribute). You can also\n * provide a function that will be called with `files` and\n * must return the url (since `v3.12.0`)\n */\n url: null,\n\n /**\n * Can be changed to `\"put\"` if necessary. You can also provide a function\n * that will be called with `files` and must return the method (since `v3.12.0`).\n */\n method: \"post\",\n\n /**\n * Will be set on the XHRequest.\n */\n withCredentials: false,\n\n /**\n * The timeout for the XHR requests in milliseconds (since `v4.4.0`).\n * If set to null or 0, no timeout is going to be set.\n */\n timeout: null,\n\n /**\n * How many file uploads to process in parallel (See the\n * Enqueuing file uploads documentation section for more info)\n */\n parallelUploads: 2,\n\n /**\n * Whether to send multiple files in one request. If\n * this it set to true, then the fallback file input element will\n * have the `multiple` attribute as well. This option will\n * also trigger additional events (like `processingmultiple`). See the events\n * documentation section for more information.\n */\n uploadMultiple: false,\n\n /**\n * Whether you want files to be uploaded in chunks to your server. This can't be\n * used in combination with `uploadMultiple`.\n *\n * See [chunksUploaded](#config-chunksUploaded) for the callback to finalise an upload.\n */\n chunking: false,\n\n /**\n * If `chunking` is enabled, this defines whether **every** file should be chunked,\n * even if the file size is below chunkSize. This means, that the additional chunk\n * form data will be submitted and the `chunksUploaded` callback will be invoked.\n */\n forceChunking: false,\n\n /**\n * If `chunking` is `true`, then this defines the chunk size in bytes.\n */\n chunkSize: 2000000,\n\n /**\n * If `true`, the individual chunks of a file are being uploaded simultaneously.\n */\n parallelChunkUploads: false,\n\n /**\n * Whether a chunk should be retried if it fails.\n */\n retryChunks: false,\n\n /**\n * If `retryChunks` is true, how many times should it be retried.\n */\n retryChunksLimit: 3,\n\n /**\n * The maximum filesize (in bytes) that is allowed to be uploaded.\n */\n maxFilesize: 256,\n\n /**\n * The name of the file param that gets transferred.\n * **NOTE**: If you have the option `uploadMultiple` set to `true`, then\n * Dropzone will append `[]` to the name.\n */\n paramName: \"file\",\n\n /**\n * Whether thumbnails for images should be generated\n */\n createImageThumbnails: true,\n\n /**\n * In MB. When the filename exceeds this limit, the thumbnail will not be generated.\n */\n maxThumbnailFilesize: 10,\n\n /**\n * If `null`, the ratio of the image will be used to calculate it.\n */\n thumbnailWidth: 120,\n\n /**\n * The same as `thumbnailWidth`. If both are null, images will not be resized.\n */\n thumbnailHeight: 120,\n\n /**\n * How the images should be scaled down in case both, `thumbnailWidth` and `thumbnailHeight` are provided.\n * Can be either `contain` or `crop`.\n */\n thumbnailMethod: \"crop\",\n\n /**\n * If set, images will be resized to these dimensions before being **uploaded**.\n * If only one, `resizeWidth` **or** `resizeHeight` is provided, the original aspect\n * ratio of the file will be preserved.\n *\n * The `options.transformFile` function uses these options, so if the `transformFile` function\n * is overridden, these options don't do anything.\n */\n resizeWidth: null,\n\n /**\n * See `resizeWidth`.\n */\n resizeHeight: null,\n\n /**\n * The mime type of the resized image (before it gets uploaded to the server).\n * If `null` the original mime type will be used. To force jpeg, for example, use `image/jpeg`.\n * See `resizeWidth` for more information.\n */\n resizeMimeType: null,\n\n /**\n * The quality of the resized images. See `resizeWidth`.\n */\n resizeQuality: 0.8,\n\n /**\n * How the images should be scaled down in case both, `resizeWidth` and `resizeHeight` are provided.\n * Can be either `contain` or `crop`.\n */\n resizeMethod: \"contain\",\n\n /**\n * The base that is used to calculate the **displayed** filesize. You can\n * change this to 1024 if you would rather display kibibytes, mebibytes,\n * etc... 1024 is technically incorrect, because `1024 bytes` are `1 kibibyte`\n * not `1 kilobyte`. You can change this to `1024` if you don't care about\n * validity.\n */\n filesizeBase: 1000,\n\n /**\n * If not `null` defines how many files this Dropzone handles. If it exceeds,\n * the event `maxfilesexceeded` will be called. The dropzone element gets the\n * class `dz-max-files-reached` accordingly so you can provide visual\n * feedback.\n */\n maxFiles: null,\n\n /**\n * An optional object to send additional headers to the server. Eg:\n * `{ \"My-Awesome-Header\": \"header value\" }`\n */\n headers: null,\n\n /**\n * If `true`, the dropzone element itself will be clickable, if `false`\n * nothing will be clickable.\n *\n * You can also pass an HTML element, a CSS selector (for multiple elements)\n * or an array of those. In that case, all of those elements will trigger an\n * upload when clicked.\n */\n clickable: true,\n\n /**\n * Whether hidden files in directories should be ignored.\n */\n ignoreHiddenFiles: true,\n\n /**\n * The default implementation of `accept` checks the file's mime type or\n * extension against this list. This is a comma separated list of mime\n * types or file extensions.\n *\n * Eg.: `image/*,application/pdf,.psd`\n *\n * If the Dropzone is `clickable` this option will also be used as\n * [`accept`](https://developer.mozilla.org/en-US/docs/HTML/Element/input#attr-accept)\n * parameter on the hidden file input as well.\n */\n acceptedFiles: null,\n\n /**\n * **Deprecated!**\n * Use acceptedFiles instead.\n */\n acceptedMimeTypes: null,\n\n /**\n * If false, files will be added to the queue but the queue will not be\n * processed automatically.\n * This can be useful if you need some additional user input before sending\n * files (or if you want want all files sent at once).\n * If you're ready to send the file simply call `myDropzone.processQueue()`.\n *\n * See the [enqueuing file uploads](#enqueuing-file-uploads) documentation\n * section for more information.\n */\n autoProcessQueue: true,\n\n /**\n * If false, files added to the dropzone will not be queued by default.\n * You'll have to call `enqueueFile(file)` manually.\n */\n autoQueue: true,\n\n /**\n * If `true`, this will add a link to every file preview to remove or cancel (if\n * already uploading) the file. The `dictCancelUpload`, `dictCancelUploadConfirmation`\n * and `dictRemoveFile` options are used for the wording.\n */\n addRemoveLinks: false,\n\n /**\n * Defines where to display the file previews – if `null` the\n * Dropzone element itself is used. Can be a plain `HTMLElement` or a CSS\n * selector. The element should have the `dropzone-previews` class so\n * the previews are displayed properly.\n */\n previewsContainer: null,\n\n /**\n * Set this to `true` if you don't want previews to be shown.\n */\n disablePreviews: false,\n\n /**\n * This is the element the hidden input field (which is used when clicking on the\n * dropzone to trigger file selection) will be appended to. This might\n * be important in case you use frameworks to switch the content of your page.\n *\n * Can be a selector string, or an element directly.\n */\n hiddenInputContainer: \"body\",\n\n /**\n * If null, no capture type will be specified\n * If camera, mobile devices will skip the file selection and choose camera\n * If microphone, mobile devices will skip the file selection and choose the microphone\n * If camcorder, mobile devices will skip the file selection and choose the camera in video mode\n * On apple devices multiple must be set to false. AcceptedFiles may need to\n * be set to an appropriate mime type (e.g. \"image/*\", \"audio/*\", or \"video/*\").\n */\n capture: null,\n\n /**\n * **Deprecated**. Use `renameFile` instead.\n */\n renameFilename: null,\n\n /**\n * A function that is invoked before the file is uploaded to the server and renames the file.\n * This function gets the `File` as argument and can use the `file.name`. The actual name of the\n * file that gets used during the upload can be accessed through `file.upload.filename`.\n */\n renameFile: null,\n\n /**\n * If `true` the fallback will be forced. This is very useful to test your server\n * implementations first and make sure that everything works as\n * expected without dropzone if you experience problems, and to test\n * how your fallbacks will look.\n */\n forceFallback: false,\n\n /**\n * The text used before any files are dropped.\n */\n dictDefaultMessage: \"Drop files here to upload\",\n\n /**\n * The text that replaces the default message text it the browser is not supported.\n */\n dictFallbackMessage: \"Your browser does not support drag'n'drop file uploads.\",\n\n /**\n * The text that will be added before the fallback form.\n * If you provide a fallback element yourself, or if this option is `null` this will\n * be ignored.\n */\n dictFallbackText: \"Please use the fallback form below to upload your files like in the olden days.\",\n\n /**\n * If the filesize is too big.\n * `{{filesize}}` and `{{maxFilesize}}` will be replaced with the respective configuration values.\n */\n dictFileTooBig: \"File is too big ({{filesize}}MiB). Max filesize: {{maxFilesize}}MiB.\",\n\n /**\n * If the file doesn't match the file type.\n */\n dictInvalidFileType: \"You can't upload files of this type.\",\n\n /**\n * If the server response was invalid.\n * `{{statusCode}}` will be replaced with the servers status code.\n */\n dictResponseError: \"Server responded with {{statusCode}} code.\",\n\n /**\n * If `addRemoveLinks` is true, the text to be used for the cancel upload link.\n */\n dictCancelUpload: \"Cancel upload\",\n\n /**\n * The text that is displayed if an upload was manually canceled\n */\n dictUploadCanceled: \"Upload canceled.\",\n\n /**\n * If `addRemoveLinks` is true, the text to be used for confirmation when cancelling upload.\n */\n dictCancelUploadConfirmation: \"Are you sure you want to cancel this upload?\",\n\n /**\n * If `addRemoveLinks` is true, the text to be used to remove a file.\n */\n dictRemoveFile: \"Remove file\",\n\n /**\n * If this is not null, then the user will be prompted before removing a file.\n */\n dictRemoveFileConfirmation: null,\n\n /**\n * Displayed if `maxFiles` is st and exceeded.\n * The string `{{maxFiles}}` will be replaced by the configuration value.\n */\n dictMaxFilesExceeded: \"You can not upload any more files.\",\n\n /**\n * Allows you to translate the different units. Starting with `tb` for terabytes and going down to\n * `b` for bytes.\n */\n dictFileSizeUnits: {\n tb: \"TB\",\n gb: \"GB\",\n mb: \"MB\",\n kb: \"KB\",\n b: \"b\"\n },\n\n /**\n * Called when dropzone initialized\n * You can add event listeners here\n */\n init: function init() {},\n\n /**\n * Can be an **object** of additional parameters to transfer to the server, **or** a `Function`\n * that gets invoked with the `files`, `xhr` and, if it's a chunked upload, `chunk` arguments. In case\n * of a function, this needs to return a map.\n *\n * The default implementation does nothing for normal uploads, but adds relevant information for\n * chunked uploads.\n *\n * This is the same as adding hidden input fields in the form element.\n */\n params: function params(files, xhr, chunk) {\n if (chunk) {\n return {\n dzuuid: chunk.file.upload.uuid,\n dzchunkindex: chunk.index,\n dztotalfilesize: chunk.file.size,\n dzchunksize: this.options.chunkSize,\n dztotalchunkcount: chunk.file.upload.totalChunkCount,\n dzchunkbyteoffset: chunk.index * this.options.chunkSize\n };\n }\n },\n\n /**\n * A function that gets a [file](https://developer.mozilla.org/en-US/docs/DOM/File)\n * and a `done` function as parameters.\n *\n * If the done function is invoked without arguments, the file is \"accepted\" and will\n * be processed. If you pass an error message, the file is rejected, and the error\n * message will be displayed.\n * This function will not be called if the file is too big or doesn't match the mime types.\n */\n accept: function accept(file, done) {\n return done();\n },\n\n /**\n * The callback that will be invoked when all chunks have been uploaded for a file.\n * It gets the file for which the chunks have been uploaded as the first parameter,\n * and the `done` function as second. `done()` needs to be invoked when everything\n * needed to finish the upload process is done.\n */\n chunksUploaded: function chunksUploaded(file, done) {\n done();\n },\n\n /**\n * Gets called when the browser is not supported.\n * The default implementation shows the fallback input field and adds\n * a text.\n */\n fallback: function fallback() {\n // This code should pass in IE7... :(\n var messageElement;\n this.element.className = \"\".concat(this.element.className, \" dz-browser-not-supported\");\n\n var _iterator = options_createForOfIteratorHelper(this.element.getElementsByTagName(\"div\"), true),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var child = _step.value;\n\n if (/(^| )dz-message($| )/.test(child.className)) {\n messageElement = child;\n child.className = \"dz-message\"; // Removes the 'dz-default' class\n\n break;\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n if (!messageElement) {\n messageElement = Dropzone.createElement('
    ');\n this.element.appendChild(messageElement);\n }\n\n var span = messageElement.getElementsByTagName(\"span\")[0];\n\n if (span) {\n if (span.textContent != null) {\n span.textContent = this.options.dictFallbackMessage;\n } else if (span.innerText != null) {\n span.innerText = this.options.dictFallbackMessage;\n }\n }\n\n return this.element.appendChild(this.getFallbackForm());\n },\n\n /**\n * Gets called to calculate the thumbnail dimensions.\n *\n * It gets `file`, `width` and `height` (both may be `null`) as parameters and must return an object containing:\n *\n * - `srcWidth` & `srcHeight` (required)\n * - `trgWidth` & `trgHeight` (required)\n * - `srcX` & `srcY` (optional, default `0`)\n * - `trgX` & `trgY` (optional, default `0`)\n *\n * Those values are going to be used by `ctx.drawImage()`.\n */\n resize: function resize(file, width, height, resizeMethod) {\n var info = {\n srcX: 0,\n srcY: 0,\n srcWidth: file.width,\n srcHeight: file.height\n };\n var srcRatio = file.width / file.height; // Automatically calculate dimensions if not specified\n\n if (width == null && height == null) {\n width = info.srcWidth;\n height = info.srcHeight;\n } else if (width == null) {\n width = height * srcRatio;\n } else if (height == null) {\n height = width / srcRatio;\n } // Make sure images aren't upscaled\n\n\n width = Math.min(width, info.srcWidth);\n height = Math.min(height, info.srcHeight);\n var trgRatio = width / height;\n\n if (info.srcWidth > width || info.srcHeight > height) {\n // Image is bigger and needs rescaling\n if (resizeMethod === \"crop\") {\n if (srcRatio > trgRatio) {\n info.srcHeight = file.height;\n info.srcWidth = info.srcHeight * trgRatio;\n } else {\n info.srcWidth = file.width;\n info.srcHeight = info.srcWidth / trgRatio;\n }\n } else if (resizeMethod === \"contain\") {\n // Method 'contain'\n if (srcRatio > trgRatio) {\n height = width / srcRatio;\n } else {\n width = height * srcRatio;\n }\n } else {\n throw new Error(\"Unknown resizeMethod '\".concat(resizeMethod, \"'\"));\n }\n }\n\n info.srcX = (file.width - info.srcWidth) / 2;\n info.srcY = (file.height - info.srcHeight) / 2;\n info.trgWidth = width;\n info.trgHeight = height;\n return info;\n },\n\n /**\n * Can be used to transform the file (for example, resize an image if necessary).\n *\n * The default implementation uses `resizeWidth` and `resizeHeight` (if provided) and resizes\n * images according to those dimensions.\n *\n * Gets the `file` as the first parameter, and a `done()` function as the second, that needs\n * to be invoked with the file when the transformation is done.\n */\n transformFile: function transformFile(file, done) {\n if ((this.options.resizeWidth || this.options.resizeHeight) && file.type.match(/image.*/)) {\n return this.resizeImage(file, this.options.resizeWidth, this.options.resizeHeight, this.options.resizeMethod, done);\n } else {\n return done(file);\n }\n },\n\n /**\n * A string that contains the template used for each dropped\n * file. Change it to fulfill your needs but make sure to properly\n * provide all elements.\n *\n * If you want to use an actual HTML element instead of providing a String\n * as a config option, you could create a div with the id `tpl`,\n * put the template inside it and provide the element like this:\n *\n * document\n * .querySelector('#tpl')\n * .innerHTML\n *\n */\n previewTemplate: preview_template,\n\n /*\n Those functions register themselves to the events on init and handle all\n the user interface specific stuff. Overwriting them won't break the upload\n but can break the way it's displayed.\n You can overwrite them if you don't like the default behavior. If you just\n want to add an additional event handler, register it on the dropzone object\n and don't overwrite those options.\n */\n // Those are self explanatory and simply concern the DragnDrop.\n drop: function drop(e) {\n return this.element.classList.remove(\"dz-drag-hover\");\n },\n dragstart: function dragstart(e) {},\n dragend: function dragend(e) {\n return this.element.classList.remove(\"dz-drag-hover\");\n },\n dragenter: function dragenter(e) {\n return this.element.classList.add(\"dz-drag-hover\");\n },\n dragover: function dragover(e) {\n return this.element.classList.add(\"dz-drag-hover\");\n },\n dragleave: function dragleave(e) {\n return this.element.classList.remove(\"dz-drag-hover\");\n },\n paste: function paste(e) {},\n // Called whenever there are no files left in the dropzone anymore, and the\n // dropzone should be displayed as if in the initial state.\n reset: function reset() {\n return this.element.classList.remove(\"dz-started\");\n },\n // Called when a file is added to the queue\n // Receives `file`\n addedfile: function addedfile(file) {\n var _this = this;\n\n if (this.element === this.previewsContainer) {\n this.element.classList.add(\"dz-started\");\n }\n\n if (this.previewsContainer && !this.options.disablePreviews) {\n file.previewElement = Dropzone.createElement(this.options.previewTemplate.trim());\n file.previewTemplate = file.previewElement; // Backwards compatibility\n\n this.previewsContainer.appendChild(file.previewElement);\n\n var _iterator2 = options_createForOfIteratorHelper(file.previewElement.querySelectorAll(\"[data-dz-name]\"), true),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var node = _step2.value;\n node.textContent = file.name;\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n var _iterator3 = options_createForOfIteratorHelper(file.previewElement.querySelectorAll(\"[data-dz-size]\"), true),\n _step3;\n\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n node = _step3.value;\n node.innerHTML = this.filesize(file.size);\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n\n if (this.options.addRemoveLinks) {\n file._removeLink = Dropzone.createElement(\"
    \".concat(this.options.dictRemoveFile, \"\"));\n file.previewElement.appendChild(file._removeLink);\n }\n\n var removeFileEvent = function removeFileEvent(e) {\n e.preventDefault();\n e.stopPropagation();\n\n if (file.status === Dropzone.UPLOADING) {\n return Dropzone.confirm(_this.options.dictCancelUploadConfirmation, function () {\n return _this.removeFile(file);\n });\n } else {\n if (_this.options.dictRemoveFileConfirmation) {\n return Dropzone.confirm(_this.options.dictRemoveFileConfirmation, function () {\n return _this.removeFile(file);\n });\n } else {\n return _this.removeFile(file);\n }\n }\n };\n\n var _iterator4 = options_createForOfIteratorHelper(file.previewElement.querySelectorAll(\"[data-dz-remove]\"), true),\n _step4;\n\n try {\n for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n var removeLink = _step4.value;\n removeLink.addEventListener(\"click\", removeFileEvent);\n }\n } catch (err) {\n _iterator4.e(err);\n } finally {\n _iterator4.f();\n }\n }\n },\n // Called whenever a file is removed.\n removedfile: function removedfile(file) {\n if (file.previewElement != null && file.previewElement.parentNode != null) {\n file.previewElement.parentNode.removeChild(file.previewElement);\n }\n\n return this._updateMaxFilesReachedClass();\n },\n // Called when a thumbnail has been generated\n // Receives `file` and `dataUrl`\n thumbnail: function thumbnail(file, dataUrl) {\n if (file.previewElement) {\n file.previewElement.classList.remove(\"dz-file-preview\");\n\n var _iterator5 = options_createForOfIteratorHelper(file.previewElement.querySelectorAll(\"[data-dz-thumbnail]\"), true),\n _step5;\n\n try {\n for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {\n var thumbnailElement = _step5.value;\n thumbnailElement.alt = file.name;\n thumbnailElement.src = dataUrl;\n }\n } catch (err) {\n _iterator5.e(err);\n } finally {\n _iterator5.f();\n }\n\n return setTimeout(function () {\n return file.previewElement.classList.add(\"dz-image-preview\");\n }, 1);\n }\n },\n // Called whenever an error occurs\n // Receives `file` and `message`\n error: function error(file, message) {\n if (file.previewElement) {\n file.previewElement.classList.add(\"dz-error\");\n\n if (typeof message !== \"string\" && message.error) {\n message = message.error;\n }\n\n var _iterator6 = options_createForOfIteratorHelper(file.previewElement.querySelectorAll(\"[data-dz-errormessage]\"), true),\n _step6;\n\n try {\n for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {\n var node = _step6.value;\n node.textContent = message;\n }\n } catch (err) {\n _iterator6.e(err);\n } finally {\n _iterator6.f();\n }\n }\n },\n errormultiple: function errormultiple() {},\n // Called when a file gets processed. Since there is a cue, not all added\n // files are processed immediately.\n // Receives `file`\n processing: function processing(file) {\n if (file.previewElement) {\n file.previewElement.classList.add(\"dz-processing\");\n\n if (file._removeLink) {\n return file._removeLink.innerHTML = this.options.dictCancelUpload;\n }\n }\n },\n processingmultiple: function processingmultiple() {},\n // Called whenever the upload progress gets updated.\n // Receives `file`, `progress` (percentage 0-100) and `bytesSent`.\n // To get the total number of bytes of the file, use `file.size`\n uploadprogress: function uploadprogress(file, progress, bytesSent) {\n if (file.previewElement) {\n var _iterator7 = options_createForOfIteratorHelper(file.previewElement.querySelectorAll(\"[data-dz-uploadprogress]\"), true),\n _step7;\n\n try {\n for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {\n var node = _step7.value;\n node.nodeName === \"PROGRESS\" ? node.value = progress : node.style.width = \"\".concat(progress, \"%\");\n }\n } catch (err) {\n _iterator7.e(err);\n } finally {\n _iterator7.f();\n }\n }\n },\n // Called whenever the total upload progress gets updated.\n // Called with totalUploadProgress (0-100), totalBytes and totalBytesSent\n totaluploadprogress: function totaluploadprogress() {},\n // Called just before the file is sent. Gets the `xhr` object as second\n // parameter, so you can modify it (for example to add a CSRF token) and a\n // `formData` object to add additional information.\n sending: function sending() {},\n sendingmultiple: function sendingmultiple() {},\n // When the complete upload is finished and successful\n // Receives `file`\n success: function success(file) {\n if (file.previewElement) {\n return file.previewElement.classList.add(\"dz-success\");\n }\n },\n successmultiple: function successmultiple() {},\n // When the upload is canceled.\n canceled: function canceled(file) {\n return this.emit(\"error\", file, this.options.dictUploadCanceled);\n },\n canceledmultiple: function canceledmultiple() {},\n // When the upload is finished, either with success or an error.\n // Receives `file`\n complete: function complete(file) {\n if (file._removeLink) {\n file._removeLink.innerHTML = this.options.dictRemoveFile;\n }\n\n if (file.previewElement) {\n return file.previewElement.classList.add(\"dz-complete\");\n }\n },\n completemultiple: function completemultiple() {},\n maxfilesexceeded: function maxfilesexceeded() {},\n maxfilesreached: function maxfilesreached() {},\n queuecomplete: function queuecomplete() {},\n addedfiles: function addedfiles() {}\n};\n/* harmony default export */ var src_options = (defaultOptions);\n;// CONCATENATED MODULE: ./src/dropzone.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction dropzone_createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = dropzone_unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\n\nfunction dropzone_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return dropzone_arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return dropzone_arrayLikeToArray(o, minLen); }\n\nfunction dropzone_arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction dropzone_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction dropzone_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction dropzone_createClass(Constructor, protoProps, staticProps) { if (protoProps) dropzone_defineProperties(Constructor.prototype, protoProps); if (staticProps) dropzone_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\nvar Dropzone = /*#__PURE__*/function (_Emitter) {\n _inherits(Dropzone, _Emitter);\n\n var _super = _createSuper(Dropzone);\n\n function Dropzone(el, options) {\n var _this;\n\n dropzone_classCallCheck(this, Dropzone);\n\n _this = _super.call(this);\n var fallback, left;\n _this.element = el; // For backwards compatibility since the version was in the prototype previously\n\n _this.version = Dropzone.version;\n _this.clickableElements = [];\n _this.listeners = [];\n _this.files = []; // All files\n\n if (typeof _this.element === \"string\") {\n _this.element = document.querySelector(_this.element);\n } // Not checking if instance of HTMLElement or Element since IE9 is extremely weird.\n\n\n if (!_this.element || _this.element.nodeType == null) {\n throw new Error(\"Invalid dropzone element.\");\n }\n\n if (_this.element.dropzone) {\n throw new Error(\"Dropzone already attached.\");\n } // Now add this dropzone to the instances.\n\n\n Dropzone.instances.push(_assertThisInitialized(_this)); // Put the dropzone inside the element itself.\n\n _this.element.dropzone = _assertThisInitialized(_this);\n var elementOptions = (left = Dropzone.optionsForElement(_this.element)) != null ? left : {};\n _this.options = Dropzone.extend({}, src_options, elementOptions, options != null ? options : {});\n _this.options.previewTemplate = _this.options.previewTemplate.replace(/\\n*/g, \"\"); // If the browser failed, just call the fallback and leave\n\n if (_this.options.forceFallback || !Dropzone.isBrowserSupported()) {\n return _possibleConstructorReturn(_this, _this.options.fallback.call(_assertThisInitialized(_this)));\n } // @options.url = @element.getAttribute \"action\" unless @options.url?\n\n\n if (_this.options.url == null) {\n _this.options.url = _this.element.getAttribute(\"action\");\n }\n\n if (!_this.options.url) {\n throw new Error(\"No URL provided.\");\n }\n\n if (_this.options.acceptedFiles && _this.options.acceptedMimeTypes) {\n throw new Error(\"You can't provide both 'acceptedFiles' and 'acceptedMimeTypes'. 'acceptedMimeTypes' is deprecated.\");\n }\n\n if (_this.options.uploadMultiple && _this.options.chunking) {\n throw new Error(\"You cannot set both: uploadMultiple and chunking.\");\n } // Backwards compatibility\n\n\n if (_this.options.acceptedMimeTypes) {\n _this.options.acceptedFiles = _this.options.acceptedMimeTypes;\n delete _this.options.acceptedMimeTypes;\n } // Backwards compatibility\n\n\n if (_this.options.renameFilename != null) {\n _this.options.renameFile = function (file) {\n return _this.options.renameFilename.call(_assertThisInitialized(_this), file.name, file);\n };\n }\n\n if (typeof _this.options.method === \"string\") {\n _this.options.method = _this.options.method.toUpperCase();\n }\n\n if ((fallback = _this.getExistingFallback()) && fallback.parentNode) {\n // Remove the fallback\n fallback.parentNode.removeChild(fallback);\n } // Display previews in the previewsContainer element or the Dropzone element unless explicitly set to false\n\n\n if (_this.options.previewsContainer !== false) {\n if (_this.options.previewsContainer) {\n _this.previewsContainer = Dropzone.getElement(_this.options.previewsContainer, \"previewsContainer\");\n } else {\n _this.previewsContainer = _this.element;\n }\n }\n\n if (_this.options.clickable) {\n if (_this.options.clickable === true) {\n _this.clickableElements = [_this.element];\n } else {\n _this.clickableElements = Dropzone.getElements(_this.options.clickable, \"clickable\");\n }\n }\n\n _this.init();\n\n return _this;\n } // Returns all files that have been accepted\n\n\n dropzone_createClass(Dropzone, [{\n key: \"getAcceptedFiles\",\n value: function getAcceptedFiles() {\n return this.files.filter(function (file) {\n return file.accepted;\n }).map(function (file) {\n return file;\n });\n } // Returns all files that have been rejected\n // Not sure when that's going to be useful, but added for completeness.\n\n }, {\n key: \"getRejectedFiles\",\n value: function getRejectedFiles() {\n return this.files.filter(function (file) {\n return !file.accepted;\n }).map(function (file) {\n return file;\n });\n }\n }, {\n key: \"getFilesWithStatus\",\n value: function getFilesWithStatus(status) {\n return this.files.filter(function (file) {\n return file.status === status;\n }).map(function (file) {\n return file;\n });\n } // Returns all files that are in the queue\n\n }, {\n key: \"getQueuedFiles\",\n value: function getQueuedFiles() {\n return this.getFilesWithStatus(Dropzone.QUEUED);\n }\n }, {\n key: \"getUploadingFiles\",\n value: function getUploadingFiles() {\n return this.getFilesWithStatus(Dropzone.UPLOADING);\n }\n }, {\n key: \"getAddedFiles\",\n value: function getAddedFiles() {\n return this.getFilesWithStatus(Dropzone.ADDED);\n } // Files that are either queued or uploading\n\n }, {\n key: \"getActiveFiles\",\n value: function getActiveFiles() {\n return this.files.filter(function (file) {\n return file.status === Dropzone.UPLOADING || file.status === Dropzone.QUEUED;\n }).map(function (file) {\n return file;\n });\n } // The function that gets called when Dropzone is initialized. You\n // can (and should) setup event listeners inside this function.\n\n }, {\n key: \"init\",\n value: function init() {\n var _this2 = this;\n\n // In case it isn't set already\n if (this.element.tagName === \"form\") {\n this.element.setAttribute(\"enctype\", \"multipart/form-data\");\n }\n\n if (this.element.classList.contains(\"dropzone\") && !this.element.querySelector(\".dz-message\")) {\n this.element.appendChild(Dropzone.createElement(\"
    \")));\n }\n\n if (this.clickableElements.length) {\n var setupHiddenFileInput = function setupHiddenFileInput() {\n if (_this2.hiddenFileInput) {\n _this2.hiddenFileInput.parentNode.removeChild(_this2.hiddenFileInput);\n }\n\n _this2.hiddenFileInput = document.createElement(\"input\");\n\n _this2.hiddenFileInput.setAttribute(\"type\", \"file\");\n\n if (_this2.options.maxFiles === null || _this2.options.maxFiles > 1) {\n _this2.hiddenFileInput.setAttribute(\"multiple\", \"multiple\");\n }\n\n _this2.hiddenFileInput.className = \"dz-hidden-input\";\n\n if (_this2.options.acceptedFiles !== null) {\n _this2.hiddenFileInput.setAttribute(\"accept\", _this2.options.acceptedFiles);\n }\n\n if (_this2.options.capture !== null) {\n _this2.hiddenFileInput.setAttribute(\"capture\", _this2.options.capture);\n } // Making sure that no one can \"tab\" into this field.\n\n\n _this2.hiddenFileInput.setAttribute(\"tabindex\", \"-1\"); // Not setting `display=\"none\"` because some browsers don't accept clicks\n // on elements that aren't displayed.\n\n\n _this2.hiddenFileInput.style.visibility = \"hidden\";\n _this2.hiddenFileInput.style.position = \"absolute\";\n _this2.hiddenFileInput.style.top = \"0\";\n _this2.hiddenFileInput.style.left = \"0\";\n _this2.hiddenFileInput.style.height = \"0\";\n _this2.hiddenFileInput.style.width = \"0\";\n Dropzone.getElement(_this2.options.hiddenInputContainer, \"hiddenInputContainer\").appendChild(_this2.hiddenFileInput);\n\n _this2.hiddenFileInput.addEventListener(\"change\", function () {\n var files = _this2.hiddenFileInput.files;\n\n if (files.length) {\n var _iterator = dropzone_createForOfIteratorHelper(files, true),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var file = _step.value;\n\n _this2.addFile(file);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n }\n\n _this2.emit(\"addedfiles\", files);\n\n setupHiddenFileInput();\n });\n };\n\n setupHiddenFileInput();\n }\n\n this.URL = window.URL !== null ? window.URL : window.webkitURL; // Setup all event listeners on the Dropzone object itself.\n // They're not in @setupEventListeners() because they shouldn't be removed\n // again when the dropzone gets disabled.\n\n var _iterator2 = dropzone_createForOfIteratorHelper(this.events, true),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var eventName = _step2.value;\n this.on(eventName, this.options[eventName]);\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n this.on(\"uploadprogress\", function () {\n return _this2.updateTotalUploadProgress();\n });\n this.on(\"removedfile\", function () {\n return _this2.updateTotalUploadProgress();\n });\n this.on(\"canceled\", function (file) {\n return _this2.emit(\"complete\", file);\n }); // Emit a `queuecomplete` event if all files finished uploading.\n\n this.on(\"complete\", function (file) {\n if (_this2.getAddedFiles().length === 0 && _this2.getUploadingFiles().length === 0 && _this2.getQueuedFiles().length === 0) {\n // This needs to be deferred so that `queuecomplete` really triggers after `complete`\n return setTimeout(function () {\n return _this2.emit(\"queuecomplete\");\n }, 0);\n }\n });\n\n var containsFiles = function containsFiles(e) {\n if (e.dataTransfer.types) {\n // Because e.dataTransfer.types is an Object in\n // IE, we need to iterate like this instead of\n // using e.dataTransfer.types.some()\n for (var i = 0; i < e.dataTransfer.types.length; i++) {\n if (e.dataTransfer.types[i] === \"Files\") return true;\n }\n }\n\n return false;\n };\n\n var noPropagation = function noPropagation(e) {\n // If there are no files, we don't want to stop\n // propagation so we don't interfere with other\n // drag and drop behaviour.\n if (!containsFiles(e)) return;\n e.stopPropagation();\n\n if (e.preventDefault) {\n return e.preventDefault();\n } else {\n return e.returnValue = false;\n }\n }; // Create the listeners\n\n\n this.listeners = [{\n element: this.element,\n events: {\n dragstart: function dragstart(e) {\n return _this2.emit(\"dragstart\", e);\n },\n dragenter: function dragenter(e) {\n noPropagation(e);\n return _this2.emit(\"dragenter\", e);\n },\n dragover: function dragover(e) {\n // Makes it possible to drag files from chrome's download bar\n // http://stackoverflow.com/questions/19526430/drag-and-drop-file-uploads-from-chrome-downloads-bar\n // Try is required to prevent bug in Internet Explorer 11 (SCRIPT65535 exception)\n var efct;\n\n try {\n efct = e.dataTransfer.effectAllowed;\n } catch (error) {}\n\n e.dataTransfer.dropEffect = \"move\" === efct || \"linkMove\" === efct ? \"move\" : \"copy\";\n noPropagation(e);\n return _this2.emit(\"dragover\", e);\n },\n dragleave: function dragleave(e) {\n return _this2.emit(\"dragleave\", e);\n },\n drop: function drop(e) {\n noPropagation(e);\n return _this2.drop(e);\n },\n dragend: function dragend(e) {\n return _this2.emit(\"dragend\", e);\n }\n } // This is disabled right now, because the browsers don't implement it properly.\n // \"paste\": (e) =>\n // noPropagation e\n // @paste e\n\n }];\n this.clickableElements.forEach(function (clickableElement) {\n return _this2.listeners.push({\n element: clickableElement,\n events: {\n click: function click(evt) {\n // Only the actual dropzone or the message element should trigger file selection\n if (clickableElement !== _this2.element || evt.target === _this2.element || Dropzone.elementInside(evt.target, _this2.element.querySelector(\".dz-message\"))) {\n _this2.hiddenFileInput.click(); // Forward the click\n\n }\n\n return true;\n }\n }\n });\n });\n this.enable();\n return this.options.init.call(this);\n } // Not fully tested yet\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.disable();\n this.removeAllFiles(true);\n\n if (this.hiddenFileInput != null ? this.hiddenFileInput.parentNode : undefined) {\n this.hiddenFileInput.parentNode.removeChild(this.hiddenFileInput);\n this.hiddenFileInput = null;\n }\n\n delete this.element.dropzone;\n return Dropzone.instances.splice(Dropzone.instances.indexOf(this), 1);\n }\n }, {\n key: \"updateTotalUploadProgress\",\n value: function updateTotalUploadProgress() {\n var totalUploadProgress;\n var totalBytesSent = 0;\n var totalBytes = 0;\n var activeFiles = this.getActiveFiles();\n\n if (activeFiles.length) {\n var _iterator3 = dropzone_createForOfIteratorHelper(this.getActiveFiles(), true),\n _step3;\n\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n var file = _step3.value;\n totalBytesSent += file.upload.bytesSent;\n totalBytes += file.upload.total;\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n\n totalUploadProgress = 100 * totalBytesSent / totalBytes;\n } else {\n totalUploadProgress = 100;\n }\n\n return this.emit(\"totaluploadprogress\", totalUploadProgress, totalBytes, totalBytesSent);\n } // @options.paramName can be a function taking one parameter rather than a string.\n // A parameter name for a file is obtained simply by calling this with an index number.\n\n }, {\n key: \"_getParamName\",\n value: function _getParamName(n) {\n if (typeof this.options.paramName === \"function\") {\n return this.options.paramName(n);\n } else {\n return \"\".concat(this.options.paramName).concat(this.options.uploadMultiple ? \"[\".concat(n, \"]\") : \"\");\n }\n } // If @options.renameFile is a function,\n // the function will be used to rename the file.name before appending it to the formData\n\n }, {\n key: \"_renameFile\",\n value: function _renameFile(file) {\n if (typeof this.options.renameFile !== \"function\") {\n return file.name;\n }\n\n return this.options.renameFile(file);\n } // Returns a form that can be used as fallback if the browser does not support DragnDrop\n //\n // If the dropzone is already a form, only the input field and button are returned. Otherwise a complete form element is provided.\n // This code has to pass in IE7 :(\n\n }, {\n key: \"getFallbackForm\",\n value: function getFallbackForm() {\n var existingFallback, form;\n\n if (existingFallback = this.getExistingFallback()) {\n return existingFallback;\n }\n\n var fieldsString = '
    ';\n\n if (this.options.dictFallbackText) {\n fieldsString += \"

    \".concat(this.options.dictFallbackText, \"

    \");\n }\n\n fieldsString += \"
    \");\n var fields = Dropzone.createElement(fieldsString);\n\n if (this.element.tagName !== \"FORM\") {\n form = Dropzone.createElement(\"
    \"));\n form.appendChild(fields);\n } else {\n // Make sure that the enctype and method attributes are set properly\n this.element.setAttribute(\"enctype\", \"multipart/form-data\");\n this.element.setAttribute(\"method\", this.options.method);\n }\n\n return form != null ? form : fields;\n } // Returns the fallback elements if they exist already\n //\n // This code has to pass in IE7 :(\n\n }, {\n key: \"getExistingFallback\",\n value: function getExistingFallback() {\n var getFallback = function getFallback(elements) {\n var _iterator4 = dropzone_createForOfIteratorHelper(elements, true),\n _step4;\n\n try {\n for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n var el = _step4.value;\n\n if (/(^| )fallback($| )/.test(el.className)) {\n return el;\n }\n }\n } catch (err) {\n _iterator4.e(err);\n } finally {\n _iterator4.f();\n }\n };\n\n for (var _i = 0, _arr = [\"div\", \"form\"]; _i < _arr.length; _i++) {\n var tagName = _arr[_i];\n var fallback;\n\n if (fallback = getFallback(this.element.getElementsByTagName(tagName))) {\n return fallback;\n }\n }\n } // Activates all listeners stored in @listeners\n\n }, {\n key: \"setupEventListeners\",\n value: function setupEventListeners() {\n return this.listeners.map(function (elementListeners) {\n return function () {\n var result = [];\n\n for (var event in elementListeners.events) {\n var listener = elementListeners.events[event];\n result.push(elementListeners.element.addEventListener(event, listener, false));\n }\n\n return result;\n }();\n });\n } // Deactivates all listeners stored in @listeners\n\n }, {\n key: \"removeEventListeners\",\n value: function removeEventListeners() {\n return this.listeners.map(function (elementListeners) {\n return function () {\n var result = [];\n\n for (var event in elementListeners.events) {\n var listener = elementListeners.events[event];\n result.push(elementListeners.element.removeEventListener(event, listener, false));\n }\n\n return result;\n }();\n });\n } // Removes all event listeners and cancels all files in the queue or being processed.\n\n }, {\n key: \"disable\",\n value: function disable() {\n var _this3 = this;\n\n this.clickableElements.forEach(function (element) {\n return element.classList.remove(\"dz-clickable\");\n });\n this.removeEventListeners();\n this.disabled = true;\n return this.files.map(function (file) {\n return _this3.cancelUpload(file);\n });\n }\n }, {\n key: \"enable\",\n value: function enable() {\n delete this.disabled;\n this.clickableElements.forEach(function (element) {\n return element.classList.add(\"dz-clickable\");\n });\n return this.setupEventListeners();\n } // Returns a nicely formatted filesize\n\n }, {\n key: \"filesize\",\n value: function filesize(size) {\n var selectedSize = 0;\n var selectedUnit = \"b\";\n\n if (size > 0) {\n var units = [\"tb\", \"gb\", \"mb\", \"kb\", \"b\"];\n\n for (var i = 0; i < units.length; i++) {\n var unit = units[i];\n var cutoff = Math.pow(this.options.filesizeBase, 4 - i) / 10;\n\n if (size >= cutoff) {\n selectedSize = size / Math.pow(this.options.filesizeBase, 4 - i);\n selectedUnit = unit;\n break;\n }\n }\n\n selectedSize = Math.round(10 * selectedSize) / 10; // Cutting of digits\n }\n\n return \"\".concat(selectedSize, \" \").concat(this.options.dictFileSizeUnits[selectedUnit]);\n } // Adds or removes the `dz-max-files-reached` class from the form.\n\n }, {\n key: \"_updateMaxFilesReachedClass\",\n value: function _updateMaxFilesReachedClass() {\n if (this.options.maxFiles != null && this.getAcceptedFiles().length >= this.options.maxFiles) {\n if (this.getAcceptedFiles().length === this.options.maxFiles) {\n this.emit(\"maxfilesreached\", this.files);\n }\n\n return this.element.classList.add(\"dz-max-files-reached\");\n } else {\n return this.element.classList.remove(\"dz-max-files-reached\");\n }\n }\n }, {\n key: \"drop\",\n value: function drop(e) {\n if (!e.dataTransfer) {\n return;\n }\n\n this.emit(\"drop\", e); // Convert the FileList to an Array\n // This is necessary for IE11\n\n var files = [];\n\n for (var i = 0; i < e.dataTransfer.files.length; i++) {\n files[i] = e.dataTransfer.files[i];\n } // Even if it's a folder, files.length will contain the folders.\n\n\n if (files.length) {\n var items = e.dataTransfer.items;\n\n if (items && items.length && items[0].webkitGetAsEntry != null) {\n // The browser supports dropping of folders, so handle items instead of files\n this._addFilesFromItems(items);\n } else {\n this.handleFiles(files);\n }\n }\n\n this.emit(\"addedfiles\", files);\n }\n }, {\n key: \"paste\",\n value: function paste(e) {\n if (__guard__(e != null ? e.clipboardData : undefined, function (x) {\n return x.items;\n }) == null) {\n return;\n }\n\n this.emit(\"paste\", e);\n var items = e.clipboardData.items;\n\n if (items.length) {\n return this._addFilesFromItems(items);\n }\n }\n }, {\n key: \"handleFiles\",\n value: function handleFiles(files) {\n var _iterator5 = dropzone_createForOfIteratorHelper(files, true),\n _step5;\n\n try {\n for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {\n var file = _step5.value;\n this.addFile(file);\n }\n } catch (err) {\n _iterator5.e(err);\n } finally {\n _iterator5.f();\n }\n } // When a folder is dropped (or files are pasted), items must be handled\n // instead of files.\n\n }, {\n key: \"_addFilesFromItems\",\n value: function _addFilesFromItems(items) {\n var _this4 = this;\n\n return function () {\n var result = [];\n\n var _iterator6 = dropzone_createForOfIteratorHelper(items, true),\n _step6;\n\n try {\n for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {\n var item = _step6.value;\n var entry;\n\n if (item.webkitGetAsEntry != null && (entry = item.webkitGetAsEntry())) {\n if (entry.isFile) {\n result.push(_this4.addFile(item.getAsFile()));\n } else if (entry.isDirectory) {\n // Append all files from that directory to files\n result.push(_this4._addFilesFromDirectory(entry, entry.name));\n } else {\n result.push(undefined);\n }\n } else if (item.getAsFile != null) {\n if (item.kind == null || item.kind === \"file\") {\n result.push(_this4.addFile(item.getAsFile()));\n } else {\n result.push(undefined);\n }\n } else {\n result.push(undefined);\n }\n }\n } catch (err) {\n _iterator6.e(err);\n } finally {\n _iterator6.f();\n }\n\n return result;\n }();\n } // Goes through the directory, and adds each file it finds recursively\n\n }, {\n key: \"_addFilesFromDirectory\",\n value: function _addFilesFromDirectory(directory, path) {\n var _this5 = this;\n\n var dirReader = directory.createReader();\n\n var errorHandler = function errorHandler(error) {\n return __guardMethod__(console, \"log\", function (o) {\n return o.log(error);\n });\n };\n\n var readEntries = function readEntries() {\n return dirReader.readEntries(function (entries) {\n if (entries.length > 0) {\n var _iterator7 = dropzone_createForOfIteratorHelper(entries, true),\n _step7;\n\n try {\n for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {\n var entry = _step7.value;\n\n if (entry.isFile) {\n entry.file(function (file) {\n if (_this5.options.ignoreHiddenFiles && file.name.substring(0, 1) === \".\") {\n return;\n }\n\n file.fullPath = \"\".concat(path, \"/\").concat(file.name);\n return _this5.addFile(file);\n });\n } else if (entry.isDirectory) {\n _this5._addFilesFromDirectory(entry, \"\".concat(path, \"/\").concat(entry.name));\n }\n } // Recursively call readEntries() again, since browser only handle\n // the first 100 entries.\n // See: https://developer.mozilla.org/en-US/docs/Web/API/DirectoryReader#readEntries\n\n } catch (err) {\n _iterator7.e(err);\n } finally {\n _iterator7.f();\n }\n\n readEntries();\n }\n\n return null;\n }, errorHandler);\n };\n\n return readEntries();\n } // If `done()` is called without argument the file is accepted\n // If you call it with an error message, the file is rejected\n // (This allows for asynchronous validation)\n //\n // This function checks the filesize, and if the file.type passes the\n // `acceptedFiles` check.\n\n }, {\n key: \"accept\",\n value: function accept(file, done) {\n if (this.options.maxFilesize && file.size > this.options.maxFilesize * 1024 * 1024) {\n done(this.options.dictFileTooBig.replace(\"{{filesize}}\", Math.round(file.size / 1024 / 10.24) / 100).replace(\"{{maxFilesize}}\", this.options.maxFilesize));\n } else if (!Dropzone.isValidFile(file, this.options.acceptedFiles)) {\n done(this.options.dictInvalidFileType);\n } else if (this.options.maxFiles != null && this.getAcceptedFiles().length >= this.options.maxFiles) {\n done(this.options.dictMaxFilesExceeded.replace(\"{{maxFiles}}\", this.options.maxFiles));\n this.emit(\"maxfilesexceeded\", file);\n } else {\n this.options.accept.call(this, file, done);\n }\n }\n }, {\n key: \"addFile\",\n value: function addFile(file) {\n var _this6 = this;\n\n file.upload = {\n uuid: Dropzone.uuidv4(),\n progress: 0,\n // Setting the total upload size to file.size for the beginning\n // It's actual different than the size to be transmitted.\n total: file.size,\n bytesSent: 0,\n filename: this._renameFile(file) // Not setting chunking information here, because the acutal data — and\n // thus the chunks — might change if `options.transformFile` is set\n // and does something to the data.\n\n };\n this.files.push(file);\n file.status = Dropzone.ADDED;\n this.emit(\"addedfile\", file);\n\n this._enqueueThumbnail(file);\n\n this.accept(file, function (error) {\n if (error) {\n file.accepted = false;\n\n _this6._errorProcessing([file], error); // Will set the file.status\n\n } else {\n file.accepted = true;\n\n if (_this6.options.autoQueue) {\n _this6.enqueueFile(file);\n } // Will set .accepted = true\n\n }\n\n _this6._updateMaxFilesReachedClass();\n });\n } // Wrapper for enqueueFile\n\n }, {\n key: \"enqueueFiles\",\n value: function enqueueFiles(files) {\n var _iterator8 = dropzone_createForOfIteratorHelper(files, true),\n _step8;\n\n try {\n for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {\n var file = _step8.value;\n this.enqueueFile(file);\n }\n } catch (err) {\n _iterator8.e(err);\n } finally {\n _iterator8.f();\n }\n\n return null;\n }\n }, {\n key: \"enqueueFile\",\n value: function enqueueFile(file) {\n var _this7 = this;\n\n if (file.status === Dropzone.ADDED && file.accepted === true) {\n file.status = Dropzone.QUEUED;\n\n if (this.options.autoProcessQueue) {\n return setTimeout(function () {\n return _this7.processQueue();\n }, 0); // Deferring the call\n }\n } else {\n throw new Error(\"This file can't be queued because it has already been processed or was rejected.\");\n }\n }\n }, {\n key: \"_enqueueThumbnail\",\n value: function _enqueueThumbnail(file) {\n var _this8 = this;\n\n if (this.options.createImageThumbnails && file.type.match(/image.*/) && file.size <= this.options.maxThumbnailFilesize * 1024 * 1024) {\n this._thumbnailQueue.push(file);\n\n return setTimeout(function () {\n return _this8._processThumbnailQueue();\n }, 0); // Deferring the call\n }\n }\n }, {\n key: \"_processThumbnailQueue\",\n value: function _processThumbnailQueue() {\n var _this9 = this;\n\n if (this._processingThumbnail || this._thumbnailQueue.length === 0) {\n return;\n }\n\n this._processingThumbnail = true;\n\n var file = this._thumbnailQueue.shift();\n\n return this.createThumbnail(file, this.options.thumbnailWidth, this.options.thumbnailHeight, this.options.thumbnailMethod, true, function (dataUrl) {\n _this9.emit(\"thumbnail\", file, dataUrl);\n\n _this9._processingThumbnail = false;\n return _this9._processThumbnailQueue();\n });\n } // Can be called by the user to remove a file\n\n }, {\n key: \"removeFile\",\n value: function removeFile(file) {\n if (file.status === Dropzone.UPLOADING) {\n this.cancelUpload(file);\n }\n\n this.files = without(this.files, file);\n this.emit(\"removedfile\", file);\n\n if (this.files.length === 0) {\n return this.emit(\"reset\");\n }\n } // Removes all files that aren't currently processed from the list\n\n }, {\n key: \"removeAllFiles\",\n value: function removeAllFiles(cancelIfNecessary) {\n // Create a copy of files since removeFile() changes the @files array.\n if (cancelIfNecessary == null) {\n cancelIfNecessary = false;\n }\n\n var _iterator9 = dropzone_createForOfIteratorHelper(this.files.slice(), true),\n _step9;\n\n try {\n for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {\n var file = _step9.value;\n\n if (file.status !== Dropzone.UPLOADING || cancelIfNecessary) {\n this.removeFile(file);\n }\n }\n } catch (err) {\n _iterator9.e(err);\n } finally {\n _iterator9.f();\n }\n\n return null;\n } // Resizes an image before it gets sent to the server. This function is the default behavior of\n // `options.transformFile` if `resizeWidth` or `resizeHeight` are set. The callback is invoked with\n // the resized blob.\n\n }, {\n key: \"resizeImage\",\n value: function resizeImage(file, width, height, resizeMethod, callback) {\n var _this10 = this;\n\n return this.createThumbnail(file, width, height, resizeMethod, true, function (dataUrl, canvas) {\n if (canvas == null) {\n // The image has not been resized\n return callback(file);\n } else {\n var resizeMimeType = _this10.options.resizeMimeType;\n\n if (resizeMimeType == null) {\n resizeMimeType = file.type;\n }\n\n var resizedDataURL = canvas.toDataURL(resizeMimeType, _this10.options.resizeQuality);\n\n if (resizeMimeType === \"image/jpeg\" || resizeMimeType === \"image/jpg\") {\n // Now add the original EXIF information\n resizedDataURL = ExifRestore.restore(file.dataURL, resizedDataURL);\n }\n\n return callback(Dropzone.dataURItoBlob(resizedDataURL));\n }\n });\n }\n }, {\n key: \"createThumbnail\",\n value: function createThumbnail(file, width, height, resizeMethod, fixOrientation, callback) {\n var _this11 = this;\n\n var fileReader = new FileReader();\n\n fileReader.onload = function () {\n file.dataURL = fileReader.result; // Don't bother creating a thumbnail for SVG images since they're vector\n\n if (file.type === \"image/svg+xml\") {\n if (callback != null) {\n callback(fileReader.result);\n }\n\n return;\n }\n\n _this11.createThumbnailFromUrl(file, width, height, resizeMethod, fixOrientation, callback);\n };\n\n fileReader.readAsDataURL(file);\n } // `mockFile` needs to have these attributes:\n //\n // { name: 'name', size: 12345, imageUrl: '' }\n //\n // `callback` will be invoked when the image has been downloaded and displayed.\n // `crossOrigin` will be added to the `img` tag when accessing the file.\n\n }, {\n key: \"displayExistingFile\",\n value: function displayExistingFile(mockFile, imageUrl, callback, crossOrigin) {\n var _this12 = this;\n\n var resizeThumbnail = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n this.emit(\"addedfile\", mockFile);\n this.emit(\"complete\", mockFile);\n\n if (!resizeThumbnail) {\n this.emit(\"thumbnail\", mockFile, imageUrl);\n if (callback) callback();\n } else {\n var onDone = function onDone(thumbnail) {\n _this12.emit(\"thumbnail\", mockFile, thumbnail);\n\n if (callback) callback();\n };\n\n mockFile.dataURL = imageUrl;\n this.createThumbnailFromUrl(mockFile, this.options.thumbnailWidth, this.options.thumbnailHeight, this.options.thumbnailMethod, this.options.fixOrientation, onDone, crossOrigin);\n }\n }\n }, {\n key: \"createThumbnailFromUrl\",\n value: function createThumbnailFromUrl(file, width, height, resizeMethod, fixOrientation, callback, crossOrigin) {\n var _this13 = this;\n\n // Not using `new Image` here because of a bug in latest Chrome versions.\n // See https://github.com/enyo/dropzone/pull/226\n var img = document.createElement(\"img\");\n\n if (crossOrigin) {\n img.crossOrigin = crossOrigin;\n } // fixOrientation is not needed anymore with browsers handling imageOrientation\n\n\n fixOrientation = getComputedStyle(document.body)[\"imageOrientation\"] == \"from-image\" ? false : fixOrientation;\n\n img.onload = function () {\n var loadExif = function loadExif(callback) {\n return callback(1);\n };\n\n if (typeof EXIF !== \"undefined\" && EXIF !== null && fixOrientation) {\n loadExif = function loadExif(callback) {\n return EXIF.getData(img, function () {\n return callback(EXIF.getTag(this, \"Orientation\"));\n });\n };\n }\n\n return loadExif(function (orientation) {\n file.width = img.width;\n file.height = img.height;\n\n var resizeInfo = _this13.options.resize.call(_this13, file, width, height, resizeMethod);\n\n var canvas = document.createElement(\"canvas\");\n var ctx = canvas.getContext(\"2d\");\n canvas.width = resizeInfo.trgWidth;\n canvas.height = resizeInfo.trgHeight;\n\n if (orientation > 4) {\n canvas.width = resizeInfo.trgHeight;\n canvas.height = resizeInfo.trgWidth;\n }\n\n switch (orientation) {\n case 2:\n // horizontal flip\n ctx.translate(canvas.width, 0);\n ctx.scale(-1, 1);\n break;\n\n case 3:\n // 180° rotate left\n ctx.translate(canvas.width, canvas.height);\n ctx.rotate(Math.PI);\n break;\n\n case 4:\n // vertical flip\n ctx.translate(0, canvas.height);\n ctx.scale(1, -1);\n break;\n\n case 5:\n // vertical flip + 90 rotate right\n ctx.rotate(0.5 * Math.PI);\n ctx.scale(1, -1);\n break;\n\n case 6:\n // 90° rotate right\n ctx.rotate(0.5 * Math.PI);\n ctx.translate(0, -canvas.width);\n break;\n\n case 7:\n // horizontal flip + 90 rotate right\n ctx.rotate(0.5 * Math.PI);\n ctx.translate(canvas.height, -canvas.width);\n ctx.scale(-1, 1);\n break;\n\n case 8:\n // 90° rotate left\n ctx.rotate(-0.5 * Math.PI);\n ctx.translate(-canvas.height, 0);\n break;\n } // This is a bugfix for iOS' scaling bug.\n\n\n drawImageIOSFix(ctx, img, resizeInfo.srcX != null ? resizeInfo.srcX : 0, resizeInfo.srcY != null ? resizeInfo.srcY : 0, resizeInfo.srcWidth, resizeInfo.srcHeight, resizeInfo.trgX != null ? resizeInfo.trgX : 0, resizeInfo.trgY != null ? resizeInfo.trgY : 0, resizeInfo.trgWidth, resizeInfo.trgHeight);\n var thumbnail = canvas.toDataURL(\"image/png\");\n\n if (callback != null) {\n return callback(thumbnail, canvas);\n }\n });\n };\n\n if (callback != null) {\n img.onerror = callback;\n }\n\n return img.src = file.dataURL;\n } // Goes through the queue and processes files if there aren't too many already.\n\n }, {\n key: \"processQueue\",\n value: function processQueue() {\n var parallelUploads = this.options.parallelUploads;\n var processingLength = this.getUploadingFiles().length;\n var i = processingLength; // There are already at least as many files uploading than should be\n\n if (processingLength >= parallelUploads) {\n return;\n }\n\n var queuedFiles = this.getQueuedFiles();\n\n if (!(queuedFiles.length > 0)) {\n return;\n }\n\n if (this.options.uploadMultiple) {\n // The files should be uploaded in one request\n return this.processFiles(queuedFiles.slice(0, parallelUploads - processingLength));\n } else {\n while (i < parallelUploads) {\n if (!queuedFiles.length) {\n return;\n } // Nothing left to process\n\n\n this.processFile(queuedFiles.shift());\n i++;\n }\n }\n } // Wrapper for `processFiles`\n\n }, {\n key: \"processFile\",\n value: function processFile(file) {\n return this.processFiles([file]);\n } // Loads the file, then calls finishedLoading()\n\n }, {\n key: \"processFiles\",\n value: function processFiles(files) {\n var _iterator10 = dropzone_createForOfIteratorHelper(files, true),\n _step10;\n\n try {\n for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {\n var file = _step10.value;\n file.processing = true; // Backwards compatibility\n\n file.status = Dropzone.UPLOADING;\n this.emit(\"processing\", file);\n }\n } catch (err) {\n _iterator10.e(err);\n } finally {\n _iterator10.f();\n }\n\n if (this.options.uploadMultiple) {\n this.emit(\"processingmultiple\", files);\n }\n\n return this.uploadFiles(files);\n }\n }, {\n key: \"_getFilesWithXhr\",\n value: function _getFilesWithXhr(xhr) {\n var files;\n return files = this.files.filter(function (file) {\n return file.xhr === xhr;\n }).map(function (file) {\n return file;\n });\n } // Cancels the file upload and sets the status to CANCELED\n // **if** the file is actually being uploaded.\n // If it's still in the queue, the file is being removed from it and the status\n // set to CANCELED.\n\n }, {\n key: \"cancelUpload\",\n value: function cancelUpload(file) {\n if (file.status === Dropzone.UPLOADING) {\n var groupedFiles = this._getFilesWithXhr(file.xhr);\n\n var _iterator11 = dropzone_createForOfIteratorHelper(groupedFiles, true),\n _step11;\n\n try {\n for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) {\n var groupedFile = _step11.value;\n groupedFile.status = Dropzone.CANCELED;\n }\n } catch (err) {\n _iterator11.e(err);\n } finally {\n _iterator11.f();\n }\n\n if (typeof file.xhr !== \"undefined\") {\n file.xhr.abort();\n }\n\n var _iterator12 = dropzone_createForOfIteratorHelper(groupedFiles, true),\n _step12;\n\n try {\n for (_iterator12.s(); !(_step12 = _iterator12.n()).done;) {\n var _groupedFile = _step12.value;\n this.emit(\"canceled\", _groupedFile);\n }\n } catch (err) {\n _iterator12.e(err);\n } finally {\n _iterator12.f();\n }\n\n if (this.options.uploadMultiple) {\n this.emit(\"canceledmultiple\", groupedFiles);\n }\n } else if (file.status === Dropzone.ADDED || file.status === Dropzone.QUEUED) {\n file.status = Dropzone.CANCELED;\n this.emit(\"canceled\", file);\n\n if (this.options.uploadMultiple) {\n this.emit(\"canceledmultiple\", [file]);\n }\n }\n\n if (this.options.autoProcessQueue) {\n return this.processQueue();\n }\n }\n }, {\n key: \"resolveOption\",\n value: function resolveOption(option) {\n if (typeof option === \"function\") {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return option.apply(this, args);\n }\n\n return option;\n }\n }, {\n key: \"uploadFile\",\n value: function uploadFile(file) {\n return this.uploadFiles([file]);\n }\n }, {\n key: \"uploadFiles\",\n value: function uploadFiles(files) {\n var _this14 = this;\n\n this._transformFiles(files, function (transformedFiles) {\n if (_this14.options.chunking) {\n // Chunking is not allowed to be used with `uploadMultiple` so we know\n // that there is only __one__file.\n var transformedFile = transformedFiles[0];\n files[0].upload.chunked = _this14.options.chunking && (_this14.options.forceChunking || transformedFile.size > _this14.options.chunkSize);\n files[0].upload.totalChunkCount = Math.ceil(transformedFile.size / _this14.options.chunkSize);\n }\n\n if (files[0].upload.chunked) {\n // This file should be sent in chunks!\n // If the chunking option is set, we **know** that there can only be **one** file, since\n // uploadMultiple is not allowed with this option.\n var file = files[0];\n var _transformedFile = transformedFiles[0];\n var startedChunkCount = 0;\n file.upload.chunks = [];\n\n var handleNextChunk = function handleNextChunk() {\n var chunkIndex = 0; // Find the next item in file.upload.chunks that is not defined yet.\n\n while (file.upload.chunks[chunkIndex] !== undefined) {\n chunkIndex++;\n } // This means, that all chunks have already been started.\n\n\n if (chunkIndex >= file.upload.totalChunkCount) return;\n startedChunkCount++;\n var start = chunkIndex * _this14.options.chunkSize;\n var end = Math.min(start + _this14.options.chunkSize, _transformedFile.size);\n var dataBlock = {\n name: _this14._getParamName(0),\n data: _transformedFile.webkitSlice ? _transformedFile.webkitSlice(start, end) : _transformedFile.slice(start, end),\n filename: file.upload.filename,\n chunkIndex: chunkIndex\n };\n file.upload.chunks[chunkIndex] = {\n file: file,\n index: chunkIndex,\n dataBlock: dataBlock,\n // In case we want to retry.\n status: Dropzone.UPLOADING,\n progress: 0,\n retries: 0 // The number of times this block has been retried.\n\n };\n\n _this14._uploadData(files, [dataBlock]);\n };\n\n file.upload.finishedChunkUpload = function (chunk, response) {\n var allFinished = true;\n chunk.status = Dropzone.SUCCESS; // Clear the data from the chunk\n\n chunk.dataBlock = null; // Leaving this reference to xhr intact here will cause memory leaks in some browsers\n\n chunk.xhr = null;\n\n for (var i = 0; i < file.upload.totalChunkCount; i++) {\n if (file.upload.chunks[i] === undefined) {\n return handleNextChunk();\n }\n\n if (file.upload.chunks[i].status !== Dropzone.SUCCESS) {\n allFinished = false;\n }\n }\n\n if (allFinished) {\n _this14.options.chunksUploaded(file, function () {\n _this14._finished(files, response, null);\n });\n }\n };\n\n if (_this14.options.parallelChunkUploads) {\n for (var i = 0; i < file.upload.totalChunkCount; i++) {\n handleNextChunk();\n }\n } else {\n handleNextChunk();\n }\n } else {\n var dataBlocks = [];\n\n for (var _i2 = 0; _i2 < files.length; _i2++) {\n dataBlocks[_i2] = {\n name: _this14._getParamName(_i2),\n data: transformedFiles[_i2],\n filename: files[_i2].upload.filename\n };\n }\n\n _this14._uploadData(files, dataBlocks);\n }\n });\n } /// Returns the right chunk for given file and xhr\n\n }, {\n key: \"_getChunk\",\n value: function _getChunk(file, xhr) {\n for (var i = 0; i < file.upload.totalChunkCount; i++) {\n if (file.upload.chunks[i] !== undefined && file.upload.chunks[i].xhr === xhr) {\n return file.upload.chunks[i];\n }\n }\n } // This function actually uploads the file(s) to the server.\n // If dataBlocks contains the actual data to upload (meaning, that this could either be transformed\n // files, or individual chunks for chunked upload).\n\n }, {\n key: \"_uploadData\",\n value: function _uploadData(files, dataBlocks) {\n var _this15 = this;\n\n var xhr = new XMLHttpRequest(); // Put the xhr object in the file objects to be able to reference it later.\n\n var _iterator13 = dropzone_createForOfIteratorHelper(files, true),\n _step13;\n\n try {\n for (_iterator13.s(); !(_step13 = _iterator13.n()).done;) {\n var file = _step13.value;\n file.xhr = xhr;\n }\n } catch (err) {\n _iterator13.e(err);\n } finally {\n _iterator13.f();\n }\n\n if (files[0].upload.chunked) {\n // Put the xhr object in the right chunk object, so it can be associated later, and found with _getChunk\n files[0].upload.chunks[dataBlocks[0].chunkIndex].xhr = xhr;\n }\n\n var method = this.resolveOption(this.options.method, files);\n var url = this.resolveOption(this.options.url, files);\n xhr.open(method, url, true); // Setting the timeout after open because of IE11 issue: https://gitlab.com/meno/dropzone/issues/8\n\n var timeout = this.resolveOption(this.options.timeout, files);\n if (timeout) xhr.timeout = this.resolveOption(this.options.timeout, files); // Has to be after `.open()`. See https://github.com/enyo/dropzone/issues/179\n\n xhr.withCredentials = !!this.options.withCredentials;\n\n xhr.onload = function (e) {\n _this15._finishedUploading(files, xhr, e);\n };\n\n xhr.ontimeout = function () {\n _this15._handleUploadError(files, xhr, \"Request timedout after \".concat(_this15.options.timeout / 1000, \" seconds\"));\n };\n\n xhr.onerror = function () {\n _this15._handleUploadError(files, xhr);\n }; // Some browsers do not have the .upload property\n\n\n var progressObj = xhr.upload != null ? xhr.upload : xhr;\n\n progressObj.onprogress = function (e) {\n return _this15._updateFilesUploadProgress(files, xhr, e);\n };\n\n var headers = {\n Accept: \"application/json\",\n \"Cache-Control\": \"no-cache\",\n \"X-Requested-With\": \"XMLHttpRequest\"\n };\n\n if (this.options.headers) {\n Dropzone.extend(headers, this.options.headers);\n }\n\n for (var headerName in headers) {\n var headerValue = headers[headerName];\n\n if (headerValue) {\n xhr.setRequestHeader(headerName, headerValue);\n }\n }\n\n var formData = new FormData(); // Adding all @options parameters\n\n if (this.options.params) {\n var additionalParams = this.options.params;\n\n if (typeof additionalParams === \"function\") {\n additionalParams = additionalParams.call(this, files, xhr, files[0].upload.chunked ? this._getChunk(files[0], xhr) : null);\n }\n\n for (var key in additionalParams) {\n var value = additionalParams[key];\n\n if (Array.isArray(value)) {\n // The additional parameter contains an array,\n // so lets iterate over it to attach each value\n // individually.\n for (var i = 0; i < value.length; i++) {\n formData.append(key, value[i]);\n }\n } else {\n formData.append(key, value);\n }\n }\n } // Let the user add additional data if necessary\n\n\n var _iterator14 = dropzone_createForOfIteratorHelper(files, true),\n _step14;\n\n try {\n for (_iterator14.s(); !(_step14 = _iterator14.n()).done;) {\n var _file = _step14.value;\n this.emit(\"sending\", _file, xhr, formData);\n }\n } catch (err) {\n _iterator14.e(err);\n } finally {\n _iterator14.f();\n }\n\n if (this.options.uploadMultiple) {\n this.emit(\"sendingmultiple\", files, xhr, formData);\n }\n\n this._addFormElementData(formData); // Finally add the files\n // Has to be last because some servers (eg: S3) expect the file to be the last parameter\n\n\n for (var _i3 = 0; _i3 < dataBlocks.length; _i3++) {\n var dataBlock = dataBlocks[_i3];\n formData.append(dataBlock.name, dataBlock.data, dataBlock.filename);\n }\n\n this.submitRequest(xhr, formData, files);\n } // Transforms all files with this.options.transformFile and invokes done with the transformed files when done.\n\n }, {\n key: \"_transformFiles\",\n value: function _transformFiles(files, done) {\n var _this16 = this;\n\n var transformedFiles = []; // Clumsy way of handling asynchronous calls, until I get to add a proper Future library.\n\n var doneCounter = 0;\n\n var _loop = function _loop(i) {\n _this16.options.transformFile.call(_this16, files[i], function (transformedFile) {\n transformedFiles[i] = transformedFile;\n\n if (++doneCounter === files.length) {\n done(transformedFiles);\n }\n });\n };\n\n for (var i = 0; i < files.length; i++) {\n _loop(i);\n }\n } // Takes care of adding other input elements of the form to the AJAX request\n\n }, {\n key: \"_addFormElementData\",\n value: function _addFormElementData(formData) {\n // Take care of other input elements\n if (this.element.tagName === \"FORM\") {\n var _iterator15 = dropzone_createForOfIteratorHelper(this.element.querySelectorAll(\"input, textarea, select, button\"), true),\n _step15;\n\n try {\n for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) {\n var input = _step15.value;\n var inputName = input.getAttribute(\"name\");\n var inputType = input.getAttribute(\"type\");\n if (inputType) inputType = inputType.toLowerCase(); // If the input doesn't have a name, we can't use it.\n\n if (typeof inputName === \"undefined\" || inputName === null) continue;\n\n if (input.tagName === \"SELECT\" && input.hasAttribute(\"multiple\")) {\n // Possibly multiple values\n var _iterator16 = dropzone_createForOfIteratorHelper(input.options, true),\n _step16;\n\n try {\n for (_iterator16.s(); !(_step16 = _iterator16.n()).done;) {\n var option = _step16.value;\n\n if (option.selected) {\n formData.append(inputName, option.value);\n }\n }\n } catch (err) {\n _iterator16.e(err);\n } finally {\n _iterator16.f();\n }\n } else if (!inputType || inputType !== \"checkbox\" && inputType !== \"radio\" || input.checked) {\n formData.append(inputName, input.value);\n }\n }\n } catch (err) {\n _iterator15.e(err);\n } finally {\n _iterator15.f();\n }\n }\n } // Invoked when there is new progress information about given files.\n // If e is not provided, it is assumed that the upload is finished.\n\n }, {\n key: \"_updateFilesUploadProgress\",\n value: function _updateFilesUploadProgress(files, xhr, e) {\n if (!files[0].upload.chunked) {\n // Handle file uploads without chunking\n var _iterator17 = dropzone_createForOfIteratorHelper(files, true),\n _step17;\n\n try {\n for (_iterator17.s(); !(_step17 = _iterator17.n()).done;) {\n var file = _step17.value;\n\n if (file.upload.total && file.upload.bytesSent && file.upload.bytesSent == file.upload.total) {\n // If both, the `total` and `bytesSent` have already been set, and\n // they are equal (meaning progress is at 100%), we can skip this\n // file, since an upload progress shouldn't go down.\n continue;\n }\n\n if (e) {\n file.upload.progress = 100 * e.loaded / e.total;\n file.upload.total = e.total;\n file.upload.bytesSent = e.loaded;\n } else {\n // No event, so we're at 100%\n file.upload.progress = 100;\n file.upload.bytesSent = file.upload.total;\n }\n\n this.emit(\"uploadprogress\", file, file.upload.progress, file.upload.bytesSent);\n }\n } catch (err) {\n _iterator17.e(err);\n } finally {\n _iterator17.f();\n }\n } else {\n // Handle chunked file uploads\n // Chunked upload is not compatible with uploading multiple files in one\n // request, so we know there's only one file.\n var _file2 = files[0]; // Since this is a chunked upload, we need to update the appropriate chunk\n // progress.\n\n var chunk = this._getChunk(_file2, xhr);\n\n if (e) {\n chunk.progress = 100 * e.loaded / e.total;\n chunk.total = e.total;\n chunk.bytesSent = e.loaded;\n } else {\n // No event, so we're at 100%\n chunk.progress = 100;\n chunk.bytesSent = chunk.total;\n } // Now tally the *file* upload progress from its individual chunks\n\n\n _file2.upload.progress = 0;\n _file2.upload.total = 0;\n _file2.upload.bytesSent = 0;\n\n for (var i = 0; i < _file2.upload.totalChunkCount; i++) {\n if (_file2.upload.chunks[i] && typeof _file2.upload.chunks[i].progress !== \"undefined\") {\n _file2.upload.progress += _file2.upload.chunks[i].progress;\n _file2.upload.total += _file2.upload.chunks[i].total;\n _file2.upload.bytesSent += _file2.upload.chunks[i].bytesSent;\n }\n } // Since the process is a percentage, we need to divide by the amount of\n // chunks we've used.\n\n\n _file2.upload.progress = _file2.upload.progress / _file2.upload.totalChunkCount;\n this.emit(\"uploadprogress\", _file2, _file2.upload.progress, _file2.upload.bytesSent);\n }\n }\n }, {\n key: \"_finishedUploading\",\n value: function _finishedUploading(files, xhr, e) {\n var response;\n\n if (files[0].status === Dropzone.CANCELED) {\n return;\n }\n\n if (xhr.readyState !== 4) {\n return;\n }\n\n if (xhr.responseType !== \"arraybuffer\" && xhr.responseType !== \"blob\") {\n response = xhr.responseText;\n\n if (xhr.getResponseHeader(\"content-type\") && ~xhr.getResponseHeader(\"content-type\").indexOf(\"application/json\")) {\n try {\n response = JSON.parse(response);\n } catch (error) {\n e = error;\n response = \"Invalid JSON response from server.\";\n }\n }\n }\n\n this._updateFilesUploadProgress(files, xhr);\n\n if (!(200 <= xhr.status && xhr.status < 300)) {\n this._handleUploadError(files, xhr, response);\n } else {\n if (files[0].upload.chunked) {\n files[0].upload.finishedChunkUpload(this._getChunk(files[0], xhr), response);\n } else {\n this._finished(files, response, e);\n }\n }\n }\n }, {\n key: \"_handleUploadError\",\n value: function _handleUploadError(files, xhr, response) {\n if (files[0].status === Dropzone.CANCELED) {\n return;\n }\n\n if (files[0].upload.chunked && this.options.retryChunks) {\n var chunk = this._getChunk(files[0], xhr);\n\n if (chunk.retries++ < this.options.retryChunksLimit) {\n this._uploadData(files, [chunk.dataBlock]);\n\n return;\n } else {\n console.warn(\"Retried this chunk too often. Giving up.\");\n }\n }\n\n this._errorProcessing(files, response || this.options.dictResponseError.replace(\"{{statusCode}}\", xhr.status), xhr);\n }\n }, {\n key: \"submitRequest\",\n value: function submitRequest(xhr, formData, files) {\n if (xhr.readyState != 1) {\n console.warn(\"Cannot send this request because the XMLHttpRequest.readyState is not OPENED.\");\n return;\n }\n\n xhr.send(formData);\n } // Called internally when processing is finished.\n // Individual callbacks have to be called in the appropriate sections.\n\n }, {\n key: \"_finished\",\n value: function _finished(files, responseText, e) {\n var _iterator18 = dropzone_createForOfIteratorHelper(files, true),\n _step18;\n\n try {\n for (_iterator18.s(); !(_step18 = _iterator18.n()).done;) {\n var file = _step18.value;\n file.status = Dropzone.SUCCESS;\n this.emit(\"success\", file, responseText, e);\n this.emit(\"complete\", file);\n }\n } catch (err) {\n _iterator18.e(err);\n } finally {\n _iterator18.f();\n }\n\n if (this.options.uploadMultiple) {\n this.emit(\"successmultiple\", files, responseText, e);\n this.emit(\"completemultiple\", files);\n }\n\n if (this.options.autoProcessQueue) {\n return this.processQueue();\n }\n } // Called internally when processing is finished.\n // Individual callbacks have to be called in the appropriate sections.\n\n }, {\n key: \"_errorProcessing\",\n value: function _errorProcessing(files, message, xhr) {\n var _iterator19 = dropzone_createForOfIteratorHelper(files, true),\n _step19;\n\n try {\n for (_iterator19.s(); !(_step19 = _iterator19.n()).done;) {\n var file = _step19.value;\n file.status = Dropzone.ERROR;\n this.emit(\"error\", file, message, xhr);\n this.emit(\"complete\", file);\n }\n } catch (err) {\n _iterator19.e(err);\n } finally {\n _iterator19.f();\n }\n\n if (this.options.uploadMultiple) {\n this.emit(\"errormultiple\", files, message, xhr);\n this.emit(\"completemultiple\", files);\n }\n\n if (this.options.autoProcessQueue) {\n return this.processQueue();\n }\n }\n }], [{\n key: \"initClass\",\n value: function initClass() {\n // Exposing the emitter class, mainly for tests\n this.prototype.Emitter = Emitter;\n /*\n This is a list of all available events you can register on a dropzone object.\n You can register an event handler like this:\n dropzone.on(\"dragEnter\", function() { });\n */\n\n this.prototype.events = [\"drop\", \"dragstart\", \"dragend\", \"dragenter\", \"dragover\", \"dragleave\", \"addedfile\", \"addedfiles\", \"removedfile\", \"thumbnail\", \"error\", \"errormultiple\", \"processing\", \"processingmultiple\", \"uploadprogress\", \"totaluploadprogress\", \"sending\", \"sendingmultiple\", \"success\", \"successmultiple\", \"canceled\", \"canceledmultiple\", \"complete\", \"completemultiple\", \"reset\", \"maxfilesexceeded\", \"maxfilesreached\", \"queuecomplete\"];\n this.prototype._thumbnailQueue = [];\n this.prototype._processingThumbnail = false;\n } // global utility\n\n }, {\n key: \"extend\",\n value: function extend(target) {\n for (var _len2 = arguments.length, objects = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n objects[_key2 - 1] = arguments[_key2];\n }\n\n for (var _i4 = 0, _objects = objects; _i4 < _objects.length; _i4++) {\n var object = _objects[_i4];\n\n for (var key in object) {\n var val = object[key];\n target[key] = val;\n }\n }\n\n return target;\n }\n }, {\n key: \"uuidv4\",\n value: function uuidv4() {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function (c) {\n var r = Math.random() * 16 | 0,\n v = c === \"x\" ? r : r & 0x3 | 0x8;\n return v.toString(16);\n });\n }\n }]);\n\n return Dropzone;\n}(Emitter);\n\n\nDropzone.initClass();\nDropzone.version = \"5.9.3\"; // This is a map of options for your different dropzones. Add configurations\n// to this object for your different dropzone elemens.\n//\n// Example:\n//\n// Dropzone.options.myDropzoneElementId = { maxFilesize: 1 };\n//\n// To disable autoDiscover for a specific element, you can set `false` as an option:\n//\n// Dropzone.options.myDisabledElementId = false;\n//\n// And in html:\n//\n//
    \n\nDropzone.options = {}; // Returns the options for an element or undefined if none available.\n\nDropzone.optionsForElement = function (element) {\n // Get the `Dropzone.options.elementId` for this element if it exists\n if (element.getAttribute(\"id\")) {\n return Dropzone.options[camelize(element.getAttribute(\"id\"))];\n } else {\n return undefined;\n }\n}; // Holds a list of all dropzone instances\n\n\nDropzone.instances = []; // Returns the dropzone for given element if any\n\nDropzone.forElement = function (element) {\n if (typeof element === \"string\") {\n element = document.querySelector(element);\n }\n\n if ((element != null ? element.dropzone : undefined) == null) {\n throw new Error(\"No Dropzone found for given element. This is probably because you're trying to access it before Dropzone had the time to initialize. Use the `init` option to setup any additional observers on your Dropzone.\");\n }\n\n return element.dropzone;\n}; // Set to false if you don't want Dropzone to automatically find and attach to .dropzone elements.\n\n\nDropzone.autoDiscover = true; // Looks for all .dropzone elements and creates a dropzone for them\n\nDropzone.discover = function () {\n var dropzones;\n\n if (document.querySelectorAll) {\n dropzones = document.querySelectorAll(\".dropzone\");\n } else {\n dropzones = []; // IE :(\n\n var checkElements = function checkElements(elements) {\n return function () {\n var result = [];\n\n var _iterator20 = dropzone_createForOfIteratorHelper(elements, true),\n _step20;\n\n try {\n for (_iterator20.s(); !(_step20 = _iterator20.n()).done;) {\n var el = _step20.value;\n\n if (/(^| )dropzone($| )/.test(el.className)) {\n result.push(dropzones.push(el));\n } else {\n result.push(undefined);\n }\n }\n } catch (err) {\n _iterator20.e(err);\n } finally {\n _iterator20.f();\n }\n\n return result;\n }();\n };\n\n checkElements(document.getElementsByTagName(\"div\"));\n checkElements(document.getElementsByTagName(\"form\"));\n }\n\n return function () {\n var result = [];\n\n var _iterator21 = dropzone_createForOfIteratorHelper(dropzones, true),\n _step21;\n\n try {\n for (_iterator21.s(); !(_step21 = _iterator21.n()).done;) {\n var dropzone = _step21.value;\n\n // Create a dropzone unless auto discover has been disabled for specific element\n if (Dropzone.optionsForElement(dropzone) !== false) {\n result.push(new Dropzone(dropzone));\n } else {\n result.push(undefined);\n }\n }\n } catch (err) {\n _iterator21.e(err);\n } finally {\n _iterator21.f();\n }\n\n return result;\n }();\n}; // Some browsers support drag and drog functionality, but not correctly.\n//\n// So I created a blocklist of userAgents. Yes, yes. Browser sniffing, I know.\n// But what to do when browsers *theoretically* support an API, but crash\n// when using it.\n//\n// This is a list of regular expressions tested against navigator.userAgent\n//\n// ** It should only be used on browser that *do* support the API, but\n// incorrectly **\n\n\nDropzone.blockedBrowsers = [// The mac os and windows phone version of opera 12 seems to have a problem with the File drag'n'drop API.\n/opera.*(Macintosh|Windows Phone).*version\\/12/i]; // Checks if the browser is supported\n\nDropzone.isBrowserSupported = function () {\n var capableBrowser = true;\n\n if (window.File && window.FileReader && window.FileList && window.Blob && window.FormData && document.querySelector) {\n if (!(\"classList\" in document.createElement(\"a\"))) {\n capableBrowser = false;\n } else {\n if (Dropzone.blacklistedBrowsers !== undefined) {\n // Since this has been renamed, this makes sure we don't break older\n // configuration.\n Dropzone.blockedBrowsers = Dropzone.blacklistedBrowsers;\n } // The browser supports the API, but may be blocked.\n\n\n var _iterator22 = dropzone_createForOfIteratorHelper(Dropzone.blockedBrowsers, true),\n _step22;\n\n try {\n for (_iterator22.s(); !(_step22 = _iterator22.n()).done;) {\n var regex = _step22.value;\n\n if (regex.test(navigator.userAgent)) {\n capableBrowser = false;\n continue;\n }\n }\n } catch (err) {\n _iterator22.e(err);\n } finally {\n _iterator22.f();\n }\n }\n } else {\n capableBrowser = false;\n }\n\n return capableBrowser;\n};\n\nDropzone.dataURItoBlob = function (dataURI) {\n // convert base64 to raw binary data held in a string\n // doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this\n var byteString = atob(dataURI.split(\",\")[1]); // separate out the mime component\n\n var mimeString = dataURI.split(\",\")[0].split(\":\")[1].split(\";\")[0]; // write the bytes of the string to an ArrayBuffer\n\n var ab = new ArrayBuffer(byteString.length);\n var ia = new Uint8Array(ab);\n\n for (var i = 0, end = byteString.length, asc = 0 <= end; asc ? i <= end : i >= end; asc ? i++ : i--) {\n ia[i] = byteString.charCodeAt(i);\n } // write the ArrayBuffer to a blob\n\n\n return new Blob([ab], {\n type: mimeString\n });\n}; // Returns an array without the rejected item\n\n\nvar without = function without(list, rejectedItem) {\n return list.filter(function (item) {\n return item !== rejectedItem;\n }).map(function (item) {\n return item;\n });\n}; // abc-def_ghi -> abcDefGhi\n\n\nvar camelize = function camelize(str) {\n return str.replace(/[\\-_](\\w)/g, function (match) {\n return match.charAt(1).toUpperCase();\n });\n}; // Creates an element from string\n\n\nDropzone.createElement = function (string) {\n var div = document.createElement(\"div\");\n div.innerHTML = string;\n return div.childNodes[0];\n}; // Tests if given element is inside (or simply is) the container\n\n\nDropzone.elementInside = function (element, container) {\n if (element === container) {\n return true;\n } // Coffeescript doesn't support do/while loops\n\n\n while (element = element.parentNode) {\n if (element === container) {\n return true;\n }\n }\n\n return false;\n};\n\nDropzone.getElement = function (el, name) {\n var element;\n\n if (typeof el === \"string\") {\n element = document.querySelector(el);\n } else if (el.nodeType != null) {\n element = el;\n }\n\n if (element == null) {\n throw new Error(\"Invalid `\".concat(name, \"` option provided. Please provide a CSS selector or a plain HTML element.\"));\n }\n\n return element;\n};\n\nDropzone.getElements = function (els, name) {\n var el, elements;\n\n if (els instanceof Array) {\n elements = [];\n\n try {\n var _iterator23 = dropzone_createForOfIteratorHelper(els, true),\n _step23;\n\n try {\n for (_iterator23.s(); !(_step23 = _iterator23.n()).done;) {\n el = _step23.value;\n elements.push(this.getElement(el, name));\n }\n } catch (err) {\n _iterator23.e(err);\n } finally {\n _iterator23.f();\n }\n } catch (e) {\n elements = null;\n }\n } else if (typeof els === \"string\") {\n elements = [];\n\n var _iterator24 = dropzone_createForOfIteratorHelper(document.querySelectorAll(els), true),\n _step24;\n\n try {\n for (_iterator24.s(); !(_step24 = _iterator24.n()).done;) {\n el = _step24.value;\n elements.push(el);\n }\n } catch (err) {\n _iterator24.e(err);\n } finally {\n _iterator24.f();\n }\n } else if (els.nodeType != null) {\n elements = [els];\n }\n\n if (elements == null || !elements.length) {\n throw new Error(\"Invalid `\".concat(name, \"` option provided. Please provide a CSS selector, a plain HTML element or a list of those.\"));\n }\n\n return elements;\n}; // Asks the user the question and calls accepted or rejected accordingly\n//\n// The default implementation just uses `window.confirm` and then calls the\n// appropriate callback.\n\n\nDropzone.confirm = function (question, accepted, rejected) {\n if (window.confirm(question)) {\n return accepted();\n } else if (rejected != null) {\n return rejected();\n }\n}; // Validates the mime type like this:\n//\n// https://developer.mozilla.org/en-US/docs/HTML/Element/input#attr-accept\n\n\nDropzone.isValidFile = function (file, acceptedFiles) {\n if (!acceptedFiles) {\n return true;\n } // If there are no accepted mime types, it's OK\n\n\n acceptedFiles = acceptedFiles.split(\",\");\n var mimeType = file.type;\n var baseMimeType = mimeType.replace(/\\/.*$/, \"\");\n\n var _iterator25 = dropzone_createForOfIteratorHelper(acceptedFiles, true),\n _step25;\n\n try {\n for (_iterator25.s(); !(_step25 = _iterator25.n()).done;) {\n var validType = _step25.value;\n validType = validType.trim();\n\n if (validType.charAt(0) === \".\") {\n if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) {\n return true;\n }\n } else if (/\\/\\*$/.test(validType)) {\n // This is something like a image/* mime type\n if (baseMimeType === validType.replace(/\\/.*$/, \"\")) {\n return true;\n }\n } else {\n if (mimeType === validType) {\n return true;\n }\n }\n }\n } catch (err) {\n _iterator25.e(err);\n } finally {\n _iterator25.f();\n }\n\n return false;\n}; // Augment jQuery\n\n\nif (typeof jQuery !== \"undefined\" && jQuery !== null) {\n jQuery.fn.dropzone = function (options) {\n return this.each(function () {\n return new Dropzone(this, options);\n });\n };\n} // Dropzone file status codes\n\n\nDropzone.ADDED = \"added\";\nDropzone.QUEUED = \"queued\"; // For backwards compatibility. Now, if a file is accepted, it's either queued\n// or uploading.\n\nDropzone.ACCEPTED = Dropzone.QUEUED;\nDropzone.UPLOADING = \"uploading\";\nDropzone.PROCESSING = Dropzone.UPLOADING; // alias\n\nDropzone.CANCELED = \"canceled\";\nDropzone.ERROR = \"error\";\nDropzone.SUCCESS = \"success\";\n/*\n\n Bugfix for iOS 6 and 7\n Source: http://stackoverflow.com/questions/11929099/html5-canvas-drawimage-ratio-bug-ios\n based on the work of https://github.com/stomita/ios-imagefile-megapixel\n\n */\n// Detecting vertical squash in loaded image.\n// Fixes a bug which squash image vertically while drawing into canvas for some images.\n// This is a bug in iOS6 devices. This function from https://github.com/stomita/ios-imagefile-megapixel\n\nvar detectVerticalSquash = function detectVerticalSquash(img) {\n var iw = img.naturalWidth;\n var ih = img.naturalHeight;\n var canvas = document.createElement(\"canvas\");\n canvas.width = 1;\n canvas.height = ih;\n var ctx = canvas.getContext(\"2d\");\n ctx.drawImage(img, 0, 0);\n\n var _ctx$getImageData = ctx.getImageData(1, 0, 1, ih),\n data = _ctx$getImageData.data; // search image edge pixel position in case it is squashed vertically.\n\n\n var sy = 0;\n var ey = ih;\n var py = ih;\n\n while (py > sy) {\n var alpha = data[(py - 1) * 4 + 3];\n\n if (alpha === 0) {\n ey = py;\n } else {\n sy = py;\n }\n\n py = ey + sy >> 1;\n }\n\n var ratio = py / ih;\n\n if (ratio === 0) {\n return 1;\n } else {\n return ratio;\n }\n}; // A replacement for context.drawImage\n// (args are for source and destination).\n\n\nvar drawImageIOSFix = function drawImageIOSFix(ctx, img, sx, sy, sw, sh, dx, dy, dw, dh) {\n var vertSquashRatio = detectVerticalSquash(img);\n return ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh / vertSquashRatio);\n}; // Based on MinifyJpeg\n// Source: http://www.perry.cz/files/ExifRestorer.js\n// http://elicon.blog57.fc2.com/blog-entry-206.html\n\n\nvar ExifRestore = /*#__PURE__*/function () {\n function ExifRestore() {\n dropzone_classCallCheck(this, ExifRestore);\n }\n\n dropzone_createClass(ExifRestore, null, [{\n key: \"initClass\",\n value: function initClass() {\n this.KEY_STR = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n }\n }, {\n key: \"encode64\",\n value: function encode64(input) {\n var output = \"\";\n var chr1 = undefined;\n var chr2 = undefined;\n var chr3 = \"\";\n var enc1 = undefined;\n var enc2 = undefined;\n var enc3 = undefined;\n var enc4 = \"\";\n var i = 0;\n\n while (true) {\n chr1 = input[i++];\n chr2 = input[i++];\n chr3 = input[i++];\n enc1 = chr1 >> 2;\n enc2 = (chr1 & 3) << 4 | chr2 >> 4;\n enc3 = (chr2 & 15) << 2 | chr3 >> 6;\n enc4 = chr3 & 63;\n\n if (isNaN(chr2)) {\n enc3 = enc4 = 64;\n } else if (isNaN(chr3)) {\n enc4 = 64;\n }\n\n output = output + this.KEY_STR.charAt(enc1) + this.KEY_STR.charAt(enc2) + this.KEY_STR.charAt(enc3) + this.KEY_STR.charAt(enc4);\n chr1 = chr2 = chr3 = \"\";\n enc1 = enc2 = enc3 = enc4 = \"\";\n\n if (!(i < input.length)) {\n break;\n }\n }\n\n return output;\n }\n }, {\n key: \"restore\",\n value: function restore(origFileBase64, resizedFileBase64) {\n if (!origFileBase64.match(\"data:image/jpeg;base64,\")) {\n return resizedFileBase64;\n }\n\n var rawImage = this.decode64(origFileBase64.replace(\"data:image/jpeg;base64,\", \"\"));\n var segments = this.slice2Segments(rawImage);\n var image = this.exifManipulation(resizedFileBase64, segments);\n return \"data:image/jpeg;base64,\".concat(this.encode64(image));\n }\n }, {\n key: \"exifManipulation\",\n value: function exifManipulation(resizedFileBase64, segments) {\n var exifArray = this.getExifArray(segments);\n var newImageArray = this.insertExif(resizedFileBase64, exifArray);\n var aBuffer = new Uint8Array(newImageArray);\n return aBuffer;\n }\n }, {\n key: \"getExifArray\",\n value: function getExifArray(segments) {\n var seg = undefined;\n var x = 0;\n\n while (x < segments.length) {\n seg = segments[x];\n\n if (seg[0] === 255 & seg[1] === 225) {\n return seg;\n }\n\n x++;\n }\n\n return [];\n }\n }, {\n key: \"insertExif\",\n value: function insertExif(resizedFileBase64, exifArray) {\n var imageData = resizedFileBase64.replace(\"data:image/jpeg;base64,\", \"\");\n var buf = this.decode64(imageData);\n var separatePoint = buf.indexOf(255, 3);\n var mae = buf.slice(0, separatePoint);\n var ato = buf.slice(separatePoint);\n var array = mae;\n array = array.concat(exifArray);\n array = array.concat(ato);\n return array;\n }\n }, {\n key: \"slice2Segments\",\n value: function slice2Segments(rawImageArray) {\n var head = 0;\n var segments = [];\n\n while (true) {\n var length;\n\n if (rawImageArray[head] === 255 & rawImageArray[head + 1] === 218) {\n break;\n }\n\n if (rawImageArray[head] === 255 & rawImageArray[head + 1] === 216) {\n head += 2;\n } else {\n length = rawImageArray[head + 2] * 256 + rawImageArray[head + 3];\n var endPoint = head + length + 2;\n var seg = rawImageArray.slice(head, endPoint);\n segments.push(seg);\n head = endPoint;\n }\n\n if (head > rawImageArray.length) {\n break;\n }\n }\n\n return segments;\n }\n }, {\n key: \"decode64\",\n value: function decode64(input) {\n var output = \"\";\n var chr1 = undefined;\n var chr2 = undefined;\n var chr3 = \"\";\n var enc1 = undefined;\n var enc2 = undefined;\n var enc3 = undefined;\n var enc4 = \"\";\n var i = 0;\n var buf = []; // remove all characters that are not A-Z, a-z, 0-9, +, /, or =\n\n var base64test = /[^A-Za-z0-9\\+\\/\\=]/g;\n\n if (base64test.exec(input)) {\n console.warn(\"There were invalid base64 characters in the input text.\\nValid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\\nExpect errors in decoding.\");\n }\n\n input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\n\n while (true) {\n enc1 = this.KEY_STR.indexOf(input.charAt(i++));\n enc2 = this.KEY_STR.indexOf(input.charAt(i++));\n enc3 = this.KEY_STR.indexOf(input.charAt(i++));\n enc4 = this.KEY_STR.indexOf(input.charAt(i++));\n chr1 = enc1 << 2 | enc2 >> 4;\n chr2 = (enc2 & 15) << 4 | enc3 >> 2;\n chr3 = (enc3 & 3) << 6 | enc4;\n buf.push(chr1);\n\n if (enc3 !== 64) {\n buf.push(chr2);\n }\n\n if (enc4 !== 64) {\n buf.push(chr3);\n }\n\n chr1 = chr2 = chr3 = \"\";\n enc1 = enc2 = enc3 = enc4 = \"\";\n\n if (!(i < input.length)) {\n break;\n }\n }\n\n return buf;\n }\n }]);\n\n return ExifRestore;\n}();\n\nExifRestore.initClass();\n/*\n * contentloaded.js\n *\n * Author: Diego Perini (diego.perini at gmail.com)\n * Summary: cross-browser wrapper for DOMContentLoaded\n * Updated: 20101020\n * License: MIT\n * Version: 1.2\n *\n * URL:\n * http://javascript.nwbox.com/ContentLoaded/\n * http://javascript.nwbox.com/ContentLoaded/MIT-LICENSE\n */\n// @win window reference\n// @fn function reference\n\nvar contentLoaded = function contentLoaded(win, fn) {\n var done = false;\n var top = true;\n var doc = win.document;\n var root = doc.documentElement;\n var add = doc.addEventListener ? \"addEventListener\" : \"attachEvent\";\n var rem = doc.addEventListener ? \"removeEventListener\" : \"detachEvent\";\n var pre = doc.addEventListener ? \"\" : \"on\";\n\n var init = function init(e) {\n if (e.type === \"readystatechange\" && doc.readyState !== \"complete\") {\n return;\n }\n\n (e.type === \"load\" ? win : doc)[rem](pre + e.type, init, false);\n\n if (!done && (done = true)) {\n return fn.call(win, e.type || e);\n }\n };\n\n var poll = function poll() {\n try {\n root.doScroll(\"left\");\n } catch (e) {\n setTimeout(poll, 50);\n return;\n }\n\n return init(\"poll\");\n };\n\n if (doc.readyState !== \"complete\") {\n if (doc.createEventObject && root.doScroll) {\n try {\n top = !win.frameElement;\n } catch (error) {}\n\n if (top) {\n poll();\n }\n }\n\n doc[add](pre + \"DOMContentLoaded\", init, false);\n doc[add](pre + \"readystatechange\", init, false);\n return win[add](pre + \"load\", init, false);\n }\n}; // As a single function to be able to write tests.\n\n\nDropzone._autoDiscoverFunction = function () {\n if (Dropzone.autoDiscover) {\n return Dropzone.discover();\n }\n};\n\ncontentLoaded(window, Dropzone._autoDiscoverFunction);\n\nfunction __guard__(value, transform) {\n return typeof value !== \"undefined\" && value !== null ? transform(value) : undefined;\n}\n\nfunction __guardMethod__(obj, methodName, transform) {\n if (typeof obj !== \"undefined\" && obj !== null && typeof obj[methodName] === \"function\") {\n return transform(obj, methodName);\n } else {\n return undefined;\n }\n}\n\n\n;// CONCATENATED MODULE: ./tool/dropzone.dist.js\n /// Make Dropzone a global variable.\n\nwindow.Dropzone = Dropzone;\n/* harmony default export */ var dropzone_dist = (Dropzone);\n\n}();\n/******/ \treturn __nested_webpack_exports__;\n/******/ })()\n;\n});\n\n//# sourceURL=webpack://django-filer/./node_modules/dropzone/dist/dropzone.js?\n}"); - -/***/ }, - -/***/ "./node_modules/mediator-js/lib/mediator.js" -/*!**************************************************!*\ - !*** ./node_modules/mediator-js/lib/mediator.js ***! - \**************************************************/ -(module, exports) { - -eval("{var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*jslint bitwise: true, nomen: true, plusplus: true, white: true */\n\n/*!\n* Mediator.js Library v0.11.0\n* https://github.com/ajacksified/Mediator.js\n*\n* Copyright 2018, Jack Lawson\n* MIT Licensed (http://www.opensource.org/licenses/mit-license.php)\n*\n* For more information: http://thejacklawson.com/2011/06/mediators-for-modularized-asynchronous-programming-in-javascript/index.html\n* Project on GitHub: https://github.com/ajacksified/Mediator.js\n*\n* Last update: 22 Mar 2018\n*/\n\n(function(global, factory) {\n 'use strict';\n\n if (true) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n global.Mediator = factory();\n return global.Mediator;\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else // removed by dead control flow\n{}\n}(this, function() {\n 'use strict';\n\n // We'll generate guids for class instances for easy referencing later on.\n // Subscriber instances will have an id that can be refernced for quick\n // lookups.\n\n function guidGenerator() {\n var S4 = function() {\n return (((1+Math.random())*0x10000)|0).toString(16).substring(1);\n };\n\n return (S4()+S4()+\"-\"+S4()+\"-\"+S4()+\"-\"+S4()+\"-\"+S4()+S4()+S4());\n }\n\n // Subscribers are instances of Mediator Channel registrations. We generate\n // an object instance so that it can be updated later on without having to\n // unregister and re-register. Subscribers are constructed with a function\n // to be called, options object, and context.\n\n function Subscriber(fn, options, context) {\n if (!(this instanceof Subscriber)) {\n return new Subscriber(fn, options, context);\n }\n\n this.id = guidGenerator();\n this.fn = fn;\n this.options = options;\n this.context = context;\n this.channel = null;\n }\n\n // Mediator.update on a subscriber instance can update its function,context,\n // or options object. It takes in an object and looks for fn, context, or\n // options keys.\n Subscriber.prototype.update = function(options) {\n if (options) {\n this.fn = options.fn || this.fn;\n this.context = options.context || this.context;\n this.options = options.options || this.options;\n if (this.channel && this.options && this.options.priority !== undefined) {\n this.channel.setPriority(this.id, this.options.priority);\n }\n }\n }\n\n // A Mediator channel holds a list of sub-channels and subscribers to be fired\n // when Mediator.publish is called on the Mediator instance. It also contains\n // some methods to manipulate its lists of data; only setPriority and\n // StopPropagation are meant to be used. The other methods should be accessed\n // through the Mediator instance.\n\n function Channel(namespace, parent) {\n if (!(this instanceof Channel)) {\n return new Channel(namespace);\n }\n\n this.namespace = namespace || \"\";\n this._subscribers = [];\n this._channels = {};\n this._parent = parent;\n this.stopped = false;\n }\n\n // Sort function for sorting the channels based on their priority. The sort will\n // place the channel with the highest priority in the first place of the array,\n // all other channels will be added in descending order. i.g. a channel with a\n // priority of 9 will be placed before a channel with a priority of 3\n Channel.prototype.channelPrioritySort = function(a, b) {\n if (a.options.priority > b.options.priority) {\n return -1;\n } else if (a.options.priority < b.options.priority) {\n return 1;\n }\n return 0;\n };\n\n Channel.prototype.addSubscriber = function(fn, options, context){\n // Make sure there is always an options object\n if (!options) {\n options = { priority: 0 };\n }\n\n // Cheap hack to either parse as an int or turn it into 0. Runs faster\n // in many browsers than parseInt with the benefit that it won't\n // return a NaN.\n options.priority = options.priority | 0;\n\n var subscriber = new Subscriber(fn, options, context);\n subscriber.channel = this;\n\n this._subscribers.push(subscriber);\n this._subscribers.sort(this.channelPrioritySort);\n\n return subscriber;\n }\n\n // The channel instance is passed as an argument to the mediator subscriber,\n // and further subscriber propagation can be called with\n // channel.StopPropagation().\n Channel.prototype.stopPropagation = function() {\n this.stopped = true;\n }\n\n Channel.prototype.getSubscriber = function(identifier) {\n var x = 0,\n y = this._subscribers.length;\n\n for(x, y; x < y; x++) {\n if (this._subscribers[x].id === identifier || this._subscribers[x].fn === identifier) {\n return this._subscribers[x];\n }\n }\n }\n\n // Channel.setPriority is useful in updating the order in which Subscribers\n // are called, and takes an identifier (subscriber id or named function) and\n // an array index. It will not search recursively through subchannels.\n\n Channel.prototype.setPriority = function(identifier, priority) {\n var x = 0,\n y = this._subscribers.length;\n\n for(; x= 0; x--) {\n if(this._subscribers[x].fn === identifier || this._subscribers[x].id === identifier){\n this._subscribers[x].channel = null;\n this._subscribers.splice(x,1);\n }\n }\n }\n\n // Check if we should attempt to automatically clean up the channel\n if (autoCleanup) {\n this.autoCleanChannel();\n }\n\n var x = this._subscribers.length - 1;\n\n // If we don't pass in an id, we're clearing all\n if (!identifier) {\n this._subscribers = [];\n return;\n }\n\n // Going backwards makes splicing a whole lot easier.\n for(x; x >= 0; x--) {\n if (this._subscribers[x].fn === identifier || this._subscribers[x].id === identifier) {\n this._subscribers[x].channel = null;\n this._subscribers.splice(x,1);\n }\n }\n }\n\n Channel.prototype.autoCleanChannel = function() {\n // First make sure there are no more subscribers, if there are we\n // can stop processing the channel any further\n if (this._subscribers.length !== 0) {\n return;\n }\n\n // Next we need to make sure there are no more sub-channels that\n // have this channel as its parent channel. We try to iterate over the\n // properties of _channels and as soon as we find a property we've\n // set we will stop processing the channel any further\n for (var key in this._channels) {\n if (this._channels.hasOwnProperty(key)) {\n return;\n }\n }\n\n // The last check before we can remove the channel is to see if it\n // has a parent. If there is no parent we don't want to remove this\n // channel\n if (this._parent != null) {\n // We need the ID by which this channel is known to its parent, it should\n // be the last part of the namespace. We need split the namespace up and\n // take its last element to pass along to the removeChannel method\n var path = this.namespace.split(':'),\n channelName = path[path.length - 1];\n // The parent of the current channel to remove this channel\n this._parent.removeChannel(channelName);\n }\n }\n\n Channel.prototype.removeChannel = function(channelName) {\n if (this.hasChannel(channelName)) {\n this._channels[channelName] = null;\n delete this._channels[channelName];\n // After removing a sub-channel we can check if that makes this channel\n // suitable for auto clean up\n this.autoCleanChannel();\n }\n };\n\n\n // This will publish arbitrary arguments to a subscriber and then to parent\n // channels.\n\n Channel.prototype.publish = function(data) {\n var x = 0,\n y = this._subscribers.length,\n shouldCall = false,\n subscriber, l,\n subsBefore,subsAfter;\n\n // Priority is preserved in the _subscribers index.\n for(x, y; x < y; x++) {\n // By default set the flag to false\n shouldCall = false;\n subscriber = this._subscribers[x];\n\n if (!this.stopped) {\n subsBefore = this._subscribers.length;\n if (subscriber.options !== undefined && typeof subscriber.options.predicate === \"function\") {\n if (subscriber.options.predicate.apply(subscriber.context, data)) {\n // The predicate matches, the callback function should be called\n shouldCall = true;\n }\n }else{\n // There is no predicate to match, the callback should always be called\n shouldCall = true;\n }\n }\n\n // Check if the callback should be called\n if (shouldCall) {\n // Check if the subscriber has options and if this include the calls options\n if (subscriber.options && subscriber.options.calls !== undefined) {\n // Decrease the number of calls left by one\n subscriber.options.calls--;\n // Once the number of calls left reaches zero or less we need to remove the subscriber\n if (subscriber.options.calls < 1) {\n this.removeSubscriber(subscriber.id);\n }\n }\n // Now we call the callback, if this in turns publishes to the same channel it will no longer\n // cause the callback to be called as we just removed it as a subscriber\n subscriber.fn.apply(subscriber.context, data);\n\n subsAfter = this._subscribers.length;\n y = subsAfter;\n if (subsAfter === subsBefore - 1) {\n x--;\n }\n }\n }\n\n if (this._parent) {\n this._parent.publish(data);\n }\n\n this.stopped = false;\n }\n\n function Mediator() {\n if (!(this instanceof Mediator)) {\n return new Mediator();\n }\n\n this._channels = new Channel('');\n }\n\n // A Mediator instance is the interface through which events are registered\n // and removed from publish channels.\n\n // Returns a channel instance based on namespace, for example\n // application:chat:message:received. If readOnly is true we\n // will refrain from creating non existing channels.\n Mediator.prototype.getChannel = function(namespace, readOnly) {\n var channel = this._channels,\n namespaceHierarchy = namespace.split(':'),\n x = 0,\n y = namespaceHierarchy.length;\n\n if (namespace === '') {\n return channel;\n }\n\n if (namespaceHierarchy.length > 0) {\n for(x, y; x < y; x++) {\n\n if (!channel.hasChannel(namespaceHierarchy[x])) {\n if (readOnly) {\n break;\n } else {\n channel.addChannel(namespaceHierarchy[x]);\n }\n }\n\n channel = channel.returnChannel(namespaceHierarchy[x]);\n }\n }\n\n return channel;\n }\n\n // Pass in a channel namespace, function to be called, options, and context\n // to call the function in to Subscribe. It will create a channel if one\n // does not exist. Options can include a predicate to determine if it\n // should be called (based on the data published to it) and a priority\n // index.\n\n Mediator.prototype.subscribe = function(channelName, fn, options, context) {\n var channel = this.getChannel(channelName || \"\", false);\n\n options = options || {};\n context = context || {};\n\n return channel.addSubscriber(fn, options, context);\n }\n\n // Pass in a channel namespace, function to be called, options, and context\n // to call the function in to Subscribe. It will create a channel if one\n // does not exist. Options can include a predicate to determine if it\n // should be called (based on the data published to it) and a priority\n // index.\n\n Mediator.prototype.once = function(channelName, fn, options, context) {\n options = options || {};\n options.calls = 1;\n\n return this.subscribe(channelName, fn, options, context);\n }\n\n // Returns a subscriber for a given subscriber id / named function and\n // channel namespace\n\n Mediator.prototype.getSubscriber = function(identifier, channelName) {\n var channel = this.getChannel(channelName || \"\", true);\n // We have to check if channel within the hierarchy exists and if it is\n // an exact match for the requested channel\n if (channel.namespace !== channelName) {\n return null;\n }\n\n return channel.getSubscriber(identifier);\n }\n\n // Remove a subscriber from a given channel namespace recursively based on\n // a passed-in subscriber id or named function.\n\n Mediator.prototype.remove = function(channelName, identifier, autoClean) {\n var channel = this.getChannel(channelName || \"\", true);\n\n if (channel.namespace !== channelName) {\n return false;\n }\n\n channel.removeSubscriber(identifier, autoClean);\n }\n\n\n // Publishes arbitrary data to a given channel namespace. Channels are\n // called recursively downwards; a post to application:chat will post to\n // application:chat:receive and application:chat:derp:test:beta:bananas.\n // Called using Mediator.publish(\"application:chat\", [ args ]);\n\n Mediator.prototype.publish = function(channelName) {\n var channel = this.getChannel(channelName || \"\", false);\n if (channel.namespace !== channelName) {\n return null;\n }\n\n var args = Array.prototype.slice.call(arguments, 1);\n\n args.push(channel);\n\n channel.publish(args);\n }\n\n // Alias some common names for easy interop\n Mediator.prototype.on = Mediator.prototype.subscribe;\n Mediator.prototype.bind = Mediator.prototype.subscribe;\n Mediator.prototype.emit = Mediator.prototype.publish;\n Mediator.prototype.trigger = Mediator.prototype.publish;\n Mediator.prototype.off = Mediator.prototype.remove;\n\n // Finally, expose it all.\n\n Mediator.Channel = Channel;\n Mediator.Subscriber = Subscriber;\n Mediator.version = \"0.10.1\";\n\n return Mediator;\n}));\n\n\n//# sourceURL=webpack://django-filer/./node_modules/mediator-js/lib/mediator.js?\n}"); - -/***/ } - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ id: moduleId, -/******/ loaded: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ if (!(moduleId in __webpack_modules__)) { -/******/ delete __webpack_module_cache__[moduleId]; -/******/ var e = new Error("Cannot find module '" + moduleId + "'"); -/******/ e.code = 'MODULE_NOT_FOUND'; -/******/ throw e; -/******/ } -/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.loaded = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/compat get default export */ -/******/ (() => { -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = (module) => { -/******/ var getter = module && module.__esModule ? -/******/ () => (module['default']) : -/******/ () => (module); -/******/ __webpack_require__.d(getter, { a: getter }); -/******/ return getter; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/harmony module decorator */ -/******/ (() => { -/******/ __webpack_require__.hmd = (module) => { -/******/ module = Object.create(module); -/******/ if (!module.children) module.children = []; -/******/ Object.defineProperty(module, 'exports', { -/******/ enumerable: true, -/******/ set: () => { -/******/ throw new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id); -/******/ } -/******/ }); -/******/ return module; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/************************************************************************/ -/******/ -/******/ // startup -/******/ // Load entry module and return exports -/******/ // This entry module can't be inlined because the eval devtool is used. -/******/ var __webpack_exports__ = __webpack_require__("./filer/static/filer/js/base.js"); -/******/ -/******/ })() -; \ No newline at end of file +/*! For license information please see filer-base.bundle.js.LICENSE.txt */ +(()=>{var e={117(){"use strict";document.addEventListener("DOMContentLoaded",()=>{const e=document.getElementById("destination");if(!e)return;const t=e.querySelectorAll("option"),n=t.length,r=document.querySelector(".js-submit-copy-move"),i=document.querySelector(".js-disabled-btn-tooltip");1===n&&t[0].disabled&&(r&&(r.style.display="none"),i&&(i.style.display="inline-block")),Cl.filerTooltip&&Cl.filerTooltip()})},413(){"use strict";(()=>{const e="filer-dropdown-backdrop",t='[data-toggle="filer-dropdown"]';class n{constructor(e){this.element=e,e.addEventListener("click",()=>this.toggle())}toggle(){const t=this.element,n=r(t),o=n.classList.contains("open"),s={relatedTarget:t};if(t.disabled||t.classList.contains("disabled"))return!1;if(i(),!o){if("ontouchstart"in document.documentElement&&!n.closest(".navbar-nav")){const n=document.createElement("div");n.className=e,t.parentNode.insertBefore(n,t.nextSibling),n.addEventListener("click",i)}const r=new CustomEvent("show.bs.filer-dropdown",{bubbles:!0,cancelable:!0,detail:s});if(n.dispatchEvent(r),r.defaultPrevented)return!1;t.focus(),t.setAttribute("aria-expanded","true"),n.classList.add("open");const o=new CustomEvent("shown.bs.filer-dropdown",{bubbles:!0,detail:s});n.dispatchEvent(o)}return!1}keydown(e){const n=this.element,i=r(n),o=i.classList.contains("open"),s=Array.from(i.querySelectorAll(".filer-dropdown-menu li:not(.disabled):visible a")).filter(e=>null!==e.offsetParent),a=s.indexOf(e.target);if(!/(38|40|27|32)/.test(e.which)||/input|textarea/i.test(e.target.tagName))return;if(e.preventDefault(),e.stopPropagation(),n.disabled||n.classList.contains("disabled"))return;if(!o&&27!==e.which||o&&27===e.which)return 27===e.which&&i.querySelector(t)?.focus(),n.click();if(!s.length)return;let l=a;38===e.which&&a>0&&l--,40===e.which&&ae.remove()),document.querySelectorAll(t).forEach(e=>{const t=r(e),i={relatedTarget:e};if(!t.classList.contains("open"))return;if(n&&"click"===n.type&&/input|textarea/i.test(n.target.tagName)&&t.contains(n.target))return;const o=new CustomEvent("hide.bs.filer-dropdown",{bubbles:!0,cancelable:!0,detail:i});if(t.dispatchEvent(o),o.defaultPrevented)return;e.setAttribute("aria-expanded","false"),t.classList.remove("open");const s=new CustomEvent("hidden.bs.filer-dropdown",{bubbles:!0,detail:i});t.dispatchEvent(s)}))}function o(e){return this.forEach(t=>{let r=t._filerDropdownInstance;r||(r=new n(t),t._filerDropdownInstance=r),"string"==typeof e&&r[e].call(t)}),this}NodeList.prototype.dropdown||(NodeList.prototype.dropdown=function(e){return o.call(this,e)}),HTMLCollection.prototype.dropdown||(HTMLCollection.prototype.dropdown=function(e){return o.call(this,e)}),document.addEventListener("click",i),document.addEventListener("click",e=>{e.target.closest(".filer-dropdown form")&&e.stopPropagation()}),document.addEventListener("click",e=>{const r=e.target.closest(t);if(r){const t=r._filerDropdownInstance||new n(r);r._filerDropdownInstance||(r._filerDropdownInstance=t),t.toggle(e)}}),document.addEventListener("keydown",e=>{const r=e.target.closest(t);if(r){const t=r._filerDropdownInstance||new n(r);r._filerDropdownInstance||(r._filerDropdownInstance=t),t.keydown(e)}}),document.addEventListener("keydown",e=>{const r=e.target.closest(".filer-dropdown-menu");if(r){const i=r.parentNode.querySelector(t);if(i){const t=i._filerDropdownInstance||new n(i);i._filerDropdownInstance||(i._filerDropdownInstance=t),t.keydown(e)}}}),window.FilerDropdown=n})()},577(){!function(){"use strict";const e=document.getElementById("django-admin-popup-response-constants");let t;if(e)switch(t=JSON.parse(e.dataset.popupResponse),t.action){case"change":opener.dismissRelatedImageLookupPopup(window,t.new_value,null,t.obj,null);break;case"delete":opener.dismissDeleteRelatedObjectPopup(window,t.value);break;default:opener.dismissAddRelatedObjectPopup(window,t.value,t.obj)}}()},216(e,t,n){"use strict";n.d(t,{A:()=>r}),e=n.hmd(e),window.Cl=window.Cl||{},(()=>{class t{constructor(e={}){this.options={containerSelector:".js-focal-point",imageSelector:".js-focal-point-image",circleSelector:".js-focal-point-circle",locationSelector:".js-focal-point-location",draggableClass:"draggable",hiddenClass:"hidden",dataLocation:"locationSelector",...e},this.focalPointInstances=[],this._init=this._init.bind(this)}_init(e){const t=new n(e,this.options);this.focalPointInstances.push(t)}initialize(){document.querySelectorAll(this.options.containerSelector).forEach(e=>{this._init(e)}),window.Cl.mediator&&window.Cl.mediator.subscribe("focal-point:init",this._init)}destroy(){window.Cl.mediator&&window.Cl.mediator.remove("focal-point:init",this._init),this.focalPointInstances.forEach(e=>{e.destroy()}),this.focalPointInstances=[]}}class n{constructor(e,t={}){this.options={imageSelector:".js-focal-point-image",circleSelector:".js-focal-point-circle",locationSelector:".js-focal-point-location",draggableClass:"draggable",hiddenClass:"hidden",dataLocation:"locationSelector",...t},this.container=e,this.image=this.container.querySelector(this.options.imageSelector),this.circle=this.container.querySelector(this.options.circleSelector),this.ratio=parseFloat(this.image?.dataset.ratio||1),this.location=this._getLocation(),this.isDragging=!1,this.dragStartX=0,this.dragStartY=0,this.circleStartX=0,this.circleStartY=0,this._onImageLoaded=this._onImageLoaded.bind(this),this._onMouseDown=this._onMouseDown.bind(this),this._onMouseMove=this._onMouseMove.bind(this),this._onMouseUp=this._onMouseUp.bind(this),this.image?.complete?this._onImageLoaded():this.image&&this.image.addEventListener("load",this._onImageLoaded)}_updateLocationValue(e,t){const n=`${Math.round(e*this.ratio)},${Math.round(t*this.ratio)}`;this.location&&(this.location.value=n)}_getLocation(){const e=this.container.dataset[this.options.dataLocation];if(e){const t=document.querySelector(e);if(t)return t}return this.container.querySelector(this.options.locationSelector)}_makeDraggable(){this.circle&&(this.circle.classList.add(this.options.draggableClass),this.circle.addEventListener("mousedown",this._onMouseDown),this.circle.addEventListener("touchstart",this._onMouseDown,{passive:!1}))}_onMouseDown(e){e.preventDefault(),this.isDragging=!0;const t="touchstart"===e.type?e.touches[0]:e,n=this.container.getBoundingClientRect();this.dragStartX=t.clientX-n.left,this.dragStartY=t.clientY-n.top;const r=this.circle.getBoundingClientRect();this.circleStartX=r.left-n.left+r.width/2,this.circleStartY=r.top-n.top+r.height/2,document.addEventListener("mousemove",this._onMouseMove),document.addEventListener("mouseup",this._onMouseUp),document.addEventListener("touchmove",this._onMouseMove,{passive:!1}),document.addEventListener("touchend",this._onMouseUp)}_onMouseMove(e){if(!this.isDragging)return;e.preventDefault();const t="touchmove"===e.type?e.touches[0]:e,n=this.container.getBoundingClientRect(),r=t.clientX-n.left,i=t.clientY-n.top,o=r-this.dragStartX,s=i-this.dragStartY;let a=this.circleStartX+o,l=this.circleStartY+s;a=Math.max(0,Math.min(n.width-1,a)),l=Math.max(0,Math.min(n.height-1,l)),this.circle.style.left=`${a}px`,this.circle.style.top=`${l}px`,this._updateLocationValue(a,l)}_onMouseUp(){this.isDragging=!1,document.removeEventListener("mousemove",this._onMouseMove),document.removeEventListener("mouseup",this._onMouseUp),document.removeEventListener("touchmove",this._onMouseMove),document.removeEventListener("touchend",this._onMouseUp)}_onImageLoaded(){if(!this.image||0===this.image.naturalWidth)return;this.circle?.classList.remove(this.options.hiddenClass);const e=this.location?.value||"",t=this.image.offsetWidth,n=this.image.offsetHeight;let r,i;if(e.length){const t=e.split(",");r=Math.round(Number(t[0])/this.ratio),i=Math.round(Number(t[1])/this.ratio)}else r=t/2,i=n/2;isNaN(r)||isNaN(i)||(this.circle&&(this.circle.style.left=`${r}px`,this.circle.style.top=`${i}px`),this._makeDraggable(),this._updateLocationValue(r,i))}destroy(){this.circle?.classList.contains(this.options.draggableClass)&&(this.circle.removeEventListener("mousedown",this._onMouseDown),this.circle.removeEventListener("touchstart",this._onMouseDown)),document.removeEventListener("mousemove",this._onMouseMove),document.removeEventListener("mouseup",this._onMouseUp),document.removeEventListener("touchmove",this._onMouseMove),document.removeEventListener("touchend",this._onMouseUp),this.image&&this.image.removeEventListener("load",this._onImageLoaded),this.options=null,this.container=null,this.image=null,this.circle=null,this.location=null,this.ratio=null}}window.Cl.FocalPoint=t,window.Cl.FocalPointConstructor=n,e.exports&&(e.exports=t)})();const r=window.Cl.FocalPoint},902(){"use strict";const e=e=>{const t=(e=(e=e.replace(/__dot__/g,".")).replace(/__dash__/g,"-")).lastIndexOf("__");return-1===t?e:e.substring(0,t)};window.dismissPopupAndReload=e=>{document.location.reload(),e.close()},window.dismissRelatedImageLookupPopup=(t,n,r,i,o)=>{const s=e(t.name),a=document.getElementById(s);if(!a)return;const l=a.closest(".filerFile");if(!l)return;const c=l.querySelector(".edit"),u=l.querySelector(".thumbnail_img"),d=l.querySelector(".description_text"),f=l.querySelector(".filerClearer"),p=l.parentElement.querySelector(".dz-message"),h=l.querySelector("input"),v=h.value;h.value=n;const m=h.closest(".js-filer-dropzone");m&&m.classList.add("js-object-attached"),r&&u&&(u.src=r,u.classList.remove("hidden"),u.removeAttribute("srcset")),d&&(d.textContent=i),f&&f.classList.remove("hidden"),a.classList.add("related-lookup-change"),c&&c.classList.add("related-lookup-change"),o&&c&&c.setAttribute("href",`${o}?_edit_from_widget=1`),p&&p.classList.add("hidden"),v!==n&&h.dispatchEvent(new Event("change",{bubbles:!0})),t.close()},window.dismissRelatedFolderLookupPopup=(t,n,r)=>{const i=e(t.name),o=document.getElementById(i);if(!o)return;const s=o.closest(".filerFile");if(!s)return;const a=s.querySelector(".thumbnail_img"),l=document.getElementById(`id_${i}_clear`),c=document.getElementById(`id_${i}`),u=s.querySelector(".description_text"),d=document.getElementById(i);c&&(c.value=n),a&&a.classList.remove("hidden"),u&&(u.textContent=r),l&&l.classList.remove("hidden"),d&&d.classList.add("hidden"),t.close()},document.addEventListener("DOMContentLoaded",()=>{document.querySelectorAll(".js-dismiss-popup").forEach(e=>{e.addEventListener("click",function(e){e.preventDefault();const t=this.dataset.fileId,n=this.dataset.iconUrl,r=this.dataset.label;if(this.classList.contains("js-dismiss-image")){const e=this.dataset.changeUrl||"";window.opener.dismissRelatedImageLookupPopup(window,t,n,r,e)}else this.classList.contains("js-dismiss-folder")&&window.opener.dismissRelatedFolderLookupPopup(window,t,r)})});const e=document.getElementById("popup-dismiss-data");if(e&&window.opener){const t=e.dataset.pk,n=e.dataset.label;window.opener.dismissRelatedPopup(window,t,n)}})},221(){"use strict";window.Cl=window.Cl||{},Cl.filerTooltip=()=>{const e=".js-filer-tooltip";document.querySelectorAll(e).forEach(t=>{t.addEventListener("mouseover",function(){const t=this.getAttribute("title");if(!t)return;this.dataset.filerTooltip=t,this.removeAttribute("title");const n=document.createElement("p");n.className="filer-tooltip",n.textContent=t;const r=document.querySelector(e);r&&r.appendChild(n)}),t.addEventListener("mouseout",function(){const e=this.dataset.filerTooltip;e&&this.setAttribute("title",e),document.querySelectorAll(".filer-tooltip").forEach(e=>{e.remove()})})})}},472(){"use strict";document.addEventListener("DOMContentLoaded",()=>{const e=e=>{e.preventDefault();const t=e.currentTarget,n=t.closest(".filerFile");if(!n)return;const r=n.querySelector("input"),i=n.querySelector(".thumbnail_img"),o=n.querySelector(".description_text"),s=n.querySelector(".lookup"),a=n.querySelector(".edit"),l=n.parentElement.querySelector(".dz-message"),c="hidden";if(t.classList.add(c),r&&(r.value=""),i){i.classList.add(c);var u=i.parentElement;"A"===u.tagName&&u.removeAttribute("href")}s&&s.classList.remove("related-lookup-change"),a&&a.classList.remove("related-lookup-change"),l&&l.classList.remove(c),o&&(o.textContent="")};document.querySelectorAll(".filerFile .vForeignKeyRawIdAdminField").forEach(e=>{e.setAttribute("type","hidden")}),document.querySelectorAll(".filerFile .filerClearer").forEach(t=>{t.addEventListener("click",e)})})},628(e){var t;self,t=function(){return function(){var e={3099:function(e){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},6077:function(e,t,n){var r=n(111);e.exports=function(e){if(!r(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},1223:function(e,t,n){var r=n(5112),i=n(30),o=n(3070),s=r("unscopables"),a=Array.prototype;null==a[s]&&o.f(a,s,{configurable:!0,value:i(null)}),e.exports=function(e){a[s][e]=!0}},1530:function(e,t,n){"use strict";var r=n(8710).charAt;e.exports=function(e,t,n){return t+(n?r(e,t).length:1)}},5787:function(e){e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e}},9670:function(e,t,n){var r=n(111);e.exports=function(e){if(!r(e))throw TypeError(String(e)+" is not an object");return e}},4019:function(e){e.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},260:function(e,t,n){"use strict";var r,i=n(4019),o=n(9781),s=n(7854),a=n(111),l=n(6656),c=n(648),u=n(8880),d=n(1320),f=n(3070).f,p=n(9518),h=n(7674),v=n(5112),m=n(9711),g=s.Int8Array,y=g&&g.prototype,b=s.Uint8ClampedArray,w=b&&b.prototype,x=g&&p(g),E=y&&p(y),S=Object.prototype,k=S.isPrototypeOf,L=v("toStringTag"),A=m("TYPED_ARRAY_TAG"),C=i&&!!h&&"Opera"!==c(s.opera),F=!1,_={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},T={BigInt64Array:8,BigUint64Array:8},I=function(e){if(!a(e))return!1;var t=c(e);return l(_,t)||l(T,t)};for(r in _)s[r]||(C=!1);if((!C||"function"!=typeof x||x===Function.prototype)&&(x=function(){throw TypeError("Incorrect invocation")},C))for(r in _)s[r]&&h(s[r],x);if((!C||!E||E===S)&&(E=x.prototype,C))for(r in _)s[r]&&h(s[r].prototype,E);if(C&&p(w)!==E&&h(w,E),o&&!l(E,L))for(r in F=!0,f(E,L,{get:function(){return a(this)?this[A]:void 0}}),_)s[r]&&u(s[r],A,r);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:C,TYPED_ARRAY_TAG:F&&A,aTypedArray:function(e){if(I(e))return e;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(e){if(h){if(k.call(x,e))return e}else for(var t in _)if(l(_,r)){var n=s[t];if(n&&(e===n||k.call(n,e)))return e}throw TypeError("Target is not a typed array constructor")},exportTypedArrayMethod:function(e,t,n){if(o){if(n)for(var r in _){var i=s[r];i&&l(i.prototype,e)&&delete i.prototype[e]}E[e]&&!n||d(E,e,n?t:C&&y[e]||t)}},exportTypedArrayStaticMethod:function(e,t,n){var r,i;if(o){if(h){if(n)for(r in _)(i=s[r])&&l(i,e)&&delete i[e];if(x[e]&&!n)return;try{return d(x,e,n?t:C&&g[e]||t)}catch(e){}}for(r in _)!(i=s[r])||i[e]&&!n||d(i,e,t)}},isView:function(e){if(!a(e))return!1;var t=c(e);return"DataView"===t||l(_,t)||l(T,t)},isTypedArray:I,TypedArray:x,TypedArrayPrototype:E}},3331:function(e,t,n){"use strict";var r=n(7854),i=n(9781),o=n(4019),s=n(8880),a=n(2248),l=n(7293),c=n(5787),u=n(9958),d=n(7466),f=n(7067),p=n(1179),h=n(9518),v=n(7674),m=n(8006).f,g=n(3070).f,y=n(1285),b=n(8003),w=n(9909),x=w.get,E=w.set,S="ArrayBuffer",k="DataView",L="prototype",A="Wrong index",C=r[S],F=C,_=r[k],T=_&&_[L],I=Object.prototype,M=r.RangeError,R=p.pack,z=p.unpack,q=function(e){return[255&e]},D=function(e){return[255&e,e>>8&255]},j=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},O=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},U=function(e){return R(e,23,4)},P=function(e){return R(e,52,8)},N=function(e,t){g(e[L],t,{get:function(){return x(this)[t]}})},$=function(e,t,n,r){var i=f(n),o=x(e);if(i+t>o.byteLength)throw M(A);var s=x(o.buffer).bytes,a=i+o.byteOffset,l=s.slice(a,a+t);return r?l:l.reverse()},B=function(e,t,n,r,i,o){var s=f(n),a=x(e);if(s+t>a.byteLength)throw M(A);for(var l=x(a.buffer).bytes,c=s+a.byteOffset,u=r(+i),d=0;dG;)(W=Y[G++])in F||s(F,W,C[W]);H.constructor=F}v&&h(T)!==I&&v(T,I);var Q=new _(new F(2)),X=T.setInt8;Q.setInt8(0,2147483648),Q.setInt8(1,2147483649),!Q.getInt8(0)&&Q.getInt8(1)||a(T,{setInt8:function(e,t){X.call(this,e,t<<24>>24)},setUint8:function(e,t){X.call(this,e,t<<24>>24)}},{unsafe:!0})}else F=function(e){c(this,F,S);var t=f(e);E(this,{bytes:y.call(new Array(t),0),byteLength:t}),i||(this.byteLength=t)},_=function(e,t,n){c(this,_,k),c(e,F,k);var r=x(e).byteLength,o=u(t);if(o<0||o>r)throw M("Wrong offset");if(o+(n=void 0===n?r-o:d(n))>r)throw M("Wrong length");E(this,{buffer:e,byteLength:n,byteOffset:o}),i||(this.buffer=e,this.byteLength=n,this.byteOffset=o)},i&&(N(F,"byteLength"),N(_,"buffer"),N(_,"byteLength"),N(_,"byteOffset")),a(_[L],{getInt8:function(e){return $(this,1,e)[0]<<24>>24},getUint8:function(e){return $(this,1,e)[0]},getInt16:function(e){var t=$(this,2,e,arguments.length>1?arguments[1]:void 0);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=$(this,2,e,arguments.length>1?arguments[1]:void 0);return t[1]<<8|t[0]},getInt32:function(e){return O($(this,4,e,arguments.length>1?arguments[1]:void 0))},getUint32:function(e){return O($(this,4,e,arguments.length>1?arguments[1]:void 0))>>>0},getFloat32:function(e){return z($(this,4,e,arguments.length>1?arguments[1]:void 0),23)},getFloat64:function(e){return z($(this,8,e,arguments.length>1?arguments[1]:void 0),52)},setInt8:function(e,t){B(this,1,e,q,t)},setUint8:function(e,t){B(this,1,e,q,t)},setInt16:function(e,t){B(this,2,e,D,t,arguments.length>2?arguments[2]:void 0)},setUint16:function(e,t){B(this,2,e,D,t,arguments.length>2?arguments[2]:void 0)},setInt32:function(e,t){B(this,4,e,j,t,arguments.length>2?arguments[2]:void 0)},setUint32:function(e,t){B(this,4,e,j,t,arguments.length>2?arguments[2]:void 0)},setFloat32:function(e,t){B(this,4,e,U,t,arguments.length>2?arguments[2]:void 0)},setFloat64:function(e,t){B(this,8,e,P,t,arguments.length>2?arguments[2]:void 0)}});b(F,S),b(_,k),e.exports={ArrayBuffer:F,DataView:_}},1048:function(e,t,n){"use strict";var r=n(7908),i=n(1400),o=n(7466),s=Math.min;e.exports=[].copyWithin||function(e,t){var n=r(this),a=o(n.length),l=i(e,a),c=i(t,a),u=arguments.length>2?arguments[2]:void 0,d=s((void 0===u?a:i(u,a))-c,a-l),f=1;for(c0;)c in n?n[l]=n[c]:delete n[l],l+=f,c+=f;return n}},1285:function(e,t,n){"use strict";var r=n(7908),i=n(1400),o=n(7466);e.exports=function(e){for(var t=r(this),n=o(t.length),s=arguments.length,a=i(s>1?arguments[1]:void 0,n),l=s>2?arguments[2]:void 0,c=void 0===l?n:i(l,n);c>a;)t[a++]=e;return t}},8533:function(e,t,n){"use strict";var r=n(2092).forEach,i=n(9341)("forEach");e.exports=i?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}},8457:function(e,t,n){"use strict";var r=n(9974),i=n(7908),o=n(3411),s=n(7659),a=n(7466),l=n(6135),c=n(1246);e.exports=function(e){var t,n,u,d,f,p,h=i(e),v="function"==typeof this?this:Array,m=arguments.length,g=m>1?arguments[1]:void 0,y=void 0!==g,b=c(h),w=0;if(y&&(g=r(g,m>2?arguments[2]:void 0,2)),null==b||v==Array&&s(b))for(n=new v(t=a(h.length));t>w;w++)p=y?g(h[w],w):h[w],l(n,w,p);else for(f=(d=b.call(h)).next,n=new v;!(u=f.call(d)).done;w++)p=y?o(d,g,[u.value,w],!0):u.value,l(n,w,p);return n.length=w,n}},1318:function(e,t,n){var r=n(5656),i=n(7466),o=n(1400),s=function(e){return function(t,n,s){var a,l=r(t),c=i(l.length),u=o(s,c);if(e&&n!=n){for(;c>u;)if((a=l[u++])!=a)return!0}else for(;c>u;u++)if((e||u in l)&&l[u]===n)return e||u||0;return!e&&-1}};e.exports={includes:s(!0),indexOf:s(!1)}},2092:function(e,t,n){var r=n(9974),i=n(8361),o=n(7908),s=n(7466),a=n(5417),l=[].push,c=function(e){var t=1==e,n=2==e,c=3==e,u=4==e,d=6==e,f=7==e,p=5==e||d;return function(h,v,m,g){for(var y,b,w=o(h),x=i(w),E=r(v,m,3),S=s(x.length),k=0,L=g||a,A=t?L(h,S):n||f?L(h,0):void 0;S>k;k++)if((p||k in x)&&(b=E(y=x[k],k,w),e))if(t)A[k]=b;else if(b)switch(e){case 3:return!0;case 5:return y;case 6:return k;case 2:l.call(A,y)}else switch(e){case 4:return!1;case 7:l.call(A,y)}return d?-1:c||u?u:A}};e.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterOut:c(7)}},6583:function(e,t,n){"use strict";var r=n(5656),i=n(9958),o=n(7466),s=n(9341),a=Math.min,l=[].lastIndexOf,c=!!l&&1/[1].lastIndexOf(1,-0)<0,u=s("lastIndexOf"),d=c||!u;e.exports=d?function(e){if(c)return l.apply(this,arguments)||0;var t=r(this),n=o(t.length),s=n-1;for(arguments.length>1&&(s=a(s,i(arguments[1]))),s<0&&(s=n+s);s>=0;s--)if(s in t&&t[s]===e)return s||0;return-1}:l},1194:function(e,t,n){var r=n(7293),i=n(5112),o=n(7392),s=i("species");e.exports=function(e){return o>=51||!r(function(){var t=[];return(t.constructor={})[s]=function(){return{foo:1}},1!==t[e](Boolean).foo})}},9341:function(e,t,n){"use strict";var r=n(7293);e.exports=function(e,t){var n=[][e];return!!n&&r(function(){n.call(null,t||function(){throw 1},1)})}},3671:function(e,t,n){var r=n(3099),i=n(7908),o=n(8361),s=n(7466),a=function(e){return function(t,n,a,l){r(n);var c=i(t),u=o(c),d=s(c.length),f=e?d-1:0,p=e?-1:1;if(a<2)for(;;){if(f in u){l=u[f],f+=p;break}if(f+=p,e?f<0:d<=f)throw TypeError("Reduce of empty array with no initial value")}for(;e?f>=0:d>f;f+=p)f in u&&(l=n(l,u[f],f,c));return l}};e.exports={left:a(!1),right:a(!0)}},5417:function(e,t,n){var r=n(111),i=n(3157),o=n(5112)("species");e.exports=function(e,t){var n;return i(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!i(n.prototype)?r(n)&&null===(n=n[o])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)}},3411:function(e,t,n){var r=n(9670),i=n(9212);e.exports=function(e,t,n,o){try{return o?t(r(n)[0],n[1]):t(n)}catch(t){throw i(e),t}}},7072:function(e,t,n){var r=n(5112)("iterator"),i=!1;try{var o=0,s={next:function(){return{done:!!o++}},return:function(){i=!0}};s[r]=function(){return this},Array.from(s,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var n=!1;try{var o={};o[r]=function(){return{next:function(){return{done:n=!0}}}},e(o)}catch(e){}return n}},4326:function(e){var t={}.toString;e.exports=function(e){return t.call(e).slice(8,-1)}},648:function(e,t,n){var r=n(1694),i=n(4326),o=n(5112)("toStringTag"),s="Arguments"==i(function(){return arguments}());e.exports=r?i:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),o))?n:s?i(t):"Object"==(r=i(t))&&"function"==typeof t.callee?"Arguments":r}},9920:function(e,t,n){var r=n(6656),i=n(3887),o=n(1236),s=n(3070);e.exports=function(e,t){for(var n=i(t),a=s.f,l=o.f,c=0;c=74)&&(r=s.match(/Chrome\/(\d+)/))&&(i=r[1]),e.exports=i&&+i},748:function(e){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},2109:function(e,t,n){var r=n(7854),i=n(1236).f,o=n(8880),s=n(1320),a=n(3505),l=n(9920),c=n(4705);e.exports=function(e,t){var n,u,d,f,p,h=e.target,v=e.global,m=e.stat;if(n=v?r:m?r[h]||a(h,{}):(r[h]||{}).prototype)for(u in t){if(f=t[u],d=e.noTargetGet?(p=i(n,u))&&p.value:n[u],!c(v?u:h+(m?".":"#")+u,e.forced)&&void 0!==d){if(typeof f==typeof d)continue;l(f,d)}(e.sham||d&&d.sham)&&o(f,"sham",!0),s(n,u,f,e)}}},7293:function(e){e.exports=function(e){try{return!!e()}catch(e){return!0}}},7007:function(e,t,n){"use strict";n(4916);var r=n(1320),i=n(7293),o=n(5112),s=n(2261),a=n(8880),l=o("species"),c=!i(function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")}),u="$0"==="a".replace(/./,"$0"),d=o("replace"),f=!!/./[d]&&""===/./[d]("a","$0"),p=!i(function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]});e.exports=function(e,t,n,d){var h=o(e),v=!i(function(){var t={};return t[h]=function(){return 7},7!=""[e](t)}),m=v&&!i(function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[l]=function(){return n},n.flags="",n[h]=/./[h]),n.exec=function(){return t=!0,null},n[h](""),!t});if(!v||!m||"replace"===e&&(!c||!u||f)||"split"===e&&!p){var g=/./[h],y=n(h,""[e],function(e,t,n,r,i){return t.exec===s?v&&!i?{done:!0,value:g.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}},{REPLACE_KEEPS_$0:u,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:f}),b=y[0],w=y[1];r(String.prototype,e,b),r(RegExp.prototype,h,2==t?function(e,t){return w.call(e,this,t)}:function(e){return w.call(e,this)})}d&&a(RegExp.prototype[h],"sham",!0)}},9974:function(e,t,n){var r=n(3099);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}}},5005:function(e,t,n){var r=n(857),i=n(7854),o=function(e){return"function"==typeof e?e:void 0};e.exports=function(e,t){return arguments.length<2?o(r[e])||o(i[e]):r[e]&&r[e][t]||i[e]&&i[e][t]}},1246:function(e,t,n){var r=n(648),i=n(7497),o=n(5112)("iterator");e.exports=function(e){if(null!=e)return e[o]||e["@@iterator"]||i[r(e)]}},8554:function(e,t,n){var r=n(9670),i=n(1246);e.exports=function(e){var t=i(e);if("function"!=typeof t)throw TypeError(String(e)+" is not iterable");return r(t.call(e))}},647:function(e,t,n){var r=n(7908),i=Math.floor,o="".replace,s=/\$([$&'`]|\d\d?|<[^>]*>)/g,a=/\$([$&'`]|\d\d?)/g;e.exports=function(e,t,n,l,c,u){var d=n+e.length,f=l.length,p=a;return void 0!==c&&(c=r(c),p=s),o.call(u,p,function(r,o){var s;switch(o.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,n);case"'":return t.slice(d);case"<":s=c[o.slice(1,-1)];break;default:var a=+o;if(0===a)return r;if(a>f){var u=i(a/10);return 0===u?r:u<=f?void 0===l[u-1]?o.charAt(1):l[u-1]+o.charAt(1):r}s=l[a-1]}return void 0===s?"":s})}},7854:function(e,t,n){var r=function(e){return e&&e.Math==Math&&e};e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},6656:function(e){var t={}.hasOwnProperty;e.exports=function(e,n){return t.call(e,n)}},3501:function(e){e.exports={}},490:function(e,t,n){var r=n(5005);e.exports=r("document","documentElement")},4664:function(e,t,n){var r=n(9781),i=n(7293),o=n(317);e.exports=!r&&!i(function(){return 7!=Object.defineProperty(o("div"),"a",{get:function(){return 7}}).a})},1179:function(e){var t=Math.abs,n=Math.pow,r=Math.floor,i=Math.log,o=Math.LN2;e.exports={pack:function(e,s,a){var l,c,u,d=new Array(a),f=8*a-s-1,p=(1<>1,v=23===s?n(2,-24)-n(2,-77):0,m=e<0||0===e&&1/e<0?1:0,g=0;for((e=t(e))!=e||e===1/0?(c=e!=e?1:0,l=p):(l=r(i(e)/o),e*(u=n(2,-l))<1&&(l--,u*=2),(e+=l+h>=1?v/u:v*n(2,1-h))*u>=2&&(l++,u/=2),l+h>=p?(c=0,l=p):l+h>=1?(c=(e*u-1)*n(2,s),l+=h):(c=e*n(2,h-1)*n(2,s),l=0));s>=8;d[g++]=255&c,c/=256,s-=8);for(l=l<0;d[g++]=255&l,l/=256,f-=8);return d[--g]|=128*m,d},unpack:function(e,t){var r,i=e.length,o=8*i-t-1,s=(1<>1,l=o-7,c=i-1,u=e[c--],d=127&u;for(u>>=7;l>0;d=256*d+e[c],c--,l-=8);for(r=d&(1<<-l)-1,d>>=-l,l+=t;l>0;r=256*r+e[c],c--,l-=8);if(0===d)d=1-a;else{if(d===s)return r?NaN:u?-1/0:1/0;r+=n(2,t),d-=a}return(u?-1:1)*r*n(2,d-t)}}},8361:function(e,t,n){var r=n(7293),i=n(4326),o="".split;e.exports=r(function(){return!Object("z").propertyIsEnumerable(0)})?function(e){return"String"==i(e)?o.call(e,""):Object(e)}:Object},9587:function(e,t,n){var r=n(111),i=n(7674);e.exports=function(e,t,n){var o,s;return i&&"function"==typeof(o=t.constructor)&&o!==n&&r(s=o.prototype)&&s!==n.prototype&&i(e,s),e}},2788:function(e,t,n){var r=n(5465),i=Function.toString;"function"!=typeof r.inspectSource&&(r.inspectSource=function(e){return i.call(e)}),e.exports=r.inspectSource},9909:function(e,t,n){var r,i,o,s=n(8536),a=n(7854),l=n(111),c=n(8880),u=n(6656),d=n(5465),f=n(6200),p=n(3501),h=a.WeakMap;if(s){var v=d.state||(d.state=new h),m=v.get,g=v.has,y=v.set;r=function(e,t){return t.facade=e,y.call(v,e,t),t},i=function(e){return m.call(v,e)||{}},o=function(e){return g.call(v,e)}}else{var b=f("state");p[b]=!0,r=function(e,t){return t.facade=e,c(e,b,t),t},i=function(e){return u(e,b)?e[b]:{}},o=function(e){return u(e,b)}}e.exports={set:r,get:i,has:o,enforce:function(e){return o(e)?i(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!l(t)||(n=i(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}}},7659:function(e,t,n){var r=n(5112),i=n(7497),o=r("iterator"),s=Array.prototype;e.exports=function(e){return void 0!==e&&(i.Array===e||s[o]===e)}},3157:function(e,t,n){var r=n(4326);e.exports=Array.isArray||function(e){return"Array"==r(e)}},4705:function(e,t,n){var r=n(7293),i=/#|\.prototype\./,o=function(e,t){var n=a[s(e)];return n==c||n!=l&&("function"==typeof t?r(t):!!t)},s=o.normalize=function(e){return String(e).replace(i,".").toLowerCase()},a=o.data={},l=o.NATIVE="N",c=o.POLYFILL="P";e.exports=o},111:function(e){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},1913:function(e){e.exports=!1},7850:function(e,t,n){var r=n(111),i=n(4326),o=n(5112)("match");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[o])?!!t:"RegExp"==i(e))}},9212:function(e,t,n){var r=n(9670);e.exports=function(e){var t=e.return;if(void 0!==t)return r(t.call(e)).value}},3383:function(e,t,n){"use strict";var r,i,o,s=n(7293),a=n(9518),l=n(8880),c=n(6656),u=n(5112),d=n(1913),f=u("iterator"),p=!1;[].keys&&("next"in(o=[].keys())?(i=a(a(o)))!==Object.prototype&&(r=i):p=!0);var h=null==r||s(function(){var e={};return r[f].call(e)!==e});h&&(r={}),d&&!h||c(r,f)||l(r,f,function(){return this}),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:p}},7497:function(e){e.exports={}},133:function(e,t,n){var r=n(7293);e.exports=!!Object.getOwnPropertySymbols&&!r(function(){return!String(Symbol())})},590:function(e,t,n){var r=n(7293),i=n(5112),o=n(1913),s=i("iterator");e.exports=!r(function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,n="";return e.pathname="c%20d",t.forEach(function(e,r){t.delete("b"),n+=r+e}),o&&!e.toJSON||!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[s]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==n||"x"!==new URL("http://x",void 0).host})},8536:function(e,t,n){var r=n(7854),i=n(2788),o=r.WeakMap;e.exports="function"==typeof o&&/native code/.test(i(o))},1574:function(e,t,n){"use strict";var r=n(9781),i=n(7293),o=n(1956),s=n(5181),a=n(5296),l=n(7908),c=n(8361),u=Object.assign,d=Object.defineProperty;e.exports=!u||i(function(){if(r&&1!==u({b:1},u(d({},"a",{enumerable:!0,get:function(){d(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach(function(e){t[e]=e}),7!=u({},e)[n]||o(u({},t)).join("")!=i})?function(e,t){for(var n=l(e),i=arguments.length,u=1,d=s.f,f=a.f;i>u;)for(var p,h=c(arguments[u++]),v=d?o(h).concat(d(h)):o(h),m=v.length,g=0;m>g;)p=v[g++],r&&!f.call(h,p)||(n[p]=h[p]);return n}:u},30:function(e,t,n){var r,i=n(9670),o=n(6048),s=n(748),a=n(3501),l=n(490),c=n(317),u=n(6200),d="prototype",f="script",p=u("IE_PROTO"),h=function(){},v=function(e){return"<"+f+">"+e+""},m=function(){try{r=document.domain&&new ActiveXObject("htmlfile")}catch(e){}var e,t,n;m=r?function(e){e.write(v("")),e.close();var t=e.parentWindow.Object;return e=null,t}(r):(t=c("iframe"),n="java"+f+":",t.style.display="none",l.appendChild(t),t.src=String(n),(e=t.contentWindow.document).open(),e.write(v("document.F=Object")),e.close(),e.F);for(var i=s.length;i--;)delete m[d][s[i]];return m()};a[p]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(h[d]=i(e),n=new h,h[d]=null,n[p]=e):n=m(),void 0===t?n:o(n,t)}},6048:function(e,t,n){var r=n(9781),i=n(3070),o=n(9670),s=n(1956);e.exports=r?Object.defineProperties:function(e,t){o(e);for(var n,r=s(t),a=r.length,l=0;a>l;)i.f(e,n=r[l++],t[n]);return e}},3070:function(e,t,n){var r=n(9781),i=n(4664),o=n(9670),s=n(7593),a=Object.defineProperty;t.f=r?a:function(e,t,n){if(o(e),t=s(t,!0),o(n),i)try{return a(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},1236:function(e,t,n){var r=n(9781),i=n(5296),o=n(9114),s=n(5656),a=n(7593),l=n(6656),c=n(4664),u=Object.getOwnPropertyDescriptor;t.f=r?u:function(e,t){if(e=s(e),t=a(t,!0),c)try{return u(e,t)}catch(e){}if(l(e,t))return o(!i.f.call(e,t),e[t])}},8006:function(e,t,n){var r=n(6324),i=n(748).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,i)}},5181:function(e,t){t.f=Object.getOwnPropertySymbols},9518:function(e,t,n){var r=n(6656),i=n(7908),o=n(6200),s=n(8544),a=o("IE_PROTO"),l=Object.prototype;e.exports=s?Object.getPrototypeOf:function(e){return e=i(e),r(e,a)?e[a]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?l:null}},6324:function(e,t,n){var r=n(6656),i=n(5656),o=n(1318).indexOf,s=n(3501);e.exports=function(e,t){var n,a=i(e),l=0,c=[];for(n in a)!r(s,n)&&r(a,n)&&c.push(n);for(;t.length>l;)r(a,n=t[l++])&&(~o(c,n)||c.push(n));return c}},1956:function(e,t,n){var r=n(6324),i=n(748);e.exports=Object.keys||function(e){return r(e,i)}},5296:function(e,t){"use strict";var n={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,i=r&&!n.call({1:2},1);t.f=i?function(e){var t=r(this,e);return!!t&&t.enumerable}:n},7674:function(e,t,n){var r=n(9670),i=n(6077);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,o){return r(n),i(o),t?e.call(n,o):n.__proto__=o,n}}():void 0)},288:function(e,t,n){"use strict";var r=n(1694),i=n(648);e.exports=r?{}.toString:function(){return"[object "+i(this)+"]"}},3887:function(e,t,n){var r=n(5005),i=n(8006),o=n(5181),s=n(9670);e.exports=r("Reflect","ownKeys")||function(e){var t=i.f(s(e)),n=o.f;return n?t.concat(n(e)):t}},857:function(e,t,n){var r=n(7854);e.exports=r},2248:function(e,t,n){var r=n(1320);e.exports=function(e,t,n){for(var i in t)r(e,i,t[i],n);return e}},1320:function(e,t,n){var r=n(7854),i=n(8880),o=n(6656),s=n(3505),a=n(2788),l=n(9909),c=l.get,u=l.enforce,d=String(String).split("String");(e.exports=function(e,t,n,a){var l,c=!!a&&!!a.unsafe,f=!!a&&!!a.enumerable,p=!!a&&!!a.noTargetGet;"function"==typeof n&&("string"!=typeof t||o(n,"name")||i(n,"name",t),(l=u(n)).source||(l.source=d.join("string"==typeof t?t:""))),e!==r?(c?!p&&e[t]&&(f=!0):delete e[t],f?e[t]=n:i(e,t,n)):f?e[t]=n:s(t,n)})(Function.prototype,"toString",function(){return"function"==typeof this&&c(this).source||a(this)})},7651:function(e,t,n){var r=n(4326),i=n(2261);e.exports=function(e,t){var n=e.exec;if("function"==typeof n){var o=n.call(e,t);if("object"!=typeof o)throw TypeError("RegExp exec method returned something other than an Object or null");return o}if("RegExp"!==r(e))throw TypeError("RegExp#exec called on incompatible receiver");return i.call(e,t)}},2261:function(e,t,n){"use strict";var r,i,o=n(7066),s=n(2999),a=RegExp.prototype.exec,l=String.prototype.replace,c=a,u=(r=/a/,i=/b*/g,a.call(r,"a"),a.call(i,"a"),0!==r.lastIndex||0!==i.lastIndex),d=s.UNSUPPORTED_Y||s.BROKEN_CARET,f=void 0!==/()??/.exec("")[1];(u||f||d)&&(c=function(e){var t,n,r,i,s=this,c=d&&s.sticky,p=o.call(s),h=s.source,v=0,m=e;return c&&(-1===(p=p.replace("y","")).indexOf("g")&&(p+="g"),m=String(e).slice(s.lastIndex),s.lastIndex>0&&(!s.multiline||s.multiline&&"\n"!==e[s.lastIndex-1])&&(h="(?: "+h+")",m=" "+m,v++),n=new RegExp("^(?:"+h+")",p)),f&&(n=new RegExp("^"+h+"$(?!\\s)",p)),u&&(t=s.lastIndex),r=a.call(c?n:s,m),c?r?(r.input=r.input.slice(v),r[0]=r[0].slice(v),r.index=s.lastIndex,s.lastIndex+=r[0].length):s.lastIndex=0:u&&r&&(s.lastIndex=s.global?r.index+r[0].length:t),f&&r&&r.length>1&&l.call(r[0],n,function(){for(i=1;i=c?e?"":void 0:(o=a.charCodeAt(l))<55296||o>56319||l+1===c||(s=a.charCodeAt(l+1))<56320||s>57343?e?a.charAt(l):o:e?a.slice(l,l+2):s-56320+(o-55296<<10)+65536}};e.exports={codeAt:o(!1),charAt:o(!0)}},3197:function(e){"use strict";var t=2147483647,n=/[^\0-\u007E]/,r=/[.\u3002\uFF0E\uFF61]/g,i="Overflow: input needs wider integers to process",o=Math.floor,s=String.fromCharCode,a=function(e){return e+22+75*(e<26)},l=function(e,t,n){var r=0;for(e=n?o(e/700):e>>1,e+=o(e/t);e>455;r+=36)e=o(e/35);return o(r+36*e/(e+38))},c=function(e){var n=[];e=function(e){for(var t=[],n=0,r=e.length;n=55296&&i<=56319&&n=d&&co((t-f)/g))throw RangeError(i);for(f+=(m-d)*g,d=m,r=0;rt)throw RangeError(i);if(c==d){for(var y=f,b=36;;b+=36){var w=b<=p?1:b>=p+26?26:b-p;if(y0?n:t)(e)}},7466:function(e,t,n){var r=n(9958),i=Math.min;e.exports=function(e){return e>0?i(r(e),9007199254740991):0}},7908:function(e,t,n){var r=n(4488);e.exports=function(e){return Object(r(e))}},4590:function(e,t,n){var r=n(3002);e.exports=function(e,t){var n=r(e);if(n%t)throw RangeError("Wrong offset");return n}},3002:function(e,t,n){var r=n(9958);e.exports=function(e){var t=r(e);if(t<0)throw RangeError("The argument can't be less than 0");return t}},7593:function(e,t,n){var r=n(111);e.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},1694:function(e,t,n){var r={};r[n(5112)("toStringTag")]="z",e.exports="[object z]"===String(r)},9843:function(e,t,n){"use strict";var r=n(2109),i=n(7854),o=n(9781),s=n(3832),a=n(260),l=n(3331),c=n(5787),u=n(9114),d=n(8880),f=n(7466),p=n(7067),h=n(4590),v=n(7593),m=n(6656),g=n(648),y=n(111),b=n(30),w=n(7674),x=n(8006).f,E=n(7321),S=n(2092).forEach,k=n(6340),L=n(3070),A=n(1236),C=n(9909),F=n(9587),_=C.get,T=C.set,I=L.f,M=A.f,R=Math.round,z=i.RangeError,q=l.ArrayBuffer,D=l.DataView,j=a.NATIVE_ARRAY_BUFFER_VIEWS,O=a.TYPED_ARRAY_TAG,U=a.TypedArray,P=a.TypedArrayPrototype,N=a.aTypedArrayConstructor,$=a.isTypedArray,B="BYTES_PER_ELEMENT",W="Wrong length",H=function(e,t){for(var n=0,r=t.length,i=new(N(e))(r);r>n;)i[n]=t[n++];return i},Y=function(e,t){I(e,t,{get:function(){return _(this)[t]}})},G=function(e){var t;return e instanceof q||"ArrayBuffer"==(t=g(e))||"SharedArrayBuffer"==t},Q=function(e,t){return $(e)&&"symbol"!=typeof t&&t in e&&String(+t)==String(t)},X=function(e,t){return Q(e,t=v(t,!0))?u(2,e[t]):M(e,t)},V=function(e,t,n){return!(Q(e,t=v(t,!0))&&y(n)&&m(n,"value"))||m(n,"get")||m(n,"set")||n.configurable||m(n,"writable")&&!n.writable||m(n,"enumerable")&&!n.enumerable?I(e,t,n):(e[t]=n.value,e)};o?(j||(A.f=X,L.f=V,Y(P,"buffer"),Y(P,"byteOffset"),Y(P,"byteLength"),Y(P,"length")),r({target:"Object",stat:!0,forced:!j},{getOwnPropertyDescriptor:X,defineProperty:V}),e.exports=function(e,t,n){var o=e.match(/\d+$/)[0]/8,a=e+(n?"Clamped":"")+"Array",l="get"+e,u="set"+e,v=i[a],m=v,g=m&&m.prototype,L={},A=function(e,t){I(e,t,{get:function(){return function(e,t){var n=_(e);return n.view[l](t*o+n.byteOffset,!0)}(this,t)},set:function(e){return function(e,t,r){var i=_(e);n&&(r=(r=R(r))<0?0:r>255?255:255&r),i.view[u](t*o+i.byteOffset,r,!0)}(this,t,e)},enumerable:!0})};j?s&&(m=t(function(e,t,n,r){return c(e,m,a),F(y(t)?G(t)?void 0!==r?new v(t,h(n,o),r):void 0!==n?new v(t,h(n,o)):new v(t):$(t)?H(m,t):E.call(m,t):new v(p(t)),e,m)}),w&&w(m,U),S(x(v),function(e){e in m||d(m,e,v[e])}),m.prototype=g):(m=t(function(e,t,n,r){c(e,m,a);var i,s,l,u=0,d=0;if(y(t)){if(!G(t))return $(t)?H(m,t):E.call(m,t);i=t,d=h(n,o);var v=t.byteLength;if(void 0===r){if(v%o)throw z(W);if((s=v-d)<0)throw z(W)}else if((s=f(r)*o)+d>v)throw z(W);l=s/o}else l=p(t),i=new q(s=l*o);for(T(e,{buffer:i,byteOffset:d,byteLength:s,length:l,view:new D(i)});uo;)a[o]=t[o++];return a}},7321:function(e,t,n){var r=n(7908),i=n(7466),o=n(1246),s=n(7659),a=n(9974),l=n(260).aTypedArrayConstructor;e.exports=function(e){var t,n,c,u,d,f,p=r(e),h=arguments.length,v=h>1?arguments[1]:void 0,m=void 0!==v,g=o(p);if(null!=g&&!s(g))for(f=(d=g.call(p)).next,p=[];!(u=f.call(d)).done;)p.push(u.value);for(m&&h>2&&(v=a(v,arguments[2],2)),n=i(p.length),c=new(l(this))(n),t=0;n>t;t++)c[t]=m?v(p[t],t):p[t];return c}},9711:function(e){var t=0,n=Math.random();e.exports=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++t+n).toString(36)}},3307:function(e,t,n){var r=n(133);e.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},5112:function(e,t,n){var r=n(7854),i=n(2309),o=n(6656),s=n(9711),a=n(133),l=n(3307),c=i("wks"),u=r.Symbol,d=l?u:u&&u.withoutSetter||s;e.exports=function(e){return o(c,e)||(a&&o(u,e)?c[e]=u[e]:c[e]=d("Symbol."+e)),c[e]}},1361:function(e){e.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},8264:function(e,t,n){"use strict";var r=n(2109),i=n(7854),o=n(3331),s=n(6340),a="ArrayBuffer",l=o[a];r({global:!0,forced:i[a]!==l},{ArrayBuffer:l}),s(a)},2222:function(e,t,n){"use strict";var r=n(2109),i=n(7293),o=n(3157),s=n(111),a=n(7908),l=n(7466),c=n(6135),u=n(5417),d=n(1194),f=n(5112),p=n(7392),h=f("isConcatSpreadable"),v=9007199254740991,m="Maximum allowed index exceeded",g=p>=51||!i(function(){var e=[];return e[h]=!1,e.concat()[0]!==e}),y=d("concat"),b=function(e){if(!s(e))return!1;var t=e[h];return void 0!==t?!!t:o(e)};r({target:"Array",proto:!0,forced:!g||!y},{concat:function(e){var t,n,r,i,o,s=a(this),d=u(s,0),f=0;for(t=-1,r=arguments.length;tv)throw TypeError(m);for(n=0;n=v)throw TypeError(m);c(d,f++,o)}return d.length=f,d}})},7327:function(e,t,n){"use strict";var r=n(2109),i=n(2092).filter;r({target:"Array",proto:!0,forced:!n(1194)("filter")},{filter:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}})},2772:function(e,t,n){"use strict";var r=n(2109),i=n(1318).indexOf,o=n(9341),s=[].indexOf,a=!!s&&1/[1].indexOf(1,-0)<0,l=o("indexOf");r({target:"Array",proto:!0,forced:a||!l},{indexOf:function(e){return a?s.apply(this,arguments)||0:i(this,e,arguments.length>1?arguments[1]:void 0)}})},6992:function(e,t,n){"use strict";var r=n(5656),i=n(1223),o=n(7497),s=n(9909),a=n(654),l="Array Iterator",c=s.set,u=s.getterFor(l);e.exports=a(Array,"Array",function(e,t){c(this,{type:l,target:r(e),index:0,kind:t})},function(){var e=u(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}},"values"),o.Arguments=o.Array,i("keys"),i("values"),i("entries")},1249:function(e,t,n){"use strict";var r=n(2109),i=n(2092).map;r({target:"Array",proto:!0,forced:!n(1194)("map")},{map:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}})},7042:function(e,t,n){"use strict";var r=n(2109),i=n(111),o=n(3157),s=n(1400),a=n(7466),l=n(5656),c=n(6135),u=n(5112),d=n(1194)("slice"),f=u("species"),p=[].slice,h=Math.max;r({target:"Array",proto:!0,forced:!d},{slice:function(e,t){var n,r,u,d=l(this),v=a(d.length),m=s(e,v),g=s(void 0===t?v:t,v);if(o(d)&&("function"!=typeof(n=d.constructor)||n!==Array&&!o(n.prototype)?i(n)&&null===(n=n[f])&&(n=void 0):n=void 0,n===Array||void 0===n))return p.call(d,m,g);for(r=new(void 0===n?Array:n)(h(g-m,0)),u=0;m9007199254740991)throw TypeError("Maximum allowed length exceeded");for(u=l(m,r),p=0;pg-r+n;p--)delete m[p-1]}else if(n>r)for(p=g-r;p>y;p--)v=p+n-1,(h=p+r-1)in m?m[v]=m[h]:delete m[v];for(p=0;p=n.length?{value:void 0,done:!0}:(e=r(n,i),t.index+=e.length,{value:e,done:!1})})},4723:function(e,t,n){"use strict";var r=n(7007),i=n(9670),o=n(7466),s=n(4488),a=n(1530),l=n(7651);r("match",1,function(e,t,n){return[function(t){var n=s(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var s=i(e),c=String(this);if(!s.global)return l(s,c);var u=s.unicode;s.lastIndex=0;for(var d,f=[],p=0;null!==(d=l(s,c));){var h=String(d[0]);f[p]=h,""===h&&(s.lastIndex=a(c,o(s.lastIndex),u)),p++}return 0===p?null:f}]})},5306:function(e,t,n){"use strict";var r=n(7007),i=n(9670),o=n(7466),s=n(9958),a=n(4488),l=n(1530),c=n(647),u=n(7651),d=Math.max,f=Math.min,p=function(e){return void 0===e?e:String(e)};r("replace",2,function(e,t,n,r){var h=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,v=r.REPLACE_KEEPS_$0,m=h?"$":"$0";return[function(n,r){var i=a(this),o=null==n?void 0:n[e];return void 0!==o?o.call(n,i,r):t.call(String(i),n,r)},function(e,r){if(!h&&v||"string"==typeof r&&-1===r.indexOf(m)){var a=n(t,e,this,r);if(a.done)return a.value}var g=i(e),y=String(this),b="function"==typeof r;b||(r=String(r));var w=g.global;if(w){var x=g.unicode;g.lastIndex=0}for(var E=[];;){var S=u(g,y);if(null===S)break;if(E.push(S),!w)break;""===String(S[0])&&(g.lastIndex=l(y,o(g.lastIndex),x))}for(var k="",L=0,A=0;A=L&&(k+=y.slice(L,F)+R,L=F+C.length)}return k+y.slice(L)}]})},3123:function(e,t,n){"use strict";var r=n(7007),i=n(7850),o=n(9670),s=n(4488),a=n(6707),l=n(1530),c=n(7466),u=n(7651),d=n(2261),f=n(7293),p=[].push,h=Math.min,v=4294967295,m=!f(function(){return!RegExp(v,"y")});r("split",2,function(e,t,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var r=String(s(this)),o=void 0===n?v:n>>>0;if(0===o)return[];if(void 0===e)return[r];if(!i(e))return t.call(r,e,o);for(var a,l,c,u=[],f=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),h=0,m=new RegExp(e.source,f+"g");(a=d.call(m,r))&&!((l=m.lastIndex)>h&&(u.push(r.slice(h,a.index)),a.length>1&&a.index=o));)m.lastIndex===a.index&&m.lastIndex++;return h===r.length?!c&&m.test("")||u.push(""):u.push(r.slice(h)),u.length>o?u.slice(0,o):u}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var i=s(this),o=null==t?void 0:t[e];return void 0!==o?o.call(t,i,n):r.call(String(i),t,n)},function(e,i){var s=n(r,e,this,i,r!==t);if(s.done)return s.value;var d=o(e),f=String(this),p=a(d,RegExp),g=d.unicode,y=(d.ignoreCase?"i":"")+(d.multiline?"m":"")+(d.unicode?"u":"")+(m?"y":"g"),b=new p(m?d:"^(?:"+d.source+")",y),w=void 0===i?v:i>>>0;if(0===w)return[];if(0===f.length)return null===u(b,f)?[f]:[];for(var x=0,E=0,S=[];E2?arguments[2]:void 0)})},8927:function(e,t,n){"use strict";var r=n(260),i=n(2092).every,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("every",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},3105:function(e,t,n){"use strict";var r=n(260),i=n(1285),o=r.aTypedArray;(0,r.exportTypedArrayMethod)("fill",function(e){return i.apply(o(this),arguments)})},5035:function(e,t,n){"use strict";var r=n(260),i=n(2092).filter,o=n(3074),s=r.aTypedArray;(0,r.exportTypedArrayMethod)("filter",function(e){var t=i(s(this),e,arguments.length>1?arguments[1]:void 0);return o(this,t)})},7174:function(e,t,n){"use strict";var r=n(260),i=n(2092).findIndex,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("findIndex",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},4345:function(e,t,n){"use strict";var r=n(260),i=n(2092).find,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("find",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},2846:function(e,t,n){"use strict";var r=n(260),i=n(2092).forEach,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("forEach",function(e){i(o(this),e,arguments.length>1?arguments[1]:void 0)})},4731:function(e,t,n){"use strict";var r=n(260),i=n(1318).includes,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("includes",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},7209:function(e,t,n){"use strict";var r=n(260),i=n(1318).indexOf,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("indexOf",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},6319:function(e,t,n){"use strict";var r=n(7854),i=n(260),o=n(6992),s=n(5112)("iterator"),a=r.Uint8Array,l=o.values,c=o.keys,u=o.entries,d=i.aTypedArray,f=i.exportTypedArrayMethod,p=a&&a.prototype[s],h=!!p&&("values"==p.name||null==p.name),v=function(){return l.call(d(this))};f("entries",function(){return u.call(d(this))}),f("keys",function(){return c.call(d(this))}),f("values",v,!h),f(s,v,!h)},8867:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=[].join;o("join",function(e){return s.apply(i(this),arguments)})},7789:function(e,t,n){"use strict";var r=n(260),i=n(6583),o=r.aTypedArray;(0,r.exportTypedArrayMethod)("lastIndexOf",function(e){return i.apply(o(this),arguments)})},3739:function(e,t,n){"use strict";var r=n(260),i=n(2092).map,o=n(6707),s=r.aTypedArray,a=r.aTypedArrayConstructor;(0,r.exportTypedArrayMethod)("map",function(e){return i(s(this),e,arguments.length>1?arguments[1]:void 0,function(e,t){return new(a(o(e,e.constructor)))(t)})})},4483:function(e,t,n){"use strict";var r=n(260),i=n(3671).right,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("reduceRight",function(e){return i(o(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)})},9368:function(e,t,n){"use strict";var r=n(260),i=n(3671).left,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("reduce",function(e){return i(o(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)})},2056:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=Math.floor;o("reverse",function(){for(var e,t=this,n=i(t).length,r=s(n/2),o=0;o1?arguments[1]:void 0,1),n=this.length,r=s(e),a=i(r.length),c=0;if(a+t>n)throw RangeError("Wrong length");for(;co;)u[o]=n[o++];return u},o(function(){new Int8Array(1).slice()}))},7462:function(e,t,n){"use strict";var r=n(260),i=n(2092).some,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("some",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},3824:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=[].sort;o("sort",function(e){return s.call(i(this),e)})},5021:function(e,t,n){"use strict";var r=n(260),i=n(7466),o=n(1400),s=n(6707),a=r.aTypedArray;(0,r.exportTypedArrayMethod)("subarray",function(e,t){var n=a(this),r=n.length,l=o(e,r);return new(s(n,n.constructor))(n.buffer,n.byteOffset+l*n.BYTES_PER_ELEMENT,i((void 0===t?r:o(t,r))-l))})},2974:function(e,t,n){"use strict";var r=n(7854),i=n(260),o=n(7293),s=r.Int8Array,a=i.aTypedArray,l=i.exportTypedArrayMethod,c=[].toLocaleString,u=[].slice,d=!!s&&o(function(){c.call(new s(1))});l("toLocaleString",function(){return c.apply(d?u.call(a(this)):a(this),arguments)},o(function(){return[1,2].toLocaleString()!=new s([1,2]).toLocaleString()})||!o(function(){s.prototype.toLocaleString.call([1,2])}))},5016:function(e,t,n){"use strict";var r=n(260).exportTypedArrayMethod,i=n(7293),o=n(7854).Uint8Array,s=o&&o.prototype||{},a=[].toString,l=[].join;i(function(){a.call({})})&&(a=function(){return l.call(this)});var c=s.toString!=a;r("toString",a,c)},2472:function(e,t,n){n(9843)("Uint8",function(e){return function(t,n,r){return e(this,t,n,r)}})},4747:function(e,t,n){var r=n(7854),i=n(8324),o=n(8533),s=n(8880);for(var a in i){var l=r[a],c=l&&l.prototype;if(c&&c.forEach!==o)try{s(c,"forEach",o)}catch(e){c.forEach=o}}},3948:function(e,t,n){var r=n(7854),i=n(8324),o=n(6992),s=n(8880),a=n(5112),l=a("iterator"),c=a("toStringTag"),u=o.values;for(var d in i){var f=r[d],p=f&&f.prototype;if(p){if(p[l]!==u)try{s(p,l,u)}catch(e){p[l]=u}if(p[c]||s(p,c,d),i[d])for(var h in o)if(p[h]!==o[h])try{s(p,h,o[h])}catch(e){p[h]=o[h]}}}},1637:function(e,t,n){"use strict";n(6992);var r=n(2109),i=n(5005),o=n(590),s=n(1320),a=n(2248),l=n(8003),c=n(4994),u=n(9909),d=n(5787),f=n(6656),p=n(9974),h=n(648),v=n(9670),m=n(111),g=n(30),y=n(9114),b=n(8554),w=n(1246),x=n(5112),E=i("fetch"),S=i("Headers"),k=x("iterator"),L="URLSearchParams",A=L+"Iterator",C=u.set,F=u.getterFor(L),_=u.getterFor(A),T=/\+/g,I=Array(4),M=function(e){return I[e-1]||(I[e-1]=RegExp("((?:%[\\da-f]{2}){"+e+"})","gi"))},R=function(e){try{return decodeURIComponent(e)}catch(t){return e}},z=function(e){var t=e.replace(T," "),n=4;try{return decodeURIComponent(t)}catch(e){for(;n;)t=t.replace(M(n--),R);return t}},q=/[!'()~]|%20/g,D={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},j=function(e){return D[e]},O=function(e){return encodeURIComponent(e).replace(q,j)},U=function(e,t){if(t)for(var n,r,i=t.split("&"),o=0;o0?arguments[0]:void 0,u=[];if(C(this,{type:L,entries:u,updateURL:function(){},updateSearchParams:P}),void 0!==c)if(m(c))if("function"==typeof(e=w(c)))for(n=(t=e.call(c)).next;!(r=n.call(t)).done;){if((s=(o=(i=b(v(r.value))).next).call(i)).done||(a=o.call(i)).done||!o.call(i).done)throw TypeError("Expected sequence with length 2");u.push({key:s.value+"",value:a.value+""})}else for(l in c)f(c,l)&&u.push({key:l,value:c[l]+""});else U(u,"string"==typeof c?"?"===c.charAt(0)?c.slice(1):c:c+"")},W=B.prototype;a(W,{append:function(e,t){N(arguments.length,2);var n=F(this);n.entries.push({key:e+"",value:t+""}),n.updateURL()},delete:function(e){N(arguments.length,1);for(var t=F(this),n=t.entries,r=e+"",i=0;ie.key){i.splice(t,0,e);break}t===n&&i.push(e)}r.updateURL()},forEach:function(e){for(var t,n=F(this).entries,r=p(e,arguments.length>1?arguments[1]:void 0,3),i=0;i1&&(m(t=arguments[1])&&(n=t.body,h(n)===L&&((r=t.headers?new S(t.headers):new S).has("content-type")||r.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),t=g(t,{body:y(0,String(n)),headers:y(0,r)}))),i.push(t)),E.apply(this,i)}}),e.exports={URLSearchParams:B,getState:F}},285:function(e,t,n){"use strict";n(8783);var r,i=n(2109),o=n(9781),s=n(590),a=n(7854),l=n(6048),c=n(1320),u=n(5787),d=n(6656),f=n(1574),p=n(8457),h=n(8710).codeAt,v=n(3197),m=n(8003),g=n(1637),y=n(9909),b=a.URL,w=g.URLSearchParams,x=g.getState,E=y.set,S=y.getterFor("URL"),k=Math.floor,L=Math.pow,A="Invalid scheme",C="Invalid host",F="Invalid port",_=/[A-Za-z]/,T=/[\d+-.A-Za-z]/,I=/\d/,M=/^(0x|0X)/,R=/^[0-7]+$/,z=/^\d+$/,q=/^[\dA-Fa-f]+$/,D=/[\u0000\t\u000A\u000D #%/:?@[\\]]/,j=/[\u0000\t\u000A\u000D #/:?@[\\]]/,O=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,U=/[\t\u000A\u000D]/g,P=function(e,t){var n,r,i;if("["==t.charAt(0)){if("]"!=t.charAt(t.length-1))return C;if(!(n=$(t.slice(1,-1))))return C;e.host=n}else if(V(e)){if(t=v(t),D.test(t))return C;if(null===(n=N(t)))return C;e.host=n}else{if(j.test(t))return C;for(n="",r=p(t),i=0;i4)return e;for(n=[],r=0;r1&&"0"==i.charAt(0)&&(o=M.test(i)?16:8,i=i.slice(8==o?1:2)),""===i)s=0;else{if(!(10==o?z:8==o?R:q).test(i))return e;s=parseInt(i,o)}n.push(s)}for(r=0;r=L(256,5-t))return null}else if(s>255)return null;for(a=n.pop(),r=0;r6)return;for(r=0;f();){if(i=null,r>0){if(!("."==f()&&r<4))return;d++}if(!I.test(f()))return;for(;I.test(f());){if(o=parseInt(f(),10),null===i)i=o;else{if(0==i)return;i=10*i+o}if(i>255)return;d++}l[c]=256*l[c]+i,2!=++r&&4!=r||c++}if(4!=r)return;break}if(":"==f()){if(d++,!f())return}else if(f())return;l[c++]=t}else{if(null!==u)return;d++,u=++c}}if(null!==u)for(s=c-u,c=7;0!=c&&s>0;)a=l[c],l[c--]=l[u+s-1],l[u+--s]=a;else if(8!=c)return;return l},B=function(e){var t,n,r,i;if("number"==typeof e){for(t=[],n=0;n<4;n++)t.unshift(e%256),e=k(e/256);return t.join(".")}if("object"==typeof e){for(t="",r=function(e){for(var t=null,n=1,r=null,i=0,o=0;o<8;o++)0!==e[o]?(i>n&&(t=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(t=r,n=i),t}(e),n=0;n<8;n++)i&&0===e[n]||(i&&(i=!1),r===n?(t+=n?":":"::",i=!0):(t+=e[n].toString(16),n<7&&(t+=":")));return"["+t+"]"}return e},W={},H=f({},W,{" ":1,'"':1,"<":1,">":1,"`":1}),Y=f({},H,{"#":1,"?":1,"{":1,"}":1}),G=f({},Y,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),Q=function(e,t){var n=h(e,0);return n>32&&n<127&&!d(t,e)?e:encodeURIComponent(e)},X={ftp:21,file:null,http:80,https:443,ws:80,wss:443},V=function(e){return d(X,e.scheme)},K=function(e){return""!=e.username||""!=e.password},Z=function(e){return!e.host||e.cannotBeABaseURL||"file"==e.scheme},J=function(e,t){var n;return 2==e.length&&_.test(e.charAt(0))&&(":"==(n=e.charAt(1))||!t&&"|"==n)},ee=function(e){var t;return e.length>1&&J(e.slice(0,2))&&(2==e.length||"/"===(t=e.charAt(2))||"\\"===t||"?"===t||"#"===t)},te=function(e){var t=e.path,n=t.length;!n||"file"==e.scheme&&1==n&&J(t[0],!0)||t.pop()},ne=function(e){return"."===e||"%2e"===e.toLowerCase()},re=function(e){return".."===(e=e.toLowerCase())||"%2e."===e||".%2e"===e||"%2e%2e"===e},ie={},oe={},se={},ae={},le={},ce={},ue={},de={},fe={},pe={},he={},ve={},me={},ge={},ye={},be={},we={},xe={},Ee={},Se={},ke={},Le=function(e,t,n,i){var o,s,a,l,c=n||ie,u=0,f="",h=!1,v=!1,m=!1;for(n||(e.scheme="",e.username="",e.password="",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,t=t.replace(O,"")),t=t.replace(U,""),o=p(t);u<=o.length;){switch(s=o[u],c){case ie:if(!s||!_.test(s)){if(n)return A;c=se;continue}f+=s.toLowerCase(),c=oe;break;case oe:if(s&&(T.test(s)||"+"==s||"-"==s||"."==s))f+=s.toLowerCase();else{if(":"!=s){if(n)return A;f="",c=se,u=0;continue}if(n&&(V(e)!=d(X,f)||"file"==f&&(K(e)||null!==e.port)||"file"==e.scheme&&!e.host))return;if(e.scheme=f,n)return void(V(e)&&X[e.scheme]==e.port&&(e.port=null));f="","file"==e.scheme?c=ge:V(e)&&i&&i.scheme==e.scheme?c=ae:V(e)?c=de:"/"==o[u+1]?(c=le,u++):(e.cannotBeABaseURL=!0,e.path.push(""),c=Ee)}break;case se:if(!i||i.cannotBeABaseURL&&"#"!=s)return A;if(i.cannotBeABaseURL&&"#"==s){e.scheme=i.scheme,e.path=i.path.slice(),e.query=i.query,e.fragment="",e.cannotBeABaseURL=!0,c=ke;break}c="file"==i.scheme?ge:ce;continue;case ae:if("/"!=s||"/"!=o[u+1]){c=ce;continue}c=fe,u++;break;case le:if("/"==s){c=pe;break}c=xe;continue;case ce:if(e.scheme=i.scheme,s==r)e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query=i.query;else if("/"==s||"\\"==s&&V(e))c=ue;else if("?"==s)e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query="",c=Se;else{if("#"!=s){e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.path.pop(),c=xe;continue}e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query=i.query,e.fragment="",c=ke}break;case ue:if(!V(e)||"/"!=s&&"\\"!=s){if("/"!=s){e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,c=xe;continue}c=pe}else c=fe;break;case de:if(c=fe,"/"!=s||"/"!=f.charAt(u+1))continue;u++;break;case fe:if("/"!=s&&"\\"!=s){c=pe;continue}break;case pe:if("@"==s){h&&(f="%40"+f),h=!0,a=p(f);for(var g=0;g65535)return F;e.port=V(e)&&w===X[e.scheme]?null:w,f=""}if(n)return;c=we;continue}return F}f+=s;break;case ge:if(e.scheme="file","/"==s||"\\"==s)c=ye;else{if(!i||"file"!=i.scheme){c=xe;continue}if(s==r)e.host=i.host,e.path=i.path.slice(),e.query=i.query;else if("?"==s)e.host=i.host,e.path=i.path.slice(),e.query="",c=Se;else{if("#"!=s){ee(o.slice(u).join(""))||(e.host=i.host,e.path=i.path.slice(),te(e)),c=xe;continue}e.host=i.host,e.path=i.path.slice(),e.query=i.query,e.fragment="",c=ke}}break;case ye:if("/"==s||"\\"==s){c=be;break}i&&"file"==i.scheme&&!ee(o.slice(u).join(""))&&(J(i.path[0],!0)?e.path.push(i.path[0]):e.host=i.host),c=xe;continue;case be:if(s==r||"/"==s||"\\"==s||"?"==s||"#"==s){if(!n&&J(f))c=xe;else if(""==f){if(e.host="",n)return;c=we}else{if(l=P(e,f))return l;if("localhost"==e.host&&(e.host=""),n)return;f="",c=we}continue}f+=s;break;case we:if(V(e)){if(c=xe,"/"!=s&&"\\"!=s)continue}else if(n||"?"!=s)if(n||"#"!=s){if(s!=r&&(c=xe,"/"!=s))continue}else e.fragment="",c=ke;else e.query="",c=Se;break;case xe:if(s==r||"/"==s||"\\"==s&&V(e)||!n&&("?"==s||"#"==s)){if(re(f)?(te(e),"/"==s||"\\"==s&&V(e)||e.path.push("")):ne(f)?"/"==s||"\\"==s&&V(e)||e.path.push(""):("file"==e.scheme&&!e.path.length&&J(f)&&(e.host&&(e.host=""),f=f.charAt(0)+":"),e.path.push(f)),f="","file"==e.scheme&&(s==r||"?"==s||"#"==s))for(;e.path.length>1&&""===e.path[0];)e.path.shift();"?"==s?(e.query="",c=Se):"#"==s&&(e.fragment="",c=ke)}else f+=Q(s,Y);break;case Ee:"?"==s?(e.query="",c=Se):"#"==s?(e.fragment="",c=ke):s!=r&&(e.path[0]+=Q(s,W));break;case Se:n||"#"!=s?s!=r&&("'"==s&&V(e)?e.query+="%27":e.query+="#"==s?"%23":Q(s,W)):(e.fragment="",c=ke);break;case ke:s!=r&&(e.fragment+=Q(s,H))}u++}},Ae=function(e){var t,n,r=u(this,Ae,"URL"),i=arguments.length>1?arguments[1]:void 0,s=String(e),a=E(r,{type:"URL"});if(void 0!==i)if(i instanceof Ae)t=S(i);else if(n=Le(t={},String(i)))throw TypeError(n);if(n=Le(a,s,null,t))throw TypeError(n);var l=a.searchParams=new w,c=x(l);c.updateSearchParams(a.query),c.updateURL=function(){a.query=String(l)||null},o||(r.href=Fe.call(r),r.origin=_e.call(r),r.protocol=Te.call(r),r.username=Ie.call(r),r.password=Me.call(r),r.host=Re.call(r),r.hostname=ze.call(r),r.port=qe.call(r),r.pathname=De.call(r),r.search=je.call(r),r.searchParams=Oe.call(r),r.hash=Ue.call(r))},Ce=Ae.prototype,Fe=function(){var e=S(this),t=e.scheme,n=e.username,r=e.password,i=e.host,o=e.port,s=e.path,a=e.query,l=e.fragment,c=t+":";return null!==i?(c+="//",K(e)&&(c+=n+(r?":"+r:"")+"@"),c+=B(i),null!==o&&(c+=":"+o)):"file"==t&&(c+="//"),c+=e.cannotBeABaseURL?s[0]:s.length?"/"+s.join("/"):"",null!==a&&(c+="?"+a),null!==l&&(c+="#"+l),c},_e=function(){var e=S(this),t=e.scheme,n=e.port;if("blob"==t)try{return new URL(t.path[0]).origin}catch(e){return"null"}return"file"!=t&&V(e)?t+"://"+B(e.host)+(null!==n?":"+n:""):"null"},Te=function(){return S(this).scheme+":"},Ie=function(){return S(this).username},Me=function(){return S(this).password},Re=function(){var e=S(this),t=e.host,n=e.port;return null===t?"":null===n?B(t):B(t)+":"+n},ze=function(){var e=S(this).host;return null===e?"":B(e)},qe=function(){var e=S(this).port;return null===e?"":String(e)},De=function(){var e=S(this),t=e.path;return e.cannotBeABaseURL?t[0]:t.length?"/"+t.join("/"):""},je=function(){var e=S(this).query;return e?"?"+e:""},Oe=function(){return S(this).searchParams},Ue=function(){var e=S(this).fragment;return e?"#"+e:""},Pe=function(e,t){return{get:e,set:t,configurable:!0,enumerable:!0}};if(o&&l(Ce,{href:Pe(Fe,function(e){var t=S(this),n=String(e),r=Le(t,n);if(r)throw TypeError(r);x(t.searchParams).updateSearchParams(t.query)}),origin:Pe(_e),protocol:Pe(Te,function(e){var t=S(this);Le(t,String(e)+":",ie)}),username:Pe(Ie,function(e){var t=S(this),n=p(String(e));if(!Z(t)){t.username="";for(var r=0;re.length)&&(t=e.length);for(var n=0,r=new Array(t);n1?r-1:0),o=1;o=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,a=!0,l=!1;return{s:function(){r=t[Symbol.iterator]()},n:function(){var e=r.next();return a=e.done,e},e:function(e){l=!0,s=e},f:function(){try{a||null==r.return||r.return()}finally{if(l)throw s}}}}(n,!0);try{for(a.s();!(s=a.n()).done;)s.value.apply(this,i)}catch(e){a.e(e)}finally{a.f()}}return this.element&&this.element.dispatchEvent(this.makeEvent("dropzone:"+t,{args:i})),this}},{key:"makeEvent",value:function(e,t){var n={bubbles:!0,cancelable:!0,detail:t};if("function"==typeof window.CustomEvent)return new CustomEvent(e,n);var r=document.createEvent("CustomEvent");return r.initCustomEvent(e,n.bubbles,n.cancelable,n.detail),r}},{key:"off",value:function(e,t){if(!this._callbacks||0===arguments.length)return this._callbacks={},this;var n=this._callbacks[e];if(!n)return this;if(1===arguments.length)return delete this._callbacks[e],this;for(var r=0;r=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,l=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return a=e.done,e},e:function(e){l=!0,o=e},f:function(){try{a||null==n.return||n.return()}finally{if(l)throw o}}}}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n'),this.element.appendChild(e));var i=e.getElementsByTagName("span")[0];return i&&(null!=i.textContent?i.textContent=this.options.dictFallbackMessage:null!=i.innerText&&(i.innerText=this.options.dictFallbackMessage)),this.element.appendChild(this.getFallbackForm())},resize:function(e,t,n,r){var i={srcX:0,srcY:0,srcWidth:e.width,srcHeight:e.height},o=e.width/e.height;null==t&&null==n?(t=i.srcWidth,n=i.srcHeight):null==t?t=n*o:null==n&&(n=t/o);var s=(t=Math.min(t,i.srcWidth))/(n=Math.min(n,i.srcHeight));if(i.srcWidth>t||i.srcHeight>n)if("crop"===r)o>s?(i.srcHeight=e.height,i.srcWidth=i.srcHeight*s):(i.srcWidth=e.width,i.srcHeight=i.srcWidth/s);else{if("contain"!==r)throw new Error("Unknown resizeMethod '".concat(r,"'"));o>s?n=t/o:t=n*o}return i.srcX=(e.width-i.srcWidth)/2,i.srcY=(e.height-i.srcHeight)/2,i.trgWidth=t,i.trgHeight=n,i},transformFile:function(e,t){return(this.options.resizeWidth||this.options.resizeHeight)&&e.type.match(/image.*/)?this.resizeImage(e,this.options.resizeWidth,this.options.resizeHeight,this.options.resizeMethod,t):t(e)},previewTemplate:'
    Check
    Error
    ',drop:function(e){return this.element.classList.remove("dz-drag-hover")},dragstart:function(e){},dragend:function(e){return this.element.classList.remove("dz-drag-hover")},dragenter:function(e){return this.element.classList.add("dz-drag-hover")},dragover:function(e){return this.element.classList.add("dz-drag-hover")},dragleave:function(e){return this.element.classList.remove("dz-drag-hover")},paste:function(e){},reset:function(){return this.element.classList.remove("dz-started")},addedfile:function(e){var t=this;if(this.element===this.previewsContainer&&this.element.classList.add("dz-started"),this.previewsContainer&&!this.options.disablePreviews){e.previewElement=y.createElement(this.options.previewTemplate.trim()),e.previewTemplate=e.previewElement,this.previewsContainer.appendChild(e.previewElement);var n,r=o(e.previewElement.querySelectorAll("[data-dz-name]"),!0);try{for(r.s();!(n=r.n()).done;){var i=n.value;i.textContent=e.name}}catch(e){r.e(e)}finally{r.f()}var s,a=o(e.previewElement.querySelectorAll("[data-dz-size]"),!0);try{for(a.s();!(s=a.n()).done;)(i=s.value).innerHTML=this.filesize(e.size)}catch(e){a.e(e)}finally{a.f()}this.options.addRemoveLinks&&(e._removeLink=y.createElement('
    '.concat(this.options.dictRemoveFile,"")),e.previewElement.appendChild(e._removeLink));var l,c=function(n){return n.preventDefault(),n.stopPropagation(),e.status===y.UPLOADING?y.confirm(t.options.dictCancelUploadConfirmation,function(){return t.removeFile(e)}):t.options.dictRemoveFileConfirmation?y.confirm(t.options.dictRemoveFileConfirmation,function(){return t.removeFile(e)}):t.removeFile(e)},u=o(e.previewElement.querySelectorAll("[data-dz-remove]"),!0);try{for(u.s();!(l=u.n()).done;)l.value.addEventListener("click",c)}catch(e){u.e(e)}finally{u.f()}}},removedfile:function(e){return null!=e.previewElement&&null!=e.previewElement.parentNode&&e.previewElement.parentNode.removeChild(e.previewElement),this._updateMaxFilesReachedClass()},thumbnail:function(e,t){if(e.previewElement){e.previewElement.classList.remove("dz-file-preview");var n,r=o(e.previewElement.querySelectorAll("[data-dz-thumbnail]"),!0);try{for(r.s();!(n=r.n()).done;){var i=n.value;i.alt=e.name,i.src=t}}catch(e){r.e(e)}finally{r.f()}return setTimeout(function(){return e.previewElement.classList.add("dz-image-preview")},1)}},error:function(e,t){if(e.previewElement){e.previewElement.classList.add("dz-error"),"string"!=typeof t&&t.error&&(t=t.error);var n,r=o(e.previewElement.querySelectorAll("[data-dz-errormessage]"),!0);try{for(r.s();!(n=r.n()).done;)n.value.textContent=t}catch(e){r.e(e)}finally{r.f()}}},errormultiple:function(){},processing:function(e){if(e.previewElement&&(e.previewElement.classList.add("dz-processing"),e._removeLink))return e._removeLink.innerHTML=this.options.dictCancelUpload},processingmultiple:function(){},uploadprogress:function(e,t,n){if(e.previewElement){var r,i=o(e.previewElement.querySelectorAll("[data-dz-uploadprogress]"),!0);try{for(i.s();!(r=i.n()).done;){var s=r.value;"PROGRESS"===s.nodeName?s.value=t:s.style.width="".concat(t,"%")}}catch(e){i.e(e)}finally{i.f()}}},totaluploadprogress:function(){},sending:function(){},sendingmultiple:function(){},success:function(e){if(e.previewElement)return e.previewElement.classList.add("dz-success")},successmultiple:function(){},canceled:function(e){return this.emit("error",e,this.options.dictUploadCanceled)},canceledmultiple:function(){},complete:function(e){if(e._removeLink&&(e._removeLink.innerHTML=this.options.dictRemoveFile),e.previewElement)return e.previewElement.classList.add("dz-complete")},completemultiple:function(){},maxfilesexceeded:function(){},maxfilesreached:function(){},queuecomplete:function(){},addedfiles:function(){}};function l(e){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l(e)}function c(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return u(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?u(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return s=e.done,e},e:function(e){a=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n"))),this.clickableElements.length&&function t(){e.hiddenFileInput&&e.hiddenFileInput.parentNode.removeChild(e.hiddenFileInput),e.hiddenFileInput=document.createElement("input"),e.hiddenFileInput.setAttribute("type","file"),(null===e.options.maxFiles||e.options.maxFiles>1)&&e.hiddenFileInput.setAttribute("multiple","multiple"),e.hiddenFileInput.className="dz-hidden-input",null!==e.options.acceptedFiles&&e.hiddenFileInput.setAttribute("accept",e.options.acceptedFiles),null!==e.options.capture&&e.hiddenFileInput.setAttribute("capture",e.options.capture),e.hiddenFileInput.setAttribute("tabindex","-1"),e.hiddenFileInput.style.visibility="hidden",e.hiddenFileInput.style.position="absolute",e.hiddenFileInput.style.top="0",e.hiddenFileInput.style.left="0",e.hiddenFileInput.style.height="0",e.hiddenFileInput.style.width="0",o.getElement(e.options.hiddenInputContainer,"hiddenInputContainer").appendChild(e.hiddenFileInput),e.hiddenFileInput.addEventListener("change",function(){var n=e.hiddenFileInput.files;if(n.length){var r,i=c(n,!0);try{for(i.s();!(r=i.n()).done;){var o=r.value;e.addFile(o)}}catch(e){i.e(e)}finally{i.f()}}e.emit("addedfiles",n),t()})}(),this.URL=null!==window.URL?window.URL:window.webkitURL;var t,n=c(this.events,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.on(r,this.options[r])}}catch(e){n.e(e)}finally{n.f()}this.on("uploadprogress",function(){return e.updateTotalUploadProgress()}),this.on("removedfile",function(){return e.updateTotalUploadProgress()}),this.on("canceled",function(t){return e.emit("complete",t)}),this.on("complete",function(t){if(0===e.getAddedFiles().length&&0===e.getUploadingFiles().length&&0===e.getQueuedFiles().length)return setTimeout(function(){return e.emit("queuecomplete")},0)});var i=function(e){if(function(e){if(e.dataTransfer.types)for(var t=0;t")),n+='');var r=o.createElement(n);return"FORM"!==this.element.tagName?(t=o.createElement('
    '))).appendChild(r):(this.element.setAttribute("enctype","multipart/form-data"),this.element.setAttribute("method",this.options.method)),null!=t?t:r}},{key:"getExistingFallback",value:function(){for(var e=function(e){var t,n=c(e,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;if(/(^| )fallback($| )/.test(r.className))return r}}catch(e){n.e(e)}finally{n.f()}},t=0,n=["div","form"];t0){for(var r=["tb","gb","mb","kb","b"],i=0;i=Math.pow(this.options.filesizeBase,4-i)/10){t=e/Math.pow(this.options.filesizeBase,4-i),n=o;break}}t=Math.round(10*t)/10}return"".concat(t," ").concat(this.options.dictFileSizeUnits[n])}},{key:"_updateMaxFilesReachedClass",value:function(){return null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(this.getAcceptedFiles().length===this.options.maxFiles&&this.emit("maxfilesreached",this.files),this.element.classList.add("dz-max-files-reached")):this.element.classList.remove("dz-max-files-reached")}},{key:"drop",value:function(e){if(e.dataTransfer){this.emit("drop",e);for(var t=[],n=0;n0){var i,o=c(r,!0);try{for(o.s();!(i=o.n()).done;){var s=i.value;s.isFile?s.file(function(e){if(!n.options.ignoreHiddenFiles||"."!==e.name.substring(0,1))return e.fullPath="".concat(t,"/").concat(e.name),n.addFile(e)}):s.isDirectory&&n._addFilesFromDirectory(s,"".concat(t,"/").concat(s.name))}}catch(e){o.e(e)}finally{o.f()}e()}return null},i)}()}},{key:"accept",value:function(e,t){this.options.maxFilesize&&e.size>1024*this.options.maxFilesize*1024?t(this.options.dictFileTooBig.replace("{{filesize}}",Math.round(e.size/1024/10.24)/100).replace("{{maxFilesize}}",this.options.maxFilesize)):o.isValidFile(e,this.options.acceptedFiles)?null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(t(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}",this.options.maxFiles)),this.emit("maxfilesexceeded",e)):this.options.accept.call(this,e,t):t(this.options.dictInvalidFileType)}},{key:"addFile",value:function(e){var t=this;e.upload={uuid:o.uuidv4(),progress:0,total:e.size,bytesSent:0,filename:this._renameFile(e)},this.files.push(e),e.status=o.ADDED,this.emit("addedfile",e),this._enqueueThumbnail(e),this.accept(e,function(n){n?(e.accepted=!1,t._errorProcessing([e],n)):(e.accepted=!0,t.options.autoQueue&&t.enqueueFile(e)),t._updateMaxFilesReachedClass()})}},{key:"enqueueFiles",value:function(e){var t,n=c(e,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.enqueueFile(r)}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"enqueueFile",value:function(e){var t=this;if(e.status!==o.ADDED||!0!==e.accepted)throw new Error("This file can't be queued because it has already been processed or was rejected.");if(e.status=o.QUEUED,this.options.autoProcessQueue)return setTimeout(function(){return t.processQueue()},0)}},{key:"_enqueueThumbnail",value:function(e){var t=this;if(this.options.createImageThumbnails&&e.type.match(/image.*/)&&e.size<=1024*this.options.maxThumbnailFilesize*1024)return this._thumbnailQueue.push(e),setTimeout(function(){return t._processThumbnailQueue()},0)}},{key:"_processThumbnailQueue",value:function(){var e=this;if(!this._processingThumbnail&&0!==this._thumbnailQueue.length){this._processingThumbnail=!0;var t=this._thumbnailQueue.shift();return this.createThumbnail(t,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,!0,function(n){return e.emit("thumbnail",t,n),e._processingThumbnail=!1,e._processThumbnailQueue()})}}},{key:"removeFile",value:function(e){if(e.status===o.UPLOADING&&this.cancelUpload(e),this.files=b(this.files,e),this.emit("removedfile",e),0===this.files.length)return this.emit("reset")}},{key:"removeAllFiles",value:function(e){null==e&&(e=!1);var t,n=c(this.files.slice(),!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;(r.status!==o.UPLOADING||e)&&this.removeFile(r)}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"resizeImage",value:function(e,t,n,r,i){var s=this;return this.createThumbnail(e,t,n,r,!0,function(t,n){if(null==n)return i(e);var r=s.options.resizeMimeType;null==r&&(r=e.type);var a=n.toDataURL(r,s.options.resizeQuality);return"image/jpeg"!==r&&"image/jpg"!==r||(a=E.restore(e.dataURL,a)),i(o.dataURItoBlob(a))})}},{key:"createThumbnail",value:function(e,t,n,r,i,o){var s=this,a=new FileReader;a.onload=function(){e.dataURL=a.result,"image/svg+xml"!==e.type?s.createThumbnailFromUrl(e,t,n,r,i,o):null!=o&&o(a.result)},a.readAsDataURL(e)}},{key:"displayExistingFile",value:function(e,t,n,r){var i=this,o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4];this.emit("addedfile",e),this.emit("complete",e),o?(e.dataURL=t,this.createThumbnailFromUrl(e,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,this.options.fixOrientation,function(t){i.emit("thumbnail",e,t),n&&n()},r)):(this.emit("thumbnail",e,t),n&&n())}},{key:"createThumbnailFromUrl",value:function(e,t,n,r,i,o,s){var a=this,l=document.createElement("img");return s&&(l.crossOrigin=s),i="from-image"!=getComputedStyle(document.body).imageOrientation&&i,l.onload=function(){var s=function(e){return e(1)};return"undefined"!=typeof EXIF&&null!==EXIF&&i&&(s=function(e){return EXIF.getData(l,function(){return e(EXIF.getTag(this,"Orientation"))})}),s(function(i){e.width=l.width,e.height=l.height;var s=a.options.resize.call(a,e,t,n,r),c=document.createElement("canvas"),u=c.getContext("2d");switch(c.width=s.trgWidth,c.height=s.trgHeight,i>4&&(c.width=s.trgHeight,c.height=s.trgWidth),i){case 2:u.translate(c.width,0),u.scale(-1,1);break;case 3:u.translate(c.width,c.height),u.rotate(Math.PI);break;case 4:u.translate(0,c.height),u.scale(1,-1);break;case 5:u.rotate(.5*Math.PI),u.scale(1,-1);break;case 6:u.rotate(.5*Math.PI),u.translate(0,-c.width);break;case 7:u.rotate(.5*Math.PI),u.translate(c.height,-c.width),u.scale(-1,1);break;case 8:u.rotate(-.5*Math.PI),u.translate(-c.height,0)}x(u,l,null!=s.srcX?s.srcX:0,null!=s.srcY?s.srcY:0,s.srcWidth,s.srcHeight,null!=s.trgX?s.trgX:0,null!=s.trgY?s.trgY:0,s.trgWidth,s.trgHeight);var d=c.toDataURL("image/png");if(null!=o)return o(d,c)})},null!=o&&(l.onerror=o),l.src=e.dataURL}},{key:"processQueue",value:function(){var e=this.options.parallelUploads,t=this.getUploadingFiles().length,n=t;if(!(t>=e)){var r=this.getQueuedFiles();if(r.length>0){if(this.options.uploadMultiple)return this.processFiles(r.slice(0,e-t));for(;n1?t-1:0),r=1;rt.options.chunkSize),e[0].upload.totalChunkCount=Math.ceil(r.size/t.options.chunkSize)}if(e[0].upload.chunked){var i=e[0],s=n[0];i.upload.chunks=[];var a=function(){for(var n=0;void 0!==i.upload.chunks[n];)n++;if(!(n>=i.upload.totalChunkCount)){var r=n*t.options.chunkSize,a=Math.min(r+t.options.chunkSize,s.size),l={name:t._getParamName(0),data:s.webkitSlice?s.webkitSlice(r,a):s.slice(r,a),filename:i.upload.filename,chunkIndex:n};i.upload.chunks[n]={file:i,index:n,dataBlock:l,status:o.UPLOADING,progress:0,retries:0},t._uploadData(e,[l])}};if(i.upload.finishedChunkUpload=function(n,r){var s=!0;n.status=o.SUCCESS,n.dataBlock=null,n.xhr=null;for(var l=0;l1?t-1:0),r=1;r=s;a?o++:o--)i[o]=t.charCodeAt(o);return new Blob([r],{type:n})};var b=function(e,t){return e.filter(function(e){return e!==t}).map(function(e){return e})},w=function(e){return e.replace(/[\-_](\w)/g,function(e){return e.charAt(1).toUpperCase()})};y.createElement=function(e){var t=document.createElement("div");return t.innerHTML=e,t.childNodes[0]},y.elementInside=function(e,t){if(e===t)return!0;for(;e=e.parentNode;)if(e===t)return!0;return!1},y.getElement=function(e,t){var n;if("string"==typeof e?n=document.querySelector(e):null!=e.nodeType&&(n=e),null==n)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector or a plain HTML element."));return n},y.getElements=function(e,t){var n,r;if(e instanceof Array){r=[];try{var i,o=c(e,!0);try{for(o.s();!(i=o.n()).done;)n=i.value,r.push(this.getElement(n,t))}catch(e){o.e(e)}finally{o.f()}}catch(e){r=null}}else if("string"==typeof e){r=[];var s,a=c(document.querySelectorAll(e),!0);try{for(a.s();!(s=a.n()).done;)n=s.value,r.push(n)}catch(e){a.e(e)}finally{a.f()}}else null!=e.nodeType&&(r=[e]);if(null==r||!r.length)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector, a plain HTML element or a list of those."));return r},y.confirm=function(e,t,n){return window.confirm(e)?t():null!=n?n():void 0},y.isValidFile=function(e,t){if(!t)return!0;t=t.split(",");var n,r=e.type,i=r.replace(/\/.*$/,""),o=c(t,!0);try{for(o.s();!(n=o.n()).done;){var s=n.value;if("."===(s=s.trim()).charAt(0)){if(-1!==e.name.toLowerCase().indexOf(s.toLowerCase(),e.name.length-s.length))return!0}else if(/\/\*$/.test(s)){if(i===s.replace(/\/.*$/,""))return!0}else if(r===s)return!0}}catch(e){o.e(e)}finally{o.f()}return!1},"undefined"!=typeof jQuery&&null!==jQuery&&(jQuery.fn.dropzone=function(e){return this.each(function(){return new y(this,e)})}),y.ADDED="added",y.QUEUED="queued",y.ACCEPTED=y.QUEUED,y.UPLOADING="uploading",y.PROCESSING=y.UPLOADING,y.CANCELED="canceled",y.ERROR="error",y.SUCCESS="success";var x=function(e,t,n,r,i,o,s,a,l,c){var u=function(e){e.naturalWidth;var t=e.naturalHeight,n=document.createElement("canvas");n.width=1,n.height=t;var r=n.getContext("2d");r.drawImage(e,0,0);for(var i=r.getImageData(1,0,1,t).data,o=0,s=t,a=t;a>o;)0===i[4*(a-1)+3]?s=a:o=a,a=s+o>>1;var l=a/t;return 0===l?1:l}(t);return e.drawImage(t,n,r,i,o,s,a,l,c/u)},E=function(){function e(){d(this,e)}return p(e,null,[{key:"initClass",value:function(){this.KEY_STR="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}},{key:"encode64",value:function(e){for(var t="",n=void 0,r=void 0,i="",o=void 0,s=void 0,a=void 0,l="",c=0;o=(n=e[c++])>>2,s=(3&n)<<4|(r=e[c++])>>4,a=(15&r)<<2|(i=e[c++])>>6,l=63&i,isNaN(r)?a=l=64:isNaN(i)&&(l=64),t=t+this.KEY_STR.charAt(o)+this.KEY_STR.charAt(s)+this.KEY_STR.charAt(a)+this.KEY_STR.charAt(l),n=r=i="",o=s=a=l="",ce.length)break}return n}},{key:"decode64",value:function(e){var t=void 0,n=void 0,r="",i=void 0,o=void 0,s="",a=0,l=[];for(/[^A-Za-z0-9\+\/\=]/g.exec(e)&&console.warn("There were invalid base64 characters in the input text.\nValid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\nExpect errors in decoding."),e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");t=this.KEY_STR.indexOf(e.charAt(a++))<<2|(i=this.KEY_STR.indexOf(e.charAt(a++)))>>4,n=(15&i)<<4|(o=this.KEY_STR.indexOf(e.charAt(a++)))>>2,r=(3&o)<<6|(s=this.KEY_STR.indexOf(e.charAt(a++))),l.push(t),64!==o&&l.push(n),64!==s&&l.push(r),t=n=r="",i=o=s="",at.options.priority?-1:e.options.priority=0;n--)this._subscribers[n].fn!==e&&this._subscribers[n].id!==e||(this._subscribers[n].channel=null,this._subscribers.splice(n,1));else this._subscribers=[];if(t&&this.autoCleanChannel(),n=this._subscribers.length-1,e)for(;n>=0;n--)this._subscribers[n].fn!==e&&this._subscribers[n].id!==e||(this._subscribers[n].channel=null,this._subscribers.splice(n,1));else this._subscribers=[]},t.prototype.autoCleanChannel=function(){if(0===this._subscribers.length){for(var e in this._channels)if(this._channels.hasOwnProperty(e))return;if(null!=this._parent){var t=this.namespace.split(":"),n=t[t.length-1];this._parent.removeChannel(n)}}},t.prototype.removeChannel=function(e){this.hasChannel(e)&&(this._channels[e]=null,delete this._channels[e],this.autoCleanChannel())},t.prototype.publish=function(e){for(var t,n,r,i=0,o=this._subscribers.length,s=!1;i0)for(;i{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";var e=n(295),t=n.n(e),r=n(216);window.Cl=window.Cl||{};class i{constructor(e={}){this.options={linksSelector:".js-toggler-link",dataHeaderSelector:"toggler-header-selector",dataContentSelector:"toggler-content-selector",collapsedClass:"js-collapsed",expandedClass:"js-expanded",hiddenClass:"hidden",...e},this.togglerInstances=[],document.querySelectorAll(this.options.linksSelector).forEach(e=>{const t=new o(e,this.options);this.togglerInstances.push(t)})}destroy(){this.links=null,this.togglerInstances.forEach(e=>e.destroy()),this.togglerInstances=[]}}class o{constructor(e,t={}){this.options={...t},this.link=e,this.headerSelector=this.link.dataset[this.options.dataHeaderSelector],this.contentSelector=this.link.dataset[this.options.dataContentSelector],this.header=document.querySelector(this.headerSelector),this.header=this.header||this.link,this.content=document.querySelector(this.contentSelector),this.content&&this._initLink()}_updateClasses(){this.content.classList.contains(this.options.hiddenClass)?(this.header.classList.remove(this.options.expandedClass),this.header.classList.add(this.options.collapsedClass)):(this.header.classList.add(this.options.expandedClass),this.header.classList.remove(this.options.collapsedClass))}_onTogglerClick(e){this.content.classList.toggle(this.options.hiddenClass),this._updateClasses(),e.preventDefault()}_initLink(){this._updateClasses(),this.link.addEventListener("click",e=>this._onTogglerClick(e))}destroy(){this.options=null,this.link=null}}Cl.Toggler=i,Cl.TogglerConstructor=o;const s=i;n(413);var a=n(628),l=n.n(a);document.addEventListener("DOMContentLoaded",()=>{let e=0,t=1;const n=document.querySelector(".js-upload-button");if(!n)return;const r=document.querySelector(".js-upload-button-disabled"),i=n.dataset.url;if(!i)return;const o=document.querySelector(".js-filer-dropzone-upload-welcome"),s=document.querySelector(".js-filer-dropzone-upload-info-container"),a=document.querySelector(".js-filer-dropzone-upload-info"),c=document.querySelector(".js-filer-dropzone-upload-number"),u=".js-filer-dropzone-progress",d=document.querySelector(".js-filer-dropzone-upload-success"),f=document.querySelector(".js-filer-dropzone-upload-canceled"),p=document.querySelector(".js-filer-dropzone-cancel"),h=document.querySelector(".js-filer-dropzone-info-message"),v="hidden",m=parseInt(n.dataset.maxUploaderConnections||3,10),g=parseInt(n.dataset.maxFilesize||0,10);let y=!1;const b=()=>{c&&(c.textContent=`${t-e}/${t}`)},w=()=>{n&&n.remove()},x=()=>{const e=window.location.toString();window.location.replace(((e,t,n)=>{const r=new RegExp(`([?&])${t}=.*?(&|$)`,"i"),i=-1!==e.indexOf("?")?"&":"?",o=window.location.hash;return(e=e.replace(/#.*$/,"")).match(r)?e.replace(r,`$1${t}=${n}$2`)+o:e+i+t+"="+n+o})(e,"order_by","-modified_at"))};let E;Cl.mediator.subscribe("filer-upload-in-progress",w),n.addEventListener("click",e=>{e.preventDefault()}),l().autoDiscover=!1;try{E=new(l())(n,{url:i,paramName:"file",maxFilesize:g,parallelUploads:m,clickable:n,previewTemplate:"
    ",addRemoveLinks:!1,autoProcessQueue:!0})}catch(e){return void console.error("[Filer Upload] Failed to create Dropzone instance:",e)}E.on("addedfile",n=>{Cl.mediator.remove("filer-upload-in-progress",w),Cl.mediator.publish("filer-upload-in-progress"),e++,t=E.files.length,h&&h.classList.remove(v),o&&o.classList.add(v),d&&d.classList.add(v),s&&s.classList.remove(v),p&&p.classList.remove(v),f&&f.classList.add(v),b()}),E.on("uploadprogress",(e,t)=>{const n=Math.round(t),r=`file-${encodeURIComponent(e.name)}${e.size}${e.lastModified}`,i=document.getElementById(r);let o;if(i){const e=i.querySelector(u);e&&(e.style.width=`${n}%`)}else if(a){o=a.cloneNode(!0);const t=o.querySelector(".js-filer-dropzone-file-name");t&&(t.textContent=e.name);const i=o.querySelector(u);i&&(i.style.width=`${n}%`),o.classList.remove(v),o.setAttribute("id",r),s&&s.appendChild(o)}}),E.on("success",(n,r)=>{const i=`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}`,s=document.getElementById(i);s&&s.remove(),r.error&&(y=!0,window.filerShowError(`${n.name}: ${r.error}`)),e--,b(),0===e&&(t=1,o&&o.classList.add(v),c&&c.classList.add(v),f&&f.classList.add(v),p&&p.classList.add(v),d&&d.classList.remove(v),y?setTimeout(x,1e3):x())}),E.on("error",(n,r)=>{const i=`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}`,s=document.getElementById(i);s&&s.remove(),y=!0,window.filerShowError(`${n.name}: ${r}`),e--,b(),0===e&&(t=1,o&&o.classList.add(v),c&&c.classList.add(v),f&&f.classList.add(v),p&&p.classList.add(v),d&&d.classList.remove(v),setTimeout(x,1e3))}),p&&p.addEventListener("click",e=>{e.preventDefault(),p.classList.add(v),c&&c.classList.add(v),s&&s.classList.add(v),f&&f.classList.remove(v),setTimeout(()=>{window.location.reload()},1e3)}),r&&Cl.filerTooltip&&Cl.filerTooltip(),document.dispatchEvent(new Event("filer-upload-scripts-executed"))}),l()&&(l().autoDiscover=!1),document.addEventListener("DOMContentLoaded",()=>{const e=".js-img-preview",t=".js-filer-dropzone:not(.js-filer-dropzone-base):not(.js-filer-dropzone-folder):not(.js-filer-dropzone-info-message)",n=document.querySelectorAll(t),r=".js-filer-dropzone-progress",i=".js-img-wrapper",o="hidden",s="filer-dropzone-mobile",a="js-object-attached",c=e=>{e.offsetWidth<500?e.classList.add(s):e.classList.remove(s)},u=e=>{try{window.parent.CMS.API.Messages.open({message:e})}catch{window.filerShowError?window.filerShowError(e):alert(e)}},d=function(t){const n=t.dataset.url,s=t.querySelector(".vForeignKeyRawIdAdminField"),d="image"===s?.getAttribute("name"),f=t.querySelector(".js-related-lookup"),p=t.querySelector(".js-related-edit"),h=t.querySelector(".js-filer-dropzone-message"),v=t.querySelector(".filerClearer"),m=t.querySelector(".js-file-selector");t.dropzone||(window.addEventListener("resize",()=>{c(t)}),new(l())(t,{url:n,paramName:"file",maxFiles:1,maxFilesize:t.dataset.maxFilesize,previewTemplate:document.querySelector(".js-filer-dropzone-template")?.innerHTML||"
    ",clickable:!1,addRemoveLinks:!1,init:function(){c(t),this.on("removedfile",()=>{m&&(m.style.display=""),t.classList.remove(a),this.removeAllFiles(),v?.click()}),this.element.querySelectorAll("img").forEach(e=>{e.addEventListener("dragstart",e=>{e.preventDefault()})}),v&&v.addEventListener("click",()=>{t.classList.remove(a)})},maxfilesexceeded:function(){this.removeAllFiles(!0)},drop:function(){this.removeAllFiles(!0),v?.click();const e=t.querySelector(r);e&&e.classList.remove(o),m&&(m.style.display="block"),f?.classList.add("related-lookup-change"),p?.classList.add("related-lookup-change"),h?.classList.add(o),t.classList.remove("dz-drag-hover"),t.classList.add(a)},success:function(n,a){const l=t.querySelector(r);if(l&&l.classList.add(o),n&&"success"===n.status&&a){if(a.file_id&&s){s.value=a.file_id;const e=new Event("change",{bubbles:!0});s.dispatchEvent(e)}if(a.thumbnail_180&&d){const n=t.querySelector(e);n&&(n.style.backgroundImage=`url(${a.thumbnail_180})`);const r=t.querySelector(i);r&&r.classList.remove(o)}}else a&&a.error&&u(`${n.name}: ${a.error}`),this.removeAllFiles(!0);this.element.querySelectorAll("img").forEach(e=>{e.addEventListener("dragstart",e=>{e.preventDefault()})})},error:function(e,t,n){n&&n.error&&(t+=` ; ${n.error}`),u(`${e.name}: ${t}`),this.removeAllFiles(!0)},reset:function(){if(d){const n=t.querySelector(i);n&&n.classList.add(o);const r=t.querySelector(e);r&&(r.style.backgroundImage="none")}if(t.classList.remove(a),s&&(s.value=""),f?.classList.remove("related-lookup-change"),p?.classList.remove("related-lookup-change"),h?.classList.remove(o),s){const e=new Event("change",{bubbles:!0});s.dispatchEvent(e)}}}))};n.length&&l()&&(window.filerDropzoneInitialized||(window.filerDropzoneInitialized=!0,l().autoDiscover=!1),n.forEach(d),document.addEventListener("formset:added",e=>{let n,r,i;e.detail&&e.detail.formsetName?(r=parseInt(document.getElementById(`id_${e.detail.formsetName}-TOTAL_FORMS`).value,10)-1,i=document.getElementById(`${e.detail.formsetName}-${r}`),n=i?.querySelectorAll(t)||[]):(i=e.target,n=i?.querySelectorAll(t)||[]),n?.forEach(d)}))}),document.addEventListener("DOMContentLoaded",()=>{let e=0,t=0;const n=[],r=document.querySelector(".js-filer-dropzone-base"),i=".js-filer-dropzone";let o;const s=document.querySelector(".js-filer-dropzone-info-message"),a=document.querySelector(".js-filer-dropzone-folder-name"),c=document.querySelector(".js-filer-dropzone-upload-info-container"),u=document.querySelector(".js-filer-dropzone-upload-info"),d=document.querySelector(".js-filer-dropzone-upload-welcome"),f=document.querySelector(".js-filer-dropzone-upload-number"),p=document.querySelector(".js-filer-upload-count"),h=document.querySelector(".js-filer-upload-text"),v=".js-filer-dropzone-progress",m=document.querySelector(".js-filer-dropzone-upload-success"),g=document.querySelector(".js-filer-dropzone-upload-canceled"),y=document.querySelector(".js-filer-dropzone-cancel"),b="dz-drag-hover",w=document.querySelector(".drag-hover-border"),x="hidden";let E,S,k,L=!1;const A=()=>{const e=window.location.toString();window.location.replace(((e,t,n)=>{const r=new RegExp(`([?&])${t}=.*?(&|$)`,"i"),i=-1!==e.indexOf("?")?"&":"?",o=window.location.hash;return(e=e.replace(/#.*$/,"")).match(r)?e.replace(r,`$1${t}=${n}$2`)+o:e+i+t+"="+n+o})(e,"order_by","-modified_at"))},C=()=>{f&&(f.textContent=`${t-e}/${t}`),h&&h.classList.remove("hidden"),p&&p.classList.remove("hidden")},F=()=>{n.forEach(e=>{e.destroy()})},_=(e,t)=>document.getElementById(`file-${encodeURIComponent(e.name)}${e.size}${e.lastModified}${t}`);if(r){S=r.dataset.url,k=r.dataset.folderName;const e=document.body;e.dataset.url=S,e.dataset.folderName=k,e.dataset.maxFiles=r.dataset.maxFiles,e.dataset.maxFilesize=r.dataset.maxFilesize,e.classList.add("js-filer-dropzone"),console.log("[Filer DnD] dropzoneBase found, url:",S,"folder:",k)}else console.log("[Filer DnD] No .js-filer-dropzone-base element found on page");Cl.mediator.subscribe("filer-upload-in-progress",F),o=document.querySelectorAll(i),console.log("[Filer DnD] Found",o.length,"dropzone elements (.js-filer-dropzone)"),o.length&&l()?(l().autoDiscover=!1,o.forEach(r=>{if(r.dropzone)return void console.log("[Filer DnD] Skipping element (already has dropzone):",r.tagName,r.className);const p=r.dataset.url;console.log("[Filer DnD] Creating Dropzone instance for",r.tagName,"url:",p,"maxFiles:",r.dataset.maxFiles,"maxFilesize:",r.dataset.maxFilesize);const h=new(l())(r,{url:p,paramName:"file",maxFiles:parseInt(r.dataset.maxFiles)||100,maxFilesize:parseInt(r.dataset.maxFilesize),previewTemplate:"
    ",clickable:!1,addRemoveLinks:!1,parallelUploads:r.dataset["max-uploader-connections"]||3,accept:(n,r)=>{let i;if(console.log("[Filer DnD] accept:",n.name,"url:",p),Cl.mediator.remove("filer-upload-in-progress",F),Cl.mediator.publish("filer-upload-in-progress"),clearTimeout(E),clearTimeout(E),d&&d.classList.add(x),y&&y.classList.remove(x),_(n,p))r("duplicate");else{i=u.cloneNode(!0);const o=i.querySelector(".js-filer-dropzone-file-name");o&&(o.textContent=n.name);const s=i.querySelector(v);s&&(s.style.width="0"),i.setAttribute("id",`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}${p}`),c&&c.appendChild(i),e++,t++,console.log("[Filer DnD] file accepted, submitNum:",e,"maxSubmitNum:",t),C(),r()}o.forEach(e=>e.classList.remove("reset-hover")),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b))},dragover:e=>{const t=e.target.closest(i),n=t?.dataset.folderName,l=r.classList.contains("js-filer-dropzone-folder"),c=r.getBoundingClientRect(),u=w?window.getComputedStyle(w):null,d=u?u.borderTopWidth:"0px",f=u?u.borderLeftWidth:"0px",p={top:`${c.top}px`,bottom:`${c.bottom}px`,left:`${c.left}px`,right:`${c.right}px`,width:c.width-2*parseInt(f,10)+"px",height:c.height-2*parseInt(d,10)+"px",display:"block"};l&&w&&Object.assign(w.style,p),o.forEach(e=>e.classList.add("reset-hover")),m&&m.classList.add(x),s&&s.classList.remove(x),r.classList.add(b),r.classList.remove("reset-hover"),a&&n&&(a.textContent=n)},dragend:()=>{clearTimeout(E),E=setTimeout(()=>{s&&s.classList.add(x)},1e3),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b)),w&&Object.assign(w.style,{top:"0",bottom:"0",width:"0",height:"0"})},dragleave:()=>{clearTimeout(E),E=setTimeout(()=>{s&&s.classList.add(x)},1e3),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b)),w&&Object.assign(w.style,{top:"0",bottom:"0",width:"0",height:"0"})},sending:e=>{console.log("[Filer DnD] sending:",e.name,"to:",p);const t=_(e,p);t&&t.classList.remove(x)},uploadprogress:(e,t)=>{const n=_(e,p);if(n){const e=n.querySelector(v);e&&(e.style.width=`${t}%`)}},success:(t,n)=>{e--,console.log("[Filer DnD] success:",t.name,"submitNum:",e,"response:",n),C();const r=_(t,p);r&&r.remove()},queuecomplete:()=>{console.log("[Filer DnD] queuecomplete: submitNum:",e,"hasErrors:",L),0===e?(C(),y&&y.classList.add(x),u&&u.classList.add(x),L?(f&&f.classList.add(x),console.log("[Filer DnD] reloading after errors (1s delay)"),setTimeout(()=>{A()},1e3)):(m&&m.classList.remove(x),console.log("[Filer DnD] reloading now via reloadOrdered"),A())):console.warn("[Filer DnD] queuecomplete: submitNum is not 0, skipping reload")},error:(t,n)=>{if(console.error("[Filer DnD] error:",t.name,"error:",n,"submitNum:",e),"duplicate"===n)return void console.log("[Filer DnD] duplicate file, ignoring");e--,console.log("[Filer DnD] after error decrement, submitNum:",e),C();const r=_(t,p);r&&r.remove(),L=!0,window.filerShowError&&window.filerShowError(`${t.name}: ${n.message||n}`)}});n.push(h),y&&y.addEventListener("click",e=>{e.preventDefault(),y.classList.add(x),g&&g.classList.remove(x),h.removeAllFiles(!0)})})):console.warn("[Filer DnD] No dropzone instances created. dropzones.length:",o.length,"Dropzone:",!!l())}),n(117),n(221),n(472),n(902),n(577),window.Cl=window.Cl||{},Cl.mediator=new(t()),Cl.FocalPoint=r.A,Cl.Toggler=s,document.addEventListener("DOMContentLoaded",()=>{let e;window.filerShowError=t=>{const n=document.querySelector(".messagelist"),r=document.querySelector("#header"),i="js-filer-error",o=`
    • {msg}
    `.replace("{msg}",t);n?n.outerHTML=o:r&&r.insertAdjacentHTML("afterend",o),e&&clearTimeout(e),e=setTimeout(()=>{const e=document.querySelector(`.${i}`);e&&e.remove()},5e3)};const t=document.querySelector(".js-filter-files");t&&(t.addEventListener("focus",e=>{const t=e.target.closest(".navigator-top-nav");t&&t.classList.add("search-is-focused")}),t.addEventListener("blur",e=>{const t=e.target.closest(".navigator-top-nav");if(t){const n=t.querySelector(".dropdown-container a");n&&e.relatedTarget===n||t.classList.remove("search-is-focused")}}));const n=document.querySelector(".js-filter-files-container");n&&n.addEventListener("submit",e=>{}),(()=>{const e=document.querySelector(".js-filter-files"),t=".navigator-top-nav",n=document.querySelector(t),r=n?.querySelector(".filter-search-wrapper .filer-dropdown-container");e&&(e.addEventListener("keydown",function(e){e.key;const n=this.closest(t);n&&n.classList.add("search-is-focused")}),r&&(r.addEventListener("show.bs.filer-dropdown",()=>{n&&n.classList.add("search-is-focused")}),r.addEventListener("hide.bs.filer-dropdown",()=>{n&&n.classList.remove("search-is-focused")})))})(),(()=>{const e=document.querySelectorAll(".navigator-table tr, .navigator-list .list-item"),t=document.querySelector(".actions-wrapper"),n=document.querySelectorAll(".action-select, #action-toggle, #files-action-toggle, #folders-action-toggle, .actions .clear a");setTimeout(()=>{n.forEach(e=>{if(e.checked){const t=e.closest(".list-item");t&&t.classList.add("selected")}}),Array.from(e).some(e=>e.classList.contains("selected"))&&t&&t.classList.add("action-selected")},100),n.forEach(n=>{n.addEventListener("change",function(){const n=this.closest(".list-item");n&&(this.checked?n.classList.add("selected"):n.classList.remove("selected")),setTimeout(()=>{const n=Array.from(e).some(e=>e.classList.contains("selected"));t&&(n?t.classList.add("action-selected"):t.classList.remove("action-selected"))},0)})})})(),(()=>{const e=document.querySelector(".js-actions-menu");if(!e)return;const t=e.querySelector(".filer-dropdown-menu"),n=document.querySelector('.actions select[name="action"]'),r=n?.querySelectorAll("option")||[],i=document.querySelector('.actions button[type="submit"]'),o=document.querySelector(".js-action-delete"),s=document.querySelector(".js-action-copy"),a=document.querySelector(".js-action-move"),l="delete_files_or_folders",c="copy_files_and_folders",u="move_files_and_folders",d=document.querySelectorAll(".navigator-table tr, .navigator-list .list-item"),f=(e,t)=>{t&&r.forEach(r=>{r.value===e&&(t.style.display="",t.addEventListener("click",t=>{if(t.preventDefault(),Array.from(d).some(e=>e.classList.contains("selected"))&&n&&i){n.value=e;const t=n.querySelector(`option[value="${e}"]`);t&&(t.selected=!0),i.click()}}))})};f(l,o),f(c,s),f(u,a),r.forEach((e,n)=>{if(0!==n){const n=document.createElement("li"),r=document.createElement("a");r.href="#",r.textContent=e.textContent,e.value!==l&&e.value!==c&&e.value!==u||r.classList.add("hidden"),n.appendChild(r),t&&t.appendChild(n)}}),t&&t.addEventListener("click",e=>{if("A"===e.target.tagName){const r=e.target.closest("li"),o=Array.from(t.querySelectorAll("li")).indexOf(r)+1;if(e.preventDefault(),n&&i){const e=n.querySelectorAll("option");e[o]&&(n.value=e[o].value,e[o].selected=!0),i.click()}}}),e.addEventListener("click",e=>{Array.from(d).some(e=>e.classList.contains("selected"))||(e.preventDefault(),e.stopPropagation())})})(),(()=>{const e=document.querySelector(".navigator-top-nav");if(!e)return;const t=document.querySelector(".breadcrumbs-container");if(!t)return;const n=t.querySelector(".navigator-breadcrumbs"),r=t.querySelector(".filer-dropdown-container"),i=document.querySelector(".filter-files-container"),o=document.querySelector(".actions-wrapper"),s=document.querySelector(".navigator-button-wrapper"),a=n?.offsetWidth||0,l=r?.offsetWidth||0,c=i?.offsetWidth||0,u=o?.offsetWidth||0,d=s?.offsetWidth||0,f=window.getComputedStyle(e),p=parseInt(f.paddingLeft,10)+parseInt(f.paddingRight,10);let h=e.offsetWidth;const v=80+a+l+c+u+d+p,m="breadcrumb-min-width",g=()=>{h{h=e.offsetWidth,g()})})(),(()=>{const e=document.querySelectorAll(".navigator-list .list-item input.action-select"),t=".navigator-list .navigator-folders-body .list-item input.action-select",n=".navigator-list .navigator-files-body .list-item input.action-select",r=document.querySelector("#files-action-toggle"),i=document.querySelector("#folders-action-toggle");i&&i.addEventListener("click",function(){const e=document.querySelectorAll(t);this.checked?e.forEach(e=>{e.checked||e.click()}):e.forEach(e=>{e.checked&&e.click()})}),r&&r.addEventListener("click",function(){const e=document.querySelectorAll(n);this.checked?e.forEach(e=>{e.checked||e.click()}):e.forEach(e=>{e.checked&&e.click()})}),e.forEach(e=>{e.addEventListener("click",function(){const e=document.querySelectorAll(n),o=document.querySelectorAll(t);if(this.checked){const t=Array.from(e).every(e=>e.checked),n=Array.from(o).every(e=>e.checked);t&&r&&(r.checked=!0),n&&i&&(i.checked=!0)}else{const t=Array.from(e).some(e=>!e.checked),n=Array.from(o).some(e=>!e.checked);t&&r&&(r.checked=!1),n&&i&&(i.checked=!1)}})});const o=document.querySelector(".navigator .actions .clear a");o&&o.addEventListener("click",()=>{i&&(i.checked=!1),r&&(r.checked=!1)})})(),document.querySelectorAll(".js-copy-url").forEach(e=>{e.addEventListener("click",function(e){const t=new URL(this.dataset.url,document.location.href),n=this.dataset.msg||"URL copied to clipboard",r=document.createElement("template");e.preventDefault(),document.querySelectorAll(".info.filer-tooltip").forEach(e=>{e.remove()}),navigator.clipboard.writeText(t.href),r.innerHTML=`
    ${n}
    `,this.classList.add("filer-tooltip-wrapper"),this.appendChild(r.content.firstChild);const i=this;setTimeout(()=>{const e=i.querySelector(".info");e&&e.remove()},1200)})}),(new r.A).initialize(),new s})})()})(); \ No newline at end of file From a92d981944e74c0950db912322fa9742297a50fe Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Tue, 9 Jun 2026 16:25:18 +0300 Subject: [PATCH 694/715] BEN-2954: setup.py removed pyproject.toml updated --- pyproject.toml | 9 ++++--- setup.py | 69 -------------------------------------------------- 2 files changed, 5 insertions(+), 73 deletions(-) delete mode 100644 setup.py diff --git a/pyproject.toml b/pyproject.toml index 6f7e6ca58..e134e5911 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,11 +19,12 @@ requires-python = ">=3.10" dependencies = [ "django>=5.1,<5.2", "django-mptt>=0.6,<1.0", - "django-polymorphic>=4.0.0", - "django-js-asset>=2.0.0", + "django-polymorphic>=4.0.0,<5.0", + "django-js-asset>=2.0.0,<3.0", "easy-thumbnails[svg]>=2,<3.0", "Unidecode>=0.04,<1.2", "filetype", + "pytz", # Pin svglib to a version below 1.6.0. # The latest version (1.6.0) adds pycairo as a dependency, @@ -54,8 +55,8 @@ classifiers = [ [project.optional-dependencies] s3 = [ - "boto3", - "django-storages", + "boto3>=1.26,<2.0", + "django-storages>=1.13,<2.0", ] heif = ["pillow-heif"] diff --git a/setup.py b/setup.py deleted file mode 100644 index 5cd5a8e7a..000000000 --- a/setup.py +++ /dev/null @@ -1,69 +0,0 @@ -import os -import re - -from setuptools import setup, find_packages - - -def get_version(): - """Read version from filer/__init__.py without importing the package.""" - init_py = os.path.join(os.path.dirname(__file__), 'filer', '__init__.py') - with open(init_py) as f: - match = re.search(r"^__version__\s*=\s*['\"]([^'\"]+)['\"]", f.read(), re.M) - if not match: - raise RuntimeError("Cannot find __version__ in filer/__init__.py") - return match.group(1) - - -version = get_version() - - -def read(fname): - """read the contents of a text file""" - return open(os.path.join(os.path.dirname(__file__), fname)).read() - -setup( - name='django-filer', - version=version, - url='http://github.com/stefanfoulis/django-filer', - license='BSD', - platforms=['OS Independent'], - description='A file management application for django that makes handling of files and images a breeze.', - long_description=read('README.rst'), - author='Stefan Foulis', - author_email='stefan.foulis@gmail.com', - packages=find_packages(), - python_requires='>=3.10', - install_requires=( - 'django>=5.1,<5.2', - 'django-mptt>=0.6,<1.0', # the exact version depends on Django - 'django_polymorphic>=4.0.0,<5.0', - 'django-js-asset>=2.0.0,<3.0', - 'easy-thumbnails>=2,<3.0', - 'Unidecode>=0.04,<1.2', - 'filetype', - 'pytz', - ), - extras_require={ - 's3': [ - 'boto3>=1.26,<2.0', - 'django-storages>=1.13,<2.0', - ], - }, - include_package_data=True, - zip_safe=False, - classifiers=[ - 'Development Status :: 4 - Beta', - 'Framework :: Django', - 'Framework :: Django :: 5.1', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: BSD License', - 'Operating System :: OS Independent', - 'Programming Language :: Python', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.10', - 'Programming Language :: Python :: 3.11', - 'Programming Language :: Python :: 3.12', - 'Programming Language :: Python :: 3.13', - 'Topic :: Internet :: WWW/HTTP', - ], -) From badec154618aa966da09e1860c9848c4709ed68a Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Tue, 9 Jun 2026 18:01:15 +0300 Subject: [PATCH 695/715] BEN-2954: remove logs --- filer/admin/folderadmin.py | 57 +------------------ .../static/filer/js/addons/table-dropzone.js | 22 ------- .../static/filer/js/dist/filer-base.bundle.js | 2 +- 3 files changed, 4 insertions(+), 77 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 2a792350c..8a39324f9 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -413,37 +413,19 @@ def directory_listing(self, request, folder_id=None, viewtype=None): limit_search_to_folder = request.GET.get('limit_search_to_folder', False) in (True, 'on') - logger.debug( - "[Filer Search] query=%r, search_terms=%r, search_mode=%s, " - "limit_search_to_folder=%s, folder=%s (id=%s, is_root=%s)", - q, search_terms, search_mode, limit_search_to_folder, - folder.name if folder else None, - folder.pk if folder else None, - folder.is_root if folder else None, - ) - if len(search_terms) > 0: if folder and limit_search_to_folder and not folder.is_root: desc_folder_ids = folder.get_descendants_ids() - logger.debug( - "[Filer Search] Limiting to folder %s and %d descendant folders", - folder.name, len(desc_folder_ids), - ) # Do not include current folder itself in search results. folder_qs = Folder.objects.filter(pk__in=desc_folder_ids) # Limit search results to files in the current folder or any # nested folder. file_qs = File.objects.filter(folder_id__in=desc_folder_ids + [folder.pk]) else: - logger.debug("[Filer Search] Searching globally (all folders and files)") folder_qs = self.get_queryset(request) file_qs = File.objects.all() folder_qs = self.filter_folder(folder_qs, search_terms).prefetch_related("children", "all_files") file_qs = self.filter_file(file_qs, search_terms) - logger.debug( - "[Filer Search] Results: %d folders, %d files found for terms=%r", - folder_qs.count(), file_qs.count(), search_terms, - ) show_result_count = True else: @@ -619,10 +601,6 @@ def construct_search(field_name): else: return "%s__icontains" % field_name - logger.debug( - "[Filer Search] filter_folder: terms=%r, search_fields=%r, owner_lookups=%r", - terms, self.search_fields, self.get_owner_filter_lookups(), - ) for term in terms: filters = models.Q() for filter_ in self.search_fields: @@ -630,11 +608,9 @@ def construct_search(field_name): for filter_ in self.get_owner_filter_lookups(): filters |= models.Q(**{filter_: term}) qs = qs.filter(filters) - logger.debug("[Filer Search] filter_folder query: %s", qs.query) return qs def filter_file(self, qs, terms=()): - logger.debug("[Filer Search] filter_file: terms=%r", terms) for term in terms: filters = (models.Q(name__icontains=term) | models.Q(description__icontains=term) @@ -642,7 +618,6 @@ def filter_file(self, qs, terms=()): for filter_ in self.get_owner_filter_lookups(): filters |= models.Q(**{filter_: term}) qs = qs.filter(filters) - logger.debug("[Filer Search] filter_file query: %s", qs.query) return qs @property @@ -703,7 +678,6 @@ def response_action(self, request, files_queryset, folders_queryset): action = action_form.cleaned_data['action'] select_across = action_form.cleaned_data['select_across'] func, name, description = self.get_actions(request)[action] - print("[Action] Dispatching action=%s, func=%s" % (action, func.__name__)) # Get the list of selected PKs. If nothing's selected, we can't # perform an action on it, so bail. Except we want to perform @@ -731,10 +705,7 @@ def response_action(self, request, files_queryset, folders_queryset): files_queryset = files_queryset.filter(pk__in=selected_files) folders_queryset = folders_queryset.filter( pk__in=selected_folders) - print("[Action] selected_files=%s, selected_folders=%s" % (selected_files, selected_folders)) - print("[Action] Calling %s with files_qs count=%d, folders_qs count=%d" % ( - name, files_queryset.count(), folders_queryset.count())) response = func(self, request, files_queryset, folders_queryset) # Actions may return an HttpResponse, which will be used as the @@ -1255,10 +1226,6 @@ def extract_files(self, request, files_queryset, folders_queryset): from ..models import Archive success_format = "Successfully extracted archive {}." - # DEBUG: print to stdout (bypasses logging config) - file_data = list(files_queryset.values_list('pk', 'original_filename', 'file', 'polymorphic_ctype_id')) - print("[Extract] files_queryset count=%d, data=%s" % (files_queryset.count(), file_data)) - # Filter by zip file extension rather than polymorphic_ctype, # because zip files may have been uploaded as plain File instances zip_extensions = Archive._filename_extensions # ['.zip'] @@ -1269,35 +1236,23 @@ def extract_files(self, request, files_queryset, folders_queryset): extension_filter |= Q(file__iendswith=ext) files_queryset = files_queryset.filter(extension_filter) - filtered_data = list(files_queryset.values_list('pk', 'original_filename', 'file')) - print("[Extract] After extension filter: count=%d, data=%s" % (files_queryset.count(), filtered_data)) - if not files_queryset.exists(): - # Show the user exactly what files were selected and why they didn't match - debug_msg = ("No archive files were selected. " - "DEBUG: Selected files: %s. " - "Looking for extensions: %s" % (file_data, zip_extensions)) - print("[Extract] " + debug_msg) - self.message_user(request, debug_msg, level=messages.WARNING) + self.message_user(request, _("No archive files were selected."), + level=messages.WARNING) return None # cannot extract in unfiled files folder if files_queryset.filter(folder__isnull=True).exists(): - print("[Extract] Cannot extract in unfiled files folder") raise PermissionDenied if not has_multi_file_action_permission(request, files_queryset, Folder.objects.none()): - print("[Extract] Permission denied for multi file action") raise PermissionDenied def _as_archive(filer_file): """Convert a File instance to Archive so extract methods work.""" if isinstance(filer_file, Archive): - print("[Extract] File pk=%s is already an Archive" % filer_file.pk) return filer_file - print("[Extract] Converting File pk=%s (%s) to Archive (ctype=%s)" % ( - filer_file.pk, filer_file.original_filename, filer_file.polymorphic_ctype)) archive = Archive() archive.__dict__.update(filer_file.__dict__) archive.extract_errors = [] @@ -1305,7 +1260,6 @@ def _as_archive(filer_file): def is_valid_archive(filer_file): is_valid = filer_file.is_valid() - print("[Extract] is_valid pk=%s: %s" % (filer_file.pk, is_valid)) if not is_valid: error_format = "{} is not a valid zip file" message = error_format.format(filer_file.clean_actual_name) @@ -1314,7 +1268,6 @@ def is_valid_archive(filer_file): def has_collisions(filer_file): collisions = filer_file.collisions() - print("[Extract] collisions pk=%s: %s" % (filer_file.pk, collisions)) if collisions: error_format = "Files/Folders from {archive} with names:" error_format += "{names} already exist." @@ -1330,22 +1283,18 @@ def has_collisions(filer_file): for f in files_queryset: f = _as_archive(f) if not is_valid_archive(f) or has_collisions(f): - print("[Extract] Skipping pk=%s (invalid or collisions)" % f.pk) continue - print("[Extract] Extracting pk=%s (%s)" % (f.pk, f.original_filename)) try: f.extract() message = success_format.format(f.actual_name) - print("[Extract] Success: %s" % message) self.message_user(request, _(message)) for err_msg in f.extract_errors: - print("[Extract] Warning: %s: %s" % (f.actual_name, err_msg)) messages.warning( request, _("%s: %s" % (f.actual_name, err_msg)) ) except Exception as e: - logger.exception("[Extract] Exception extracting file pk=%s: %s", f.pk, e) + logger.exception("Exception extracting file pk=%s: %s", f.pk, e) messages.error(request, _("Error extracting %s: %s" % (f.actual_name, str(e)))) return None diff --git a/filer/static/filer/js/addons/table-dropzone.js b/filer/static/filer/js/addons/table-dropzone.js index 2a6633370..2c64c9a41 100644 --- a/filer/static/filer/js/addons/table-dropzone.js +++ b/filer/static/filer/js/addons/table-dropzone.js @@ -88,27 +88,19 @@ document.addEventListener('DOMContentLoaded', () => { body.dataset.maxFiles = dropzoneBase.dataset.maxFiles; body.dataset.maxFilesize = dropzoneBase.dataset.maxFilesize; body.classList.add('js-filer-dropzone'); - console.log('[Filer DnD] dropzoneBase found, url:', baseUrl, 'folder:', baseFolderTitle); - } else { - console.log('[Filer DnD] No .js-filer-dropzone-base element found on page'); } Cl.mediator.subscribe('filer-upload-in-progress', destroyDropzones); dropzones = document.querySelectorAll(dropzoneSelector); - console.log('[Filer DnD] Found', dropzones.length, 'dropzone elements (.js-filer-dropzone)'); if (dropzones.length && Dropzone) { Dropzone.autoDiscover = false; dropzones.forEach((dropzoneElement) => { if (dropzoneElement.dropzone) { - console.log('[Filer DnD] Skipping element (already has dropzone):', dropzoneElement.tagName, dropzoneElement.className); return; } const dropzoneUrl = dropzoneElement.dataset.url; - console.log('[Filer DnD] Creating Dropzone instance for', dropzoneElement.tagName, - 'url:', dropzoneUrl, 'maxFiles:', dropzoneElement.dataset.maxFiles, - 'maxFilesize:', dropzoneElement.dataset.maxFilesize); const dropzoneInstance = new Dropzone(dropzoneElement, { url: dropzoneUrl, paramName: 'file', @@ -120,7 +112,6 @@ document.addEventListener('DOMContentLoaded', () => { parallelUploads: dropzoneElement.dataset[dataUploaderConnections] || 3, accept: (file, done) => { let uploadInfoClone; - console.log('[Filer DnD] accept:', file.name, 'url:', dropzoneUrl); Cl.mediator.remove('filer-upload-in-progress', destroyDropzones); Cl.mediator.publish('filer-upload-in-progress'); @@ -157,7 +148,6 @@ document.addEventListener('DOMContentLoaded', () => { submitNum++; maxSubmitNum++; - console.log('[Filer DnD] file accepted, submitNum:', submitNum, 'maxSubmitNum:', maxSubmitNum); updateUploadNumber(); done(); } @@ -236,7 +226,6 @@ document.addEventListener('DOMContentLoaded', () => { } }, sending: (file) => { - console.log('[Filer DnD] sending:', file.name, 'to:', dropzoneUrl); const fileEl = getElementByFile(file, dropzoneUrl); if (fileEl) { fileEl.classList.remove(hiddenClass); @@ -253,7 +242,6 @@ document.addEventListener('DOMContentLoaded', () => { }, success: (file, response) => { submitNum--; - console.log('[Filer DnD] success:', file.name, 'submitNum:', submitNum, 'response:', response); updateUploadNumber(); const fileEl = getElementByFile(file, dropzoneUrl); if (fileEl) { @@ -261,9 +249,7 @@ document.addEventListener('DOMContentLoaded', () => { } }, queuecomplete: () => { - console.log('[Filer DnD] queuecomplete: submitNum:', submitNum, 'hasErrors:', hasErrors); if (submitNum !== 0) { - console.warn('[Filer DnD] queuecomplete: submitNum is not 0, skipping reload'); return; } @@ -280,7 +266,6 @@ document.addEventListener('DOMContentLoaded', () => { if (uploadNumber) { uploadNumber.classList.add(hiddenClass); } - console.log('[Filer DnD] reloading after errors (1s delay)'); setTimeout(() => { reloadOrdered(); }, 1000); @@ -288,19 +273,14 @@ document.addEventListener('DOMContentLoaded', () => { if (uploadSuccess) { uploadSuccess.classList.remove(hiddenClass); } - console.log('[Filer DnD] reloading now via reloadOrdered'); reloadOrdered(); } }, error: (file, error) => { - console.error('[Filer DnD] error:', file.name, 'error:', error, 'submitNum:', submitNum); if (error === 'duplicate') { - // submitNum was never incremented for duplicates - console.log('[Filer DnD] duplicate file, ignoring'); return; } submitNum--; - console.log('[Filer DnD] after error decrement, submitNum:', submitNum); updateUploadNumber(); const fileEl = getElementByFile(file, dropzoneUrl); if (fileEl) { @@ -324,7 +304,5 @@ document.addEventListener('DOMContentLoaded', () => { }); } }); - } else { - console.warn('[Filer DnD] No dropzone instances created. dropzones.length:', dropzones.length, 'Dropzone:', !!Dropzone); } }); diff --git a/filer/static/filer/js/dist/filer-base.bundle.js b/filer/static/filer/js/dist/filer-base.bundle.js index ff1695c57..1a42c7551 100644 --- a/filer/static/filer/js/dist/filer-base.bundle.js +++ b/filer/static/filer/js/dist/filer-base.bundle.js @@ -1,2 +1,2 @@ /*! For license information please see filer-base.bundle.js.LICENSE.txt */ -(()=>{var e={117(){"use strict";document.addEventListener("DOMContentLoaded",()=>{const e=document.getElementById("destination");if(!e)return;const t=e.querySelectorAll("option"),n=t.length,r=document.querySelector(".js-submit-copy-move"),i=document.querySelector(".js-disabled-btn-tooltip");1===n&&t[0].disabled&&(r&&(r.style.display="none"),i&&(i.style.display="inline-block")),Cl.filerTooltip&&Cl.filerTooltip()})},413(){"use strict";(()=>{const e="filer-dropdown-backdrop",t='[data-toggle="filer-dropdown"]';class n{constructor(e){this.element=e,e.addEventListener("click",()=>this.toggle())}toggle(){const t=this.element,n=r(t),o=n.classList.contains("open"),s={relatedTarget:t};if(t.disabled||t.classList.contains("disabled"))return!1;if(i(),!o){if("ontouchstart"in document.documentElement&&!n.closest(".navbar-nav")){const n=document.createElement("div");n.className=e,t.parentNode.insertBefore(n,t.nextSibling),n.addEventListener("click",i)}const r=new CustomEvent("show.bs.filer-dropdown",{bubbles:!0,cancelable:!0,detail:s});if(n.dispatchEvent(r),r.defaultPrevented)return!1;t.focus(),t.setAttribute("aria-expanded","true"),n.classList.add("open");const o=new CustomEvent("shown.bs.filer-dropdown",{bubbles:!0,detail:s});n.dispatchEvent(o)}return!1}keydown(e){const n=this.element,i=r(n),o=i.classList.contains("open"),s=Array.from(i.querySelectorAll(".filer-dropdown-menu li:not(.disabled):visible a")).filter(e=>null!==e.offsetParent),a=s.indexOf(e.target);if(!/(38|40|27|32)/.test(e.which)||/input|textarea/i.test(e.target.tagName))return;if(e.preventDefault(),e.stopPropagation(),n.disabled||n.classList.contains("disabled"))return;if(!o&&27!==e.which||o&&27===e.which)return 27===e.which&&i.querySelector(t)?.focus(),n.click();if(!s.length)return;let l=a;38===e.which&&a>0&&l--,40===e.which&&ae.remove()),document.querySelectorAll(t).forEach(e=>{const t=r(e),i={relatedTarget:e};if(!t.classList.contains("open"))return;if(n&&"click"===n.type&&/input|textarea/i.test(n.target.tagName)&&t.contains(n.target))return;const o=new CustomEvent("hide.bs.filer-dropdown",{bubbles:!0,cancelable:!0,detail:i});if(t.dispatchEvent(o),o.defaultPrevented)return;e.setAttribute("aria-expanded","false"),t.classList.remove("open");const s=new CustomEvent("hidden.bs.filer-dropdown",{bubbles:!0,detail:i});t.dispatchEvent(s)}))}function o(e){return this.forEach(t=>{let r=t._filerDropdownInstance;r||(r=new n(t),t._filerDropdownInstance=r),"string"==typeof e&&r[e].call(t)}),this}NodeList.prototype.dropdown||(NodeList.prototype.dropdown=function(e){return o.call(this,e)}),HTMLCollection.prototype.dropdown||(HTMLCollection.prototype.dropdown=function(e){return o.call(this,e)}),document.addEventListener("click",i),document.addEventListener("click",e=>{e.target.closest(".filer-dropdown form")&&e.stopPropagation()}),document.addEventListener("click",e=>{const r=e.target.closest(t);if(r){const t=r._filerDropdownInstance||new n(r);r._filerDropdownInstance||(r._filerDropdownInstance=t),t.toggle(e)}}),document.addEventListener("keydown",e=>{const r=e.target.closest(t);if(r){const t=r._filerDropdownInstance||new n(r);r._filerDropdownInstance||(r._filerDropdownInstance=t),t.keydown(e)}}),document.addEventListener("keydown",e=>{const r=e.target.closest(".filer-dropdown-menu");if(r){const i=r.parentNode.querySelector(t);if(i){const t=i._filerDropdownInstance||new n(i);i._filerDropdownInstance||(i._filerDropdownInstance=t),t.keydown(e)}}}),window.FilerDropdown=n})()},577(){!function(){"use strict";const e=document.getElementById("django-admin-popup-response-constants");let t;if(e)switch(t=JSON.parse(e.dataset.popupResponse),t.action){case"change":opener.dismissRelatedImageLookupPopup(window,t.new_value,null,t.obj,null);break;case"delete":opener.dismissDeleteRelatedObjectPopup(window,t.value);break;default:opener.dismissAddRelatedObjectPopup(window,t.value,t.obj)}}()},216(e,t,n){"use strict";n.d(t,{A:()=>r}),e=n.hmd(e),window.Cl=window.Cl||{},(()=>{class t{constructor(e={}){this.options={containerSelector:".js-focal-point",imageSelector:".js-focal-point-image",circleSelector:".js-focal-point-circle",locationSelector:".js-focal-point-location",draggableClass:"draggable",hiddenClass:"hidden",dataLocation:"locationSelector",...e},this.focalPointInstances=[],this._init=this._init.bind(this)}_init(e){const t=new n(e,this.options);this.focalPointInstances.push(t)}initialize(){document.querySelectorAll(this.options.containerSelector).forEach(e=>{this._init(e)}),window.Cl.mediator&&window.Cl.mediator.subscribe("focal-point:init",this._init)}destroy(){window.Cl.mediator&&window.Cl.mediator.remove("focal-point:init",this._init),this.focalPointInstances.forEach(e=>{e.destroy()}),this.focalPointInstances=[]}}class n{constructor(e,t={}){this.options={imageSelector:".js-focal-point-image",circleSelector:".js-focal-point-circle",locationSelector:".js-focal-point-location",draggableClass:"draggable",hiddenClass:"hidden",dataLocation:"locationSelector",...t},this.container=e,this.image=this.container.querySelector(this.options.imageSelector),this.circle=this.container.querySelector(this.options.circleSelector),this.ratio=parseFloat(this.image?.dataset.ratio||1),this.location=this._getLocation(),this.isDragging=!1,this.dragStartX=0,this.dragStartY=0,this.circleStartX=0,this.circleStartY=0,this._onImageLoaded=this._onImageLoaded.bind(this),this._onMouseDown=this._onMouseDown.bind(this),this._onMouseMove=this._onMouseMove.bind(this),this._onMouseUp=this._onMouseUp.bind(this),this.image?.complete?this._onImageLoaded():this.image&&this.image.addEventListener("load",this._onImageLoaded)}_updateLocationValue(e,t){const n=`${Math.round(e*this.ratio)},${Math.round(t*this.ratio)}`;this.location&&(this.location.value=n)}_getLocation(){const e=this.container.dataset[this.options.dataLocation];if(e){const t=document.querySelector(e);if(t)return t}return this.container.querySelector(this.options.locationSelector)}_makeDraggable(){this.circle&&(this.circle.classList.add(this.options.draggableClass),this.circle.addEventListener("mousedown",this._onMouseDown),this.circle.addEventListener("touchstart",this._onMouseDown,{passive:!1}))}_onMouseDown(e){e.preventDefault(),this.isDragging=!0;const t="touchstart"===e.type?e.touches[0]:e,n=this.container.getBoundingClientRect();this.dragStartX=t.clientX-n.left,this.dragStartY=t.clientY-n.top;const r=this.circle.getBoundingClientRect();this.circleStartX=r.left-n.left+r.width/2,this.circleStartY=r.top-n.top+r.height/2,document.addEventListener("mousemove",this._onMouseMove),document.addEventListener("mouseup",this._onMouseUp),document.addEventListener("touchmove",this._onMouseMove,{passive:!1}),document.addEventListener("touchend",this._onMouseUp)}_onMouseMove(e){if(!this.isDragging)return;e.preventDefault();const t="touchmove"===e.type?e.touches[0]:e,n=this.container.getBoundingClientRect(),r=t.clientX-n.left,i=t.clientY-n.top,o=r-this.dragStartX,s=i-this.dragStartY;let a=this.circleStartX+o,l=this.circleStartY+s;a=Math.max(0,Math.min(n.width-1,a)),l=Math.max(0,Math.min(n.height-1,l)),this.circle.style.left=`${a}px`,this.circle.style.top=`${l}px`,this._updateLocationValue(a,l)}_onMouseUp(){this.isDragging=!1,document.removeEventListener("mousemove",this._onMouseMove),document.removeEventListener("mouseup",this._onMouseUp),document.removeEventListener("touchmove",this._onMouseMove),document.removeEventListener("touchend",this._onMouseUp)}_onImageLoaded(){if(!this.image||0===this.image.naturalWidth)return;this.circle?.classList.remove(this.options.hiddenClass);const e=this.location?.value||"",t=this.image.offsetWidth,n=this.image.offsetHeight;let r,i;if(e.length){const t=e.split(",");r=Math.round(Number(t[0])/this.ratio),i=Math.round(Number(t[1])/this.ratio)}else r=t/2,i=n/2;isNaN(r)||isNaN(i)||(this.circle&&(this.circle.style.left=`${r}px`,this.circle.style.top=`${i}px`),this._makeDraggable(),this._updateLocationValue(r,i))}destroy(){this.circle?.classList.contains(this.options.draggableClass)&&(this.circle.removeEventListener("mousedown",this._onMouseDown),this.circle.removeEventListener("touchstart",this._onMouseDown)),document.removeEventListener("mousemove",this._onMouseMove),document.removeEventListener("mouseup",this._onMouseUp),document.removeEventListener("touchmove",this._onMouseMove),document.removeEventListener("touchend",this._onMouseUp),this.image&&this.image.removeEventListener("load",this._onImageLoaded),this.options=null,this.container=null,this.image=null,this.circle=null,this.location=null,this.ratio=null}}window.Cl.FocalPoint=t,window.Cl.FocalPointConstructor=n,e.exports&&(e.exports=t)})();const r=window.Cl.FocalPoint},902(){"use strict";const e=e=>{const t=(e=(e=e.replace(/__dot__/g,".")).replace(/__dash__/g,"-")).lastIndexOf("__");return-1===t?e:e.substring(0,t)};window.dismissPopupAndReload=e=>{document.location.reload(),e.close()},window.dismissRelatedImageLookupPopup=(t,n,r,i,o)=>{const s=e(t.name),a=document.getElementById(s);if(!a)return;const l=a.closest(".filerFile");if(!l)return;const c=l.querySelector(".edit"),u=l.querySelector(".thumbnail_img"),d=l.querySelector(".description_text"),f=l.querySelector(".filerClearer"),p=l.parentElement.querySelector(".dz-message"),h=l.querySelector("input"),v=h.value;h.value=n;const m=h.closest(".js-filer-dropzone");m&&m.classList.add("js-object-attached"),r&&u&&(u.src=r,u.classList.remove("hidden"),u.removeAttribute("srcset")),d&&(d.textContent=i),f&&f.classList.remove("hidden"),a.classList.add("related-lookup-change"),c&&c.classList.add("related-lookup-change"),o&&c&&c.setAttribute("href",`${o}?_edit_from_widget=1`),p&&p.classList.add("hidden"),v!==n&&h.dispatchEvent(new Event("change",{bubbles:!0})),t.close()},window.dismissRelatedFolderLookupPopup=(t,n,r)=>{const i=e(t.name),o=document.getElementById(i);if(!o)return;const s=o.closest(".filerFile");if(!s)return;const a=s.querySelector(".thumbnail_img"),l=document.getElementById(`id_${i}_clear`),c=document.getElementById(`id_${i}`),u=s.querySelector(".description_text"),d=document.getElementById(i);c&&(c.value=n),a&&a.classList.remove("hidden"),u&&(u.textContent=r),l&&l.classList.remove("hidden"),d&&d.classList.add("hidden"),t.close()},document.addEventListener("DOMContentLoaded",()=>{document.querySelectorAll(".js-dismiss-popup").forEach(e=>{e.addEventListener("click",function(e){e.preventDefault();const t=this.dataset.fileId,n=this.dataset.iconUrl,r=this.dataset.label;if(this.classList.contains("js-dismiss-image")){const e=this.dataset.changeUrl||"";window.opener.dismissRelatedImageLookupPopup(window,t,n,r,e)}else this.classList.contains("js-dismiss-folder")&&window.opener.dismissRelatedFolderLookupPopup(window,t,r)})});const e=document.getElementById("popup-dismiss-data");if(e&&window.opener){const t=e.dataset.pk,n=e.dataset.label;window.opener.dismissRelatedPopup(window,t,n)}})},221(){"use strict";window.Cl=window.Cl||{},Cl.filerTooltip=()=>{const e=".js-filer-tooltip";document.querySelectorAll(e).forEach(t=>{t.addEventListener("mouseover",function(){const t=this.getAttribute("title");if(!t)return;this.dataset.filerTooltip=t,this.removeAttribute("title");const n=document.createElement("p");n.className="filer-tooltip",n.textContent=t;const r=document.querySelector(e);r&&r.appendChild(n)}),t.addEventListener("mouseout",function(){const e=this.dataset.filerTooltip;e&&this.setAttribute("title",e),document.querySelectorAll(".filer-tooltip").forEach(e=>{e.remove()})})})}},472(){"use strict";document.addEventListener("DOMContentLoaded",()=>{const e=e=>{e.preventDefault();const t=e.currentTarget,n=t.closest(".filerFile");if(!n)return;const r=n.querySelector("input"),i=n.querySelector(".thumbnail_img"),o=n.querySelector(".description_text"),s=n.querySelector(".lookup"),a=n.querySelector(".edit"),l=n.parentElement.querySelector(".dz-message"),c="hidden";if(t.classList.add(c),r&&(r.value=""),i){i.classList.add(c);var u=i.parentElement;"A"===u.tagName&&u.removeAttribute("href")}s&&s.classList.remove("related-lookup-change"),a&&a.classList.remove("related-lookup-change"),l&&l.classList.remove(c),o&&(o.textContent="")};document.querySelectorAll(".filerFile .vForeignKeyRawIdAdminField").forEach(e=>{e.setAttribute("type","hidden")}),document.querySelectorAll(".filerFile .filerClearer").forEach(t=>{t.addEventListener("click",e)})})},628(e){var t;self,t=function(){return function(){var e={3099:function(e){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},6077:function(e,t,n){var r=n(111);e.exports=function(e){if(!r(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},1223:function(e,t,n){var r=n(5112),i=n(30),o=n(3070),s=r("unscopables"),a=Array.prototype;null==a[s]&&o.f(a,s,{configurable:!0,value:i(null)}),e.exports=function(e){a[s][e]=!0}},1530:function(e,t,n){"use strict";var r=n(8710).charAt;e.exports=function(e,t,n){return t+(n?r(e,t).length:1)}},5787:function(e){e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e}},9670:function(e,t,n){var r=n(111);e.exports=function(e){if(!r(e))throw TypeError(String(e)+" is not an object");return e}},4019:function(e){e.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},260:function(e,t,n){"use strict";var r,i=n(4019),o=n(9781),s=n(7854),a=n(111),l=n(6656),c=n(648),u=n(8880),d=n(1320),f=n(3070).f,p=n(9518),h=n(7674),v=n(5112),m=n(9711),g=s.Int8Array,y=g&&g.prototype,b=s.Uint8ClampedArray,w=b&&b.prototype,x=g&&p(g),E=y&&p(y),S=Object.prototype,k=S.isPrototypeOf,L=v("toStringTag"),A=m("TYPED_ARRAY_TAG"),C=i&&!!h&&"Opera"!==c(s.opera),F=!1,_={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},T={BigInt64Array:8,BigUint64Array:8},I=function(e){if(!a(e))return!1;var t=c(e);return l(_,t)||l(T,t)};for(r in _)s[r]||(C=!1);if((!C||"function"!=typeof x||x===Function.prototype)&&(x=function(){throw TypeError("Incorrect invocation")},C))for(r in _)s[r]&&h(s[r],x);if((!C||!E||E===S)&&(E=x.prototype,C))for(r in _)s[r]&&h(s[r].prototype,E);if(C&&p(w)!==E&&h(w,E),o&&!l(E,L))for(r in F=!0,f(E,L,{get:function(){return a(this)?this[A]:void 0}}),_)s[r]&&u(s[r],A,r);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:C,TYPED_ARRAY_TAG:F&&A,aTypedArray:function(e){if(I(e))return e;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(e){if(h){if(k.call(x,e))return e}else for(var t in _)if(l(_,r)){var n=s[t];if(n&&(e===n||k.call(n,e)))return e}throw TypeError("Target is not a typed array constructor")},exportTypedArrayMethod:function(e,t,n){if(o){if(n)for(var r in _){var i=s[r];i&&l(i.prototype,e)&&delete i.prototype[e]}E[e]&&!n||d(E,e,n?t:C&&y[e]||t)}},exportTypedArrayStaticMethod:function(e,t,n){var r,i;if(o){if(h){if(n)for(r in _)(i=s[r])&&l(i,e)&&delete i[e];if(x[e]&&!n)return;try{return d(x,e,n?t:C&&g[e]||t)}catch(e){}}for(r in _)!(i=s[r])||i[e]&&!n||d(i,e,t)}},isView:function(e){if(!a(e))return!1;var t=c(e);return"DataView"===t||l(_,t)||l(T,t)},isTypedArray:I,TypedArray:x,TypedArrayPrototype:E}},3331:function(e,t,n){"use strict";var r=n(7854),i=n(9781),o=n(4019),s=n(8880),a=n(2248),l=n(7293),c=n(5787),u=n(9958),d=n(7466),f=n(7067),p=n(1179),h=n(9518),v=n(7674),m=n(8006).f,g=n(3070).f,y=n(1285),b=n(8003),w=n(9909),x=w.get,E=w.set,S="ArrayBuffer",k="DataView",L="prototype",A="Wrong index",C=r[S],F=C,_=r[k],T=_&&_[L],I=Object.prototype,M=r.RangeError,R=p.pack,z=p.unpack,q=function(e){return[255&e]},D=function(e){return[255&e,e>>8&255]},j=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},O=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},U=function(e){return R(e,23,4)},P=function(e){return R(e,52,8)},N=function(e,t){g(e[L],t,{get:function(){return x(this)[t]}})},$=function(e,t,n,r){var i=f(n),o=x(e);if(i+t>o.byteLength)throw M(A);var s=x(o.buffer).bytes,a=i+o.byteOffset,l=s.slice(a,a+t);return r?l:l.reverse()},B=function(e,t,n,r,i,o){var s=f(n),a=x(e);if(s+t>a.byteLength)throw M(A);for(var l=x(a.buffer).bytes,c=s+a.byteOffset,u=r(+i),d=0;dG;)(W=Y[G++])in F||s(F,W,C[W]);H.constructor=F}v&&h(T)!==I&&v(T,I);var Q=new _(new F(2)),X=T.setInt8;Q.setInt8(0,2147483648),Q.setInt8(1,2147483649),!Q.getInt8(0)&&Q.getInt8(1)||a(T,{setInt8:function(e,t){X.call(this,e,t<<24>>24)},setUint8:function(e,t){X.call(this,e,t<<24>>24)}},{unsafe:!0})}else F=function(e){c(this,F,S);var t=f(e);E(this,{bytes:y.call(new Array(t),0),byteLength:t}),i||(this.byteLength=t)},_=function(e,t,n){c(this,_,k),c(e,F,k);var r=x(e).byteLength,o=u(t);if(o<0||o>r)throw M("Wrong offset");if(o+(n=void 0===n?r-o:d(n))>r)throw M("Wrong length");E(this,{buffer:e,byteLength:n,byteOffset:o}),i||(this.buffer=e,this.byteLength=n,this.byteOffset=o)},i&&(N(F,"byteLength"),N(_,"buffer"),N(_,"byteLength"),N(_,"byteOffset")),a(_[L],{getInt8:function(e){return $(this,1,e)[0]<<24>>24},getUint8:function(e){return $(this,1,e)[0]},getInt16:function(e){var t=$(this,2,e,arguments.length>1?arguments[1]:void 0);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=$(this,2,e,arguments.length>1?arguments[1]:void 0);return t[1]<<8|t[0]},getInt32:function(e){return O($(this,4,e,arguments.length>1?arguments[1]:void 0))},getUint32:function(e){return O($(this,4,e,arguments.length>1?arguments[1]:void 0))>>>0},getFloat32:function(e){return z($(this,4,e,arguments.length>1?arguments[1]:void 0),23)},getFloat64:function(e){return z($(this,8,e,arguments.length>1?arguments[1]:void 0),52)},setInt8:function(e,t){B(this,1,e,q,t)},setUint8:function(e,t){B(this,1,e,q,t)},setInt16:function(e,t){B(this,2,e,D,t,arguments.length>2?arguments[2]:void 0)},setUint16:function(e,t){B(this,2,e,D,t,arguments.length>2?arguments[2]:void 0)},setInt32:function(e,t){B(this,4,e,j,t,arguments.length>2?arguments[2]:void 0)},setUint32:function(e,t){B(this,4,e,j,t,arguments.length>2?arguments[2]:void 0)},setFloat32:function(e,t){B(this,4,e,U,t,arguments.length>2?arguments[2]:void 0)},setFloat64:function(e,t){B(this,8,e,P,t,arguments.length>2?arguments[2]:void 0)}});b(F,S),b(_,k),e.exports={ArrayBuffer:F,DataView:_}},1048:function(e,t,n){"use strict";var r=n(7908),i=n(1400),o=n(7466),s=Math.min;e.exports=[].copyWithin||function(e,t){var n=r(this),a=o(n.length),l=i(e,a),c=i(t,a),u=arguments.length>2?arguments[2]:void 0,d=s((void 0===u?a:i(u,a))-c,a-l),f=1;for(c0;)c in n?n[l]=n[c]:delete n[l],l+=f,c+=f;return n}},1285:function(e,t,n){"use strict";var r=n(7908),i=n(1400),o=n(7466);e.exports=function(e){for(var t=r(this),n=o(t.length),s=arguments.length,a=i(s>1?arguments[1]:void 0,n),l=s>2?arguments[2]:void 0,c=void 0===l?n:i(l,n);c>a;)t[a++]=e;return t}},8533:function(e,t,n){"use strict";var r=n(2092).forEach,i=n(9341)("forEach");e.exports=i?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}},8457:function(e,t,n){"use strict";var r=n(9974),i=n(7908),o=n(3411),s=n(7659),a=n(7466),l=n(6135),c=n(1246);e.exports=function(e){var t,n,u,d,f,p,h=i(e),v="function"==typeof this?this:Array,m=arguments.length,g=m>1?arguments[1]:void 0,y=void 0!==g,b=c(h),w=0;if(y&&(g=r(g,m>2?arguments[2]:void 0,2)),null==b||v==Array&&s(b))for(n=new v(t=a(h.length));t>w;w++)p=y?g(h[w],w):h[w],l(n,w,p);else for(f=(d=b.call(h)).next,n=new v;!(u=f.call(d)).done;w++)p=y?o(d,g,[u.value,w],!0):u.value,l(n,w,p);return n.length=w,n}},1318:function(e,t,n){var r=n(5656),i=n(7466),o=n(1400),s=function(e){return function(t,n,s){var a,l=r(t),c=i(l.length),u=o(s,c);if(e&&n!=n){for(;c>u;)if((a=l[u++])!=a)return!0}else for(;c>u;u++)if((e||u in l)&&l[u]===n)return e||u||0;return!e&&-1}};e.exports={includes:s(!0),indexOf:s(!1)}},2092:function(e,t,n){var r=n(9974),i=n(8361),o=n(7908),s=n(7466),a=n(5417),l=[].push,c=function(e){var t=1==e,n=2==e,c=3==e,u=4==e,d=6==e,f=7==e,p=5==e||d;return function(h,v,m,g){for(var y,b,w=o(h),x=i(w),E=r(v,m,3),S=s(x.length),k=0,L=g||a,A=t?L(h,S):n||f?L(h,0):void 0;S>k;k++)if((p||k in x)&&(b=E(y=x[k],k,w),e))if(t)A[k]=b;else if(b)switch(e){case 3:return!0;case 5:return y;case 6:return k;case 2:l.call(A,y)}else switch(e){case 4:return!1;case 7:l.call(A,y)}return d?-1:c||u?u:A}};e.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterOut:c(7)}},6583:function(e,t,n){"use strict";var r=n(5656),i=n(9958),o=n(7466),s=n(9341),a=Math.min,l=[].lastIndexOf,c=!!l&&1/[1].lastIndexOf(1,-0)<0,u=s("lastIndexOf"),d=c||!u;e.exports=d?function(e){if(c)return l.apply(this,arguments)||0;var t=r(this),n=o(t.length),s=n-1;for(arguments.length>1&&(s=a(s,i(arguments[1]))),s<0&&(s=n+s);s>=0;s--)if(s in t&&t[s]===e)return s||0;return-1}:l},1194:function(e,t,n){var r=n(7293),i=n(5112),o=n(7392),s=i("species");e.exports=function(e){return o>=51||!r(function(){var t=[];return(t.constructor={})[s]=function(){return{foo:1}},1!==t[e](Boolean).foo})}},9341:function(e,t,n){"use strict";var r=n(7293);e.exports=function(e,t){var n=[][e];return!!n&&r(function(){n.call(null,t||function(){throw 1},1)})}},3671:function(e,t,n){var r=n(3099),i=n(7908),o=n(8361),s=n(7466),a=function(e){return function(t,n,a,l){r(n);var c=i(t),u=o(c),d=s(c.length),f=e?d-1:0,p=e?-1:1;if(a<2)for(;;){if(f in u){l=u[f],f+=p;break}if(f+=p,e?f<0:d<=f)throw TypeError("Reduce of empty array with no initial value")}for(;e?f>=0:d>f;f+=p)f in u&&(l=n(l,u[f],f,c));return l}};e.exports={left:a(!1),right:a(!0)}},5417:function(e,t,n){var r=n(111),i=n(3157),o=n(5112)("species");e.exports=function(e,t){var n;return i(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!i(n.prototype)?r(n)&&null===(n=n[o])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)}},3411:function(e,t,n){var r=n(9670),i=n(9212);e.exports=function(e,t,n,o){try{return o?t(r(n)[0],n[1]):t(n)}catch(t){throw i(e),t}}},7072:function(e,t,n){var r=n(5112)("iterator"),i=!1;try{var o=0,s={next:function(){return{done:!!o++}},return:function(){i=!0}};s[r]=function(){return this},Array.from(s,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var n=!1;try{var o={};o[r]=function(){return{next:function(){return{done:n=!0}}}},e(o)}catch(e){}return n}},4326:function(e){var t={}.toString;e.exports=function(e){return t.call(e).slice(8,-1)}},648:function(e,t,n){var r=n(1694),i=n(4326),o=n(5112)("toStringTag"),s="Arguments"==i(function(){return arguments}());e.exports=r?i:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),o))?n:s?i(t):"Object"==(r=i(t))&&"function"==typeof t.callee?"Arguments":r}},9920:function(e,t,n){var r=n(6656),i=n(3887),o=n(1236),s=n(3070);e.exports=function(e,t){for(var n=i(t),a=s.f,l=o.f,c=0;c=74)&&(r=s.match(/Chrome\/(\d+)/))&&(i=r[1]),e.exports=i&&+i},748:function(e){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},2109:function(e,t,n){var r=n(7854),i=n(1236).f,o=n(8880),s=n(1320),a=n(3505),l=n(9920),c=n(4705);e.exports=function(e,t){var n,u,d,f,p,h=e.target,v=e.global,m=e.stat;if(n=v?r:m?r[h]||a(h,{}):(r[h]||{}).prototype)for(u in t){if(f=t[u],d=e.noTargetGet?(p=i(n,u))&&p.value:n[u],!c(v?u:h+(m?".":"#")+u,e.forced)&&void 0!==d){if(typeof f==typeof d)continue;l(f,d)}(e.sham||d&&d.sham)&&o(f,"sham",!0),s(n,u,f,e)}}},7293:function(e){e.exports=function(e){try{return!!e()}catch(e){return!0}}},7007:function(e,t,n){"use strict";n(4916);var r=n(1320),i=n(7293),o=n(5112),s=n(2261),a=n(8880),l=o("species"),c=!i(function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")}),u="$0"==="a".replace(/./,"$0"),d=o("replace"),f=!!/./[d]&&""===/./[d]("a","$0"),p=!i(function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]});e.exports=function(e,t,n,d){var h=o(e),v=!i(function(){var t={};return t[h]=function(){return 7},7!=""[e](t)}),m=v&&!i(function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[l]=function(){return n},n.flags="",n[h]=/./[h]),n.exec=function(){return t=!0,null},n[h](""),!t});if(!v||!m||"replace"===e&&(!c||!u||f)||"split"===e&&!p){var g=/./[h],y=n(h,""[e],function(e,t,n,r,i){return t.exec===s?v&&!i?{done:!0,value:g.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}},{REPLACE_KEEPS_$0:u,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:f}),b=y[0],w=y[1];r(String.prototype,e,b),r(RegExp.prototype,h,2==t?function(e,t){return w.call(e,this,t)}:function(e){return w.call(e,this)})}d&&a(RegExp.prototype[h],"sham",!0)}},9974:function(e,t,n){var r=n(3099);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}}},5005:function(e,t,n){var r=n(857),i=n(7854),o=function(e){return"function"==typeof e?e:void 0};e.exports=function(e,t){return arguments.length<2?o(r[e])||o(i[e]):r[e]&&r[e][t]||i[e]&&i[e][t]}},1246:function(e,t,n){var r=n(648),i=n(7497),o=n(5112)("iterator");e.exports=function(e){if(null!=e)return e[o]||e["@@iterator"]||i[r(e)]}},8554:function(e,t,n){var r=n(9670),i=n(1246);e.exports=function(e){var t=i(e);if("function"!=typeof t)throw TypeError(String(e)+" is not iterable");return r(t.call(e))}},647:function(e,t,n){var r=n(7908),i=Math.floor,o="".replace,s=/\$([$&'`]|\d\d?|<[^>]*>)/g,a=/\$([$&'`]|\d\d?)/g;e.exports=function(e,t,n,l,c,u){var d=n+e.length,f=l.length,p=a;return void 0!==c&&(c=r(c),p=s),o.call(u,p,function(r,o){var s;switch(o.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,n);case"'":return t.slice(d);case"<":s=c[o.slice(1,-1)];break;default:var a=+o;if(0===a)return r;if(a>f){var u=i(a/10);return 0===u?r:u<=f?void 0===l[u-1]?o.charAt(1):l[u-1]+o.charAt(1):r}s=l[a-1]}return void 0===s?"":s})}},7854:function(e,t,n){var r=function(e){return e&&e.Math==Math&&e};e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},6656:function(e){var t={}.hasOwnProperty;e.exports=function(e,n){return t.call(e,n)}},3501:function(e){e.exports={}},490:function(e,t,n){var r=n(5005);e.exports=r("document","documentElement")},4664:function(e,t,n){var r=n(9781),i=n(7293),o=n(317);e.exports=!r&&!i(function(){return 7!=Object.defineProperty(o("div"),"a",{get:function(){return 7}}).a})},1179:function(e){var t=Math.abs,n=Math.pow,r=Math.floor,i=Math.log,o=Math.LN2;e.exports={pack:function(e,s,a){var l,c,u,d=new Array(a),f=8*a-s-1,p=(1<>1,v=23===s?n(2,-24)-n(2,-77):0,m=e<0||0===e&&1/e<0?1:0,g=0;for((e=t(e))!=e||e===1/0?(c=e!=e?1:0,l=p):(l=r(i(e)/o),e*(u=n(2,-l))<1&&(l--,u*=2),(e+=l+h>=1?v/u:v*n(2,1-h))*u>=2&&(l++,u/=2),l+h>=p?(c=0,l=p):l+h>=1?(c=(e*u-1)*n(2,s),l+=h):(c=e*n(2,h-1)*n(2,s),l=0));s>=8;d[g++]=255&c,c/=256,s-=8);for(l=l<0;d[g++]=255&l,l/=256,f-=8);return d[--g]|=128*m,d},unpack:function(e,t){var r,i=e.length,o=8*i-t-1,s=(1<>1,l=o-7,c=i-1,u=e[c--],d=127&u;for(u>>=7;l>0;d=256*d+e[c],c--,l-=8);for(r=d&(1<<-l)-1,d>>=-l,l+=t;l>0;r=256*r+e[c],c--,l-=8);if(0===d)d=1-a;else{if(d===s)return r?NaN:u?-1/0:1/0;r+=n(2,t),d-=a}return(u?-1:1)*r*n(2,d-t)}}},8361:function(e,t,n){var r=n(7293),i=n(4326),o="".split;e.exports=r(function(){return!Object("z").propertyIsEnumerable(0)})?function(e){return"String"==i(e)?o.call(e,""):Object(e)}:Object},9587:function(e,t,n){var r=n(111),i=n(7674);e.exports=function(e,t,n){var o,s;return i&&"function"==typeof(o=t.constructor)&&o!==n&&r(s=o.prototype)&&s!==n.prototype&&i(e,s),e}},2788:function(e,t,n){var r=n(5465),i=Function.toString;"function"!=typeof r.inspectSource&&(r.inspectSource=function(e){return i.call(e)}),e.exports=r.inspectSource},9909:function(e,t,n){var r,i,o,s=n(8536),a=n(7854),l=n(111),c=n(8880),u=n(6656),d=n(5465),f=n(6200),p=n(3501),h=a.WeakMap;if(s){var v=d.state||(d.state=new h),m=v.get,g=v.has,y=v.set;r=function(e,t){return t.facade=e,y.call(v,e,t),t},i=function(e){return m.call(v,e)||{}},o=function(e){return g.call(v,e)}}else{var b=f("state");p[b]=!0,r=function(e,t){return t.facade=e,c(e,b,t),t},i=function(e){return u(e,b)?e[b]:{}},o=function(e){return u(e,b)}}e.exports={set:r,get:i,has:o,enforce:function(e){return o(e)?i(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!l(t)||(n=i(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}}},7659:function(e,t,n){var r=n(5112),i=n(7497),o=r("iterator"),s=Array.prototype;e.exports=function(e){return void 0!==e&&(i.Array===e||s[o]===e)}},3157:function(e,t,n){var r=n(4326);e.exports=Array.isArray||function(e){return"Array"==r(e)}},4705:function(e,t,n){var r=n(7293),i=/#|\.prototype\./,o=function(e,t){var n=a[s(e)];return n==c||n!=l&&("function"==typeof t?r(t):!!t)},s=o.normalize=function(e){return String(e).replace(i,".").toLowerCase()},a=o.data={},l=o.NATIVE="N",c=o.POLYFILL="P";e.exports=o},111:function(e){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},1913:function(e){e.exports=!1},7850:function(e,t,n){var r=n(111),i=n(4326),o=n(5112)("match");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[o])?!!t:"RegExp"==i(e))}},9212:function(e,t,n){var r=n(9670);e.exports=function(e){var t=e.return;if(void 0!==t)return r(t.call(e)).value}},3383:function(e,t,n){"use strict";var r,i,o,s=n(7293),a=n(9518),l=n(8880),c=n(6656),u=n(5112),d=n(1913),f=u("iterator"),p=!1;[].keys&&("next"in(o=[].keys())?(i=a(a(o)))!==Object.prototype&&(r=i):p=!0);var h=null==r||s(function(){var e={};return r[f].call(e)!==e});h&&(r={}),d&&!h||c(r,f)||l(r,f,function(){return this}),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:p}},7497:function(e){e.exports={}},133:function(e,t,n){var r=n(7293);e.exports=!!Object.getOwnPropertySymbols&&!r(function(){return!String(Symbol())})},590:function(e,t,n){var r=n(7293),i=n(5112),o=n(1913),s=i("iterator");e.exports=!r(function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,n="";return e.pathname="c%20d",t.forEach(function(e,r){t.delete("b"),n+=r+e}),o&&!e.toJSON||!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[s]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==n||"x"!==new URL("http://x",void 0).host})},8536:function(e,t,n){var r=n(7854),i=n(2788),o=r.WeakMap;e.exports="function"==typeof o&&/native code/.test(i(o))},1574:function(e,t,n){"use strict";var r=n(9781),i=n(7293),o=n(1956),s=n(5181),a=n(5296),l=n(7908),c=n(8361),u=Object.assign,d=Object.defineProperty;e.exports=!u||i(function(){if(r&&1!==u({b:1},u(d({},"a",{enumerable:!0,get:function(){d(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach(function(e){t[e]=e}),7!=u({},e)[n]||o(u({},t)).join("")!=i})?function(e,t){for(var n=l(e),i=arguments.length,u=1,d=s.f,f=a.f;i>u;)for(var p,h=c(arguments[u++]),v=d?o(h).concat(d(h)):o(h),m=v.length,g=0;m>g;)p=v[g++],r&&!f.call(h,p)||(n[p]=h[p]);return n}:u},30:function(e,t,n){var r,i=n(9670),o=n(6048),s=n(748),a=n(3501),l=n(490),c=n(317),u=n(6200),d="prototype",f="script",p=u("IE_PROTO"),h=function(){},v=function(e){return"<"+f+">"+e+""},m=function(){try{r=document.domain&&new ActiveXObject("htmlfile")}catch(e){}var e,t,n;m=r?function(e){e.write(v("")),e.close();var t=e.parentWindow.Object;return e=null,t}(r):(t=c("iframe"),n="java"+f+":",t.style.display="none",l.appendChild(t),t.src=String(n),(e=t.contentWindow.document).open(),e.write(v("document.F=Object")),e.close(),e.F);for(var i=s.length;i--;)delete m[d][s[i]];return m()};a[p]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(h[d]=i(e),n=new h,h[d]=null,n[p]=e):n=m(),void 0===t?n:o(n,t)}},6048:function(e,t,n){var r=n(9781),i=n(3070),o=n(9670),s=n(1956);e.exports=r?Object.defineProperties:function(e,t){o(e);for(var n,r=s(t),a=r.length,l=0;a>l;)i.f(e,n=r[l++],t[n]);return e}},3070:function(e,t,n){var r=n(9781),i=n(4664),o=n(9670),s=n(7593),a=Object.defineProperty;t.f=r?a:function(e,t,n){if(o(e),t=s(t,!0),o(n),i)try{return a(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},1236:function(e,t,n){var r=n(9781),i=n(5296),o=n(9114),s=n(5656),a=n(7593),l=n(6656),c=n(4664),u=Object.getOwnPropertyDescriptor;t.f=r?u:function(e,t){if(e=s(e),t=a(t,!0),c)try{return u(e,t)}catch(e){}if(l(e,t))return o(!i.f.call(e,t),e[t])}},8006:function(e,t,n){var r=n(6324),i=n(748).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,i)}},5181:function(e,t){t.f=Object.getOwnPropertySymbols},9518:function(e,t,n){var r=n(6656),i=n(7908),o=n(6200),s=n(8544),a=o("IE_PROTO"),l=Object.prototype;e.exports=s?Object.getPrototypeOf:function(e){return e=i(e),r(e,a)?e[a]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?l:null}},6324:function(e,t,n){var r=n(6656),i=n(5656),o=n(1318).indexOf,s=n(3501);e.exports=function(e,t){var n,a=i(e),l=0,c=[];for(n in a)!r(s,n)&&r(a,n)&&c.push(n);for(;t.length>l;)r(a,n=t[l++])&&(~o(c,n)||c.push(n));return c}},1956:function(e,t,n){var r=n(6324),i=n(748);e.exports=Object.keys||function(e){return r(e,i)}},5296:function(e,t){"use strict";var n={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,i=r&&!n.call({1:2},1);t.f=i?function(e){var t=r(this,e);return!!t&&t.enumerable}:n},7674:function(e,t,n){var r=n(9670),i=n(6077);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,o){return r(n),i(o),t?e.call(n,o):n.__proto__=o,n}}():void 0)},288:function(e,t,n){"use strict";var r=n(1694),i=n(648);e.exports=r?{}.toString:function(){return"[object "+i(this)+"]"}},3887:function(e,t,n){var r=n(5005),i=n(8006),o=n(5181),s=n(9670);e.exports=r("Reflect","ownKeys")||function(e){var t=i.f(s(e)),n=o.f;return n?t.concat(n(e)):t}},857:function(e,t,n){var r=n(7854);e.exports=r},2248:function(e,t,n){var r=n(1320);e.exports=function(e,t,n){for(var i in t)r(e,i,t[i],n);return e}},1320:function(e,t,n){var r=n(7854),i=n(8880),o=n(6656),s=n(3505),a=n(2788),l=n(9909),c=l.get,u=l.enforce,d=String(String).split("String");(e.exports=function(e,t,n,a){var l,c=!!a&&!!a.unsafe,f=!!a&&!!a.enumerable,p=!!a&&!!a.noTargetGet;"function"==typeof n&&("string"!=typeof t||o(n,"name")||i(n,"name",t),(l=u(n)).source||(l.source=d.join("string"==typeof t?t:""))),e!==r?(c?!p&&e[t]&&(f=!0):delete e[t],f?e[t]=n:i(e,t,n)):f?e[t]=n:s(t,n)})(Function.prototype,"toString",function(){return"function"==typeof this&&c(this).source||a(this)})},7651:function(e,t,n){var r=n(4326),i=n(2261);e.exports=function(e,t){var n=e.exec;if("function"==typeof n){var o=n.call(e,t);if("object"!=typeof o)throw TypeError("RegExp exec method returned something other than an Object or null");return o}if("RegExp"!==r(e))throw TypeError("RegExp#exec called on incompatible receiver");return i.call(e,t)}},2261:function(e,t,n){"use strict";var r,i,o=n(7066),s=n(2999),a=RegExp.prototype.exec,l=String.prototype.replace,c=a,u=(r=/a/,i=/b*/g,a.call(r,"a"),a.call(i,"a"),0!==r.lastIndex||0!==i.lastIndex),d=s.UNSUPPORTED_Y||s.BROKEN_CARET,f=void 0!==/()??/.exec("")[1];(u||f||d)&&(c=function(e){var t,n,r,i,s=this,c=d&&s.sticky,p=o.call(s),h=s.source,v=0,m=e;return c&&(-1===(p=p.replace("y","")).indexOf("g")&&(p+="g"),m=String(e).slice(s.lastIndex),s.lastIndex>0&&(!s.multiline||s.multiline&&"\n"!==e[s.lastIndex-1])&&(h="(?: "+h+")",m=" "+m,v++),n=new RegExp("^(?:"+h+")",p)),f&&(n=new RegExp("^"+h+"$(?!\\s)",p)),u&&(t=s.lastIndex),r=a.call(c?n:s,m),c?r?(r.input=r.input.slice(v),r[0]=r[0].slice(v),r.index=s.lastIndex,s.lastIndex+=r[0].length):s.lastIndex=0:u&&r&&(s.lastIndex=s.global?r.index+r[0].length:t),f&&r&&r.length>1&&l.call(r[0],n,function(){for(i=1;i=c?e?"":void 0:(o=a.charCodeAt(l))<55296||o>56319||l+1===c||(s=a.charCodeAt(l+1))<56320||s>57343?e?a.charAt(l):o:e?a.slice(l,l+2):s-56320+(o-55296<<10)+65536}};e.exports={codeAt:o(!1),charAt:o(!0)}},3197:function(e){"use strict";var t=2147483647,n=/[^\0-\u007E]/,r=/[.\u3002\uFF0E\uFF61]/g,i="Overflow: input needs wider integers to process",o=Math.floor,s=String.fromCharCode,a=function(e){return e+22+75*(e<26)},l=function(e,t,n){var r=0;for(e=n?o(e/700):e>>1,e+=o(e/t);e>455;r+=36)e=o(e/35);return o(r+36*e/(e+38))},c=function(e){var n=[];e=function(e){for(var t=[],n=0,r=e.length;n=55296&&i<=56319&&n=d&&co((t-f)/g))throw RangeError(i);for(f+=(m-d)*g,d=m,r=0;rt)throw RangeError(i);if(c==d){for(var y=f,b=36;;b+=36){var w=b<=p?1:b>=p+26?26:b-p;if(y0?n:t)(e)}},7466:function(e,t,n){var r=n(9958),i=Math.min;e.exports=function(e){return e>0?i(r(e),9007199254740991):0}},7908:function(e,t,n){var r=n(4488);e.exports=function(e){return Object(r(e))}},4590:function(e,t,n){var r=n(3002);e.exports=function(e,t){var n=r(e);if(n%t)throw RangeError("Wrong offset");return n}},3002:function(e,t,n){var r=n(9958);e.exports=function(e){var t=r(e);if(t<0)throw RangeError("The argument can't be less than 0");return t}},7593:function(e,t,n){var r=n(111);e.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},1694:function(e,t,n){var r={};r[n(5112)("toStringTag")]="z",e.exports="[object z]"===String(r)},9843:function(e,t,n){"use strict";var r=n(2109),i=n(7854),o=n(9781),s=n(3832),a=n(260),l=n(3331),c=n(5787),u=n(9114),d=n(8880),f=n(7466),p=n(7067),h=n(4590),v=n(7593),m=n(6656),g=n(648),y=n(111),b=n(30),w=n(7674),x=n(8006).f,E=n(7321),S=n(2092).forEach,k=n(6340),L=n(3070),A=n(1236),C=n(9909),F=n(9587),_=C.get,T=C.set,I=L.f,M=A.f,R=Math.round,z=i.RangeError,q=l.ArrayBuffer,D=l.DataView,j=a.NATIVE_ARRAY_BUFFER_VIEWS,O=a.TYPED_ARRAY_TAG,U=a.TypedArray,P=a.TypedArrayPrototype,N=a.aTypedArrayConstructor,$=a.isTypedArray,B="BYTES_PER_ELEMENT",W="Wrong length",H=function(e,t){for(var n=0,r=t.length,i=new(N(e))(r);r>n;)i[n]=t[n++];return i},Y=function(e,t){I(e,t,{get:function(){return _(this)[t]}})},G=function(e){var t;return e instanceof q||"ArrayBuffer"==(t=g(e))||"SharedArrayBuffer"==t},Q=function(e,t){return $(e)&&"symbol"!=typeof t&&t in e&&String(+t)==String(t)},X=function(e,t){return Q(e,t=v(t,!0))?u(2,e[t]):M(e,t)},V=function(e,t,n){return!(Q(e,t=v(t,!0))&&y(n)&&m(n,"value"))||m(n,"get")||m(n,"set")||n.configurable||m(n,"writable")&&!n.writable||m(n,"enumerable")&&!n.enumerable?I(e,t,n):(e[t]=n.value,e)};o?(j||(A.f=X,L.f=V,Y(P,"buffer"),Y(P,"byteOffset"),Y(P,"byteLength"),Y(P,"length")),r({target:"Object",stat:!0,forced:!j},{getOwnPropertyDescriptor:X,defineProperty:V}),e.exports=function(e,t,n){var o=e.match(/\d+$/)[0]/8,a=e+(n?"Clamped":"")+"Array",l="get"+e,u="set"+e,v=i[a],m=v,g=m&&m.prototype,L={},A=function(e,t){I(e,t,{get:function(){return function(e,t){var n=_(e);return n.view[l](t*o+n.byteOffset,!0)}(this,t)},set:function(e){return function(e,t,r){var i=_(e);n&&(r=(r=R(r))<0?0:r>255?255:255&r),i.view[u](t*o+i.byteOffset,r,!0)}(this,t,e)},enumerable:!0})};j?s&&(m=t(function(e,t,n,r){return c(e,m,a),F(y(t)?G(t)?void 0!==r?new v(t,h(n,o),r):void 0!==n?new v(t,h(n,o)):new v(t):$(t)?H(m,t):E.call(m,t):new v(p(t)),e,m)}),w&&w(m,U),S(x(v),function(e){e in m||d(m,e,v[e])}),m.prototype=g):(m=t(function(e,t,n,r){c(e,m,a);var i,s,l,u=0,d=0;if(y(t)){if(!G(t))return $(t)?H(m,t):E.call(m,t);i=t,d=h(n,o);var v=t.byteLength;if(void 0===r){if(v%o)throw z(W);if((s=v-d)<0)throw z(W)}else if((s=f(r)*o)+d>v)throw z(W);l=s/o}else l=p(t),i=new q(s=l*o);for(T(e,{buffer:i,byteOffset:d,byteLength:s,length:l,view:new D(i)});uo;)a[o]=t[o++];return a}},7321:function(e,t,n){var r=n(7908),i=n(7466),o=n(1246),s=n(7659),a=n(9974),l=n(260).aTypedArrayConstructor;e.exports=function(e){var t,n,c,u,d,f,p=r(e),h=arguments.length,v=h>1?arguments[1]:void 0,m=void 0!==v,g=o(p);if(null!=g&&!s(g))for(f=(d=g.call(p)).next,p=[];!(u=f.call(d)).done;)p.push(u.value);for(m&&h>2&&(v=a(v,arguments[2],2)),n=i(p.length),c=new(l(this))(n),t=0;n>t;t++)c[t]=m?v(p[t],t):p[t];return c}},9711:function(e){var t=0,n=Math.random();e.exports=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++t+n).toString(36)}},3307:function(e,t,n){var r=n(133);e.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},5112:function(e,t,n){var r=n(7854),i=n(2309),o=n(6656),s=n(9711),a=n(133),l=n(3307),c=i("wks"),u=r.Symbol,d=l?u:u&&u.withoutSetter||s;e.exports=function(e){return o(c,e)||(a&&o(u,e)?c[e]=u[e]:c[e]=d("Symbol."+e)),c[e]}},1361:function(e){e.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},8264:function(e,t,n){"use strict";var r=n(2109),i=n(7854),o=n(3331),s=n(6340),a="ArrayBuffer",l=o[a];r({global:!0,forced:i[a]!==l},{ArrayBuffer:l}),s(a)},2222:function(e,t,n){"use strict";var r=n(2109),i=n(7293),o=n(3157),s=n(111),a=n(7908),l=n(7466),c=n(6135),u=n(5417),d=n(1194),f=n(5112),p=n(7392),h=f("isConcatSpreadable"),v=9007199254740991,m="Maximum allowed index exceeded",g=p>=51||!i(function(){var e=[];return e[h]=!1,e.concat()[0]!==e}),y=d("concat"),b=function(e){if(!s(e))return!1;var t=e[h];return void 0!==t?!!t:o(e)};r({target:"Array",proto:!0,forced:!g||!y},{concat:function(e){var t,n,r,i,o,s=a(this),d=u(s,0),f=0;for(t=-1,r=arguments.length;tv)throw TypeError(m);for(n=0;n=v)throw TypeError(m);c(d,f++,o)}return d.length=f,d}})},7327:function(e,t,n){"use strict";var r=n(2109),i=n(2092).filter;r({target:"Array",proto:!0,forced:!n(1194)("filter")},{filter:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}})},2772:function(e,t,n){"use strict";var r=n(2109),i=n(1318).indexOf,o=n(9341),s=[].indexOf,a=!!s&&1/[1].indexOf(1,-0)<0,l=o("indexOf");r({target:"Array",proto:!0,forced:a||!l},{indexOf:function(e){return a?s.apply(this,arguments)||0:i(this,e,arguments.length>1?arguments[1]:void 0)}})},6992:function(e,t,n){"use strict";var r=n(5656),i=n(1223),o=n(7497),s=n(9909),a=n(654),l="Array Iterator",c=s.set,u=s.getterFor(l);e.exports=a(Array,"Array",function(e,t){c(this,{type:l,target:r(e),index:0,kind:t})},function(){var e=u(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}},"values"),o.Arguments=o.Array,i("keys"),i("values"),i("entries")},1249:function(e,t,n){"use strict";var r=n(2109),i=n(2092).map;r({target:"Array",proto:!0,forced:!n(1194)("map")},{map:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}})},7042:function(e,t,n){"use strict";var r=n(2109),i=n(111),o=n(3157),s=n(1400),a=n(7466),l=n(5656),c=n(6135),u=n(5112),d=n(1194)("slice"),f=u("species"),p=[].slice,h=Math.max;r({target:"Array",proto:!0,forced:!d},{slice:function(e,t){var n,r,u,d=l(this),v=a(d.length),m=s(e,v),g=s(void 0===t?v:t,v);if(o(d)&&("function"!=typeof(n=d.constructor)||n!==Array&&!o(n.prototype)?i(n)&&null===(n=n[f])&&(n=void 0):n=void 0,n===Array||void 0===n))return p.call(d,m,g);for(r=new(void 0===n?Array:n)(h(g-m,0)),u=0;m9007199254740991)throw TypeError("Maximum allowed length exceeded");for(u=l(m,r),p=0;pg-r+n;p--)delete m[p-1]}else if(n>r)for(p=g-r;p>y;p--)v=p+n-1,(h=p+r-1)in m?m[v]=m[h]:delete m[v];for(p=0;p=n.length?{value:void 0,done:!0}:(e=r(n,i),t.index+=e.length,{value:e,done:!1})})},4723:function(e,t,n){"use strict";var r=n(7007),i=n(9670),o=n(7466),s=n(4488),a=n(1530),l=n(7651);r("match",1,function(e,t,n){return[function(t){var n=s(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var s=i(e),c=String(this);if(!s.global)return l(s,c);var u=s.unicode;s.lastIndex=0;for(var d,f=[],p=0;null!==(d=l(s,c));){var h=String(d[0]);f[p]=h,""===h&&(s.lastIndex=a(c,o(s.lastIndex),u)),p++}return 0===p?null:f}]})},5306:function(e,t,n){"use strict";var r=n(7007),i=n(9670),o=n(7466),s=n(9958),a=n(4488),l=n(1530),c=n(647),u=n(7651),d=Math.max,f=Math.min,p=function(e){return void 0===e?e:String(e)};r("replace",2,function(e,t,n,r){var h=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,v=r.REPLACE_KEEPS_$0,m=h?"$":"$0";return[function(n,r){var i=a(this),o=null==n?void 0:n[e];return void 0!==o?o.call(n,i,r):t.call(String(i),n,r)},function(e,r){if(!h&&v||"string"==typeof r&&-1===r.indexOf(m)){var a=n(t,e,this,r);if(a.done)return a.value}var g=i(e),y=String(this),b="function"==typeof r;b||(r=String(r));var w=g.global;if(w){var x=g.unicode;g.lastIndex=0}for(var E=[];;){var S=u(g,y);if(null===S)break;if(E.push(S),!w)break;""===String(S[0])&&(g.lastIndex=l(y,o(g.lastIndex),x))}for(var k="",L=0,A=0;A=L&&(k+=y.slice(L,F)+R,L=F+C.length)}return k+y.slice(L)}]})},3123:function(e,t,n){"use strict";var r=n(7007),i=n(7850),o=n(9670),s=n(4488),a=n(6707),l=n(1530),c=n(7466),u=n(7651),d=n(2261),f=n(7293),p=[].push,h=Math.min,v=4294967295,m=!f(function(){return!RegExp(v,"y")});r("split",2,function(e,t,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var r=String(s(this)),o=void 0===n?v:n>>>0;if(0===o)return[];if(void 0===e)return[r];if(!i(e))return t.call(r,e,o);for(var a,l,c,u=[],f=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),h=0,m=new RegExp(e.source,f+"g");(a=d.call(m,r))&&!((l=m.lastIndex)>h&&(u.push(r.slice(h,a.index)),a.length>1&&a.index=o));)m.lastIndex===a.index&&m.lastIndex++;return h===r.length?!c&&m.test("")||u.push(""):u.push(r.slice(h)),u.length>o?u.slice(0,o):u}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var i=s(this),o=null==t?void 0:t[e];return void 0!==o?o.call(t,i,n):r.call(String(i),t,n)},function(e,i){var s=n(r,e,this,i,r!==t);if(s.done)return s.value;var d=o(e),f=String(this),p=a(d,RegExp),g=d.unicode,y=(d.ignoreCase?"i":"")+(d.multiline?"m":"")+(d.unicode?"u":"")+(m?"y":"g"),b=new p(m?d:"^(?:"+d.source+")",y),w=void 0===i?v:i>>>0;if(0===w)return[];if(0===f.length)return null===u(b,f)?[f]:[];for(var x=0,E=0,S=[];E2?arguments[2]:void 0)})},8927:function(e,t,n){"use strict";var r=n(260),i=n(2092).every,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("every",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},3105:function(e,t,n){"use strict";var r=n(260),i=n(1285),o=r.aTypedArray;(0,r.exportTypedArrayMethod)("fill",function(e){return i.apply(o(this),arguments)})},5035:function(e,t,n){"use strict";var r=n(260),i=n(2092).filter,o=n(3074),s=r.aTypedArray;(0,r.exportTypedArrayMethod)("filter",function(e){var t=i(s(this),e,arguments.length>1?arguments[1]:void 0);return o(this,t)})},7174:function(e,t,n){"use strict";var r=n(260),i=n(2092).findIndex,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("findIndex",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},4345:function(e,t,n){"use strict";var r=n(260),i=n(2092).find,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("find",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},2846:function(e,t,n){"use strict";var r=n(260),i=n(2092).forEach,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("forEach",function(e){i(o(this),e,arguments.length>1?arguments[1]:void 0)})},4731:function(e,t,n){"use strict";var r=n(260),i=n(1318).includes,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("includes",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},7209:function(e,t,n){"use strict";var r=n(260),i=n(1318).indexOf,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("indexOf",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},6319:function(e,t,n){"use strict";var r=n(7854),i=n(260),o=n(6992),s=n(5112)("iterator"),a=r.Uint8Array,l=o.values,c=o.keys,u=o.entries,d=i.aTypedArray,f=i.exportTypedArrayMethod,p=a&&a.prototype[s],h=!!p&&("values"==p.name||null==p.name),v=function(){return l.call(d(this))};f("entries",function(){return u.call(d(this))}),f("keys",function(){return c.call(d(this))}),f("values",v,!h),f(s,v,!h)},8867:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=[].join;o("join",function(e){return s.apply(i(this),arguments)})},7789:function(e,t,n){"use strict";var r=n(260),i=n(6583),o=r.aTypedArray;(0,r.exportTypedArrayMethod)("lastIndexOf",function(e){return i.apply(o(this),arguments)})},3739:function(e,t,n){"use strict";var r=n(260),i=n(2092).map,o=n(6707),s=r.aTypedArray,a=r.aTypedArrayConstructor;(0,r.exportTypedArrayMethod)("map",function(e){return i(s(this),e,arguments.length>1?arguments[1]:void 0,function(e,t){return new(a(o(e,e.constructor)))(t)})})},4483:function(e,t,n){"use strict";var r=n(260),i=n(3671).right,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("reduceRight",function(e){return i(o(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)})},9368:function(e,t,n){"use strict";var r=n(260),i=n(3671).left,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("reduce",function(e){return i(o(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)})},2056:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=Math.floor;o("reverse",function(){for(var e,t=this,n=i(t).length,r=s(n/2),o=0;o1?arguments[1]:void 0,1),n=this.length,r=s(e),a=i(r.length),c=0;if(a+t>n)throw RangeError("Wrong length");for(;co;)u[o]=n[o++];return u},o(function(){new Int8Array(1).slice()}))},7462:function(e,t,n){"use strict";var r=n(260),i=n(2092).some,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("some",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},3824:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=[].sort;o("sort",function(e){return s.call(i(this),e)})},5021:function(e,t,n){"use strict";var r=n(260),i=n(7466),o=n(1400),s=n(6707),a=r.aTypedArray;(0,r.exportTypedArrayMethod)("subarray",function(e,t){var n=a(this),r=n.length,l=o(e,r);return new(s(n,n.constructor))(n.buffer,n.byteOffset+l*n.BYTES_PER_ELEMENT,i((void 0===t?r:o(t,r))-l))})},2974:function(e,t,n){"use strict";var r=n(7854),i=n(260),o=n(7293),s=r.Int8Array,a=i.aTypedArray,l=i.exportTypedArrayMethod,c=[].toLocaleString,u=[].slice,d=!!s&&o(function(){c.call(new s(1))});l("toLocaleString",function(){return c.apply(d?u.call(a(this)):a(this),arguments)},o(function(){return[1,2].toLocaleString()!=new s([1,2]).toLocaleString()})||!o(function(){s.prototype.toLocaleString.call([1,2])}))},5016:function(e,t,n){"use strict";var r=n(260).exportTypedArrayMethod,i=n(7293),o=n(7854).Uint8Array,s=o&&o.prototype||{},a=[].toString,l=[].join;i(function(){a.call({})})&&(a=function(){return l.call(this)});var c=s.toString!=a;r("toString",a,c)},2472:function(e,t,n){n(9843)("Uint8",function(e){return function(t,n,r){return e(this,t,n,r)}})},4747:function(e,t,n){var r=n(7854),i=n(8324),o=n(8533),s=n(8880);for(var a in i){var l=r[a],c=l&&l.prototype;if(c&&c.forEach!==o)try{s(c,"forEach",o)}catch(e){c.forEach=o}}},3948:function(e,t,n){var r=n(7854),i=n(8324),o=n(6992),s=n(8880),a=n(5112),l=a("iterator"),c=a("toStringTag"),u=o.values;for(var d in i){var f=r[d],p=f&&f.prototype;if(p){if(p[l]!==u)try{s(p,l,u)}catch(e){p[l]=u}if(p[c]||s(p,c,d),i[d])for(var h in o)if(p[h]!==o[h])try{s(p,h,o[h])}catch(e){p[h]=o[h]}}}},1637:function(e,t,n){"use strict";n(6992);var r=n(2109),i=n(5005),o=n(590),s=n(1320),a=n(2248),l=n(8003),c=n(4994),u=n(9909),d=n(5787),f=n(6656),p=n(9974),h=n(648),v=n(9670),m=n(111),g=n(30),y=n(9114),b=n(8554),w=n(1246),x=n(5112),E=i("fetch"),S=i("Headers"),k=x("iterator"),L="URLSearchParams",A=L+"Iterator",C=u.set,F=u.getterFor(L),_=u.getterFor(A),T=/\+/g,I=Array(4),M=function(e){return I[e-1]||(I[e-1]=RegExp("((?:%[\\da-f]{2}){"+e+"})","gi"))},R=function(e){try{return decodeURIComponent(e)}catch(t){return e}},z=function(e){var t=e.replace(T," "),n=4;try{return decodeURIComponent(t)}catch(e){for(;n;)t=t.replace(M(n--),R);return t}},q=/[!'()~]|%20/g,D={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},j=function(e){return D[e]},O=function(e){return encodeURIComponent(e).replace(q,j)},U=function(e,t){if(t)for(var n,r,i=t.split("&"),o=0;o0?arguments[0]:void 0,u=[];if(C(this,{type:L,entries:u,updateURL:function(){},updateSearchParams:P}),void 0!==c)if(m(c))if("function"==typeof(e=w(c)))for(n=(t=e.call(c)).next;!(r=n.call(t)).done;){if((s=(o=(i=b(v(r.value))).next).call(i)).done||(a=o.call(i)).done||!o.call(i).done)throw TypeError("Expected sequence with length 2");u.push({key:s.value+"",value:a.value+""})}else for(l in c)f(c,l)&&u.push({key:l,value:c[l]+""});else U(u,"string"==typeof c?"?"===c.charAt(0)?c.slice(1):c:c+"")},W=B.prototype;a(W,{append:function(e,t){N(arguments.length,2);var n=F(this);n.entries.push({key:e+"",value:t+""}),n.updateURL()},delete:function(e){N(arguments.length,1);for(var t=F(this),n=t.entries,r=e+"",i=0;ie.key){i.splice(t,0,e);break}t===n&&i.push(e)}r.updateURL()},forEach:function(e){for(var t,n=F(this).entries,r=p(e,arguments.length>1?arguments[1]:void 0,3),i=0;i1&&(m(t=arguments[1])&&(n=t.body,h(n)===L&&((r=t.headers?new S(t.headers):new S).has("content-type")||r.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),t=g(t,{body:y(0,String(n)),headers:y(0,r)}))),i.push(t)),E.apply(this,i)}}),e.exports={URLSearchParams:B,getState:F}},285:function(e,t,n){"use strict";n(8783);var r,i=n(2109),o=n(9781),s=n(590),a=n(7854),l=n(6048),c=n(1320),u=n(5787),d=n(6656),f=n(1574),p=n(8457),h=n(8710).codeAt,v=n(3197),m=n(8003),g=n(1637),y=n(9909),b=a.URL,w=g.URLSearchParams,x=g.getState,E=y.set,S=y.getterFor("URL"),k=Math.floor,L=Math.pow,A="Invalid scheme",C="Invalid host",F="Invalid port",_=/[A-Za-z]/,T=/[\d+-.A-Za-z]/,I=/\d/,M=/^(0x|0X)/,R=/^[0-7]+$/,z=/^\d+$/,q=/^[\dA-Fa-f]+$/,D=/[\u0000\t\u000A\u000D #%/:?@[\\]]/,j=/[\u0000\t\u000A\u000D #/:?@[\\]]/,O=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,U=/[\t\u000A\u000D]/g,P=function(e,t){var n,r,i;if("["==t.charAt(0)){if("]"!=t.charAt(t.length-1))return C;if(!(n=$(t.slice(1,-1))))return C;e.host=n}else if(V(e)){if(t=v(t),D.test(t))return C;if(null===(n=N(t)))return C;e.host=n}else{if(j.test(t))return C;for(n="",r=p(t),i=0;i4)return e;for(n=[],r=0;r1&&"0"==i.charAt(0)&&(o=M.test(i)?16:8,i=i.slice(8==o?1:2)),""===i)s=0;else{if(!(10==o?z:8==o?R:q).test(i))return e;s=parseInt(i,o)}n.push(s)}for(r=0;r=L(256,5-t))return null}else if(s>255)return null;for(a=n.pop(),r=0;r6)return;for(r=0;f();){if(i=null,r>0){if(!("."==f()&&r<4))return;d++}if(!I.test(f()))return;for(;I.test(f());){if(o=parseInt(f(),10),null===i)i=o;else{if(0==i)return;i=10*i+o}if(i>255)return;d++}l[c]=256*l[c]+i,2!=++r&&4!=r||c++}if(4!=r)return;break}if(":"==f()){if(d++,!f())return}else if(f())return;l[c++]=t}else{if(null!==u)return;d++,u=++c}}if(null!==u)for(s=c-u,c=7;0!=c&&s>0;)a=l[c],l[c--]=l[u+s-1],l[u+--s]=a;else if(8!=c)return;return l},B=function(e){var t,n,r,i;if("number"==typeof e){for(t=[],n=0;n<4;n++)t.unshift(e%256),e=k(e/256);return t.join(".")}if("object"==typeof e){for(t="",r=function(e){for(var t=null,n=1,r=null,i=0,o=0;o<8;o++)0!==e[o]?(i>n&&(t=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(t=r,n=i),t}(e),n=0;n<8;n++)i&&0===e[n]||(i&&(i=!1),r===n?(t+=n?":":"::",i=!0):(t+=e[n].toString(16),n<7&&(t+=":")));return"["+t+"]"}return e},W={},H=f({},W,{" ":1,'"':1,"<":1,">":1,"`":1}),Y=f({},H,{"#":1,"?":1,"{":1,"}":1}),G=f({},Y,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),Q=function(e,t){var n=h(e,0);return n>32&&n<127&&!d(t,e)?e:encodeURIComponent(e)},X={ftp:21,file:null,http:80,https:443,ws:80,wss:443},V=function(e){return d(X,e.scheme)},K=function(e){return""!=e.username||""!=e.password},Z=function(e){return!e.host||e.cannotBeABaseURL||"file"==e.scheme},J=function(e,t){var n;return 2==e.length&&_.test(e.charAt(0))&&(":"==(n=e.charAt(1))||!t&&"|"==n)},ee=function(e){var t;return e.length>1&&J(e.slice(0,2))&&(2==e.length||"/"===(t=e.charAt(2))||"\\"===t||"?"===t||"#"===t)},te=function(e){var t=e.path,n=t.length;!n||"file"==e.scheme&&1==n&&J(t[0],!0)||t.pop()},ne=function(e){return"."===e||"%2e"===e.toLowerCase()},re=function(e){return".."===(e=e.toLowerCase())||"%2e."===e||".%2e"===e||"%2e%2e"===e},ie={},oe={},se={},ae={},le={},ce={},ue={},de={},fe={},pe={},he={},ve={},me={},ge={},ye={},be={},we={},xe={},Ee={},Se={},ke={},Le=function(e,t,n,i){var o,s,a,l,c=n||ie,u=0,f="",h=!1,v=!1,m=!1;for(n||(e.scheme="",e.username="",e.password="",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,t=t.replace(O,"")),t=t.replace(U,""),o=p(t);u<=o.length;){switch(s=o[u],c){case ie:if(!s||!_.test(s)){if(n)return A;c=se;continue}f+=s.toLowerCase(),c=oe;break;case oe:if(s&&(T.test(s)||"+"==s||"-"==s||"."==s))f+=s.toLowerCase();else{if(":"!=s){if(n)return A;f="",c=se,u=0;continue}if(n&&(V(e)!=d(X,f)||"file"==f&&(K(e)||null!==e.port)||"file"==e.scheme&&!e.host))return;if(e.scheme=f,n)return void(V(e)&&X[e.scheme]==e.port&&(e.port=null));f="","file"==e.scheme?c=ge:V(e)&&i&&i.scheme==e.scheme?c=ae:V(e)?c=de:"/"==o[u+1]?(c=le,u++):(e.cannotBeABaseURL=!0,e.path.push(""),c=Ee)}break;case se:if(!i||i.cannotBeABaseURL&&"#"!=s)return A;if(i.cannotBeABaseURL&&"#"==s){e.scheme=i.scheme,e.path=i.path.slice(),e.query=i.query,e.fragment="",e.cannotBeABaseURL=!0,c=ke;break}c="file"==i.scheme?ge:ce;continue;case ae:if("/"!=s||"/"!=o[u+1]){c=ce;continue}c=fe,u++;break;case le:if("/"==s){c=pe;break}c=xe;continue;case ce:if(e.scheme=i.scheme,s==r)e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query=i.query;else if("/"==s||"\\"==s&&V(e))c=ue;else if("?"==s)e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query="",c=Se;else{if("#"!=s){e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.path.pop(),c=xe;continue}e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query=i.query,e.fragment="",c=ke}break;case ue:if(!V(e)||"/"!=s&&"\\"!=s){if("/"!=s){e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,c=xe;continue}c=pe}else c=fe;break;case de:if(c=fe,"/"!=s||"/"!=f.charAt(u+1))continue;u++;break;case fe:if("/"!=s&&"\\"!=s){c=pe;continue}break;case pe:if("@"==s){h&&(f="%40"+f),h=!0,a=p(f);for(var g=0;g65535)return F;e.port=V(e)&&w===X[e.scheme]?null:w,f=""}if(n)return;c=we;continue}return F}f+=s;break;case ge:if(e.scheme="file","/"==s||"\\"==s)c=ye;else{if(!i||"file"!=i.scheme){c=xe;continue}if(s==r)e.host=i.host,e.path=i.path.slice(),e.query=i.query;else if("?"==s)e.host=i.host,e.path=i.path.slice(),e.query="",c=Se;else{if("#"!=s){ee(o.slice(u).join(""))||(e.host=i.host,e.path=i.path.slice(),te(e)),c=xe;continue}e.host=i.host,e.path=i.path.slice(),e.query=i.query,e.fragment="",c=ke}}break;case ye:if("/"==s||"\\"==s){c=be;break}i&&"file"==i.scheme&&!ee(o.slice(u).join(""))&&(J(i.path[0],!0)?e.path.push(i.path[0]):e.host=i.host),c=xe;continue;case be:if(s==r||"/"==s||"\\"==s||"?"==s||"#"==s){if(!n&&J(f))c=xe;else if(""==f){if(e.host="",n)return;c=we}else{if(l=P(e,f))return l;if("localhost"==e.host&&(e.host=""),n)return;f="",c=we}continue}f+=s;break;case we:if(V(e)){if(c=xe,"/"!=s&&"\\"!=s)continue}else if(n||"?"!=s)if(n||"#"!=s){if(s!=r&&(c=xe,"/"!=s))continue}else e.fragment="",c=ke;else e.query="",c=Se;break;case xe:if(s==r||"/"==s||"\\"==s&&V(e)||!n&&("?"==s||"#"==s)){if(re(f)?(te(e),"/"==s||"\\"==s&&V(e)||e.path.push("")):ne(f)?"/"==s||"\\"==s&&V(e)||e.path.push(""):("file"==e.scheme&&!e.path.length&&J(f)&&(e.host&&(e.host=""),f=f.charAt(0)+":"),e.path.push(f)),f="","file"==e.scheme&&(s==r||"?"==s||"#"==s))for(;e.path.length>1&&""===e.path[0];)e.path.shift();"?"==s?(e.query="",c=Se):"#"==s&&(e.fragment="",c=ke)}else f+=Q(s,Y);break;case Ee:"?"==s?(e.query="",c=Se):"#"==s?(e.fragment="",c=ke):s!=r&&(e.path[0]+=Q(s,W));break;case Se:n||"#"!=s?s!=r&&("'"==s&&V(e)?e.query+="%27":e.query+="#"==s?"%23":Q(s,W)):(e.fragment="",c=ke);break;case ke:s!=r&&(e.fragment+=Q(s,H))}u++}},Ae=function(e){var t,n,r=u(this,Ae,"URL"),i=arguments.length>1?arguments[1]:void 0,s=String(e),a=E(r,{type:"URL"});if(void 0!==i)if(i instanceof Ae)t=S(i);else if(n=Le(t={},String(i)))throw TypeError(n);if(n=Le(a,s,null,t))throw TypeError(n);var l=a.searchParams=new w,c=x(l);c.updateSearchParams(a.query),c.updateURL=function(){a.query=String(l)||null},o||(r.href=Fe.call(r),r.origin=_e.call(r),r.protocol=Te.call(r),r.username=Ie.call(r),r.password=Me.call(r),r.host=Re.call(r),r.hostname=ze.call(r),r.port=qe.call(r),r.pathname=De.call(r),r.search=je.call(r),r.searchParams=Oe.call(r),r.hash=Ue.call(r))},Ce=Ae.prototype,Fe=function(){var e=S(this),t=e.scheme,n=e.username,r=e.password,i=e.host,o=e.port,s=e.path,a=e.query,l=e.fragment,c=t+":";return null!==i?(c+="//",K(e)&&(c+=n+(r?":"+r:"")+"@"),c+=B(i),null!==o&&(c+=":"+o)):"file"==t&&(c+="//"),c+=e.cannotBeABaseURL?s[0]:s.length?"/"+s.join("/"):"",null!==a&&(c+="?"+a),null!==l&&(c+="#"+l),c},_e=function(){var e=S(this),t=e.scheme,n=e.port;if("blob"==t)try{return new URL(t.path[0]).origin}catch(e){return"null"}return"file"!=t&&V(e)?t+"://"+B(e.host)+(null!==n?":"+n:""):"null"},Te=function(){return S(this).scheme+":"},Ie=function(){return S(this).username},Me=function(){return S(this).password},Re=function(){var e=S(this),t=e.host,n=e.port;return null===t?"":null===n?B(t):B(t)+":"+n},ze=function(){var e=S(this).host;return null===e?"":B(e)},qe=function(){var e=S(this).port;return null===e?"":String(e)},De=function(){var e=S(this),t=e.path;return e.cannotBeABaseURL?t[0]:t.length?"/"+t.join("/"):""},je=function(){var e=S(this).query;return e?"?"+e:""},Oe=function(){return S(this).searchParams},Ue=function(){var e=S(this).fragment;return e?"#"+e:""},Pe=function(e,t){return{get:e,set:t,configurable:!0,enumerable:!0}};if(o&&l(Ce,{href:Pe(Fe,function(e){var t=S(this),n=String(e),r=Le(t,n);if(r)throw TypeError(r);x(t.searchParams).updateSearchParams(t.query)}),origin:Pe(_e),protocol:Pe(Te,function(e){var t=S(this);Le(t,String(e)+":",ie)}),username:Pe(Ie,function(e){var t=S(this),n=p(String(e));if(!Z(t)){t.username="";for(var r=0;re.length)&&(t=e.length);for(var n=0,r=new Array(t);n1?r-1:0),o=1;o=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,a=!0,l=!1;return{s:function(){r=t[Symbol.iterator]()},n:function(){var e=r.next();return a=e.done,e},e:function(e){l=!0,s=e},f:function(){try{a||null==r.return||r.return()}finally{if(l)throw s}}}}(n,!0);try{for(a.s();!(s=a.n()).done;)s.value.apply(this,i)}catch(e){a.e(e)}finally{a.f()}}return this.element&&this.element.dispatchEvent(this.makeEvent("dropzone:"+t,{args:i})),this}},{key:"makeEvent",value:function(e,t){var n={bubbles:!0,cancelable:!0,detail:t};if("function"==typeof window.CustomEvent)return new CustomEvent(e,n);var r=document.createEvent("CustomEvent");return r.initCustomEvent(e,n.bubbles,n.cancelable,n.detail),r}},{key:"off",value:function(e,t){if(!this._callbacks||0===arguments.length)return this._callbacks={},this;var n=this._callbacks[e];if(!n)return this;if(1===arguments.length)return delete this._callbacks[e],this;for(var r=0;r=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,l=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return a=e.done,e},e:function(e){l=!0,o=e},f:function(){try{a||null==n.return||n.return()}finally{if(l)throw o}}}}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n'),this.element.appendChild(e));var i=e.getElementsByTagName("span")[0];return i&&(null!=i.textContent?i.textContent=this.options.dictFallbackMessage:null!=i.innerText&&(i.innerText=this.options.dictFallbackMessage)),this.element.appendChild(this.getFallbackForm())},resize:function(e,t,n,r){var i={srcX:0,srcY:0,srcWidth:e.width,srcHeight:e.height},o=e.width/e.height;null==t&&null==n?(t=i.srcWidth,n=i.srcHeight):null==t?t=n*o:null==n&&(n=t/o);var s=(t=Math.min(t,i.srcWidth))/(n=Math.min(n,i.srcHeight));if(i.srcWidth>t||i.srcHeight>n)if("crop"===r)o>s?(i.srcHeight=e.height,i.srcWidth=i.srcHeight*s):(i.srcWidth=e.width,i.srcHeight=i.srcWidth/s);else{if("contain"!==r)throw new Error("Unknown resizeMethod '".concat(r,"'"));o>s?n=t/o:t=n*o}return i.srcX=(e.width-i.srcWidth)/2,i.srcY=(e.height-i.srcHeight)/2,i.trgWidth=t,i.trgHeight=n,i},transformFile:function(e,t){return(this.options.resizeWidth||this.options.resizeHeight)&&e.type.match(/image.*/)?this.resizeImage(e,this.options.resizeWidth,this.options.resizeHeight,this.options.resizeMethod,t):t(e)},previewTemplate:'
    Check
    Error
    ',drop:function(e){return this.element.classList.remove("dz-drag-hover")},dragstart:function(e){},dragend:function(e){return this.element.classList.remove("dz-drag-hover")},dragenter:function(e){return this.element.classList.add("dz-drag-hover")},dragover:function(e){return this.element.classList.add("dz-drag-hover")},dragleave:function(e){return this.element.classList.remove("dz-drag-hover")},paste:function(e){},reset:function(){return this.element.classList.remove("dz-started")},addedfile:function(e){var t=this;if(this.element===this.previewsContainer&&this.element.classList.add("dz-started"),this.previewsContainer&&!this.options.disablePreviews){e.previewElement=y.createElement(this.options.previewTemplate.trim()),e.previewTemplate=e.previewElement,this.previewsContainer.appendChild(e.previewElement);var n,r=o(e.previewElement.querySelectorAll("[data-dz-name]"),!0);try{for(r.s();!(n=r.n()).done;){var i=n.value;i.textContent=e.name}}catch(e){r.e(e)}finally{r.f()}var s,a=o(e.previewElement.querySelectorAll("[data-dz-size]"),!0);try{for(a.s();!(s=a.n()).done;)(i=s.value).innerHTML=this.filesize(e.size)}catch(e){a.e(e)}finally{a.f()}this.options.addRemoveLinks&&(e._removeLink=y.createElement('
    '.concat(this.options.dictRemoveFile,"")),e.previewElement.appendChild(e._removeLink));var l,c=function(n){return n.preventDefault(),n.stopPropagation(),e.status===y.UPLOADING?y.confirm(t.options.dictCancelUploadConfirmation,function(){return t.removeFile(e)}):t.options.dictRemoveFileConfirmation?y.confirm(t.options.dictRemoveFileConfirmation,function(){return t.removeFile(e)}):t.removeFile(e)},u=o(e.previewElement.querySelectorAll("[data-dz-remove]"),!0);try{for(u.s();!(l=u.n()).done;)l.value.addEventListener("click",c)}catch(e){u.e(e)}finally{u.f()}}},removedfile:function(e){return null!=e.previewElement&&null!=e.previewElement.parentNode&&e.previewElement.parentNode.removeChild(e.previewElement),this._updateMaxFilesReachedClass()},thumbnail:function(e,t){if(e.previewElement){e.previewElement.classList.remove("dz-file-preview");var n,r=o(e.previewElement.querySelectorAll("[data-dz-thumbnail]"),!0);try{for(r.s();!(n=r.n()).done;){var i=n.value;i.alt=e.name,i.src=t}}catch(e){r.e(e)}finally{r.f()}return setTimeout(function(){return e.previewElement.classList.add("dz-image-preview")},1)}},error:function(e,t){if(e.previewElement){e.previewElement.classList.add("dz-error"),"string"!=typeof t&&t.error&&(t=t.error);var n,r=o(e.previewElement.querySelectorAll("[data-dz-errormessage]"),!0);try{for(r.s();!(n=r.n()).done;)n.value.textContent=t}catch(e){r.e(e)}finally{r.f()}}},errormultiple:function(){},processing:function(e){if(e.previewElement&&(e.previewElement.classList.add("dz-processing"),e._removeLink))return e._removeLink.innerHTML=this.options.dictCancelUpload},processingmultiple:function(){},uploadprogress:function(e,t,n){if(e.previewElement){var r,i=o(e.previewElement.querySelectorAll("[data-dz-uploadprogress]"),!0);try{for(i.s();!(r=i.n()).done;){var s=r.value;"PROGRESS"===s.nodeName?s.value=t:s.style.width="".concat(t,"%")}}catch(e){i.e(e)}finally{i.f()}}},totaluploadprogress:function(){},sending:function(){},sendingmultiple:function(){},success:function(e){if(e.previewElement)return e.previewElement.classList.add("dz-success")},successmultiple:function(){},canceled:function(e){return this.emit("error",e,this.options.dictUploadCanceled)},canceledmultiple:function(){},complete:function(e){if(e._removeLink&&(e._removeLink.innerHTML=this.options.dictRemoveFile),e.previewElement)return e.previewElement.classList.add("dz-complete")},completemultiple:function(){},maxfilesexceeded:function(){},maxfilesreached:function(){},queuecomplete:function(){},addedfiles:function(){}};function l(e){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l(e)}function c(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return u(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?u(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return s=e.done,e},e:function(e){a=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n"))),this.clickableElements.length&&function t(){e.hiddenFileInput&&e.hiddenFileInput.parentNode.removeChild(e.hiddenFileInput),e.hiddenFileInput=document.createElement("input"),e.hiddenFileInput.setAttribute("type","file"),(null===e.options.maxFiles||e.options.maxFiles>1)&&e.hiddenFileInput.setAttribute("multiple","multiple"),e.hiddenFileInput.className="dz-hidden-input",null!==e.options.acceptedFiles&&e.hiddenFileInput.setAttribute("accept",e.options.acceptedFiles),null!==e.options.capture&&e.hiddenFileInput.setAttribute("capture",e.options.capture),e.hiddenFileInput.setAttribute("tabindex","-1"),e.hiddenFileInput.style.visibility="hidden",e.hiddenFileInput.style.position="absolute",e.hiddenFileInput.style.top="0",e.hiddenFileInput.style.left="0",e.hiddenFileInput.style.height="0",e.hiddenFileInput.style.width="0",o.getElement(e.options.hiddenInputContainer,"hiddenInputContainer").appendChild(e.hiddenFileInput),e.hiddenFileInput.addEventListener("change",function(){var n=e.hiddenFileInput.files;if(n.length){var r,i=c(n,!0);try{for(i.s();!(r=i.n()).done;){var o=r.value;e.addFile(o)}}catch(e){i.e(e)}finally{i.f()}}e.emit("addedfiles",n),t()})}(),this.URL=null!==window.URL?window.URL:window.webkitURL;var t,n=c(this.events,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.on(r,this.options[r])}}catch(e){n.e(e)}finally{n.f()}this.on("uploadprogress",function(){return e.updateTotalUploadProgress()}),this.on("removedfile",function(){return e.updateTotalUploadProgress()}),this.on("canceled",function(t){return e.emit("complete",t)}),this.on("complete",function(t){if(0===e.getAddedFiles().length&&0===e.getUploadingFiles().length&&0===e.getQueuedFiles().length)return setTimeout(function(){return e.emit("queuecomplete")},0)});var i=function(e){if(function(e){if(e.dataTransfer.types)for(var t=0;t")),n+='');var r=o.createElement(n);return"FORM"!==this.element.tagName?(t=o.createElement('
    '))).appendChild(r):(this.element.setAttribute("enctype","multipart/form-data"),this.element.setAttribute("method",this.options.method)),null!=t?t:r}},{key:"getExistingFallback",value:function(){for(var e=function(e){var t,n=c(e,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;if(/(^| )fallback($| )/.test(r.className))return r}}catch(e){n.e(e)}finally{n.f()}},t=0,n=["div","form"];t0){for(var r=["tb","gb","mb","kb","b"],i=0;i=Math.pow(this.options.filesizeBase,4-i)/10){t=e/Math.pow(this.options.filesizeBase,4-i),n=o;break}}t=Math.round(10*t)/10}return"".concat(t," ").concat(this.options.dictFileSizeUnits[n])}},{key:"_updateMaxFilesReachedClass",value:function(){return null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(this.getAcceptedFiles().length===this.options.maxFiles&&this.emit("maxfilesreached",this.files),this.element.classList.add("dz-max-files-reached")):this.element.classList.remove("dz-max-files-reached")}},{key:"drop",value:function(e){if(e.dataTransfer){this.emit("drop",e);for(var t=[],n=0;n0){var i,o=c(r,!0);try{for(o.s();!(i=o.n()).done;){var s=i.value;s.isFile?s.file(function(e){if(!n.options.ignoreHiddenFiles||"."!==e.name.substring(0,1))return e.fullPath="".concat(t,"/").concat(e.name),n.addFile(e)}):s.isDirectory&&n._addFilesFromDirectory(s,"".concat(t,"/").concat(s.name))}}catch(e){o.e(e)}finally{o.f()}e()}return null},i)}()}},{key:"accept",value:function(e,t){this.options.maxFilesize&&e.size>1024*this.options.maxFilesize*1024?t(this.options.dictFileTooBig.replace("{{filesize}}",Math.round(e.size/1024/10.24)/100).replace("{{maxFilesize}}",this.options.maxFilesize)):o.isValidFile(e,this.options.acceptedFiles)?null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(t(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}",this.options.maxFiles)),this.emit("maxfilesexceeded",e)):this.options.accept.call(this,e,t):t(this.options.dictInvalidFileType)}},{key:"addFile",value:function(e){var t=this;e.upload={uuid:o.uuidv4(),progress:0,total:e.size,bytesSent:0,filename:this._renameFile(e)},this.files.push(e),e.status=o.ADDED,this.emit("addedfile",e),this._enqueueThumbnail(e),this.accept(e,function(n){n?(e.accepted=!1,t._errorProcessing([e],n)):(e.accepted=!0,t.options.autoQueue&&t.enqueueFile(e)),t._updateMaxFilesReachedClass()})}},{key:"enqueueFiles",value:function(e){var t,n=c(e,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.enqueueFile(r)}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"enqueueFile",value:function(e){var t=this;if(e.status!==o.ADDED||!0!==e.accepted)throw new Error("This file can't be queued because it has already been processed or was rejected.");if(e.status=o.QUEUED,this.options.autoProcessQueue)return setTimeout(function(){return t.processQueue()},0)}},{key:"_enqueueThumbnail",value:function(e){var t=this;if(this.options.createImageThumbnails&&e.type.match(/image.*/)&&e.size<=1024*this.options.maxThumbnailFilesize*1024)return this._thumbnailQueue.push(e),setTimeout(function(){return t._processThumbnailQueue()},0)}},{key:"_processThumbnailQueue",value:function(){var e=this;if(!this._processingThumbnail&&0!==this._thumbnailQueue.length){this._processingThumbnail=!0;var t=this._thumbnailQueue.shift();return this.createThumbnail(t,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,!0,function(n){return e.emit("thumbnail",t,n),e._processingThumbnail=!1,e._processThumbnailQueue()})}}},{key:"removeFile",value:function(e){if(e.status===o.UPLOADING&&this.cancelUpload(e),this.files=b(this.files,e),this.emit("removedfile",e),0===this.files.length)return this.emit("reset")}},{key:"removeAllFiles",value:function(e){null==e&&(e=!1);var t,n=c(this.files.slice(),!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;(r.status!==o.UPLOADING||e)&&this.removeFile(r)}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"resizeImage",value:function(e,t,n,r,i){var s=this;return this.createThumbnail(e,t,n,r,!0,function(t,n){if(null==n)return i(e);var r=s.options.resizeMimeType;null==r&&(r=e.type);var a=n.toDataURL(r,s.options.resizeQuality);return"image/jpeg"!==r&&"image/jpg"!==r||(a=E.restore(e.dataURL,a)),i(o.dataURItoBlob(a))})}},{key:"createThumbnail",value:function(e,t,n,r,i,o){var s=this,a=new FileReader;a.onload=function(){e.dataURL=a.result,"image/svg+xml"!==e.type?s.createThumbnailFromUrl(e,t,n,r,i,o):null!=o&&o(a.result)},a.readAsDataURL(e)}},{key:"displayExistingFile",value:function(e,t,n,r){var i=this,o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4];this.emit("addedfile",e),this.emit("complete",e),o?(e.dataURL=t,this.createThumbnailFromUrl(e,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,this.options.fixOrientation,function(t){i.emit("thumbnail",e,t),n&&n()},r)):(this.emit("thumbnail",e,t),n&&n())}},{key:"createThumbnailFromUrl",value:function(e,t,n,r,i,o,s){var a=this,l=document.createElement("img");return s&&(l.crossOrigin=s),i="from-image"!=getComputedStyle(document.body).imageOrientation&&i,l.onload=function(){var s=function(e){return e(1)};return"undefined"!=typeof EXIF&&null!==EXIF&&i&&(s=function(e){return EXIF.getData(l,function(){return e(EXIF.getTag(this,"Orientation"))})}),s(function(i){e.width=l.width,e.height=l.height;var s=a.options.resize.call(a,e,t,n,r),c=document.createElement("canvas"),u=c.getContext("2d");switch(c.width=s.trgWidth,c.height=s.trgHeight,i>4&&(c.width=s.trgHeight,c.height=s.trgWidth),i){case 2:u.translate(c.width,0),u.scale(-1,1);break;case 3:u.translate(c.width,c.height),u.rotate(Math.PI);break;case 4:u.translate(0,c.height),u.scale(1,-1);break;case 5:u.rotate(.5*Math.PI),u.scale(1,-1);break;case 6:u.rotate(.5*Math.PI),u.translate(0,-c.width);break;case 7:u.rotate(.5*Math.PI),u.translate(c.height,-c.width),u.scale(-1,1);break;case 8:u.rotate(-.5*Math.PI),u.translate(-c.height,0)}x(u,l,null!=s.srcX?s.srcX:0,null!=s.srcY?s.srcY:0,s.srcWidth,s.srcHeight,null!=s.trgX?s.trgX:0,null!=s.trgY?s.trgY:0,s.trgWidth,s.trgHeight);var d=c.toDataURL("image/png");if(null!=o)return o(d,c)})},null!=o&&(l.onerror=o),l.src=e.dataURL}},{key:"processQueue",value:function(){var e=this.options.parallelUploads,t=this.getUploadingFiles().length,n=t;if(!(t>=e)){var r=this.getQueuedFiles();if(r.length>0){if(this.options.uploadMultiple)return this.processFiles(r.slice(0,e-t));for(;n1?t-1:0),r=1;rt.options.chunkSize),e[0].upload.totalChunkCount=Math.ceil(r.size/t.options.chunkSize)}if(e[0].upload.chunked){var i=e[0],s=n[0];i.upload.chunks=[];var a=function(){for(var n=0;void 0!==i.upload.chunks[n];)n++;if(!(n>=i.upload.totalChunkCount)){var r=n*t.options.chunkSize,a=Math.min(r+t.options.chunkSize,s.size),l={name:t._getParamName(0),data:s.webkitSlice?s.webkitSlice(r,a):s.slice(r,a),filename:i.upload.filename,chunkIndex:n};i.upload.chunks[n]={file:i,index:n,dataBlock:l,status:o.UPLOADING,progress:0,retries:0},t._uploadData(e,[l])}};if(i.upload.finishedChunkUpload=function(n,r){var s=!0;n.status=o.SUCCESS,n.dataBlock=null,n.xhr=null;for(var l=0;l1?t-1:0),r=1;r=s;a?o++:o--)i[o]=t.charCodeAt(o);return new Blob([r],{type:n})};var b=function(e,t){return e.filter(function(e){return e!==t}).map(function(e){return e})},w=function(e){return e.replace(/[\-_](\w)/g,function(e){return e.charAt(1).toUpperCase()})};y.createElement=function(e){var t=document.createElement("div");return t.innerHTML=e,t.childNodes[0]},y.elementInside=function(e,t){if(e===t)return!0;for(;e=e.parentNode;)if(e===t)return!0;return!1},y.getElement=function(e,t){var n;if("string"==typeof e?n=document.querySelector(e):null!=e.nodeType&&(n=e),null==n)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector or a plain HTML element."));return n},y.getElements=function(e,t){var n,r;if(e instanceof Array){r=[];try{var i,o=c(e,!0);try{for(o.s();!(i=o.n()).done;)n=i.value,r.push(this.getElement(n,t))}catch(e){o.e(e)}finally{o.f()}}catch(e){r=null}}else if("string"==typeof e){r=[];var s,a=c(document.querySelectorAll(e),!0);try{for(a.s();!(s=a.n()).done;)n=s.value,r.push(n)}catch(e){a.e(e)}finally{a.f()}}else null!=e.nodeType&&(r=[e]);if(null==r||!r.length)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector, a plain HTML element or a list of those."));return r},y.confirm=function(e,t,n){return window.confirm(e)?t():null!=n?n():void 0},y.isValidFile=function(e,t){if(!t)return!0;t=t.split(",");var n,r=e.type,i=r.replace(/\/.*$/,""),o=c(t,!0);try{for(o.s();!(n=o.n()).done;){var s=n.value;if("."===(s=s.trim()).charAt(0)){if(-1!==e.name.toLowerCase().indexOf(s.toLowerCase(),e.name.length-s.length))return!0}else if(/\/\*$/.test(s)){if(i===s.replace(/\/.*$/,""))return!0}else if(r===s)return!0}}catch(e){o.e(e)}finally{o.f()}return!1},"undefined"!=typeof jQuery&&null!==jQuery&&(jQuery.fn.dropzone=function(e){return this.each(function(){return new y(this,e)})}),y.ADDED="added",y.QUEUED="queued",y.ACCEPTED=y.QUEUED,y.UPLOADING="uploading",y.PROCESSING=y.UPLOADING,y.CANCELED="canceled",y.ERROR="error",y.SUCCESS="success";var x=function(e,t,n,r,i,o,s,a,l,c){var u=function(e){e.naturalWidth;var t=e.naturalHeight,n=document.createElement("canvas");n.width=1,n.height=t;var r=n.getContext("2d");r.drawImage(e,0,0);for(var i=r.getImageData(1,0,1,t).data,o=0,s=t,a=t;a>o;)0===i[4*(a-1)+3]?s=a:o=a,a=s+o>>1;var l=a/t;return 0===l?1:l}(t);return e.drawImage(t,n,r,i,o,s,a,l,c/u)},E=function(){function e(){d(this,e)}return p(e,null,[{key:"initClass",value:function(){this.KEY_STR="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}},{key:"encode64",value:function(e){for(var t="",n=void 0,r=void 0,i="",o=void 0,s=void 0,a=void 0,l="",c=0;o=(n=e[c++])>>2,s=(3&n)<<4|(r=e[c++])>>4,a=(15&r)<<2|(i=e[c++])>>6,l=63&i,isNaN(r)?a=l=64:isNaN(i)&&(l=64),t=t+this.KEY_STR.charAt(o)+this.KEY_STR.charAt(s)+this.KEY_STR.charAt(a)+this.KEY_STR.charAt(l),n=r=i="",o=s=a=l="",ce.length)break}return n}},{key:"decode64",value:function(e){var t=void 0,n=void 0,r="",i=void 0,o=void 0,s="",a=0,l=[];for(/[^A-Za-z0-9\+\/\=]/g.exec(e)&&console.warn("There were invalid base64 characters in the input text.\nValid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\nExpect errors in decoding."),e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");t=this.KEY_STR.indexOf(e.charAt(a++))<<2|(i=this.KEY_STR.indexOf(e.charAt(a++)))>>4,n=(15&i)<<4|(o=this.KEY_STR.indexOf(e.charAt(a++)))>>2,r=(3&o)<<6|(s=this.KEY_STR.indexOf(e.charAt(a++))),l.push(t),64!==o&&l.push(n),64!==s&&l.push(r),t=n=r="",i=o=s="",at.options.priority?-1:e.options.priority=0;n--)this._subscribers[n].fn!==e&&this._subscribers[n].id!==e||(this._subscribers[n].channel=null,this._subscribers.splice(n,1));else this._subscribers=[];if(t&&this.autoCleanChannel(),n=this._subscribers.length-1,e)for(;n>=0;n--)this._subscribers[n].fn!==e&&this._subscribers[n].id!==e||(this._subscribers[n].channel=null,this._subscribers.splice(n,1));else this._subscribers=[]},t.prototype.autoCleanChannel=function(){if(0===this._subscribers.length){for(var e in this._channels)if(this._channels.hasOwnProperty(e))return;if(null!=this._parent){var t=this.namespace.split(":"),n=t[t.length-1];this._parent.removeChannel(n)}}},t.prototype.removeChannel=function(e){this.hasChannel(e)&&(this._channels[e]=null,delete this._channels[e],this.autoCleanChannel())},t.prototype.publish=function(e){for(var t,n,r,i=0,o=this._subscribers.length,s=!1;i0)for(;i{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";var e=n(295),t=n.n(e),r=n(216);window.Cl=window.Cl||{};class i{constructor(e={}){this.options={linksSelector:".js-toggler-link",dataHeaderSelector:"toggler-header-selector",dataContentSelector:"toggler-content-selector",collapsedClass:"js-collapsed",expandedClass:"js-expanded",hiddenClass:"hidden",...e},this.togglerInstances=[],document.querySelectorAll(this.options.linksSelector).forEach(e=>{const t=new o(e,this.options);this.togglerInstances.push(t)})}destroy(){this.links=null,this.togglerInstances.forEach(e=>e.destroy()),this.togglerInstances=[]}}class o{constructor(e,t={}){this.options={...t},this.link=e,this.headerSelector=this.link.dataset[this.options.dataHeaderSelector],this.contentSelector=this.link.dataset[this.options.dataContentSelector],this.header=document.querySelector(this.headerSelector),this.header=this.header||this.link,this.content=document.querySelector(this.contentSelector),this.content&&this._initLink()}_updateClasses(){this.content.classList.contains(this.options.hiddenClass)?(this.header.classList.remove(this.options.expandedClass),this.header.classList.add(this.options.collapsedClass)):(this.header.classList.add(this.options.expandedClass),this.header.classList.remove(this.options.collapsedClass))}_onTogglerClick(e){this.content.classList.toggle(this.options.hiddenClass),this._updateClasses(),e.preventDefault()}_initLink(){this._updateClasses(),this.link.addEventListener("click",e=>this._onTogglerClick(e))}destroy(){this.options=null,this.link=null}}Cl.Toggler=i,Cl.TogglerConstructor=o;const s=i;n(413);var a=n(628),l=n.n(a);document.addEventListener("DOMContentLoaded",()=>{let e=0,t=1;const n=document.querySelector(".js-upload-button");if(!n)return;const r=document.querySelector(".js-upload-button-disabled"),i=n.dataset.url;if(!i)return;const o=document.querySelector(".js-filer-dropzone-upload-welcome"),s=document.querySelector(".js-filer-dropzone-upload-info-container"),a=document.querySelector(".js-filer-dropzone-upload-info"),c=document.querySelector(".js-filer-dropzone-upload-number"),u=".js-filer-dropzone-progress",d=document.querySelector(".js-filer-dropzone-upload-success"),f=document.querySelector(".js-filer-dropzone-upload-canceled"),p=document.querySelector(".js-filer-dropzone-cancel"),h=document.querySelector(".js-filer-dropzone-info-message"),v="hidden",m=parseInt(n.dataset.maxUploaderConnections||3,10),g=parseInt(n.dataset.maxFilesize||0,10);let y=!1;const b=()=>{c&&(c.textContent=`${t-e}/${t}`)},w=()=>{n&&n.remove()},x=()=>{const e=window.location.toString();window.location.replace(((e,t,n)=>{const r=new RegExp(`([?&])${t}=.*?(&|$)`,"i"),i=-1!==e.indexOf("?")?"&":"?",o=window.location.hash;return(e=e.replace(/#.*$/,"")).match(r)?e.replace(r,`$1${t}=${n}$2`)+o:e+i+t+"="+n+o})(e,"order_by","-modified_at"))};let E;Cl.mediator.subscribe("filer-upload-in-progress",w),n.addEventListener("click",e=>{e.preventDefault()}),l().autoDiscover=!1;try{E=new(l())(n,{url:i,paramName:"file",maxFilesize:g,parallelUploads:m,clickable:n,previewTemplate:"
    ",addRemoveLinks:!1,autoProcessQueue:!0})}catch(e){return void console.error("[Filer Upload] Failed to create Dropzone instance:",e)}E.on("addedfile",n=>{Cl.mediator.remove("filer-upload-in-progress",w),Cl.mediator.publish("filer-upload-in-progress"),e++,t=E.files.length,h&&h.classList.remove(v),o&&o.classList.add(v),d&&d.classList.add(v),s&&s.classList.remove(v),p&&p.classList.remove(v),f&&f.classList.add(v),b()}),E.on("uploadprogress",(e,t)=>{const n=Math.round(t),r=`file-${encodeURIComponent(e.name)}${e.size}${e.lastModified}`,i=document.getElementById(r);let o;if(i){const e=i.querySelector(u);e&&(e.style.width=`${n}%`)}else if(a){o=a.cloneNode(!0);const t=o.querySelector(".js-filer-dropzone-file-name");t&&(t.textContent=e.name);const i=o.querySelector(u);i&&(i.style.width=`${n}%`),o.classList.remove(v),o.setAttribute("id",r),s&&s.appendChild(o)}}),E.on("success",(n,r)=>{const i=`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}`,s=document.getElementById(i);s&&s.remove(),r.error&&(y=!0,window.filerShowError(`${n.name}: ${r.error}`)),e--,b(),0===e&&(t=1,o&&o.classList.add(v),c&&c.classList.add(v),f&&f.classList.add(v),p&&p.classList.add(v),d&&d.classList.remove(v),y?setTimeout(x,1e3):x())}),E.on("error",(n,r)=>{const i=`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}`,s=document.getElementById(i);s&&s.remove(),y=!0,window.filerShowError(`${n.name}: ${r}`),e--,b(),0===e&&(t=1,o&&o.classList.add(v),c&&c.classList.add(v),f&&f.classList.add(v),p&&p.classList.add(v),d&&d.classList.remove(v),setTimeout(x,1e3))}),p&&p.addEventListener("click",e=>{e.preventDefault(),p.classList.add(v),c&&c.classList.add(v),s&&s.classList.add(v),f&&f.classList.remove(v),setTimeout(()=>{window.location.reload()},1e3)}),r&&Cl.filerTooltip&&Cl.filerTooltip(),document.dispatchEvent(new Event("filer-upload-scripts-executed"))}),l()&&(l().autoDiscover=!1),document.addEventListener("DOMContentLoaded",()=>{const e=".js-img-preview",t=".js-filer-dropzone:not(.js-filer-dropzone-base):not(.js-filer-dropzone-folder):not(.js-filer-dropzone-info-message)",n=document.querySelectorAll(t),r=".js-filer-dropzone-progress",i=".js-img-wrapper",o="hidden",s="filer-dropzone-mobile",a="js-object-attached",c=e=>{e.offsetWidth<500?e.classList.add(s):e.classList.remove(s)},u=e=>{try{window.parent.CMS.API.Messages.open({message:e})}catch{window.filerShowError?window.filerShowError(e):alert(e)}},d=function(t){const n=t.dataset.url,s=t.querySelector(".vForeignKeyRawIdAdminField"),d="image"===s?.getAttribute("name"),f=t.querySelector(".js-related-lookup"),p=t.querySelector(".js-related-edit"),h=t.querySelector(".js-filer-dropzone-message"),v=t.querySelector(".filerClearer"),m=t.querySelector(".js-file-selector");t.dropzone||(window.addEventListener("resize",()=>{c(t)}),new(l())(t,{url:n,paramName:"file",maxFiles:1,maxFilesize:t.dataset.maxFilesize,previewTemplate:document.querySelector(".js-filer-dropzone-template")?.innerHTML||"
    ",clickable:!1,addRemoveLinks:!1,init:function(){c(t),this.on("removedfile",()=>{m&&(m.style.display=""),t.classList.remove(a),this.removeAllFiles(),v?.click()}),this.element.querySelectorAll("img").forEach(e=>{e.addEventListener("dragstart",e=>{e.preventDefault()})}),v&&v.addEventListener("click",()=>{t.classList.remove(a)})},maxfilesexceeded:function(){this.removeAllFiles(!0)},drop:function(){this.removeAllFiles(!0),v?.click();const e=t.querySelector(r);e&&e.classList.remove(o),m&&(m.style.display="block"),f?.classList.add("related-lookup-change"),p?.classList.add("related-lookup-change"),h?.classList.add(o),t.classList.remove("dz-drag-hover"),t.classList.add(a)},success:function(n,a){const l=t.querySelector(r);if(l&&l.classList.add(o),n&&"success"===n.status&&a){if(a.file_id&&s){s.value=a.file_id;const e=new Event("change",{bubbles:!0});s.dispatchEvent(e)}if(a.thumbnail_180&&d){const n=t.querySelector(e);n&&(n.style.backgroundImage=`url(${a.thumbnail_180})`);const r=t.querySelector(i);r&&r.classList.remove(o)}}else a&&a.error&&u(`${n.name}: ${a.error}`),this.removeAllFiles(!0);this.element.querySelectorAll("img").forEach(e=>{e.addEventListener("dragstart",e=>{e.preventDefault()})})},error:function(e,t,n){n&&n.error&&(t+=` ; ${n.error}`),u(`${e.name}: ${t}`),this.removeAllFiles(!0)},reset:function(){if(d){const n=t.querySelector(i);n&&n.classList.add(o);const r=t.querySelector(e);r&&(r.style.backgroundImage="none")}if(t.classList.remove(a),s&&(s.value=""),f?.classList.remove("related-lookup-change"),p?.classList.remove("related-lookup-change"),h?.classList.remove(o),s){const e=new Event("change",{bubbles:!0});s.dispatchEvent(e)}}}))};n.length&&l()&&(window.filerDropzoneInitialized||(window.filerDropzoneInitialized=!0,l().autoDiscover=!1),n.forEach(d),document.addEventListener("formset:added",e=>{let n,r,i;e.detail&&e.detail.formsetName?(r=parseInt(document.getElementById(`id_${e.detail.formsetName}-TOTAL_FORMS`).value,10)-1,i=document.getElementById(`${e.detail.formsetName}-${r}`),n=i?.querySelectorAll(t)||[]):(i=e.target,n=i?.querySelectorAll(t)||[]),n?.forEach(d)}))}),document.addEventListener("DOMContentLoaded",()=>{let e=0,t=0;const n=[],r=document.querySelector(".js-filer-dropzone-base"),i=".js-filer-dropzone";let o;const s=document.querySelector(".js-filer-dropzone-info-message"),a=document.querySelector(".js-filer-dropzone-folder-name"),c=document.querySelector(".js-filer-dropzone-upload-info-container"),u=document.querySelector(".js-filer-dropzone-upload-info"),d=document.querySelector(".js-filer-dropzone-upload-welcome"),f=document.querySelector(".js-filer-dropzone-upload-number"),p=document.querySelector(".js-filer-upload-count"),h=document.querySelector(".js-filer-upload-text"),v=".js-filer-dropzone-progress",m=document.querySelector(".js-filer-dropzone-upload-success"),g=document.querySelector(".js-filer-dropzone-upload-canceled"),y=document.querySelector(".js-filer-dropzone-cancel"),b="dz-drag-hover",w=document.querySelector(".drag-hover-border"),x="hidden";let E,S,k,L=!1;const A=()=>{const e=window.location.toString();window.location.replace(((e,t,n)=>{const r=new RegExp(`([?&])${t}=.*?(&|$)`,"i"),i=-1!==e.indexOf("?")?"&":"?",o=window.location.hash;return(e=e.replace(/#.*$/,"")).match(r)?e.replace(r,`$1${t}=${n}$2`)+o:e+i+t+"="+n+o})(e,"order_by","-modified_at"))},C=()=>{f&&(f.textContent=`${t-e}/${t}`),h&&h.classList.remove("hidden"),p&&p.classList.remove("hidden")},F=()=>{n.forEach(e=>{e.destroy()})},_=(e,t)=>document.getElementById(`file-${encodeURIComponent(e.name)}${e.size}${e.lastModified}${t}`);if(r){S=r.dataset.url,k=r.dataset.folderName;const e=document.body;e.dataset.url=S,e.dataset.folderName=k,e.dataset.maxFiles=r.dataset.maxFiles,e.dataset.maxFilesize=r.dataset.maxFilesize,e.classList.add("js-filer-dropzone"),console.log("[Filer DnD] dropzoneBase found, url:",S,"folder:",k)}else console.log("[Filer DnD] No .js-filer-dropzone-base element found on page");Cl.mediator.subscribe("filer-upload-in-progress",F),o=document.querySelectorAll(i),console.log("[Filer DnD] Found",o.length,"dropzone elements (.js-filer-dropzone)"),o.length&&l()?(l().autoDiscover=!1,o.forEach(r=>{if(r.dropzone)return void console.log("[Filer DnD] Skipping element (already has dropzone):",r.tagName,r.className);const p=r.dataset.url;console.log("[Filer DnD] Creating Dropzone instance for",r.tagName,"url:",p,"maxFiles:",r.dataset.maxFiles,"maxFilesize:",r.dataset.maxFilesize);const h=new(l())(r,{url:p,paramName:"file",maxFiles:parseInt(r.dataset.maxFiles)||100,maxFilesize:parseInt(r.dataset.maxFilesize),previewTemplate:"
    ",clickable:!1,addRemoveLinks:!1,parallelUploads:r.dataset["max-uploader-connections"]||3,accept:(n,r)=>{let i;if(console.log("[Filer DnD] accept:",n.name,"url:",p),Cl.mediator.remove("filer-upload-in-progress",F),Cl.mediator.publish("filer-upload-in-progress"),clearTimeout(E),clearTimeout(E),d&&d.classList.add(x),y&&y.classList.remove(x),_(n,p))r("duplicate");else{i=u.cloneNode(!0);const o=i.querySelector(".js-filer-dropzone-file-name");o&&(o.textContent=n.name);const s=i.querySelector(v);s&&(s.style.width="0"),i.setAttribute("id",`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}${p}`),c&&c.appendChild(i),e++,t++,console.log("[Filer DnD] file accepted, submitNum:",e,"maxSubmitNum:",t),C(),r()}o.forEach(e=>e.classList.remove("reset-hover")),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b))},dragover:e=>{const t=e.target.closest(i),n=t?.dataset.folderName,l=r.classList.contains("js-filer-dropzone-folder"),c=r.getBoundingClientRect(),u=w?window.getComputedStyle(w):null,d=u?u.borderTopWidth:"0px",f=u?u.borderLeftWidth:"0px",p={top:`${c.top}px`,bottom:`${c.bottom}px`,left:`${c.left}px`,right:`${c.right}px`,width:c.width-2*parseInt(f,10)+"px",height:c.height-2*parseInt(d,10)+"px",display:"block"};l&&w&&Object.assign(w.style,p),o.forEach(e=>e.classList.add("reset-hover")),m&&m.classList.add(x),s&&s.classList.remove(x),r.classList.add(b),r.classList.remove("reset-hover"),a&&n&&(a.textContent=n)},dragend:()=>{clearTimeout(E),E=setTimeout(()=>{s&&s.classList.add(x)},1e3),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b)),w&&Object.assign(w.style,{top:"0",bottom:"0",width:"0",height:"0"})},dragleave:()=>{clearTimeout(E),E=setTimeout(()=>{s&&s.classList.add(x)},1e3),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b)),w&&Object.assign(w.style,{top:"0",bottom:"0",width:"0",height:"0"})},sending:e=>{console.log("[Filer DnD] sending:",e.name,"to:",p);const t=_(e,p);t&&t.classList.remove(x)},uploadprogress:(e,t)=>{const n=_(e,p);if(n){const e=n.querySelector(v);e&&(e.style.width=`${t}%`)}},success:(t,n)=>{e--,console.log("[Filer DnD] success:",t.name,"submitNum:",e,"response:",n),C();const r=_(t,p);r&&r.remove()},queuecomplete:()=>{console.log("[Filer DnD] queuecomplete: submitNum:",e,"hasErrors:",L),0===e?(C(),y&&y.classList.add(x),u&&u.classList.add(x),L?(f&&f.classList.add(x),console.log("[Filer DnD] reloading after errors (1s delay)"),setTimeout(()=>{A()},1e3)):(m&&m.classList.remove(x),console.log("[Filer DnD] reloading now via reloadOrdered"),A())):console.warn("[Filer DnD] queuecomplete: submitNum is not 0, skipping reload")},error:(t,n)=>{if(console.error("[Filer DnD] error:",t.name,"error:",n,"submitNum:",e),"duplicate"===n)return void console.log("[Filer DnD] duplicate file, ignoring");e--,console.log("[Filer DnD] after error decrement, submitNum:",e),C();const r=_(t,p);r&&r.remove(),L=!0,window.filerShowError&&window.filerShowError(`${t.name}: ${n.message||n}`)}});n.push(h),y&&y.addEventListener("click",e=>{e.preventDefault(),y.classList.add(x),g&&g.classList.remove(x),h.removeAllFiles(!0)})})):console.warn("[Filer DnD] No dropzone instances created. dropzones.length:",o.length,"Dropzone:",!!l())}),n(117),n(221),n(472),n(902),n(577),window.Cl=window.Cl||{},Cl.mediator=new(t()),Cl.FocalPoint=r.A,Cl.Toggler=s,document.addEventListener("DOMContentLoaded",()=>{let e;window.filerShowError=t=>{const n=document.querySelector(".messagelist"),r=document.querySelector("#header"),i="js-filer-error",o=`
    • {msg}
    `.replace("{msg}",t);n?n.outerHTML=o:r&&r.insertAdjacentHTML("afterend",o),e&&clearTimeout(e),e=setTimeout(()=>{const e=document.querySelector(`.${i}`);e&&e.remove()},5e3)};const t=document.querySelector(".js-filter-files");t&&(t.addEventListener("focus",e=>{const t=e.target.closest(".navigator-top-nav");t&&t.classList.add("search-is-focused")}),t.addEventListener("blur",e=>{const t=e.target.closest(".navigator-top-nav");if(t){const n=t.querySelector(".dropdown-container a");n&&e.relatedTarget===n||t.classList.remove("search-is-focused")}}));const n=document.querySelector(".js-filter-files-container");n&&n.addEventListener("submit",e=>{}),(()=>{const e=document.querySelector(".js-filter-files"),t=".navigator-top-nav",n=document.querySelector(t),r=n?.querySelector(".filter-search-wrapper .filer-dropdown-container");e&&(e.addEventListener("keydown",function(e){e.key;const n=this.closest(t);n&&n.classList.add("search-is-focused")}),r&&(r.addEventListener("show.bs.filer-dropdown",()=>{n&&n.classList.add("search-is-focused")}),r.addEventListener("hide.bs.filer-dropdown",()=>{n&&n.classList.remove("search-is-focused")})))})(),(()=>{const e=document.querySelectorAll(".navigator-table tr, .navigator-list .list-item"),t=document.querySelector(".actions-wrapper"),n=document.querySelectorAll(".action-select, #action-toggle, #files-action-toggle, #folders-action-toggle, .actions .clear a");setTimeout(()=>{n.forEach(e=>{if(e.checked){const t=e.closest(".list-item");t&&t.classList.add("selected")}}),Array.from(e).some(e=>e.classList.contains("selected"))&&t&&t.classList.add("action-selected")},100),n.forEach(n=>{n.addEventListener("change",function(){const n=this.closest(".list-item");n&&(this.checked?n.classList.add("selected"):n.classList.remove("selected")),setTimeout(()=>{const n=Array.from(e).some(e=>e.classList.contains("selected"));t&&(n?t.classList.add("action-selected"):t.classList.remove("action-selected"))},0)})})})(),(()=>{const e=document.querySelector(".js-actions-menu");if(!e)return;const t=e.querySelector(".filer-dropdown-menu"),n=document.querySelector('.actions select[name="action"]'),r=n?.querySelectorAll("option")||[],i=document.querySelector('.actions button[type="submit"]'),o=document.querySelector(".js-action-delete"),s=document.querySelector(".js-action-copy"),a=document.querySelector(".js-action-move"),l="delete_files_or_folders",c="copy_files_and_folders",u="move_files_and_folders",d=document.querySelectorAll(".navigator-table tr, .navigator-list .list-item"),f=(e,t)=>{t&&r.forEach(r=>{r.value===e&&(t.style.display="",t.addEventListener("click",t=>{if(t.preventDefault(),Array.from(d).some(e=>e.classList.contains("selected"))&&n&&i){n.value=e;const t=n.querySelector(`option[value="${e}"]`);t&&(t.selected=!0),i.click()}}))})};f(l,o),f(c,s),f(u,a),r.forEach((e,n)=>{if(0!==n){const n=document.createElement("li"),r=document.createElement("a");r.href="#",r.textContent=e.textContent,e.value!==l&&e.value!==c&&e.value!==u||r.classList.add("hidden"),n.appendChild(r),t&&t.appendChild(n)}}),t&&t.addEventListener("click",e=>{if("A"===e.target.tagName){const r=e.target.closest("li"),o=Array.from(t.querySelectorAll("li")).indexOf(r)+1;if(e.preventDefault(),n&&i){const e=n.querySelectorAll("option");e[o]&&(n.value=e[o].value,e[o].selected=!0),i.click()}}}),e.addEventListener("click",e=>{Array.from(d).some(e=>e.classList.contains("selected"))||(e.preventDefault(),e.stopPropagation())})})(),(()=>{const e=document.querySelector(".navigator-top-nav");if(!e)return;const t=document.querySelector(".breadcrumbs-container");if(!t)return;const n=t.querySelector(".navigator-breadcrumbs"),r=t.querySelector(".filer-dropdown-container"),i=document.querySelector(".filter-files-container"),o=document.querySelector(".actions-wrapper"),s=document.querySelector(".navigator-button-wrapper"),a=n?.offsetWidth||0,l=r?.offsetWidth||0,c=i?.offsetWidth||0,u=o?.offsetWidth||0,d=s?.offsetWidth||0,f=window.getComputedStyle(e),p=parseInt(f.paddingLeft,10)+parseInt(f.paddingRight,10);let h=e.offsetWidth;const v=80+a+l+c+u+d+p,m="breadcrumb-min-width",g=()=>{h{h=e.offsetWidth,g()})})(),(()=>{const e=document.querySelectorAll(".navigator-list .list-item input.action-select"),t=".navigator-list .navigator-folders-body .list-item input.action-select",n=".navigator-list .navigator-files-body .list-item input.action-select",r=document.querySelector("#files-action-toggle"),i=document.querySelector("#folders-action-toggle");i&&i.addEventListener("click",function(){const e=document.querySelectorAll(t);this.checked?e.forEach(e=>{e.checked||e.click()}):e.forEach(e=>{e.checked&&e.click()})}),r&&r.addEventListener("click",function(){const e=document.querySelectorAll(n);this.checked?e.forEach(e=>{e.checked||e.click()}):e.forEach(e=>{e.checked&&e.click()})}),e.forEach(e=>{e.addEventListener("click",function(){const e=document.querySelectorAll(n),o=document.querySelectorAll(t);if(this.checked){const t=Array.from(e).every(e=>e.checked),n=Array.from(o).every(e=>e.checked);t&&r&&(r.checked=!0),n&&i&&(i.checked=!0)}else{const t=Array.from(e).some(e=>!e.checked),n=Array.from(o).some(e=>!e.checked);t&&r&&(r.checked=!1),n&&i&&(i.checked=!1)}})});const o=document.querySelector(".navigator .actions .clear a");o&&o.addEventListener("click",()=>{i&&(i.checked=!1),r&&(r.checked=!1)})})(),document.querySelectorAll(".js-copy-url").forEach(e=>{e.addEventListener("click",function(e){const t=new URL(this.dataset.url,document.location.href),n=this.dataset.msg||"URL copied to clipboard",r=document.createElement("template");e.preventDefault(),document.querySelectorAll(".info.filer-tooltip").forEach(e=>{e.remove()}),navigator.clipboard.writeText(t.href),r.innerHTML=`
    ${n}
    `,this.classList.add("filer-tooltip-wrapper"),this.appendChild(r.content.firstChild);const i=this;setTimeout(()=>{const e=i.querySelector(".info");e&&e.remove()},1200)})}),(new r.A).initialize(),new s})})()})(); \ No newline at end of file +(()=>{var e={117(){"use strict";document.addEventListener("DOMContentLoaded",()=>{const e=document.getElementById("destination");if(!e)return;const t=e.querySelectorAll("option"),n=t.length,r=document.querySelector(".js-submit-copy-move"),i=document.querySelector(".js-disabled-btn-tooltip");1===n&&t[0].disabled&&(r&&(r.style.display="none"),i&&(i.style.display="inline-block")),Cl.filerTooltip&&Cl.filerTooltip()})},413(){"use strict";(()=>{const e="filer-dropdown-backdrop",t='[data-toggle="filer-dropdown"]';class n{constructor(e){this.element=e,e.addEventListener("click",()=>this.toggle())}toggle(){const t=this.element,n=r(t),o=n.classList.contains("open"),s={relatedTarget:t};if(t.disabled||t.classList.contains("disabled"))return!1;if(i(),!o){if("ontouchstart"in document.documentElement&&!n.closest(".navbar-nav")){const n=document.createElement("div");n.className=e,t.parentNode.insertBefore(n,t.nextSibling),n.addEventListener("click",i)}const r=new CustomEvent("show.bs.filer-dropdown",{bubbles:!0,cancelable:!0,detail:s});if(n.dispatchEvent(r),r.defaultPrevented)return!1;t.focus(),t.setAttribute("aria-expanded","true"),n.classList.add("open");const o=new CustomEvent("shown.bs.filer-dropdown",{bubbles:!0,detail:s});n.dispatchEvent(o)}return!1}keydown(e){const n=this.element,i=r(n),o=i.classList.contains("open"),s=Array.from(i.querySelectorAll(".filer-dropdown-menu li:not(.disabled):visible a")).filter(e=>null!==e.offsetParent),a=s.indexOf(e.target);if(!/(38|40|27|32)/.test(e.which)||/input|textarea/i.test(e.target.tagName))return;if(e.preventDefault(),e.stopPropagation(),n.disabled||n.classList.contains("disabled"))return;if(!o&&27!==e.which||o&&27===e.which)return 27===e.which&&i.querySelector(t)?.focus(),n.click();if(!s.length)return;let l=a;38===e.which&&a>0&&l--,40===e.which&&ae.remove()),document.querySelectorAll(t).forEach(e=>{const t=r(e),i={relatedTarget:e};if(!t.classList.contains("open"))return;if(n&&"click"===n.type&&/input|textarea/i.test(n.target.tagName)&&t.contains(n.target))return;const o=new CustomEvent("hide.bs.filer-dropdown",{bubbles:!0,cancelable:!0,detail:i});if(t.dispatchEvent(o),o.defaultPrevented)return;e.setAttribute("aria-expanded","false"),t.classList.remove("open");const s=new CustomEvent("hidden.bs.filer-dropdown",{bubbles:!0,detail:i});t.dispatchEvent(s)}))}function o(e){return this.forEach(t=>{let r=t._filerDropdownInstance;r||(r=new n(t),t._filerDropdownInstance=r),"string"==typeof e&&r[e].call(t)}),this}NodeList.prototype.dropdown||(NodeList.prototype.dropdown=function(e){return o.call(this,e)}),HTMLCollection.prototype.dropdown||(HTMLCollection.prototype.dropdown=function(e){return o.call(this,e)}),document.addEventListener("click",i),document.addEventListener("click",e=>{e.target.closest(".filer-dropdown form")&&e.stopPropagation()}),document.addEventListener("click",e=>{const r=e.target.closest(t);if(r){const t=r._filerDropdownInstance||new n(r);r._filerDropdownInstance||(r._filerDropdownInstance=t),t.toggle(e)}}),document.addEventListener("keydown",e=>{const r=e.target.closest(t);if(r){const t=r._filerDropdownInstance||new n(r);r._filerDropdownInstance||(r._filerDropdownInstance=t),t.keydown(e)}}),document.addEventListener("keydown",e=>{const r=e.target.closest(".filer-dropdown-menu");if(r){const i=r.parentNode.querySelector(t);if(i){const t=i._filerDropdownInstance||new n(i);i._filerDropdownInstance||(i._filerDropdownInstance=t),t.keydown(e)}}}),window.FilerDropdown=n})()},577(){!function(){"use strict";const e=document.getElementById("django-admin-popup-response-constants");let t;if(e)switch(t=JSON.parse(e.dataset.popupResponse),t.action){case"change":opener.dismissRelatedImageLookupPopup(window,t.new_value,null,t.obj,null);break;case"delete":opener.dismissDeleteRelatedObjectPopup(window,t.value);break;default:opener.dismissAddRelatedObjectPopup(window,t.value,t.obj)}}()},216(e,t,n){"use strict";n.d(t,{A:()=>r}),e=n.hmd(e),window.Cl=window.Cl||{},(()=>{class t{constructor(e={}){this.options={containerSelector:".js-focal-point",imageSelector:".js-focal-point-image",circleSelector:".js-focal-point-circle",locationSelector:".js-focal-point-location",draggableClass:"draggable",hiddenClass:"hidden",dataLocation:"locationSelector",...e},this.focalPointInstances=[],this._init=this._init.bind(this)}_init(e){const t=new n(e,this.options);this.focalPointInstances.push(t)}initialize(){document.querySelectorAll(this.options.containerSelector).forEach(e=>{this._init(e)}),window.Cl.mediator&&window.Cl.mediator.subscribe("focal-point:init",this._init)}destroy(){window.Cl.mediator&&window.Cl.mediator.remove("focal-point:init",this._init),this.focalPointInstances.forEach(e=>{e.destroy()}),this.focalPointInstances=[]}}class n{constructor(e,t={}){this.options={imageSelector:".js-focal-point-image",circleSelector:".js-focal-point-circle",locationSelector:".js-focal-point-location",draggableClass:"draggable",hiddenClass:"hidden",dataLocation:"locationSelector",...t},this.container=e,this.image=this.container.querySelector(this.options.imageSelector),this.circle=this.container.querySelector(this.options.circleSelector),this.ratio=parseFloat(this.image?.dataset.ratio||1),this.location=this._getLocation(),this.isDragging=!1,this.dragStartX=0,this.dragStartY=0,this.circleStartX=0,this.circleStartY=0,this._onImageLoaded=this._onImageLoaded.bind(this),this._onMouseDown=this._onMouseDown.bind(this),this._onMouseMove=this._onMouseMove.bind(this),this._onMouseUp=this._onMouseUp.bind(this),this.image?.complete?this._onImageLoaded():this.image&&this.image.addEventListener("load",this._onImageLoaded)}_updateLocationValue(e,t){const n=`${Math.round(e*this.ratio)},${Math.round(t*this.ratio)}`;this.location&&(this.location.value=n)}_getLocation(){const e=this.container.dataset[this.options.dataLocation];if(e){const t=document.querySelector(e);if(t)return t}return this.container.querySelector(this.options.locationSelector)}_makeDraggable(){this.circle&&(this.circle.classList.add(this.options.draggableClass),this.circle.addEventListener("mousedown",this._onMouseDown),this.circle.addEventListener("touchstart",this._onMouseDown,{passive:!1}))}_onMouseDown(e){e.preventDefault(),this.isDragging=!0;const t="touchstart"===e.type?e.touches[0]:e,n=this.container.getBoundingClientRect();this.dragStartX=t.clientX-n.left,this.dragStartY=t.clientY-n.top;const r=this.circle.getBoundingClientRect();this.circleStartX=r.left-n.left+r.width/2,this.circleStartY=r.top-n.top+r.height/2,document.addEventListener("mousemove",this._onMouseMove),document.addEventListener("mouseup",this._onMouseUp),document.addEventListener("touchmove",this._onMouseMove,{passive:!1}),document.addEventListener("touchend",this._onMouseUp)}_onMouseMove(e){if(!this.isDragging)return;e.preventDefault();const t="touchmove"===e.type?e.touches[0]:e,n=this.container.getBoundingClientRect(),r=t.clientX-n.left,i=t.clientY-n.top,o=r-this.dragStartX,s=i-this.dragStartY;let a=this.circleStartX+o,l=this.circleStartY+s;a=Math.max(0,Math.min(n.width-1,a)),l=Math.max(0,Math.min(n.height-1,l)),this.circle.style.left=`${a}px`,this.circle.style.top=`${l}px`,this._updateLocationValue(a,l)}_onMouseUp(){this.isDragging=!1,document.removeEventListener("mousemove",this._onMouseMove),document.removeEventListener("mouseup",this._onMouseUp),document.removeEventListener("touchmove",this._onMouseMove),document.removeEventListener("touchend",this._onMouseUp)}_onImageLoaded(){if(!this.image||0===this.image.naturalWidth)return;this.circle?.classList.remove(this.options.hiddenClass);const e=this.location?.value||"",t=this.image.offsetWidth,n=this.image.offsetHeight;let r,i;if(e.length){const t=e.split(",");r=Math.round(Number(t[0])/this.ratio),i=Math.round(Number(t[1])/this.ratio)}else r=t/2,i=n/2;isNaN(r)||isNaN(i)||(this.circle&&(this.circle.style.left=`${r}px`,this.circle.style.top=`${i}px`),this._makeDraggable(),this._updateLocationValue(r,i))}destroy(){this.circle?.classList.contains(this.options.draggableClass)&&(this.circle.removeEventListener("mousedown",this._onMouseDown),this.circle.removeEventListener("touchstart",this._onMouseDown)),document.removeEventListener("mousemove",this._onMouseMove),document.removeEventListener("mouseup",this._onMouseUp),document.removeEventListener("touchmove",this._onMouseMove),document.removeEventListener("touchend",this._onMouseUp),this.image&&this.image.removeEventListener("load",this._onImageLoaded),this.options=null,this.container=null,this.image=null,this.circle=null,this.location=null,this.ratio=null}}window.Cl.FocalPoint=t,window.Cl.FocalPointConstructor=n,e.exports&&(e.exports=t)})();const r=window.Cl.FocalPoint},902(){"use strict";const e=e=>{const t=(e=(e=e.replace(/__dot__/g,".")).replace(/__dash__/g,"-")).lastIndexOf("__");return-1===t?e:e.substring(0,t)};window.dismissPopupAndReload=e=>{document.location.reload(),e.close()},window.dismissRelatedImageLookupPopup=(t,n,r,i,o)=>{const s=e(t.name),a=document.getElementById(s);if(!a)return;const l=a.closest(".filerFile");if(!l)return;const c=l.querySelector(".edit"),u=l.querySelector(".thumbnail_img"),d=l.querySelector(".description_text"),f=l.querySelector(".filerClearer"),p=l.parentElement.querySelector(".dz-message"),h=l.querySelector("input"),v=h.value;h.value=n;const m=h.closest(".js-filer-dropzone");m&&m.classList.add("js-object-attached"),r&&u&&(u.src=r,u.classList.remove("hidden"),u.removeAttribute("srcset")),d&&(d.textContent=i),f&&f.classList.remove("hidden"),a.classList.add("related-lookup-change"),c&&c.classList.add("related-lookup-change"),o&&c&&c.setAttribute("href",`${o}?_edit_from_widget=1`),p&&p.classList.add("hidden"),v!==n&&h.dispatchEvent(new Event("change",{bubbles:!0})),t.close()},window.dismissRelatedFolderLookupPopup=(t,n,r)=>{const i=e(t.name),o=document.getElementById(i);if(!o)return;const s=o.closest(".filerFile");if(!s)return;const a=s.querySelector(".thumbnail_img"),l=document.getElementById(`id_${i}_clear`),c=document.getElementById(`id_${i}`),u=s.querySelector(".description_text"),d=document.getElementById(i);c&&(c.value=n),a&&a.classList.remove("hidden"),u&&(u.textContent=r),l&&l.classList.remove("hidden"),d&&d.classList.add("hidden"),t.close()},document.addEventListener("DOMContentLoaded",()=>{document.querySelectorAll(".js-dismiss-popup").forEach(e=>{e.addEventListener("click",function(e){e.preventDefault();const t=this.dataset.fileId,n=this.dataset.iconUrl,r=this.dataset.label;if(this.classList.contains("js-dismiss-image")){const e=this.dataset.changeUrl||"";window.opener.dismissRelatedImageLookupPopup(window,t,n,r,e)}else this.classList.contains("js-dismiss-folder")&&window.opener.dismissRelatedFolderLookupPopup(window,t,r)})});const e=document.getElementById("popup-dismiss-data");if(e&&window.opener){const t=e.dataset.pk,n=e.dataset.label;window.opener.dismissRelatedPopup(window,t,n)}})},221(){"use strict";window.Cl=window.Cl||{},Cl.filerTooltip=()=>{const e=".js-filer-tooltip";document.querySelectorAll(e).forEach(t=>{t.addEventListener("mouseover",function(){const t=this.getAttribute("title");if(!t)return;this.dataset.filerTooltip=t,this.removeAttribute("title");const n=document.createElement("p");n.className="filer-tooltip",n.textContent=t;const r=document.querySelector(e);r&&r.appendChild(n)}),t.addEventListener("mouseout",function(){const e=this.dataset.filerTooltip;e&&this.setAttribute("title",e),document.querySelectorAll(".filer-tooltip").forEach(e=>{e.remove()})})})}},472(){"use strict";document.addEventListener("DOMContentLoaded",()=>{const e=e=>{e.preventDefault();const t=e.currentTarget,n=t.closest(".filerFile");if(!n)return;const r=n.querySelector("input"),i=n.querySelector(".thumbnail_img"),o=n.querySelector(".description_text"),s=n.querySelector(".lookup"),a=n.querySelector(".edit"),l=n.parentElement.querySelector(".dz-message"),c="hidden";if(t.classList.add(c),r&&(r.value=""),i){i.classList.add(c);var u=i.parentElement;"A"===u.tagName&&u.removeAttribute("href")}s&&s.classList.remove("related-lookup-change"),a&&a.classList.remove("related-lookup-change"),l&&l.classList.remove(c),o&&(o.textContent="")};document.querySelectorAll(".filerFile .vForeignKeyRawIdAdminField").forEach(e=>{e.setAttribute("type","hidden")}),document.querySelectorAll(".filerFile .filerClearer").forEach(t=>{t.addEventListener("click",e)})})},628(e){var t;self,t=function(){return function(){var e={3099:function(e){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},6077:function(e,t,n){var r=n(111);e.exports=function(e){if(!r(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},1223:function(e,t,n){var r=n(5112),i=n(30),o=n(3070),s=r("unscopables"),a=Array.prototype;null==a[s]&&o.f(a,s,{configurable:!0,value:i(null)}),e.exports=function(e){a[s][e]=!0}},1530:function(e,t,n){"use strict";var r=n(8710).charAt;e.exports=function(e,t,n){return t+(n?r(e,t).length:1)}},5787:function(e){e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e}},9670:function(e,t,n){var r=n(111);e.exports=function(e){if(!r(e))throw TypeError(String(e)+" is not an object");return e}},4019:function(e){e.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},260:function(e,t,n){"use strict";var r,i=n(4019),o=n(9781),s=n(7854),a=n(111),l=n(6656),c=n(648),u=n(8880),d=n(1320),f=n(3070).f,p=n(9518),h=n(7674),v=n(5112),m=n(9711),y=s.Int8Array,g=y&&y.prototype,b=s.Uint8ClampedArray,w=b&&b.prototype,x=y&&p(y),E=g&&p(g),S=Object.prototype,k=S.isPrototypeOf,L=v("toStringTag"),A=m("TYPED_ARRAY_TAG"),C=i&&!!h&&"Opera"!==c(s.opera),_=!1,T={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},F={BigInt64Array:8,BigUint64Array:8},I=function(e){if(!a(e))return!1;var t=c(e);return l(T,t)||l(F,t)};for(r in T)s[r]||(C=!1);if((!C||"function"!=typeof x||x===Function.prototype)&&(x=function(){throw TypeError("Incorrect invocation")},C))for(r in T)s[r]&&h(s[r],x);if((!C||!E||E===S)&&(E=x.prototype,C))for(r in T)s[r]&&h(s[r].prototype,E);if(C&&p(w)!==E&&h(w,E),o&&!l(E,L))for(r in _=!0,f(E,L,{get:function(){return a(this)?this[A]:void 0}}),T)s[r]&&u(s[r],A,r);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:C,TYPED_ARRAY_TAG:_&&A,aTypedArray:function(e){if(I(e))return e;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(e){if(h){if(k.call(x,e))return e}else for(var t in T)if(l(T,r)){var n=s[t];if(n&&(e===n||k.call(n,e)))return e}throw TypeError("Target is not a typed array constructor")},exportTypedArrayMethod:function(e,t,n){if(o){if(n)for(var r in T){var i=s[r];i&&l(i.prototype,e)&&delete i.prototype[e]}E[e]&&!n||d(E,e,n?t:C&&g[e]||t)}},exportTypedArrayStaticMethod:function(e,t,n){var r,i;if(o){if(h){if(n)for(r in T)(i=s[r])&&l(i,e)&&delete i[e];if(x[e]&&!n)return;try{return d(x,e,n?t:C&&y[e]||t)}catch(e){}}for(r in T)!(i=s[r])||i[e]&&!n||d(i,e,t)}},isView:function(e){if(!a(e))return!1;var t=c(e);return"DataView"===t||l(T,t)||l(F,t)},isTypedArray:I,TypedArray:x,TypedArrayPrototype:E}},3331:function(e,t,n){"use strict";var r=n(7854),i=n(9781),o=n(4019),s=n(8880),a=n(2248),l=n(7293),c=n(5787),u=n(9958),d=n(7466),f=n(7067),p=n(1179),h=n(9518),v=n(7674),m=n(8006).f,y=n(3070).f,g=n(1285),b=n(8003),w=n(9909),x=w.get,E=w.set,S="ArrayBuffer",k="DataView",L="prototype",A="Wrong index",C=r[S],_=C,T=r[k],F=T&&T[L],I=Object.prototype,M=r.RangeError,R=p.pack,z=p.unpack,q=function(e){return[255&e]},j=function(e){return[255&e,e>>8&255]},U=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},O=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},P=function(e){return R(e,23,4)},D=function(e){return R(e,52,8)},N=function(e,t){y(e[L],t,{get:function(){return x(this)[t]}})},$=function(e,t,n,r){var i=f(n),o=x(e);if(i+t>o.byteLength)throw M(A);var s=x(o.buffer).bytes,a=i+o.byteOffset,l=s.slice(a,a+t);return r?l:l.reverse()},B=function(e,t,n,r,i,o){var s=f(n),a=x(e);if(s+t>a.byteLength)throw M(A);for(var l=x(a.buffer).bytes,c=s+a.byteOffset,u=r(+i),d=0;dG;)(W=Y[G++])in _||s(_,W,C[W]);H.constructor=_}v&&h(F)!==I&&v(F,I);var Q=new T(new _(2)),X=F.setInt8;Q.setInt8(0,2147483648),Q.setInt8(1,2147483649),!Q.getInt8(0)&&Q.getInt8(1)||a(F,{setInt8:function(e,t){X.call(this,e,t<<24>>24)},setUint8:function(e,t){X.call(this,e,t<<24>>24)}},{unsafe:!0})}else _=function(e){c(this,_,S);var t=f(e);E(this,{bytes:g.call(new Array(t),0),byteLength:t}),i||(this.byteLength=t)},T=function(e,t,n){c(this,T,k),c(e,_,k);var r=x(e).byteLength,o=u(t);if(o<0||o>r)throw M("Wrong offset");if(o+(n=void 0===n?r-o:d(n))>r)throw M("Wrong length");E(this,{buffer:e,byteLength:n,byteOffset:o}),i||(this.buffer=e,this.byteLength=n,this.byteOffset=o)},i&&(N(_,"byteLength"),N(T,"buffer"),N(T,"byteLength"),N(T,"byteOffset")),a(T[L],{getInt8:function(e){return $(this,1,e)[0]<<24>>24},getUint8:function(e){return $(this,1,e)[0]},getInt16:function(e){var t=$(this,2,e,arguments.length>1?arguments[1]:void 0);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=$(this,2,e,arguments.length>1?arguments[1]:void 0);return t[1]<<8|t[0]},getInt32:function(e){return O($(this,4,e,arguments.length>1?arguments[1]:void 0))},getUint32:function(e){return O($(this,4,e,arguments.length>1?arguments[1]:void 0))>>>0},getFloat32:function(e){return z($(this,4,e,arguments.length>1?arguments[1]:void 0),23)},getFloat64:function(e){return z($(this,8,e,arguments.length>1?arguments[1]:void 0),52)},setInt8:function(e,t){B(this,1,e,q,t)},setUint8:function(e,t){B(this,1,e,q,t)},setInt16:function(e,t){B(this,2,e,j,t,arguments.length>2?arguments[2]:void 0)},setUint16:function(e,t){B(this,2,e,j,t,arguments.length>2?arguments[2]:void 0)},setInt32:function(e,t){B(this,4,e,U,t,arguments.length>2?arguments[2]:void 0)},setUint32:function(e,t){B(this,4,e,U,t,arguments.length>2?arguments[2]:void 0)},setFloat32:function(e,t){B(this,4,e,P,t,arguments.length>2?arguments[2]:void 0)},setFloat64:function(e,t){B(this,8,e,D,t,arguments.length>2?arguments[2]:void 0)}});b(_,S),b(T,k),e.exports={ArrayBuffer:_,DataView:T}},1048:function(e,t,n){"use strict";var r=n(7908),i=n(1400),o=n(7466),s=Math.min;e.exports=[].copyWithin||function(e,t){var n=r(this),a=o(n.length),l=i(e,a),c=i(t,a),u=arguments.length>2?arguments[2]:void 0,d=s((void 0===u?a:i(u,a))-c,a-l),f=1;for(c0;)c in n?n[l]=n[c]:delete n[l],l+=f,c+=f;return n}},1285:function(e,t,n){"use strict";var r=n(7908),i=n(1400),o=n(7466);e.exports=function(e){for(var t=r(this),n=o(t.length),s=arguments.length,a=i(s>1?arguments[1]:void 0,n),l=s>2?arguments[2]:void 0,c=void 0===l?n:i(l,n);c>a;)t[a++]=e;return t}},8533:function(e,t,n){"use strict";var r=n(2092).forEach,i=n(9341)("forEach");e.exports=i?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}},8457:function(e,t,n){"use strict";var r=n(9974),i=n(7908),o=n(3411),s=n(7659),a=n(7466),l=n(6135),c=n(1246);e.exports=function(e){var t,n,u,d,f,p,h=i(e),v="function"==typeof this?this:Array,m=arguments.length,y=m>1?arguments[1]:void 0,g=void 0!==y,b=c(h),w=0;if(g&&(y=r(y,m>2?arguments[2]:void 0,2)),null==b||v==Array&&s(b))for(n=new v(t=a(h.length));t>w;w++)p=g?y(h[w],w):h[w],l(n,w,p);else for(f=(d=b.call(h)).next,n=new v;!(u=f.call(d)).done;w++)p=g?o(d,y,[u.value,w],!0):u.value,l(n,w,p);return n.length=w,n}},1318:function(e,t,n){var r=n(5656),i=n(7466),o=n(1400),s=function(e){return function(t,n,s){var a,l=r(t),c=i(l.length),u=o(s,c);if(e&&n!=n){for(;c>u;)if((a=l[u++])!=a)return!0}else for(;c>u;u++)if((e||u in l)&&l[u]===n)return e||u||0;return!e&&-1}};e.exports={includes:s(!0),indexOf:s(!1)}},2092:function(e,t,n){var r=n(9974),i=n(8361),o=n(7908),s=n(7466),a=n(5417),l=[].push,c=function(e){var t=1==e,n=2==e,c=3==e,u=4==e,d=6==e,f=7==e,p=5==e||d;return function(h,v,m,y){for(var g,b,w=o(h),x=i(w),E=r(v,m,3),S=s(x.length),k=0,L=y||a,A=t?L(h,S):n||f?L(h,0):void 0;S>k;k++)if((p||k in x)&&(b=E(g=x[k],k,w),e))if(t)A[k]=b;else if(b)switch(e){case 3:return!0;case 5:return g;case 6:return k;case 2:l.call(A,g)}else switch(e){case 4:return!1;case 7:l.call(A,g)}return d?-1:c||u?u:A}};e.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterOut:c(7)}},6583:function(e,t,n){"use strict";var r=n(5656),i=n(9958),o=n(7466),s=n(9341),a=Math.min,l=[].lastIndexOf,c=!!l&&1/[1].lastIndexOf(1,-0)<0,u=s("lastIndexOf"),d=c||!u;e.exports=d?function(e){if(c)return l.apply(this,arguments)||0;var t=r(this),n=o(t.length),s=n-1;for(arguments.length>1&&(s=a(s,i(arguments[1]))),s<0&&(s=n+s);s>=0;s--)if(s in t&&t[s]===e)return s||0;return-1}:l},1194:function(e,t,n){var r=n(7293),i=n(5112),o=n(7392),s=i("species");e.exports=function(e){return o>=51||!r(function(){var t=[];return(t.constructor={})[s]=function(){return{foo:1}},1!==t[e](Boolean).foo})}},9341:function(e,t,n){"use strict";var r=n(7293);e.exports=function(e,t){var n=[][e];return!!n&&r(function(){n.call(null,t||function(){throw 1},1)})}},3671:function(e,t,n){var r=n(3099),i=n(7908),o=n(8361),s=n(7466),a=function(e){return function(t,n,a,l){r(n);var c=i(t),u=o(c),d=s(c.length),f=e?d-1:0,p=e?-1:1;if(a<2)for(;;){if(f in u){l=u[f],f+=p;break}if(f+=p,e?f<0:d<=f)throw TypeError("Reduce of empty array with no initial value")}for(;e?f>=0:d>f;f+=p)f in u&&(l=n(l,u[f],f,c));return l}};e.exports={left:a(!1),right:a(!0)}},5417:function(e,t,n){var r=n(111),i=n(3157),o=n(5112)("species");e.exports=function(e,t){var n;return i(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!i(n.prototype)?r(n)&&null===(n=n[o])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)}},3411:function(e,t,n){var r=n(9670),i=n(9212);e.exports=function(e,t,n,o){try{return o?t(r(n)[0],n[1]):t(n)}catch(t){throw i(e),t}}},7072:function(e,t,n){var r=n(5112)("iterator"),i=!1;try{var o=0,s={next:function(){return{done:!!o++}},return:function(){i=!0}};s[r]=function(){return this},Array.from(s,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var n=!1;try{var o={};o[r]=function(){return{next:function(){return{done:n=!0}}}},e(o)}catch(e){}return n}},4326:function(e){var t={}.toString;e.exports=function(e){return t.call(e).slice(8,-1)}},648:function(e,t,n){var r=n(1694),i=n(4326),o=n(5112)("toStringTag"),s="Arguments"==i(function(){return arguments}());e.exports=r?i:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),o))?n:s?i(t):"Object"==(r=i(t))&&"function"==typeof t.callee?"Arguments":r}},9920:function(e,t,n){var r=n(6656),i=n(3887),o=n(1236),s=n(3070);e.exports=function(e,t){for(var n=i(t),a=s.f,l=o.f,c=0;c=74)&&(r=s.match(/Chrome\/(\d+)/))&&(i=r[1]),e.exports=i&&+i},748:function(e){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},2109:function(e,t,n){var r=n(7854),i=n(1236).f,o=n(8880),s=n(1320),a=n(3505),l=n(9920),c=n(4705);e.exports=function(e,t){var n,u,d,f,p,h=e.target,v=e.global,m=e.stat;if(n=v?r:m?r[h]||a(h,{}):(r[h]||{}).prototype)for(u in t){if(f=t[u],d=e.noTargetGet?(p=i(n,u))&&p.value:n[u],!c(v?u:h+(m?".":"#")+u,e.forced)&&void 0!==d){if(typeof f==typeof d)continue;l(f,d)}(e.sham||d&&d.sham)&&o(f,"sham",!0),s(n,u,f,e)}}},7293:function(e){e.exports=function(e){try{return!!e()}catch(e){return!0}}},7007:function(e,t,n){"use strict";n(4916);var r=n(1320),i=n(7293),o=n(5112),s=n(2261),a=n(8880),l=o("species"),c=!i(function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")}),u="$0"==="a".replace(/./,"$0"),d=o("replace"),f=!!/./[d]&&""===/./[d]("a","$0"),p=!i(function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]});e.exports=function(e,t,n,d){var h=o(e),v=!i(function(){var t={};return t[h]=function(){return 7},7!=""[e](t)}),m=v&&!i(function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[l]=function(){return n},n.flags="",n[h]=/./[h]),n.exec=function(){return t=!0,null},n[h](""),!t});if(!v||!m||"replace"===e&&(!c||!u||f)||"split"===e&&!p){var y=/./[h],g=n(h,""[e],function(e,t,n,r,i){return t.exec===s?v&&!i?{done:!0,value:y.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}},{REPLACE_KEEPS_$0:u,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:f}),b=g[0],w=g[1];r(String.prototype,e,b),r(RegExp.prototype,h,2==t?function(e,t){return w.call(e,this,t)}:function(e){return w.call(e,this)})}d&&a(RegExp.prototype[h],"sham",!0)}},9974:function(e,t,n){var r=n(3099);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}}},5005:function(e,t,n){var r=n(857),i=n(7854),o=function(e){return"function"==typeof e?e:void 0};e.exports=function(e,t){return arguments.length<2?o(r[e])||o(i[e]):r[e]&&r[e][t]||i[e]&&i[e][t]}},1246:function(e,t,n){var r=n(648),i=n(7497),o=n(5112)("iterator");e.exports=function(e){if(null!=e)return e[o]||e["@@iterator"]||i[r(e)]}},8554:function(e,t,n){var r=n(9670),i=n(1246);e.exports=function(e){var t=i(e);if("function"!=typeof t)throw TypeError(String(e)+" is not iterable");return r(t.call(e))}},647:function(e,t,n){var r=n(7908),i=Math.floor,o="".replace,s=/\$([$&'`]|\d\d?|<[^>]*>)/g,a=/\$([$&'`]|\d\d?)/g;e.exports=function(e,t,n,l,c,u){var d=n+e.length,f=l.length,p=a;return void 0!==c&&(c=r(c),p=s),o.call(u,p,function(r,o){var s;switch(o.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,n);case"'":return t.slice(d);case"<":s=c[o.slice(1,-1)];break;default:var a=+o;if(0===a)return r;if(a>f){var u=i(a/10);return 0===u?r:u<=f?void 0===l[u-1]?o.charAt(1):l[u-1]+o.charAt(1):r}s=l[a-1]}return void 0===s?"":s})}},7854:function(e,t,n){var r=function(e){return e&&e.Math==Math&&e};e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},6656:function(e){var t={}.hasOwnProperty;e.exports=function(e,n){return t.call(e,n)}},3501:function(e){e.exports={}},490:function(e,t,n){var r=n(5005);e.exports=r("document","documentElement")},4664:function(e,t,n){var r=n(9781),i=n(7293),o=n(317);e.exports=!r&&!i(function(){return 7!=Object.defineProperty(o("div"),"a",{get:function(){return 7}}).a})},1179:function(e){var t=Math.abs,n=Math.pow,r=Math.floor,i=Math.log,o=Math.LN2;e.exports={pack:function(e,s,a){var l,c,u,d=new Array(a),f=8*a-s-1,p=(1<>1,v=23===s?n(2,-24)-n(2,-77):0,m=e<0||0===e&&1/e<0?1:0,y=0;for((e=t(e))!=e||e===1/0?(c=e!=e?1:0,l=p):(l=r(i(e)/o),e*(u=n(2,-l))<1&&(l--,u*=2),(e+=l+h>=1?v/u:v*n(2,1-h))*u>=2&&(l++,u/=2),l+h>=p?(c=0,l=p):l+h>=1?(c=(e*u-1)*n(2,s),l+=h):(c=e*n(2,h-1)*n(2,s),l=0));s>=8;d[y++]=255&c,c/=256,s-=8);for(l=l<0;d[y++]=255&l,l/=256,f-=8);return d[--y]|=128*m,d},unpack:function(e,t){var r,i=e.length,o=8*i-t-1,s=(1<>1,l=o-7,c=i-1,u=e[c--],d=127&u;for(u>>=7;l>0;d=256*d+e[c],c--,l-=8);for(r=d&(1<<-l)-1,d>>=-l,l+=t;l>0;r=256*r+e[c],c--,l-=8);if(0===d)d=1-a;else{if(d===s)return r?NaN:u?-1/0:1/0;r+=n(2,t),d-=a}return(u?-1:1)*r*n(2,d-t)}}},8361:function(e,t,n){var r=n(7293),i=n(4326),o="".split;e.exports=r(function(){return!Object("z").propertyIsEnumerable(0)})?function(e){return"String"==i(e)?o.call(e,""):Object(e)}:Object},9587:function(e,t,n){var r=n(111),i=n(7674);e.exports=function(e,t,n){var o,s;return i&&"function"==typeof(o=t.constructor)&&o!==n&&r(s=o.prototype)&&s!==n.prototype&&i(e,s),e}},2788:function(e,t,n){var r=n(5465),i=Function.toString;"function"!=typeof r.inspectSource&&(r.inspectSource=function(e){return i.call(e)}),e.exports=r.inspectSource},9909:function(e,t,n){var r,i,o,s=n(8536),a=n(7854),l=n(111),c=n(8880),u=n(6656),d=n(5465),f=n(6200),p=n(3501),h=a.WeakMap;if(s){var v=d.state||(d.state=new h),m=v.get,y=v.has,g=v.set;r=function(e,t){return t.facade=e,g.call(v,e,t),t},i=function(e){return m.call(v,e)||{}},o=function(e){return y.call(v,e)}}else{var b=f("state");p[b]=!0,r=function(e,t){return t.facade=e,c(e,b,t),t},i=function(e){return u(e,b)?e[b]:{}},o=function(e){return u(e,b)}}e.exports={set:r,get:i,has:o,enforce:function(e){return o(e)?i(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!l(t)||(n=i(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}}},7659:function(e,t,n){var r=n(5112),i=n(7497),o=r("iterator"),s=Array.prototype;e.exports=function(e){return void 0!==e&&(i.Array===e||s[o]===e)}},3157:function(e,t,n){var r=n(4326);e.exports=Array.isArray||function(e){return"Array"==r(e)}},4705:function(e,t,n){var r=n(7293),i=/#|\.prototype\./,o=function(e,t){var n=a[s(e)];return n==c||n!=l&&("function"==typeof t?r(t):!!t)},s=o.normalize=function(e){return String(e).replace(i,".").toLowerCase()},a=o.data={},l=o.NATIVE="N",c=o.POLYFILL="P";e.exports=o},111:function(e){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},1913:function(e){e.exports=!1},7850:function(e,t,n){var r=n(111),i=n(4326),o=n(5112)("match");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[o])?!!t:"RegExp"==i(e))}},9212:function(e,t,n){var r=n(9670);e.exports=function(e){var t=e.return;if(void 0!==t)return r(t.call(e)).value}},3383:function(e,t,n){"use strict";var r,i,o,s=n(7293),a=n(9518),l=n(8880),c=n(6656),u=n(5112),d=n(1913),f=u("iterator"),p=!1;[].keys&&("next"in(o=[].keys())?(i=a(a(o)))!==Object.prototype&&(r=i):p=!0);var h=null==r||s(function(){var e={};return r[f].call(e)!==e});h&&(r={}),d&&!h||c(r,f)||l(r,f,function(){return this}),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:p}},7497:function(e){e.exports={}},133:function(e,t,n){var r=n(7293);e.exports=!!Object.getOwnPropertySymbols&&!r(function(){return!String(Symbol())})},590:function(e,t,n){var r=n(7293),i=n(5112),o=n(1913),s=i("iterator");e.exports=!r(function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,n="";return e.pathname="c%20d",t.forEach(function(e,r){t.delete("b"),n+=r+e}),o&&!e.toJSON||!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[s]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==n||"x"!==new URL("http://x",void 0).host})},8536:function(e,t,n){var r=n(7854),i=n(2788),o=r.WeakMap;e.exports="function"==typeof o&&/native code/.test(i(o))},1574:function(e,t,n){"use strict";var r=n(9781),i=n(7293),o=n(1956),s=n(5181),a=n(5296),l=n(7908),c=n(8361),u=Object.assign,d=Object.defineProperty;e.exports=!u||i(function(){if(r&&1!==u({b:1},u(d({},"a",{enumerable:!0,get:function(){d(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach(function(e){t[e]=e}),7!=u({},e)[n]||o(u({},t)).join("")!=i})?function(e,t){for(var n=l(e),i=arguments.length,u=1,d=s.f,f=a.f;i>u;)for(var p,h=c(arguments[u++]),v=d?o(h).concat(d(h)):o(h),m=v.length,y=0;m>y;)p=v[y++],r&&!f.call(h,p)||(n[p]=h[p]);return n}:u},30:function(e,t,n){var r,i=n(9670),o=n(6048),s=n(748),a=n(3501),l=n(490),c=n(317),u=n(6200),d="prototype",f="script",p=u("IE_PROTO"),h=function(){},v=function(e){return"<"+f+">"+e+""},m=function(){try{r=document.domain&&new ActiveXObject("htmlfile")}catch(e){}var e,t,n;m=r?function(e){e.write(v("")),e.close();var t=e.parentWindow.Object;return e=null,t}(r):(t=c("iframe"),n="java"+f+":",t.style.display="none",l.appendChild(t),t.src=String(n),(e=t.contentWindow.document).open(),e.write(v("document.F=Object")),e.close(),e.F);for(var i=s.length;i--;)delete m[d][s[i]];return m()};a[p]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(h[d]=i(e),n=new h,h[d]=null,n[p]=e):n=m(),void 0===t?n:o(n,t)}},6048:function(e,t,n){var r=n(9781),i=n(3070),o=n(9670),s=n(1956);e.exports=r?Object.defineProperties:function(e,t){o(e);for(var n,r=s(t),a=r.length,l=0;a>l;)i.f(e,n=r[l++],t[n]);return e}},3070:function(e,t,n){var r=n(9781),i=n(4664),o=n(9670),s=n(7593),a=Object.defineProperty;t.f=r?a:function(e,t,n){if(o(e),t=s(t,!0),o(n),i)try{return a(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},1236:function(e,t,n){var r=n(9781),i=n(5296),o=n(9114),s=n(5656),a=n(7593),l=n(6656),c=n(4664),u=Object.getOwnPropertyDescriptor;t.f=r?u:function(e,t){if(e=s(e),t=a(t,!0),c)try{return u(e,t)}catch(e){}if(l(e,t))return o(!i.f.call(e,t),e[t])}},8006:function(e,t,n){var r=n(6324),i=n(748).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,i)}},5181:function(e,t){t.f=Object.getOwnPropertySymbols},9518:function(e,t,n){var r=n(6656),i=n(7908),o=n(6200),s=n(8544),a=o("IE_PROTO"),l=Object.prototype;e.exports=s?Object.getPrototypeOf:function(e){return e=i(e),r(e,a)?e[a]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?l:null}},6324:function(e,t,n){var r=n(6656),i=n(5656),o=n(1318).indexOf,s=n(3501);e.exports=function(e,t){var n,a=i(e),l=0,c=[];for(n in a)!r(s,n)&&r(a,n)&&c.push(n);for(;t.length>l;)r(a,n=t[l++])&&(~o(c,n)||c.push(n));return c}},1956:function(e,t,n){var r=n(6324),i=n(748);e.exports=Object.keys||function(e){return r(e,i)}},5296:function(e,t){"use strict";var n={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,i=r&&!n.call({1:2},1);t.f=i?function(e){var t=r(this,e);return!!t&&t.enumerable}:n},7674:function(e,t,n){var r=n(9670),i=n(6077);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,o){return r(n),i(o),t?e.call(n,o):n.__proto__=o,n}}():void 0)},288:function(e,t,n){"use strict";var r=n(1694),i=n(648);e.exports=r?{}.toString:function(){return"[object "+i(this)+"]"}},3887:function(e,t,n){var r=n(5005),i=n(8006),o=n(5181),s=n(9670);e.exports=r("Reflect","ownKeys")||function(e){var t=i.f(s(e)),n=o.f;return n?t.concat(n(e)):t}},857:function(e,t,n){var r=n(7854);e.exports=r},2248:function(e,t,n){var r=n(1320);e.exports=function(e,t,n){for(var i in t)r(e,i,t[i],n);return e}},1320:function(e,t,n){var r=n(7854),i=n(8880),o=n(6656),s=n(3505),a=n(2788),l=n(9909),c=l.get,u=l.enforce,d=String(String).split("String");(e.exports=function(e,t,n,a){var l,c=!!a&&!!a.unsafe,f=!!a&&!!a.enumerable,p=!!a&&!!a.noTargetGet;"function"==typeof n&&("string"!=typeof t||o(n,"name")||i(n,"name",t),(l=u(n)).source||(l.source=d.join("string"==typeof t?t:""))),e!==r?(c?!p&&e[t]&&(f=!0):delete e[t],f?e[t]=n:i(e,t,n)):f?e[t]=n:s(t,n)})(Function.prototype,"toString",function(){return"function"==typeof this&&c(this).source||a(this)})},7651:function(e,t,n){var r=n(4326),i=n(2261);e.exports=function(e,t){var n=e.exec;if("function"==typeof n){var o=n.call(e,t);if("object"!=typeof o)throw TypeError("RegExp exec method returned something other than an Object or null");return o}if("RegExp"!==r(e))throw TypeError("RegExp#exec called on incompatible receiver");return i.call(e,t)}},2261:function(e,t,n){"use strict";var r,i,o=n(7066),s=n(2999),a=RegExp.prototype.exec,l=String.prototype.replace,c=a,u=(r=/a/,i=/b*/g,a.call(r,"a"),a.call(i,"a"),0!==r.lastIndex||0!==i.lastIndex),d=s.UNSUPPORTED_Y||s.BROKEN_CARET,f=void 0!==/()??/.exec("")[1];(u||f||d)&&(c=function(e){var t,n,r,i,s=this,c=d&&s.sticky,p=o.call(s),h=s.source,v=0,m=e;return c&&(-1===(p=p.replace("y","")).indexOf("g")&&(p+="g"),m=String(e).slice(s.lastIndex),s.lastIndex>0&&(!s.multiline||s.multiline&&"\n"!==e[s.lastIndex-1])&&(h="(?: "+h+")",m=" "+m,v++),n=new RegExp("^(?:"+h+")",p)),f&&(n=new RegExp("^"+h+"$(?!\\s)",p)),u&&(t=s.lastIndex),r=a.call(c?n:s,m),c?r?(r.input=r.input.slice(v),r[0]=r[0].slice(v),r.index=s.lastIndex,s.lastIndex+=r[0].length):s.lastIndex=0:u&&r&&(s.lastIndex=s.global?r.index+r[0].length:t),f&&r&&r.length>1&&l.call(r[0],n,function(){for(i=1;i=c?e?"":void 0:(o=a.charCodeAt(l))<55296||o>56319||l+1===c||(s=a.charCodeAt(l+1))<56320||s>57343?e?a.charAt(l):o:e?a.slice(l,l+2):s-56320+(o-55296<<10)+65536}};e.exports={codeAt:o(!1),charAt:o(!0)}},3197:function(e){"use strict";var t=2147483647,n=/[^\0-\u007E]/,r=/[.\u3002\uFF0E\uFF61]/g,i="Overflow: input needs wider integers to process",o=Math.floor,s=String.fromCharCode,a=function(e){return e+22+75*(e<26)},l=function(e,t,n){var r=0;for(e=n?o(e/700):e>>1,e+=o(e/t);e>455;r+=36)e=o(e/35);return o(r+36*e/(e+38))},c=function(e){var n=[];e=function(e){for(var t=[],n=0,r=e.length;n=55296&&i<=56319&&n=d&&co((t-f)/y))throw RangeError(i);for(f+=(m-d)*y,d=m,r=0;rt)throw RangeError(i);if(c==d){for(var g=f,b=36;;b+=36){var w=b<=p?1:b>=p+26?26:b-p;if(g0?n:t)(e)}},7466:function(e,t,n){var r=n(9958),i=Math.min;e.exports=function(e){return e>0?i(r(e),9007199254740991):0}},7908:function(e,t,n){var r=n(4488);e.exports=function(e){return Object(r(e))}},4590:function(e,t,n){var r=n(3002);e.exports=function(e,t){var n=r(e);if(n%t)throw RangeError("Wrong offset");return n}},3002:function(e,t,n){var r=n(9958);e.exports=function(e){var t=r(e);if(t<0)throw RangeError("The argument can't be less than 0");return t}},7593:function(e,t,n){var r=n(111);e.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},1694:function(e,t,n){var r={};r[n(5112)("toStringTag")]="z",e.exports="[object z]"===String(r)},9843:function(e,t,n){"use strict";var r=n(2109),i=n(7854),o=n(9781),s=n(3832),a=n(260),l=n(3331),c=n(5787),u=n(9114),d=n(8880),f=n(7466),p=n(7067),h=n(4590),v=n(7593),m=n(6656),y=n(648),g=n(111),b=n(30),w=n(7674),x=n(8006).f,E=n(7321),S=n(2092).forEach,k=n(6340),L=n(3070),A=n(1236),C=n(9909),_=n(9587),T=C.get,F=C.set,I=L.f,M=A.f,R=Math.round,z=i.RangeError,q=l.ArrayBuffer,j=l.DataView,U=a.NATIVE_ARRAY_BUFFER_VIEWS,O=a.TYPED_ARRAY_TAG,P=a.TypedArray,D=a.TypedArrayPrototype,N=a.aTypedArrayConstructor,$=a.isTypedArray,B="BYTES_PER_ELEMENT",W="Wrong length",H=function(e,t){for(var n=0,r=t.length,i=new(N(e))(r);r>n;)i[n]=t[n++];return i},Y=function(e,t){I(e,t,{get:function(){return T(this)[t]}})},G=function(e){var t;return e instanceof q||"ArrayBuffer"==(t=y(e))||"SharedArrayBuffer"==t},Q=function(e,t){return $(e)&&"symbol"!=typeof t&&t in e&&String(+t)==String(t)},X=function(e,t){return Q(e,t=v(t,!0))?u(2,e[t]):M(e,t)},V=function(e,t,n){return!(Q(e,t=v(t,!0))&&g(n)&&m(n,"value"))||m(n,"get")||m(n,"set")||n.configurable||m(n,"writable")&&!n.writable||m(n,"enumerable")&&!n.enumerable?I(e,t,n):(e[t]=n.value,e)};o?(U||(A.f=X,L.f=V,Y(D,"buffer"),Y(D,"byteOffset"),Y(D,"byteLength"),Y(D,"length")),r({target:"Object",stat:!0,forced:!U},{getOwnPropertyDescriptor:X,defineProperty:V}),e.exports=function(e,t,n){var o=e.match(/\d+$/)[0]/8,a=e+(n?"Clamped":"")+"Array",l="get"+e,u="set"+e,v=i[a],m=v,y=m&&m.prototype,L={},A=function(e,t){I(e,t,{get:function(){return function(e,t){var n=T(e);return n.view[l](t*o+n.byteOffset,!0)}(this,t)},set:function(e){return function(e,t,r){var i=T(e);n&&(r=(r=R(r))<0?0:r>255?255:255&r),i.view[u](t*o+i.byteOffset,r,!0)}(this,t,e)},enumerable:!0})};U?s&&(m=t(function(e,t,n,r){return c(e,m,a),_(g(t)?G(t)?void 0!==r?new v(t,h(n,o),r):void 0!==n?new v(t,h(n,o)):new v(t):$(t)?H(m,t):E.call(m,t):new v(p(t)),e,m)}),w&&w(m,P),S(x(v),function(e){e in m||d(m,e,v[e])}),m.prototype=y):(m=t(function(e,t,n,r){c(e,m,a);var i,s,l,u=0,d=0;if(g(t)){if(!G(t))return $(t)?H(m,t):E.call(m,t);i=t,d=h(n,o);var v=t.byteLength;if(void 0===r){if(v%o)throw z(W);if((s=v-d)<0)throw z(W)}else if((s=f(r)*o)+d>v)throw z(W);l=s/o}else l=p(t),i=new q(s=l*o);for(F(e,{buffer:i,byteOffset:d,byteLength:s,length:l,view:new j(i)});uo;)a[o]=t[o++];return a}},7321:function(e,t,n){var r=n(7908),i=n(7466),o=n(1246),s=n(7659),a=n(9974),l=n(260).aTypedArrayConstructor;e.exports=function(e){var t,n,c,u,d,f,p=r(e),h=arguments.length,v=h>1?arguments[1]:void 0,m=void 0!==v,y=o(p);if(null!=y&&!s(y))for(f=(d=y.call(p)).next,p=[];!(u=f.call(d)).done;)p.push(u.value);for(m&&h>2&&(v=a(v,arguments[2],2)),n=i(p.length),c=new(l(this))(n),t=0;n>t;t++)c[t]=m?v(p[t],t):p[t];return c}},9711:function(e){var t=0,n=Math.random();e.exports=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++t+n).toString(36)}},3307:function(e,t,n){var r=n(133);e.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},5112:function(e,t,n){var r=n(7854),i=n(2309),o=n(6656),s=n(9711),a=n(133),l=n(3307),c=i("wks"),u=r.Symbol,d=l?u:u&&u.withoutSetter||s;e.exports=function(e){return o(c,e)||(a&&o(u,e)?c[e]=u[e]:c[e]=d("Symbol."+e)),c[e]}},1361:function(e){e.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},8264:function(e,t,n){"use strict";var r=n(2109),i=n(7854),o=n(3331),s=n(6340),a="ArrayBuffer",l=o[a];r({global:!0,forced:i[a]!==l},{ArrayBuffer:l}),s(a)},2222:function(e,t,n){"use strict";var r=n(2109),i=n(7293),o=n(3157),s=n(111),a=n(7908),l=n(7466),c=n(6135),u=n(5417),d=n(1194),f=n(5112),p=n(7392),h=f("isConcatSpreadable"),v=9007199254740991,m="Maximum allowed index exceeded",y=p>=51||!i(function(){var e=[];return e[h]=!1,e.concat()[0]!==e}),g=d("concat"),b=function(e){if(!s(e))return!1;var t=e[h];return void 0!==t?!!t:o(e)};r({target:"Array",proto:!0,forced:!y||!g},{concat:function(e){var t,n,r,i,o,s=a(this),d=u(s,0),f=0;for(t=-1,r=arguments.length;tv)throw TypeError(m);for(n=0;n=v)throw TypeError(m);c(d,f++,o)}return d.length=f,d}})},7327:function(e,t,n){"use strict";var r=n(2109),i=n(2092).filter;r({target:"Array",proto:!0,forced:!n(1194)("filter")},{filter:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}})},2772:function(e,t,n){"use strict";var r=n(2109),i=n(1318).indexOf,o=n(9341),s=[].indexOf,a=!!s&&1/[1].indexOf(1,-0)<0,l=o("indexOf");r({target:"Array",proto:!0,forced:a||!l},{indexOf:function(e){return a?s.apply(this,arguments)||0:i(this,e,arguments.length>1?arguments[1]:void 0)}})},6992:function(e,t,n){"use strict";var r=n(5656),i=n(1223),o=n(7497),s=n(9909),a=n(654),l="Array Iterator",c=s.set,u=s.getterFor(l);e.exports=a(Array,"Array",function(e,t){c(this,{type:l,target:r(e),index:0,kind:t})},function(){var e=u(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}},"values"),o.Arguments=o.Array,i("keys"),i("values"),i("entries")},1249:function(e,t,n){"use strict";var r=n(2109),i=n(2092).map;r({target:"Array",proto:!0,forced:!n(1194)("map")},{map:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}})},7042:function(e,t,n){"use strict";var r=n(2109),i=n(111),o=n(3157),s=n(1400),a=n(7466),l=n(5656),c=n(6135),u=n(5112),d=n(1194)("slice"),f=u("species"),p=[].slice,h=Math.max;r({target:"Array",proto:!0,forced:!d},{slice:function(e,t){var n,r,u,d=l(this),v=a(d.length),m=s(e,v),y=s(void 0===t?v:t,v);if(o(d)&&("function"!=typeof(n=d.constructor)||n!==Array&&!o(n.prototype)?i(n)&&null===(n=n[f])&&(n=void 0):n=void 0,n===Array||void 0===n))return p.call(d,m,y);for(r=new(void 0===n?Array:n)(h(y-m,0)),u=0;m9007199254740991)throw TypeError("Maximum allowed length exceeded");for(u=l(m,r),p=0;py-r+n;p--)delete m[p-1]}else if(n>r)for(p=y-r;p>g;p--)v=p+n-1,(h=p+r-1)in m?m[v]=m[h]:delete m[v];for(p=0;p=n.length?{value:void 0,done:!0}:(e=r(n,i),t.index+=e.length,{value:e,done:!1})})},4723:function(e,t,n){"use strict";var r=n(7007),i=n(9670),o=n(7466),s=n(4488),a=n(1530),l=n(7651);r("match",1,function(e,t,n){return[function(t){var n=s(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var s=i(e),c=String(this);if(!s.global)return l(s,c);var u=s.unicode;s.lastIndex=0;for(var d,f=[],p=0;null!==(d=l(s,c));){var h=String(d[0]);f[p]=h,""===h&&(s.lastIndex=a(c,o(s.lastIndex),u)),p++}return 0===p?null:f}]})},5306:function(e,t,n){"use strict";var r=n(7007),i=n(9670),o=n(7466),s=n(9958),a=n(4488),l=n(1530),c=n(647),u=n(7651),d=Math.max,f=Math.min,p=function(e){return void 0===e?e:String(e)};r("replace",2,function(e,t,n,r){var h=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,v=r.REPLACE_KEEPS_$0,m=h?"$":"$0";return[function(n,r){var i=a(this),o=null==n?void 0:n[e];return void 0!==o?o.call(n,i,r):t.call(String(i),n,r)},function(e,r){if(!h&&v||"string"==typeof r&&-1===r.indexOf(m)){var a=n(t,e,this,r);if(a.done)return a.value}var y=i(e),g=String(this),b="function"==typeof r;b||(r=String(r));var w=y.global;if(w){var x=y.unicode;y.lastIndex=0}for(var E=[];;){var S=u(y,g);if(null===S)break;if(E.push(S),!w)break;""===String(S[0])&&(y.lastIndex=l(g,o(y.lastIndex),x))}for(var k="",L=0,A=0;A=L&&(k+=g.slice(L,_)+R,L=_+C.length)}return k+g.slice(L)}]})},3123:function(e,t,n){"use strict";var r=n(7007),i=n(7850),o=n(9670),s=n(4488),a=n(6707),l=n(1530),c=n(7466),u=n(7651),d=n(2261),f=n(7293),p=[].push,h=Math.min,v=4294967295,m=!f(function(){return!RegExp(v,"y")});r("split",2,function(e,t,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var r=String(s(this)),o=void 0===n?v:n>>>0;if(0===o)return[];if(void 0===e)return[r];if(!i(e))return t.call(r,e,o);for(var a,l,c,u=[],f=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),h=0,m=new RegExp(e.source,f+"g");(a=d.call(m,r))&&!((l=m.lastIndex)>h&&(u.push(r.slice(h,a.index)),a.length>1&&a.index=o));)m.lastIndex===a.index&&m.lastIndex++;return h===r.length?!c&&m.test("")||u.push(""):u.push(r.slice(h)),u.length>o?u.slice(0,o):u}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var i=s(this),o=null==t?void 0:t[e];return void 0!==o?o.call(t,i,n):r.call(String(i),t,n)},function(e,i){var s=n(r,e,this,i,r!==t);if(s.done)return s.value;var d=o(e),f=String(this),p=a(d,RegExp),y=d.unicode,g=(d.ignoreCase?"i":"")+(d.multiline?"m":"")+(d.unicode?"u":"")+(m?"y":"g"),b=new p(m?d:"^(?:"+d.source+")",g),w=void 0===i?v:i>>>0;if(0===w)return[];if(0===f.length)return null===u(b,f)?[f]:[];for(var x=0,E=0,S=[];E2?arguments[2]:void 0)})},8927:function(e,t,n){"use strict";var r=n(260),i=n(2092).every,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("every",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},3105:function(e,t,n){"use strict";var r=n(260),i=n(1285),o=r.aTypedArray;(0,r.exportTypedArrayMethod)("fill",function(e){return i.apply(o(this),arguments)})},5035:function(e,t,n){"use strict";var r=n(260),i=n(2092).filter,o=n(3074),s=r.aTypedArray;(0,r.exportTypedArrayMethod)("filter",function(e){var t=i(s(this),e,arguments.length>1?arguments[1]:void 0);return o(this,t)})},7174:function(e,t,n){"use strict";var r=n(260),i=n(2092).findIndex,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("findIndex",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},4345:function(e,t,n){"use strict";var r=n(260),i=n(2092).find,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("find",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},2846:function(e,t,n){"use strict";var r=n(260),i=n(2092).forEach,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("forEach",function(e){i(o(this),e,arguments.length>1?arguments[1]:void 0)})},4731:function(e,t,n){"use strict";var r=n(260),i=n(1318).includes,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("includes",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},7209:function(e,t,n){"use strict";var r=n(260),i=n(1318).indexOf,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("indexOf",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},6319:function(e,t,n){"use strict";var r=n(7854),i=n(260),o=n(6992),s=n(5112)("iterator"),a=r.Uint8Array,l=o.values,c=o.keys,u=o.entries,d=i.aTypedArray,f=i.exportTypedArrayMethod,p=a&&a.prototype[s],h=!!p&&("values"==p.name||null==p.name),v=function(){return l.call(d(this))};f("entries",function(){return u.call(d(this))}),f("keys",function(){return c.call(d(this))}),f("values",v,!h),f(s,v,!h)},8867:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=[].join;o("join",function(e){return s.apply(i(this),arguments)})},7789:function(e,t,n){"use strict";var r=n(260),i=n(6583),o=r.aTypedArray;(0,r.exportTypedArrayMethod)("lastIndexOf",function(e){return i.apply(o(this),arguments)})},3739:function(e,t,n){"use strict";var r=n(260),i=n(2092).map,o=n(6707),s=r.aTypedArray,a=r.aTypedArrayConstructor;(0,r.exportTypedArrayMethod)("map",function(e){return i(s(this),e,arguments.length>1?arguments[1]:void 0,function(e,t){return new(a(o(e,e.constructor)))(t)})})},4483:function(e,t,n){"use strict";var r=n(260),i=n(3671).right,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("reduceRight",function(e){return i(o(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)})},9368:function(e,t,n){"use strict";var r=n(260),i=n(3671).left,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("reduce",function(e){return i(o(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)})},2056:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=Math.floor;o("reverse",function(){for(var e,t=this,n=i(t).length,r=s(n/2),o=0;o1?arguments[1]:void 0,1),n=this.length,r=s(e),a=i(r.length),c=0;if(a+t>n)throw RangeError("Wrong length");for(;co;)u[o]=n[o++];return u},o(function(){new Int8Array(1).slice()}))},7462:function(e,t,n){"use strict";var r=n(260),i=n(2092).some,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("some",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},3824:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=[].sort;o("sort",function(e){return s.call(i(this),e)})},5021:function(e,t,n){"use strict";var r=n(260),i=n(7466),o=n(1400),s=n(6707),a=r.aTypedArray;(0,r.exportTypedArrayMethod)("subarray",function(e,t){var n=a(this),r=n.length,l=o(e,r);return new(s(n,n.constructor))(n.buffer,n.byteOffset+l*n.BYTES_PER_ELEMENT,i((void 0===t?r:o(t,r))-l))})},2974:function(e,t,n){"use strict";var r=n(7854),i=n(260),o=n(7293),s=r.Int8Array,a=i.aTypedArray,l=i.exportTypedArrayMethod,c=[].toLocaleString,u=[].slice,d=!!s&&o(function(){c.call(new s(1))});l("toLocaleString",function(){return c.apply(d?u.call(a(this)):a(this),arguments)},o(function(){return[1,2].toLocaleString()!=new s([1,2]).toLocaleString()})||!o(function(){s.prototype.toLocaleString.call([1,2])}))},5016:function(e,t,n){"use strict";var r=n(260).exportTypedArrayMethod,i=n(7293),o=n(7854).Uint8Array,s=o&&o.prototype||{},a=[].toString,l=[].join;i(function(){a.call({})})&&(a=function(){return l.call(this)});var c=s.toString!=a;r("toString",a,c)},2472:function(e,t,n){n(9843)("Uint8",function(e){return function(t,n,r){return e(this,t,n,r)}})},4747:function(e,t,n){var r=n(7854),i=n(8324),o=n(8533),s=n(8880);for(var a in i){var l=r[a],c=l&&l.prototype;if(c&&c.forEach!==o)try{s(c,"forEach",o)}catch(e){c.forEach=o}}},3948:function(e,t,n){var r=n(7854),i=n(8324),o=n(6992),s=n(8880),a=n(5112),l=a("iterator"),c=a("toStringTag"),u=o.values;for(var d in i){var f=r[d],p=f&&f.prototype;if(p){if(p[l]!==u)try{s(p,l,u)}catch(e){p[l]=u}if(p[c]||s(p,c,d),i[d])for(var h in o)if(p[h]!==o[h])try{s(p,h,o[h])}catch(e){p[h]=o[h]}}}},1637:function(e,t,n){"use strict";n(6992);var r=n(2109),i=n(5005),o=n(590),s=n(1320),a=n(2248),l=n(8003),c=n(4994),u=n(9909),d=n(5787),f=n(6656),p=n(9974),h=n(648),v=n(9670),m=n(111),y=n(30),g=n(9114),b=n(8554),w=n(1246),x=n(5112),E=i("fetch"),S=i("Headers"),k=x("iterator"),L="URLSearchParams",A=L+"Iterator",C=u.set,_=u.getterFor(L),T=u.getterFor(A),F=/\+/g,I=Array(4),M=function(e){return I[e-1]||(I[e-1]=RegExp("((?:%[\\da-f]{2}){"+e+"})","gi"))},R=function(e){try{return decodeURIComponent(e)}catch(t){return e}},z=function(e){var t=e.replace(F," "),n=4;try{return decodeURIComponent(t)}catch(e){for(;n;)t=t.replace(M(n--),R);return t}},q=/[!'()~]|%20/g,j={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},U=function(e){return j[e]},O=function(e){return encodeURIComponent(e).replace(q,U)},P=function(e,t){if(t)for(var n,r,i=t.split("&"),o=0;o0?arguments[0]:void 0,u=[];if(C(this,{type:L,entries:u,updateURL:function(){},updateSearchParams:D}),void 0!==c)if(m(c))if("function"==typeof(e=w(c)))for(n=(t=e.call(c)).next;!(r=n.call(t)).done;){if((s=(o=(i=b(v(r.value))).next).call(i)).done||(a=o.call(i)).done||!o.call(i).done)throw TypeError("Expected sequence with length 2");u.push({key:s.value+"",value:a.value+""})}else for(l in c)f(c,l)&&u.push({key:l,value:c[l]+""});else P(u,"string"==typeof c?"?"===c.charAt(0)?c.slice(1):c:c+"")},W=B.prototype;a(W,{append:function(e,t){N(arguments.length,2);var n=_(this);n.entries.push({key:e+"",value:t+""}),n.updateURL()},delete:function(e){N(arguments.length,1);for(var t=_(this),n=t.entries,r=e+"",i=0;ie.key){i.splice(t,0,e);break}t===n&&i.push(e)}r.updateURL()},forEach:function(e){for(var t,n=_(this).entries,r=p(e,arguments.length>1?arguments[1]:void 0,3),i=0;i1&&(m(t=arguments[1])&&(n=t.body,h(n)===L&&((r=t.headers?new S(t.headers):new S).has("content-type")||r.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),t=y(t,{body:g(0,String(n)),headers:g(0,r)}))),i.push(t)),E.apply(this,i)}}),e.exports={URLSearchParams:B,getState:_}},285:function(e,t,n){"use strict";n(8783);var r,i=n(2109),o=n(9781),s=n(590),a=n(7854),l=n(6048),c=n(1320),u=n(5787),d=n(6656),f=n(1574),p=n(8457),h=n(8710).codeAt,v=n(3197),m=n(8003),y=n(1637),g=n(9909),b=a.URL,w=y.URLSearchParams,x=y.getState,E=g.set,S=g.getterFor("URL"),k=Math.floor,L=Math.pow,A="Invalid scheme",C="Invalid host",_="Invalid port",T=/[A-Za-z]/,F=/[\d+-.A-Za-z]/,I=/\d/,M=/^(0x|0X)/,R=/^[0-7]+$/,z=/^\d+$/,q=/^[\dA-Fa-f]+$/,j=/[\u0000\t\u000A\u000D #%/:?@[\\]]/,U=/[\u0000\t\u000A\u000D #/:?@[\\]]/,O=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,P=/[\t\u000A\u000D]/g,D=function(e,t){var n,r,i;if("["==t.charAt(0)){if("]"!=t.charAt(t.length-1))return C;if(!(n=$(t.slice(1,-1))))return C;e.host=n}else if(V(e)){if(t=v(t),j.test(t))return C;if(null===(n=N(t)))return C;e.host=n}else{if(U.test(t))return C;for(n="",r=p(t),i=0;i4)return e;for(n=[],r=0;r1&&"0"==i.charAt(0)&&(o=M.test(i)?16:8,i=i.slice(8==o?1:2)),""===i)s=0;else{if(!(10==o?z:8==o?R:q).test(i))return e;s=parseInt(i,o)}n.push(s)}for(r=0;r=L(256,5-t))return null}else if(s>255)return null;for(a=n.pop(),r=0;r6)return;for(r=0;f();){if(i=null,r>0){if(!("."==f()&&r<4))return;d++}if(!I.test(f()))return;for(;I.test(f());){if(o=parseInt(f(),10),null===i)i=o;else{if(0==i)return;i=10*i+o}if(i>255)return;d++}l[c]=256*l[c]+i,2!=++r&&4!=r||c++}if(4!=r)return;break}if(":"==f()){if(d++,!f())return}else if(f())return;l[c++]=t}else{if(null!==u)return;d++,u=++c}}if(null!==u)for(s=c-u,c=7;0!=c&&s>0;)a=l[c],l[c--]=l[u+s-1],l[u+--s]=a;else if(8!=c)return;return l},B=function(e){var t,n,r,i;if("number"==typeof e){for(t=[],n=0;n<4;n++)t.unshift(e%256),e=k(e/256);return t.join(".")}if("object"==typeof e){for(t="",r=function(e){for(var t=null,n=1,r=null,i=0,o=0;o<8;o++)0!==e[o]?(i>n&&(t=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(t=r,n=i),t}(e),n=0;n<8;n++)i&&0===e[n]||(i&&(i=!1),r===n?(t+=n?":":"::",i=!0):(t+=e[n].toString(16),n<7&&(t+=":")));return"["+t+"]"}return e},W={},H=f({},W,{" ":1,'"':1,"<":1,">":1,"`":1}),Y=f({},H,{"#":1,"?":1,"{":1,"}":1}),G=f({},Y,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),Q=function(e,t){var n=h(e,0);return n>32&&n<127&&!d(t,e)?e:encodeURIComponent(e)},X={ftp:21,file:null,http:80,https:443,ws:80,wss:443},V=function(e){return d(X,e.scheme)},K=function(e){return""!=e.username||""!=e.password},Z=function(e){return!e.host||e.cannotBeABaseURL||"file"==e.scheme},J=function(e,t){var n;return 2==e.length&&T.test(e.charAt(0))&&(":"==(n=e.charAt(1))||!t&&"|"==n)},ee=function(e){var t;return e.length>1&&J(e.slice(0,2))&&(2==e.length||"/"===(t=e.charAt(2))||"\\"===t||"?"===t||"#"===t)},te=function(e){var t=e.path,n=t.length;!n||"file"==e.scheme&&1==n&&J(t[0],!0)||t.pop()},ne=function(e){return"."===e||"%2e"===e.toLowerCase()},re=function(e){return".."===(e=e.toLowerCase())||"%2e."===e||".%2e"===e||"%2e%2e"===e},ie={},oe={},se={},ae={},le={},ce={},ue={},de={},fe={},pe={},he={},ve={},me={},ye={},ge={},be={},we={},xe={},Ee={},Se={},ke={},Le=function(e,t,n,i){var o,s,a,l,c=n||ie,u=0,f="",h=!1,v=!1,m=!1;for(n||(e.scheme="",e.username="",e.password="",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,t=t.replace(O,"")),t=t.replace(P,""),o=p(t);u<=o.length;){switch(s=o[u],c){case ie:if(!s||!T.test(s)){if(n)return A;c=se;continue}f+=s.toLowerCase(),c=oe;break;case oe:if(s&&(F.test(s)||"+"==s||"-"==s||"."==s))f+=s.toLowerCase();else{if(":"!=s){if(n)return A;f="",c=se,u=0;continue}if(n&&(V(e)!=d(X,f)||"file"==f&&(K(e)||null!==e.port)||"file"==e.scheme&&!e.host))return;if(e.scheme=f,n)return void(V(e)&&X[e.scheme]==e.port&&(e.port=null));f="","file"==e.scheme?c=ye:V(e)&&i&&i.scheme==e.scheme?c=ae:V(e)?c=de:"/"==o[u+1]?(c=le,u++):(e.cannotBeABaseURL=!0,e.path.push(""),c=Ee)}break;case se:if(!i||i.cannotBeABaseURL&&"#"!=s)return A;if(i.cannotBeABaseURL&&"#"==s){e.scheme=i.scheme,e.path=i.path.slice(),e.query=i.query,e.fragment="",e.cannotBeABaseURL=!0,c=ke;break}c="file"==i.scheme?ye:ce;continue;case ae:if("/"!=s||"/"!=o[u+1]){c=ce;continue}c=fe,u++;break;case le:if("/"==s){c=pe;break}c=xe;continue;case ce:if(e.scheme=i.scheme,s==r)e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query=i.query;else if("/"==s||"\\"==s&&V(e))c=ue;else if("?"==s)e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query="",c=Se;else{if("#"!=s){e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.path.pop(),c=xe;continue}e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query=i.query,e.fragment="",c=ke}break;case ue:if(!V(e)||"/"!=s&&"\\"!=s){if("/"!=s){e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,c=xe;continue}c=pe}else c=fe;break;case de:if(c=fe,"/"!=s||"/"!=f.charAt(u+1))continue;u++;break;case fe:if("/"!=s&&"\\"!=s){c=pe;continue}break;case pe:if("@"==s){h&&(f="%40"+f),h=!0,a=p(f);for(var y=0;y65535)return _;e.port=V(e)&&w===X[e.scheme]?null:w,f=""}if(n)return;c=we;continue}return _}f+=s;break;case ye:if(e.scheme="file","/"==s||"\\"==s)c=ge;else{if(!i||"file"!=i.scheme){c=xe;continue}if(s==r)e.host=i.host,e.path=i.path.slice(),e.query=i.query;else if("?"==s)e.host=i.host,e.path=i.path.slice(),e.query="",c=Se;else{if("#"!=s){ee(o.slice(u).join(""))||(e.host=i.host,e.path=i.path.slice(),te(e)),c=xe;continue}e.host=i.host,e.path=i.path.slice(),e.query=i.query,e.fragment="",c=ke}}break;case ge:if("/"==s||"\\"==s){c=be;break}i&&"file"==i.scheme&&!ee(o.slice(u).join(""))&&(J(i.path[0],!0)?e.path.push(i.path[0]):e.host=i.host),c=xe;continue;case be:if(s==r||"/"==s||"\\"==s||"?"==s||"#"==s){if(!n&&J(f))c=xe;else if(""==f){if(e.host="",n)return;c=we}else{if(l=D(e,f))return l;if("localhost"==e.host&&(e.host=""),n)return;f="",c=we}continue}f+=s;break;case we:if(V(e)){if(c=xe,"/"!=s&&"\\"!=s)continue}else if(n||"?"!=s)if(n||"#"!=s){if(s!=r&&(c=xe,"/"!=s))continue}else e.fragment="",c=ke;else e.query="",c=Se;break;case xe:if(s==r||"/"==s||"\\"==s&&V(e)||!n&&("?"==s||"#"==s)){if(re(f)?(te(e),"/"==s||"\\"==s&&V(e)||e.path.push("")):ne(f)?"/"==s||"\\"==s&&V(e)||e.path.push(""):("file"==e.scheme&&!e.path.length&&J(f)&&(e.host&&(e.host=""),f=f.charAt(0)+":"),e.path.push(f)),f="","file"==e.scheme&&(s==r||"?"==s||"#"==s))for(;e.path.length>1&&""===e.path[0];)e.path.shift();"?"==s?(e.query="",c=Se):"#"==s&&(e.fragment="",c=ke)}else f+=Q(s,Y);break;case Ee:"?"==s?(e.query="",c=Se):"#"==s?(e.fragment="",c=ke):s!=r&&(e.path[0]+=Q(s,W));break;case Se:n||"#"!=s?s!=r&&("'"==s&&V(e)?e.query+="%27":e.query+="#"==s?"%23":Q(s,W)):(e.fragment="",c=ke);break;case ke:s!=r&&(e.fragment+=Q(s,H))}u++}},Ae=function(e){var t,n,r=u(this,Ae,"URL"),i=arguments.length>1?arguments[1]:void 0,s=String(e),a=E(r,{type:"URL"});if(void 0!==i)if(i instanceof Ae)t=S(i);else if(n=Le(t={},String(i)))throw TypeError(n);if(n=Le(a,s,null,t))throw TypeError(n);var l=a.searchParams=new w,c=x(l);c.updateSearchParams(a.query),c.updateURL=function(){a.query=String(l)||null},o||(r.href=_e.call(r),r.origin=Te.call(r),r.protocol=Fe.call(r),r.username=Ie.call(r),r.password=Me.call(r),r.host=Re.call(r),r.hostname=ze.call(r),r.port=qe.call(r),r.pathname=je.call(r),r.search=Ue.call(r),r.searchParams=Oe.call(r),r.hash=Pe.call(r))},Ce=Ae.prototype,_e=function(){var e=S(this),t=e.scheme,n=e.username,r=e.password,i=e.host,o=e.port,s=e.path,a=e.query,l=e.fragment,c=t+":";return null!==i?(c+="//",K(e)&&(c+=n+(r?":"+r:"")+"@"),c+=B(i),null!==o&&(c+=":"+o)):"file"==t&&(c+="//"),c+=e.cannotBeABaseURL?s[0]:s.length?"/"+s.join("/"):"",null!==a&&(c+="?"+a),null!==l&&(c+="#"+l),c},Te=function(){var e=S(this),t=e.scheme,n=e.port;if("blob"==t)try{return new URL(t.path[0]).origin}catch(e){return"null"}return"file"!=t&&V(e)?t+"://"+B(e.host)+(null!==n?":"+n:""):"null"},Fe=function(){return S(this).scheme+":"},Ie=function(){return S(this).username},Me=function(){return S(this).password},Re=function(){var e=S(this),t=e.host,n=e.port;return null===t?"":null===n?B(t):B(t)+":"+n},ze=function(){var e=S(this).host;return null===e?"":B(e)},qe=function(){var e=S(this).port;return null===e?"":String(e)},je=function(){var e=S(this),t=e.path;return e.cannotBeABaseURL?t[0]:t.length?"/"+t.join("/"):""},Ue=function(){var e=S(this).query;return e?"?"+e:""},Oe=function(){return S(this).searchParams},Pe=function(){var e=S(this).fragment;return e?"#"+e:""},De=function(e,t){return{get:e,set:t,configurable:!0,enumerable:!0}};if(o&&l(Ce,{href:De(_e,function(e){var t=S(this),n=String(e),r=Le(t,n);if(r)throw TypeError(r);x(t.searchParams).updateSearchParams(t.query)}),origin:De(Te),protocol:De(Fe,function(e){var t=S(this);Le(t,String(e)+":",ie)}),username:De(Ie,function(e){var t=S(this),n=p(String(e));if(!Z(t)){t.username="";for(var r=0;re.length)&&(t=e.length);for(var n=0,r=new Array(t);n1?r-1:0),o=1;o=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,a=!0,l=!1;return{s:function(){r=t[Symbol.iterator]()},n:function(){var e=r.next();return a=e.done,e},e:function(e){l=!0,s=e},f:function(){try{a||null==r.return||r.return()}finally{if(l)throw s}}}}(n,!0);try{for(a.s();!(s=a.n()).done;)s.value.apply(this,i)}catch(e){a.e(e)}finally{a.f()}}return this.element&&this.element.dispatchEvent(this.makeEvent("dropzone:"+t,{args:i})),this}},{key:"makeEvent",value:function(e,t){var n={bubbles:!0,cancelable:!0,detail:t};if("function"==typeof window.CustomEvent)return new CustomEvent(e,n);var r=document.createEvent("CustomEvent");return r.initCustomEvent(e,n.bubbles,n.cancelable,n.detail),r}},{key:"off",value:function(e,t){if(!this._callbacks||0===arguments.length)return this._callbacks={},this;var n=this._callbacks[e];if(!n)return this;if(1===arguments.length)return delete this._callbacks[e],this;for(var r=0;r=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,l=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return a=e.done,e},e:function(e){l=!0,o=e},f:function(){try{a||null==n.return||n.return()}finally{if(l)throw o}}}}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n'),this.element.appendChild(e));var i=e.getElementsByTagName("span")[0];return i&&(null!=i.textContent?i.textContent=this.options.dictFallbackMessage:null!=i.innerText&&(i.innerText=this.options.dictFallbackMessage)),this.element.appendChild(this.getFallbackForm())},resize:function(e,t,n,r){var i={srcX:0,srcY:0,srcWidth:e.width,srcHeight:e.height},o=e.width/e.height;null==t&&null==n?(t=i.srcWidth,n=i.srcHeight):null==t?t=n*o:null==n&&(n=t/o);var s=(t=Math.min(t,i.srcWidth))/(n=Math.min(n,i.srcHeight));if(i.srcWidth>t||i.srcHeight>n)if("crop"===r)o>s?(i.srcHeight=e.height,i.srcWidth=i.srcHeight*s):(i.srcWidth=e.width,i.srcHeight=i.srcWidth/s);else{if("contain"!==r)throw new Error("Unknown resizeMethod '".concat(r,"'"));o>s?n=t/o:t=n*o}return i.srcX=(e.width-i.srcWidth)/2,i.srcY=(e.height-i.srcHeight)/2,i.trgWidth=t,i.trgHeight=n,i},transformFile:function(e,t){return(this.options.resizeWidth||this.options.resizeHeight)&&e.type.match(/image.*/)?this.resizeImage(e,this.options.resizeWidth,this.options.resizeHeight,this.options.resizeMethod,t):t(e)},previewTemplate:'
    Check
    Error
    ',drop:function(e){return this.element.classList.remove("dz-drag-hover")},dragstart:function(e){},dragend:function(e){return this.element.classList.remove("dz-drag-hover")},dragenter:function(e){return this.element.classList.add("dz-drag-hover")},dragover:function(e){return this.element.classList.add("dz-drag-hover")},dragleave:function(e){return this.element.classList.remove("dz-drag-hover")},paste:function(e){},reset:function(){return this.element.classList.remove("dz-started")},addedfile:function(e){var t=this;if(this.element===this.previewsContainer&&this.element.classList.add("dz-started"),this.previewsContainer&&!this.options.disablePreviews){e.previewElement=g.createElement(this.options.previewTemplate.trim()),e.previewTemplate=e.previewElement,this.previewsContainer.appendChild(e.previewElement);var n,r=o(e.previewElement.querySelectorAll("[data-dz-name]"),!0);try{for(r.s();!(n=r.n()).done;){var i=n.value;i.textContent=e.name}}catch(e){r.e(e)}finally{r.f()}var s,a=o(e.previewElement.querySelectorAll("[data-dz-size]"),!0);try{for(a.s();!(s=a.n()).done;)(i=s.value).innerHTML=this.filesize(e.size)}catch(e){a.e(e)}finally{a.f()}this.options.addRemoveLinks&&(e._removeLink=g.createElement('
    '.concat(this.options.dictRemoveFile,"")),e.previewElement.appendChild(e._removeLink));var l,c=function(n){return n.preventDefault(),n.stopPropagation(),e.status===g.UPLOADING?g.confirm(t.options.dictCancelUploadConfirmation,function(){return t.removeFile(e)}):t.options.dictRemoveFileConfirmation?g.confirm(t.options.dictRemoveFileConfirmation,function(){return t.removeFile(e)}):t.removeFile(e)},u=o(e.previewElement.querySelectorAll("[data-dz-remove]"),!0);try{for(u.s();!(l=u.n()).done;)l.value.addEventListener("click",c)}catch(e){u.e(e)}finally{u.f()}}},removedfile:function(e){return null!=e.previewElement&&null!=e.previewElement.parentNode&&e.previewElement.parentNode.removeChild(e.previewElement),this._updateMaxFilesReachedClass()},thumbnail:function(e,t){if(e.previewElement){e.previewElement.classList.remove("dz-file-preview");var n,r=o(e.previewElement.querySelectorAll("[data-dz-thumbnail]"),!0);try{for(r.s();!(n=r.n()).done;){var i=n.value;i.alt=e.name,i.src=t}}catch(e){r.e(e)}finally{r.f()}return setTimeout(function(){return e.previewElement.classList.add("dz-image-preview")},1)}},error:function(e,t){if(e.previewElement){e.previewElement.classList.add("dz-error"),"string"!=typeof t&&t.error&&(t=t.error);var n,r=o(e.previewElement.querySelectorAll("[data-dz-errormessage]"),!0);try{for(r.s();!(n=r.n()).done;)n.value.textContent=t}catch(e){r.e(e)}finally{r.f()}}},errormultiple:function(){},processing:function(e){if(e.previewElement&&(e.previewElement.classList.add("dz-processing"),e._removeLink))return e._removeLink.innerHTML=this.options.dictCancelUpload},processingmultiple:function(){},uploadprogress:function(e,t,n){if(e.previewElement){var r,i=o(e.previewElement.querySelectorAll("[data-dz-uploadprogress]"),!0);try{for(i.s();!(r=i.n()).done;){var s=r.value;"PROGRESS"===s.nodeName?s.value=t:s.style.width="".concat(t,"%")}}catch(e){i.e(e)}finally{i.f()}}},totaluploadprogress:function(){},sending:function(){},sendingmultiple:function(){},success:function(e){if(e.previewElement)return e.previewElement.classList.add("dz-success")},successmultiple:function(){},canceled:function(e){return this.emit("error",e,this.options.dictUploadCanceled)},canceledmultiple:function(){},complete:function(e){if(e._removeLink&&(e._removeLink.innerHTML=this.options.dictRemoveFile),e.previewElement)return e.previewElement.classList.add("dz-complete")},completemultiple:function(){},maxfilesexceeded:function(){},maxfilesreached:function(){},queuecomplete:function(){},addedfiles:function(){}};function l(e){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l(e)}function c(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return u(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?u(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return s=e.done,e},e:function(e){a=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n"))),this.clickableElements.length&&function t(){e.hiddenFileInput&&e.hiddenFileInput.parentNode.removeChild(e.hiddenFileInput),e.hiddenFileInput=document.createElement("input"),e.hiddenFileInput.setAttribute("type","file"),(null===e.options.maxFiles||e.options.maxFiles>1)&&e.hiddenFileInput.setAttribute("multiple","multiple"),e.hiddenFileInput.className="dz-hidden-input",null!==e.options.acceptedFiles&&e.hiddenFileInput.setAttribute("accept",e.options.acceptedFiles),null!==e.options.capture&&e.hiddenFileInput.setAttribute("capture",e.options.capture),e.hiddenFileInput.setAttribute("tabindex","-1"),e.hiddenFileInput.style.visibility="hidden",e.hiddenFileInput.style.position="absolute",e.hiddenFileInput.style.top="0",e.hiddenFileInput.style.left="0",e.hiddenFileInput.style.height="0",e.hiddenFileInput.style.width="0",o.getElement(e.options.hiddenInputContainer,"hiddenInputContainer").appendChild(e.hiddenFileInput),e.hiddenFileInput.addEventListener("change",function(){var n=e.hiddenFileInput.files;if(n.length){var r,i=c(n,!0);try{for(i.s();!(r=i.n()).done;){var o=r.value;e.addFile(o)}}catch(e){i.e(e)}finally{i.f()}}e.emit("addedfiles",n),t()})}(),this.URL=null!==window.URL?window.URL:window.webkitURL;var t,n=c(this.events,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.on(r,this.options[r])}}catch(e){n.e(e)}finally{n.f()}this.on("uploadprogress",function(){return e.updateTotalUploadProgress()}),this.on("removedfile",function(){return e.updateTotalUploadProgress()}),this.on("canceled",function(t){return e.emit("complete",t)}),this.on("complete",function(t){if(0===e.getAddedFiles().length&&0===e.getUploadingFiles().length&&0===e.getQueuedFiles().length)return setTimeout(function(){return e.emit("queuecomplete")},0)});var i=function(e){if(function(e){if(e.dataTransfer.types)for(var t=0;t")),n+='');var r=o.createElement(n);return"FORM"!==this.element.tagName?(t=o.createElement('
    '))).appendChild(r):(this.element.setAttribute("enctype","multipart/form-data"),this.element.setAttribute("method",this.options.method)),null!=t?t:r}},{key:"getExistingFallback",value:function(){for(var e=function(e){var t,n=c(e,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;if(/(^| )fallback($| )/.test(r.className))return r}}catch(e){n.e(e)}finally{n.f()}},t=0,n=["div","form"];t0){for(var r=["tb","gb","mb","kb","b"],i=0;i=Math.pow(this.options.filesizeBase,4-i)/10){t=e/Math.pow(this.options.filesizeBase,4-i),n=o;break}}t=Math.round(10*t)/10}return"".concat(t," ").concat(this.options.dictFileSizeUnits[n])}},{key:"_updateMaxFilesReachedClass",value:function(){return null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(this.getAcceptedFiles().length===this.options.maxFiles&&this.emit("maxfilesreached",this.files),this.element.classList.add("dz-max-files-reached")):this.element.classList.remove("dz-max-files-reached")}},{key:"drop",value:function(e){if(e.dataTransfer){this.emit("drop",e);for(var t=[],n=0;n0){var i,o=c(r,!0);try{for(o.s();!(i=o.n()).done;){var s=i.value;s.isFile?s.file(function(e){if(!n.options.ignoreHiddenFiles||"."!==e.name.substring(0,1))return e.fullPath="".concat(t,"/").concat(e.name),n.addFile(e)}):s.isDirectory&&n._addFilesFromDirectory(s,"".concat(t,"/").concat(s.name))}}catch(e){o.e(e)}finally{o.f()}e()}return null},i)}()}},{key:"accept",value:function(e,t){this.options.maxFilesize&&e.size>1024*this.options.maxFilesize*1024?t(this.options.dictFileTooBig.replace("{{filesize}}",Math.round(e.size/1024/10.24)/100).replace("{{maxFilesize}}",this.options.maxFilesize)):o.isValidFile(e,this.options.acceptedFiles)?null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(t(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}",this.options.maxFiles)),this.emit("maxfilesexceeded",e)):this.options.accept.call(this,e,t):t(this.options.dictInvalidFileType)}},{key:"addFile",value:function(e){var t=this;e.upload={uuid:o.uuidv4(),progress:0,total:e.size,bytesSent:0,filename:this._renameFile(e)},this.files.push(e),e.status=o.ADDED,this.emit("addedfile",e),this._enqueueThumbnail(e),this.accept(e,function(n){n?(e.accepted=!1,t._errorProcessing([e],n)):(e.accepted=!0,t.options.autoQueue&&t.enqueueFile(e)),t._updateMaxFilesReachedClass()})}},{key:"enqueueFiles",value:function(e){var t,n=c(e,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.enqueueFile(r)}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"enqueueFile",value:function(e){var t=this;if(e.status!==o.ADDED||!0!==e.accepted)throw new Error("This file can't be queued because it has already been processed or was rejected.");if(e.status=o.QUEUED,this.options.autoProcessQueue)return setTimeout(function(){return t.processQueue()},0)}},{key:"_enqueueThumbnail",value:function(e){var t=this;if(this.options.createImageThumbnails&&e.type.match(/image.*/)&&e.size<=1024*this.options.maxThumbnailFilesize*1024)return this._thumbnailQueue.push(e),setTimeout(function(){return t._processThumbnailQueue()},0)}},{key:"_processThumbnailQueue",value:function(){var e=this;if(!this._processingThumbnail&&0!==this._thumbnailQueue.length){this._processingThumbnail=!0;var t=this._thumbnailQueue.shift();return this.createThumbnail(t,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,!0,function(n){return e.emit("thumbnail",t,n),e._processingThumbnail=!1,e._processThumbnailQueue()})}}},{key:"removeFile",value:function(e){if(e.status===o.UPLOADING&&this.cancelUpload(e),this.files=b(this.files,e),this.emit("removedfile",e),0===this.files.length)return this.emit("reset")}},{key:"removeAllFiles",value:function(e){null==e&&(e=!1);var t,n=c(this.files.slice(),!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;(r.status!==o.UPLOADING||e)&&this.removeFile(r)}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"resizeImage",value:function(e,t,n,r,i){var s=this;return this.createThumbnail(e,t,n,r,!0,function(t,n){if(null==n)return i(e);var r=s.options.resizeMimeType;null==r&&(r=e.type);var a=n.toDataURL(r,s.options.resizeQuality);return"image/jpeg"!==r&&"image/jpg"!==r||(a=E.restore(e.dataURL,a)),i(o.dataURItoBlob(a))})}},{key:"createThumbnail",value:function(e,t,n,r,i,o){var s=this,a=new FileReader;a.onload=function(){e.dataURL=a.result,"image/svg+xml"!==e.type?s.createThumbnailFromUrl(e,t,n,r,i,o):null!=o&&o(a.result)},a.readAsDataURL(e)}},{key:"displayExistingFile",value:function(e,t,n,r){var i=this,o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4];this.emit("addedfile",e),this.emit("complete",e),o?(e.dataURL=t,this.createThumbnailFromUrl(e,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,this.options.fixOrientation,function(t){i.emit("thumbnail",e,t),n&&n()},r)):(this.emit("thumbnail",e,t),n&&n())}},{key:"createThumbnailFromUrl",value:function(e,t,n,r,i,o,s){var a=this,l=document.createElement("img");return s&&(l.crossOrigin=s),i="from-image"!=getComputedStyle(document.body).imageOrientation&&i,l.onload=function(){var s=function(e){return e(1)};return"undefined"!=typeof EXIF&&null!==EXIF&&i&&(s=function(e){return EXIF.getData(l,function(){return e(EXIF.getTag(this,"Orientation"))})}),s(function(i){e.width=l.width,e.height=l.height;var s=a.options.resize.call(a,e,t,n,r),c=document.createElement("canvas"),u=c.getContext("2d");switch(c.width=s.trgWidth,c.height=s.trgHeight,i>4&&(c.width=s.trgHeight,c.height=s.trgWidth),i){case 2:u.translate(c.width,0),u.scale(-1,1);break;case 3:u.translate(c.width,c.height),u.rotate(Math.PI);break;case 4:u.translate(0,c.height),u.scale(1,-1);break;case 5:u.rotate(.5*Math.PI),u.scale(1,-1);break;case 6:u.rotate(.5*Math.PI),u.translate(0,-c.width);break;case 7:u.rotate(.5*Math.PI),u.translate(c.height,-c.width),u.scale(-1,1);break;case 8:u.rotate(-.5*Math.PI),u.translate(-c.height,0)}x(u,l,null!=s.srcX?s.srcX:0,null!=s.srcY?s.srcY:0,s.srcWidth,s.srcHeight,null!=s.trgX?s.trgX:0,null!=s.trgY?s.trgY:0,s.trgWidth,s.trgHeight);var d=c.toDataURL("image/png");if(null!=o)return o(d,c)})},null!=o&&(l.onerror=o),l.src=e.dataURL}},{key:"processQueue",value:function(){var e=this.options.parallelUploads,t=this.getUploadingFiles().length,n=t;if(!(t>=e)){var r=this.getQueuedFiles();if(r.length>0){if(this.options.uploadMultiple)return this.processFiles(r.slice(0,e-t));for(;n1?t-1:0),r=1;rt.options.chunkSize),e[0].upload.totalChunkCount=Math.ceil(r.size/t.options.chunkSize)}if(e[0].upload.chunked){var i=e[0],s=n[0];i.upload.chunks=[];var a=function(){for(var n=0;void 0!==i.upload.chunks[n];)n++;if(!(n>=i.upload.totalChunkCount)){var r=n*t.options.chunkSize,a=Math.min(r+t.options.chunkSize,s.size),l={name:t._getParamName(0),data:s.webkitSlice?s.webkitSlice(r,a):s.slice(r,a),filename:i.upload.filename,chunkIndex:n};i.upload.chunks[n]={file:i,index:n,dataBlock:l,status:o.UPLOADING,progress:0,retries:0},t._uploadData(e,[l])}};if(i.upload.finishedChunkUpload=function(n,r){var s=!0;n.status=o.SUCCESS,n.dataBlock=null,n.xhr=null;for(var l=0;l1?t-1:0),r=1;r=s;a?o++:o--)i[o]=t.charCodeAt(o);return new Blob([r],{type:n})};var b=function(e,t){return e.filter(function(e){return e!==t}).map(function(e){return e})},w=function(e){return e.replace(/[\-_](\w)/g,function(e){return e.charAt(1).toUpperCase()})};g.createElement=function(e){var t=document.createElement("div");return t.innerHTML=e,t.childNodes[0]},g.elementInside=function(e,t){if(e===t)return!0;for(;e=e.parentNode;)if(e===t)return!0;return!1},g.getElement=function(e,t){var n;if("string"==typeof e?n=document.querySelector(e):null!=e.nodeType&&(n=e),null==n)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector or a plain HTML element."));return n},g.getElements=function(e,t){var n,r;if(e instanceof Array){r=[];try{var i,o=c(e,!0);try{for(o.s();!(i=o.n()).done;)n=i.value,r.push(this.getElement(n,t))}catch(e){o.e(e)}finally{o.f()}}catch(e){r=null}}else if("string"==typeof e){r=[];var s,a=c(document.querySelectorAll(e),!0);try{for(a.s();!(s=a.n()).done;)n=s.value,r.push(n)}catch(e){a.e(e)}finally{a.f()}}else null!=e.nodeType&&(r=[e]);if(null==r||!r.length)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector, a plain HTML element or a list of those."));return r},g.confirm=function(e,t,n){return window.confirm(e)?t():null!=n?n():void 0},g.isValidFile=function(e,t){if(!t)return!0;t=t.split(",");var n,r=e.type,i=r.replace(/\/.*$/,""),o=c(t,!0);try{for(o.s();!(n=o.n()).done;){var s=n.value;if("."===(s=s.trim()).charAt(0)){if(-1!==e.name.toLowerCase().indexOf(s.toLowerCase(),e.name.length-s.length))return!0}else if(/\/\*$/.test(s)){if(i===s.replace(/\/.*$/,""))return!0}else if(r===s)return!0}}catch(e){o.e(e)}finally{o.f()}return!1},"undefined"!=typeof jQuery&&null!==jQuery&&(jQuery.fn.dropzone=function(e){return this.each(function(){return new g(this,e)})}),g.ADDED="added",g.QUEUED="queued",g.ACCEPTED=g.QUEUED,g.UPLOADING="uploading",g.PROCESSING=g.UPLOADING,g.CANCELED="canceled",g.ERROR="error",g.SUCCESS="success";var x=function(e,t,n,r,i,o,s,a,l,c){var u=function(e){e.naturalWidth;var t=e.naturalHeight,n=document.createElement("canvas");n.width=1,n.height=t;var r=n.getContext("2d");r.drawImage(e,0,0);for(var i=r.getImageData(1,0,1,t).data,o=0,s=t,a=t;a>o;)0===i[4*(a-1)+3]?s=a:o=a,a=s+o>>1;var l=a/t;return 0===l?1:l}(t);return e.drawImage(t,n,r,i,o,s,a,l,c/u)},E=function(){function e(){d(this,e)}return p(e,null,[{key:"initClass",value:function(){this.KEY_STR="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}},{key:"encode64",value:function(e){for(var t="",n=void 0,r=void 0,i="",o=void 0,s=void 0,a=void 0,l="",c=0;o=(n=e[c++])>>2,s=(3&n)<<4|(r=e[c++])>>4,a=(15&r)<<2|(i=e[c++])>>6,l=63&i,isNaN(r)?a=l=64:isNaN(i)&&(l=64),t=t+this.KEY_STR.charAt(o)+this.KEY_STR.charAt(s)+this.KEY_STR.charAt(a)+this.KEY_STR.charAt(l),n=r=i="",o=s=a=l="",ce.length)break}return n}},{key:"decode64",value:function(e){var t=void 0,n=void 0,r="",i=void 0,o=void 0,s="",a=0,l=[];for(/[^A-Za-z0-9\+\/\=]/g.exec(e)&&console.warn("There were invalid base64 characters in the input text.\nValid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\nExpect errors in decoding."),e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");t=this.KEY_STR.indexOf(e.charAt(a++))<<2|(i=this.KEY_STR.indexOf(e.charAt(a++)))>>4,n=(15&i)<<4|(o=this.KEY_STR.indexOf(e.charAt(a++)))>>2,r=(3&o)<<6|(s=this.KEY_STR.indexOf(e.charAt(a++))),l.push(t),64!==o&&l.push(n),64!==s&&l.push(r),t=n=r="",i=o=s="",at.options.priority?-1:e.options.priority=0;n--)this._subscribers[n].fn!==e&&this._subscribers[n].id!==e||(this._subscribers[n].channel=null,this._subscribers.splice(n,1));else this._subscribers=[];if(t&&this.autoCleanChannel(),n=this._subscribers.length-1,e)for(;n>=0;n--)this._subscribers[n].fn!==e&&this._subscribers[n].id!==e||(this._subscribers[n].channel=null,this._subscribers.splice(n,1));else this._subscribers=[]},t.prototype.autoCleanChannel=function(){if(0===this._subscribers.length){for(var e in this._channels)if(this._channels.hasOwnProperty(e))return;if(null!=this._parent){var t=this.namespace.split(":"),n=t[t.length-1];this._parent.removeChannel(n)}}},t.prototype.removeChannel=function(e){this.hasChannel(e)&&(this._channels[e]=null,delete this._channels[e],this.autoCleanChannel())},t.prototype.publish=function(e){for(var t,n,r,i=0,o=this._subscribers.length,s=!1;i0)for(;i{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";var e=n(295),t=n.n(e),r=n(216);window.Cl=window.Cl||{};class i{constructor(e={}){this.options={linksSelector:".js-toggler-link",dataHeaderSelector:"toggler-header-selector",dataContentSelector:"toggler-content-selector",collapsedClass:"js-collapsed",expandedClass:"js-expanded",hiddenClass:"hidden",...e},this.togglerInstances=[],document.querySelectorAll(this.options.linksSelector).forEach(e=>{const t=new o(e,this.options);this.togglerInstances.push(t)})}destroy(){this.links=null,this.togglerInstances.forEach(e=>e.destroy()),this.togglerInstances=[]}}class o{constructor(e,t={}){this.options={...t},this.link=e,this.headerSelector=this.link.dataset[this.options.dataHeaderSelector],this.contentSelector=this.link.dataset[this.options.dataContentSelector],this.header=document.querySelector(this.headerSelector),this.header=this.header||this.link,this.content=document.querySelector(this.contentSelector),this.content&&this._initLink()}_updateClasses(){this.content.classList.contains(this.options.hiddenClass)?(this.header.classList.remove(this.options.expandedClass),this.header.classList.add(this.options.collapsedClass)):(this.header.classList.add(this.options.expandedClass),this.header.classList.remove(this.options.collapsedClass))}_onTogglerClick(e){this.content.classList.toggle(this.options.hiddenClass),this._updateClasses(),e.preventDefault()}_initLink(){this._updateClasses(),this.link.addEventListener("click",e=>this._onTogglerClick(e))}destroy(){this.options=null,this.link=null}}Cl.Toggler=i,Cl.TogglerConstructor=o;const s=i;n(413);var a=n(628),l=n.n(a);document.addEventListener("DOMContentLoaded",()=>{let e=0,t=1;const n=document.querySelector(".js-upload-button");if(!n)return;const r=document.querySelector(".js-upload-button-disabled"),i=n.dataset.url;if(!i)return;const o=document.querySelector(".js-filer-dropzone-upload-welcome"),s=document.querySelector(".js-filer-dropzone-upload-info-container"),a=document.querySelector(".js-filer-dropzone-upload-info"),c=document.querySelector(".js-filer-dropzone-upload-number"),u=".js-filer-dropzone-progress",d=document.querySelector(".js-filer-dropzone-upload-success"),f=document.querySelector(".js-filer-dropzone-upload-canceled"),p=document.querySelector(".js-filer-dropzone-cancel"),h=document.querySelector(".js-filer-dropzone-info-message"),v="hidden",m=parseInt(n.dataset.maxUploaderConnections||3,10),y=parseInt(n.dataset.maxFilesize||0,10);let g=!1;const b=()=>{c&&(c.textContent=`${t-e}/${t}`)},w=()=>{n&&n.remove()},x=()=>{const e=window.location.toString();window.location.replace(((e,t,n)=>{const r=new RegExp(`([?&])${t}=.*?(&|$)`,"i"),i=-1!==e.indexOf("?")?"&":"?",o=window.location.hash;return(e=e.replace(/#.*$/,"")).match(r)?e.replace(r,`$1${t}=${n}$2`)+o:e+i+t+"="+n+o})(e,"order_by","-modified_at"))};let E;Cl.mediator.subscribe("filer-upload-in-progress",w),n.addEventListener("click",e=>{e.preventDefault()}),l().autoDiscover=!1;try{E=new(l())(n,{url:i,paramName:"file",maxFilesize:y,parallelUploads:m,clickable:n,previewTemplate:"
    ",addRemoveLinks:!1,autoProcessQueue:!0})}catch(e){return void console.error("[Filer Upload] Failed to create Dropzone instance:",e)}E.on("addedfile",n=>{Cl.mediator.remove("filer-upload-in-progress",w),Cl.mediator.publish("filer-upload-in-progress"),e++,t=E.files.length,h&&h.classList.remove(v),o&&o.classList.add(v),d&&d.classList.add(v),s&&s.classList.remove(v),p&&p.classList.remove(v),f&&f.classList.add(v),b()}),E.on("uploadprogress",(e,t)=>{const n=Math.round(t),r=`file-${encodeURIComponent(e.name)}${e.size}${e.lastModified}`,i=document.getElementById(r);let o;if(i){const e=i.querySelector(u);e&&(e.style.width=`${n}%`)}else if(a){o=a.cloneNode(!0);const t=o.querySelector(".js-filer-dropzone-file-name");t&&(t.textContent=e.name);const i=o.querySelector(u);i&&(i.style.width=`${n}%`),o.classList.remove(v),o.setAttribute("id",r),s&&s.appendChild(o)}}),E.on("success",(n,r)=>{const i=`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}`,s=document.getElementById(i);s&&s.remove(),r.error&&(g=!0,window.filerShowError(`${n.name}: ${r.error}`)),e--,b(),0===e&&(t=1,o&&o.classList.add(v),c&&c.classList.add(v),f&&f.classList.add(v),p&&p.classList.add(v),d&&d.classList.remove(v),g?setTimeout(x,1e3):x())}),E.on("error",(n,r)=>{const i=`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}`,s=document.getElementById(i);s&&s.remove(),g=!0,window.filerShowError(`${n.name}: ${r}`),e--,b(),0===e&&(t=1,o&&o.classList.add(v),c&&c.classList.add(v),f&&f.classList.add(v),p&&p.classList.add(v),d&&d.classList.remove(v),setTimeout(x,1e3))}),p&&p.addEventListener("click",e=>{e.preventDefault(),p.classList.add(v),c&&c.classList.add(v),s&&s.classList.add(v),f&&f.classList.remove(v),setTimeout(()=>{window.location.reload()},1e3)}),r&&Cl.filerTooltip&&Cl.filerTooltip(),document.dispatchEvent(new Event("filer-upload-scripts-executed"))}),l()&&(l().autoDiscover=!1),document.addEventListener("DOMContentLoaded",()=>{const e=".js-img-preview",t=".js-filer-dropzone:not(.js-filer-dropzone-base):not(.js-filer-dropzone-folder):not(.js-filer-dropzone-info-message)",n=document.querySelectorAll(t),r=".js-filer-dropzone-progress",i=".js-img-wrapper",o="hidden",s="filer-dropzone-mobile",a="js-object-attached",c=e=>{e.offsetWidth<500?e.classList.add(s):e.classList.remove(s)},u=e=>{try{window.parent.CMS.API.Messages.open({message:e})}catch{window.filerShowError?window.filerShowError(e):alert(e)}},d=function(t){const n=t.dataset.url,s=t.querySelector(".vForeignKeyRawIdAdminField"),d="image"===s?.getAttribute("name"),f=t.querySelector(".js-related-lookup"),p=t.querySelector(".js-related-edit"),h=t.querySelector(".js-filer-dropzone-message"),v=t.querySelector(".filerClearer"),m=t.querySelector(".js-file-selector");t.dropzone||(window.addEventListener("resize",()=>{c(t)}),new(l())(t,{url:n,paramName:"file",maxFiles:1,maxFilesize:t.dataset.maxFilesize,previewTemplate:document.querySelector(".js-filer-dropzone-template")?.innerHTML||"
    ",clickable:!1,addRemoveLinks:!1,init:function(){c(t),this.on("removedfile",()=>{m&&(m.style.display=""),t.classList.remove(a),this.removeAllFiles(),v?.click()}),this.element.querySelectorAll("img").forEach(e=>{e.addEventListener("dragstart",e=>{e.preventDefault()})}),v&&v.addEventListener("click",()=>{t.classList.remove(a)})},maxfilesexceeded:function(){this.removeAllFiles(!0)},drop:function(){this.removeAllFiles(!0),v?.click();const e=t.querySelector(r);e&&e.classList.remove(o),m&&(m.style.display="block"),f?.classList.add("related-lookup-change"),p?.classList.add("related-lookup-change"),h?.classList.add(o),t.classList.remove("dz-drag-hover"),t.classList.add(a)},success:function(n,a){const l=t.querySelector(r);if(l&&l.classList.add(o),n&&"success"===n.status&&a){if(a.file_id&&s){s.value=a.file_id;const e=new Event("change",{bubbles:!0});s.dispatchEvent(e)}if(a.thumbnail_180&&d){const n=t.querySelector(e);n&&(n.style.backgroundImage=`url(${a.thumbnail_180})`);const r=t.querySelector(i);r&&r.classList.remove(o)}}else a&&a.error&&u(`${n.name}: ${a.error}`),this.removeAllFiles(!0);this.element.querySelectorAll("img").forEach(e=>{e.addEventListener("dragstart",e=>{e.preventDefault()})})},error:function(e,t,n){n&&n.error&&(t+=` ; ${n.error}`),u(`${e.name}: ${t}`),this.removeAllFiles(!0)},reset:function(){if(d){const n=t.querySelector(i);n&&n.classList.add(o);const r=t.querySelector(e);r&&(r.style.backgroundImage="none")}if(t.classList.remove(a),s&&(s.value=""),f?.classList.remove("related-lookup-change"),p?.classList.remove("related-lookup-change"),h?.classList.remove(o),s){const e=new Event("change",{bubbles:!0});s.dispatchEvent(e)}}}))};n.length&&l()&&(window.filerDropzoneInitialized||(window.filerDropzoneInitialized=!0,l().autoDiscover=!1),n.forEach(d),document.addEventListener("formset:added",e=>{let n,r,i;e.detail&&e.detail.formsetName?(r=parseInt(document.getElementById(`id_${e.detail.formsetName}-TOTAL_FORMS`).value,10)-1,i=document.getElementById(`${e.detail.formsetName}-${r}`),n=i?.querySelectorAll(t)||[]):(i=e.target,n=i?.querySelectorAll(t)||[]),n?.forEach(d)}))}),document.addEventListener("DOMContentLoaded",()=>{let e=0,t=0;const n=[],r=document.querySelector(".js-filer-dropzone-base"),i=".js-filer-dropzone";let o;const s=document.querySelector(".js-filer-dropzone-info-message"),a=document.querySelector(".js-filer-dropzone-folder-name"),c=document.querySelector(".js-filer-dropzone-upload-info-container"),u=document.querySelector(".js-filer-dropzone-upload-info"),d=document.querySelector(".js-filer-dropzone-upload-welcome"),f=document.querySelector(".js-filer-dropzone-upload-number"),p=document.querySelector(".js-filer-upload-count"),h=document.querySelector(".js-filer-upload-text"),v=".js-filer-dropzone-progress",m=document.querySelector(".js-filer-dropzone-upload-success"),y=document.querySelector(".js-filer-dropzone-upload-canceled"),g=document.querySelector(".js-filer-dropzone-cancel"),b="dz-drag-hover",w=document.querySelector(".drag-hover-border"),x="hidden";let E,S,k,L=!1;const A=()=>{const e=window.location.toString();window.location.replace(((e,t,n)=>{const r=new RegExp(`([?&])${t}=.*?(&|$)`,"i"),i=-1!==e.indexOf("?")?"&":"?",o=window.location.hash;return(e=e.replace(/#.*$/,"")).match(r)?e.replace(r,`$1${t}=${n}$2`)+o:e+i+t+"="+n+o})(e,"order_by","-modified_at"))},C=()=>{f&&(f.textContent=`${t-e}/${t}`),h&&h.classList.remove("hidden"),p&&p.classList.remove("hidden")},_=()=>{n.forEach(e=>{e.destroy()})},T=(e,t)=>document.getElementById(`file-${encodeURIComponent(e.name)}${e.size}${e.lastModified}${t}`);if(r){S=r.dataset.url,k=r.dataset.folderName;const e=document.body;e.dataset.url=S,e.dataset.folderName=k,e.dataset.maxFiles=r.dataset.maxFiles,e.dataset.maxFilesize=r.dataset.maxFilesize,e.classList.add("js-filer-dropzone")}Cl.mediator.subscribe("filer-upload-in-progress",_),o=document.querySelectorAll(i),o.length&&l()&&(l().autoDiscover=!1,o.forEach(r=>{if(r.dropzone)return;const p=r.dataset.url,h=new(l())(r,{url:p,paramName:"file",maxFiles:parseInt(r.dataset.maxFiles)||100,maxFilesize:parseInt(r.dataset.maxFilesize),previewTemplate:"
    ",clickable:!1,addRemoveLinks:!1,parallelUploads:r.dataset["max-uploader-connections"]||3,accept:(n,r)=>{let i;if(Cl.mediator.remove("filer-upload-in-progress",_),Cl.mediator.publish("filer-upload-in-progress"),clearTimeout(E),clearTimeout(E),d&&d.classList.add(x),g&&g.classList.remove(x),T(n,p))r("duplicate");else{i=u.cloneNode(!0);const o=i.querySelector(".js-filer-dropzone-file-name");o&&(o.textContent=n.name);const s=i.querySelector(v);s&&(s.style.width="0"),i.setAttribute("id",`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}${p}`),c&&c.appendChild(i),e++,t++,C(),r()}o.forEach(e=>e.classList.remove("reset-hover")),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b))},dragover:e=>{const t=e.target.closest(i),n=t?.dataset.folderName,l=r.classList.contains("js-filer-dropzone-folder"),c=r.getBoundingClientRect(),u=w?window.getComputedStyle(w):null,d=u?u.borderTopWidth:"0px",f=u?u.borderLeftWidth:"0px",p={top:`${c.top}px`,bottom:`${c.bottom}px`,left:`${c.left}px`,right:`${c.right}px`,width:c.width-2*parseInt(f,10)+"px",height:c.height-2*parseInt(d,10)+"px",display:"block"};l&&w&&Object.assign(w.style,p),o.forEach(e=>e.classList.add("reset-hover")),m&&m.classList.add(x),s&&s.classList.remove(x),r.classList.add(b),r.classList.remove("reset-hover"),a&&n&&(a.textContent=n)},dragend:()=>{clearTimeout(E),E=setTimeout(()=>{s&&s.classList.add(x)},1e3),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b)),w&&Object.assign(w.style,{top:"0",bottom:"0",width:"0",height:"0"})},dragleave:()=>{clearTimeout(E),E=setTimeout(()=>{s&&s.classList.add(x)},1e3),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b)),w&&Object.assign(w.style,{top:"0",bottom:"0",width:"0",height:"0"})},sending:e=>{const t=T(e,p);t&&t.classList.remove(x)},uploadprogress:(e,t)=>{const n=T(e,p);if(n){const e=n.querySelector(v);e&&(e.style.width=`${t}%`)}},success:(t,n)=>{e--,C();const r=T(t,p);r&&r.remove()},queuecomplete:()=>{0===e&&(C(),g&&g.classList.add(x),u&&u.classList.add(x),L?(f&&f.classList.add(x),setTimeout(()=>{A()},1e3)):(m&&m.classList.remove(x),A()))},error:(t,n)=>{if("duplicate"===n)return;e--,C();const r=T(t,p);r&&r.remove(),L=!0,window.filerShowError&&window.filerShowError(`${t.name}: ${n.message||n}`)}});n.push(h),g&&g.addEventListener("click",e=>{e.preventDefault(),g.classList.add(x),y&&y.classList.remove(x),h.removeAllFiles(!0)})}))}),n(117),n(221),n(472),n(902),n(577),window.Cl=window.Cl||{},Cl.mediator=new(t()),Cl.FocalPoint=r.A,Cl.Toggler=s,document.addEventListener("DOMContentLoaded",()=>{let e;window.filerShowError=t=>{const n=document.querySelector(".messagelist"),r=document.querySelector("#header"),i="js-filer-error",o=`
    • {msg}
    `.replace("{msg}",t);n?n.outerHTML=o:r&&r.insertAdjacentHTML("afterend",o),e&&clearTimeout(e),e=setTimeout(()=>{const e=document.querySelector(`.${i}`);e&&e.remove()},5e3)};const t=document.querySelector(".js-filter-files");t&&(t.addEventListener("focus",e=>{const t=e.target.closest(".navigator-top-nav");t&&t.classList.add("search-is-focused")}),t.addEventListener("blur",e=>{const t=e.target.closest(".navigator-top-nav");if(t){const n=t.querySelector(".dropdown-container a");n&&e.relatedTarget===n||t.classList.remove("search-is-focused")}}));const n=document.querySelector(".js-filter-files-container");n&&n.addEventListener("submit",e=>{}),(()=>{const e=document.querySelector(".js-filter-files"),t=".navigator-top-nav",n=document.querySelector(t),r=n?.querySelector(".filter-search-wrapper .filer-dropdown-container");e&&(e.addEventListener("keydown",function(e){e.key;const n=this.closest(t);n&&n.classList.add("search-is-focused")}),r&&(r.addEventListener("show.bs.filer-dropdown",()=>{n&&n.classList.add("search-is-focused")}),r.addEventListener("hide.bs.filer-dropdown",()=>{n&&n.classList.remove("search-is-focused")})))})(),(()=>{const e=document.querySelectorAll(".navigator-table tr, .navigator-list .list-item"),t=document.querySelector(".actions-wrapper"),n=document.querySelectorAll(".action-select, #action-toggle, #files-action-toggle, #folders-action-toggle, .actions .clear a");setTimeout(()=>{n.forEach(e=>{if(e.checked){const t=e.closest(".list-item");t&&t.classList.add("selected")}}),Array.from(e).some(e=>e.classList.contains("selected"))&&t&&t.classList.add("action-selected")},100),n.forEach(n=>{n.addEventListener("change",function(){const n=this.closest(".list-item");n&&(this.checked?n.classList.add("selected"):n.classList.remove("selected")),setTimeout(()=>{const n=Array.from(e).some(e=>e.classList.contains("selected"));t&&(n?t.classList.add("action-selected"):t.classList.remove("action-selected"))},0)})})})(),(()=>{const e=document.querySelector(".js-actions-menu");if(!e)return;const t=e.querySelector(".filer-dropdown-menu"),n=document.querySelector('.actions select[name="action"]'),r=n?.querySelectorAll("option")||[],i=document.querySelector('.actions button[type="submit"]'),o=document.querySelector(".js-action-delete"),s=document.querySelector(".js-action-copy"),a=document.querySelector(".js-action-move"),l="delete_files_or_folders",c="copy_files_and_folders",u="move_files_and_folders",d=document.querySelectorAll(".navigator-table tr, .navigator-list .list-item"),f=(e,t)=>{t&&r.forEach(r=>{r.value===e&&(t.style.display="",t.addEventListener("click",t=>{if(t.preventDefault(),Array.from(d).some(e=>e.classList.contains("selected"))&&n&&i){n.value=e;const t=n.querySelector(`option[value="${e}"]`);t&&(t.selected=!0),i.click()}}))})};f(l,o),f(c,s),f(u,a),r.forEach((e,n)=>{if(0!==n){const n=document.createElement("li"),r=document.createElement("a");r.href="#",r.textContent=e.textContent,e.value!==l&&e.value!==c&&e.value!==u||r.classList.add("hidden"),n.appendChild(r),t&&t.appendChild(n)}}),t&&t.addEventListener("click",e=>{if("A"===e.target.tagName){const r=e.target.closest("li"),o=Array.from(t.querySelectorAll("li")).indexOf(r)+1;if(e.preventDefault(),n&&i){const e=n.querySelectorAll("option");e[o]&&(n.value=e[o].value,e[o].selected=!0),i.click()}}}),e.addEventListener("click",e=>{Array.from(d).some(e=>e.classList.contains("selected"))||(e.preventDefault(),e.stopPropagation())})})(),(()=>{const e=document.querySelector(".navigator-top-nav");if(!e)return;const t=document.querySelector(".breadcrumbs-container");if(!t)return;const n=t.querySelector(".navigator-breadcrumbs"),r=t.querySelector(".filer-dropdown-container"),i=document.querySelector(".filter-files-container"),o=document.querySelector(".actions-wrapper"),s=document.querySelector(".navigator-button-wrapper"),a=n?.offsetWidth||0,l=r?.offsetWidth||0,c=i?.offsetWidth||0,u=o?.offsetWidth||0,d=s?.offsetWidth||0,f=window.getComputedStyle(e),p=parseInt(f.paddingLeft,10)+parseInt(f.paddingRight,10);let h=e.offsetWidth;const v=80+a+l+c+u+d+p,m="breadcrumb-min-width",y=()=>{h{h=e.offsetWidth,y()})})(),(()=>{const e=document.querySelectorAll(".navigator-list .list-item input.action-select"),t=".navigator-list .navigator-folders-body .list-item input.action-select",n=".navigator-list .navigator-files-body .list-item input.action-select",r=document.querySelector("#files-action-toggle"),i=document.querySelector("#folders-action-toggle");i&&i.addEventListener("click",function(){const e=document.querySelectorAll(t);this.checked?e.forEach(e=>{e.checked||e.click()}):e.forEach(e=>{e.checked&&e.click()})}),r&&r.addEventListener("click",function(){const e=document.querySelectorAll(n);this.checked?e.forEach(e=>{e.checked||e.click()}):e.forEach(e=>{e.checked&&e.click()})}),e.forEach(e=>{e.addEventListener("click",function(){const e=document.querySelectorAll(n),o=document.querySelectorAll(t);if(this.checked){const t=Array.from(e).every(e=>e.checked),n=Array.from(o).every(e=>e.checked);t&&r&&(r.checked=!0),n&&i&&(i.checked=!0)}else{const t=Array.from(e).some(e=>!e.checked),n=Array.from(o).some(e=>!e.checked);t&&r&&(r.checked=!1),n&&i&&(i.checked=!1)}})});const o=document.querySelector(".navigator .actions .clear a");o&&o.addEventListener("click",()=>{i&&(i.checked=!1),r&&(r.checked=!1)})})(),document.querySelectorAll(".js-copy-url").forEach(e=>{e.addEventListener("click",function(e){const t=new URL(this.dataset.url,document.location.href),n=this.dataset.msg||"URL copied to clipboard",r=document.createElement("template");e.preventDefault(),document.querySelectorAll(".info.filer-tooltip").forEach(e=>{e.remove()}),navigator.clipboard.writeText(t.href),r.innerHTML=`
    ${n}
    `,this.classList.add("filer-tooltip-wrapper"),this.appendChild(r.content.firstChild);const i=this;setTimeout(()=>{const e=i.querySelector(".info");e&&e.remove()},1200)})}),(new r.A).initialize(),new s})})()})(); \ No newline at end of file From 8abf6c64fde8737bb0333448c90a313ebbd75a86 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Wed, 10 Jun 2026 15:00:00 +0300 Subject: [PATCH 696/715] BEN-2954: fix file uploads and edit --- filer/admin/archiveadmin.py | 5 ++--- filer/admin/clipboardadmin.py | 5 ++++- filer/admin/fileadmin.py | 5 +++++ filer/utils/files.py | 23 +++++++++++++++++++++-- 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/filer/admin/archiveadmin.py b/filer/admin/archiveadmin.py index f7e1f1214..2c30342b9 100644 --- a/filer/admin/archiveadmin.py +++ b/filer/admin/archiveadmin.py @@ -1,9 +1,8 @@ -from django import forms -from filer.admin.fileadmin import FileAdmin +from filer.admin.fileadmin import FileAdmin, FileAdminChangeFrom from filer.models import Archive -class ArchiveAdminForm(forms.ModelForm): +class ArchiveAdminForm(FileAdminChangeFrom): class Meta: model = Archive diff --git a/filer/admin/clipboardadmin.py b/filer/admin/clipboardadmin.py index 1f4ac6e1e..9f00f1930 100644 --- a/filer/admin/clipboardadmin.py +++ b/filer/admin/clipboardadmin.py @@ -109,7 +109,10 @@ def ajax_upload(request, folder_id=None): # Re-detect mime_type after truncation may have added an extension import mimetypes as _mimetypes guessed_type = _mimetypes.guess_type(filename)[0] - if guessed_type and mime_type == 'application/octet-stream': + if guessed_type and ( + mime_type == 'application/octet-stream' + or not _mimetypes.guess_all_extensions(mime_type) + ): mime_type = guessed_type # Get clipboard diff --git a/filer/admin/fileadmin.py b/filer/admin/fileadmin.py index 17b7b8c7a..7487e2846 100644 --- a/filer/admin/fileadmin.py +++ b/filer/admin/fileadmin.py @@ -46,6 +46,11 @@ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) if "file" in self.fields: self.fields["file"].widget = forms.FileInput() + # Pre-populate the "name" field with the original_filename when it is + # empty so that users see the current effective filename on first edit. + if self.instance and self.instance.pk and "name" in self.fields: + if not self.instance.name and self.instance.original_filename: + self.initial["name"] = self.instance.original_filename def clean(self): from ..validation import validate_upload diff --git a/filer/utils/files.py b/filer/utils/files.py index 2b87eed34..07c3cb74f 100644 --- a/filer/utils/files.py +++ b/filer/utils/files.py @@ -113,8 +113,27 @@ def handle_request_files_upload(request): mime_type = upload.content_type.lower() extensions = mimetypes.guess_all_extensions(mime_type) if mime_type != 'application/octet-stream' and extensions and iext.lower() not in extensions: - msg = "MIME-Type '{mimetype}' does not correspond to file extension of {filename}." - raise UploadException(msg.format(mimetype=mime_type, filename=filename)) + # The browser's content type doesn't match the file extension. + # Check if the file extension has its own known MIME type (e.g. + # browser sends image/webp for a .jpg file, or application/x-zip-compressed + # for a .zip file). + guessed_type = mimetypes.guess_type(filename)[0] + if guessed_type: + # Extension has a known type – use it instead of rejecting. + mime_type = guessed_type + elif iext: + # Extension exists but is not recognized by Python's mimetypes + # (e.g. .jfif). Trust the browser's content type rather than + # rejecting the upload. + pass + else: + # No file extension at all – trust the browser's content type. + pass + elif not extensions and mime_type != 'application/octet-stream': + # Browser sent an unrecognized MIME type; try to guess from filename + guessed_type = mimetypes.guess_type(filename)[0] + if guessed_type: + mime_type = guessed_type return upload, filename, is_raw, mime_type From c52912f99779eba6783eeeb8a3aa45ed0a66383e Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Wed, 10 Jun 2026 15:54:56 +0300 Subject: [PATCH 697/715] BEN-2954: rename filer versions --- filer/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filer/__init__.py b/filer/__init__.py index 5f45d5c29..03cc0b520 100644 --- a/filer/__init__.py +++ b/filer/__init__.py @@ -11,4 +11,4 @@ 7. Create a new release on github. """ -__version__ = '3.4.4+bento3.patch.1' +__version__ = '3.4.4+pbs.1' From bed9d6d7f63e2ce1cf898e6fce5fb65bc7f30532 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Wed, 10 Jun 2026 17:02:30 +0300 Subject: [PATCH 698/715] BEN-2954: add button --- filer/admin/common_admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filer/admin/common_admin.py b/filer/admin/common_admin.py index f9cadd9c6..c7771bc1a 100644 --- a/filer/admin/common_admin.py +++ b/filer/admin/common_admin.py @@ -126,7 +126,7 @@ def render_change_form(self, request, context, add=False, change=False, 'select_folder': selectfolder_status(request), }) return super(CommonModelAdmin, self).render_change_form( - request=request, context=context, add=False, + request=request, context=context, add=add, change=change, form_url=form_url, obj=obj) def response_change(self, request, obj): From dc8739a0a0f9642b08adf9eabac4baa8b7f221b5 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Wed, 10 Jun 2026 17:21:04 +0300 Subject: [PATCH 699/715] BEN-2954: test upload --- filer/admin/clipboardadmin.py | 34 ++++- filer/models/abstract.py | 32 +++-- .../static/filer/js/addons/table-dropzone.js | 6 + .../static/filer/js/dist/filer-base.bundle.js | 2 +- test_image_upload.py | 120 ++++++++++++++++++ 5 files changed, 178 insertions(+), 16 deletions(-) create mode 100644 test_image_upload.py diff --git a/filer/admin/clipboardadmin.py b/filer/admin/clipboardadmin.py index 9f00f1930..d4eccbe42 100644 --- a/filer/admin/clipboardadmin.py +++ b/filer/admin/clipboardadmin.py @@ -1,3 +1,5 @@ +import logging + from django.contrib import admin, messages from django.core.exceptions import ValidationError from django.forms.models import modelform_factory @@ -75,6 +77,7 @@ def ajax_upload(request, folder_id=None): """ Receives an upload from the uploader. Receives only one file at a time. """ + logger = logging.getLogger(__name__) if not request.user.has_perm("filer.add_file"): messages.error(request, NO_PERMISSIONS) @@ -95,12 +98,16 @@ def ajax_upload(request, folder_id=None): messages.error(request, NO_PERMISSIONS_FOR_FOLDER) return JsonResponse({'error': NO_PERMISSIONS_FOR_FOLDER}) - if len(request.FILES) == 1: - # don't check if request is ajax or not, just grab the file - upload, filename, is_raw, mime_type = handle_request_files_upload(request) - else: - # else process the request as usual - upload, filename, is_raw, mime_type = handle_upload(request) + try: + if len(request.FILES) == 1: + # don't check if request is ajax or not, just grab the file + upload, filename, is_raw, mime_type = handle_request_files_upload(request) + else: + # else process the request as usual + upload, filename, is_raw, mime_type = handle_upload(request) + except Exception as e: + logger.exception("[ajax_upload] Error handling upload: %s", e) + return JsonResponse({'error': str(e)}) # Truncate long filenames filename = truncate_filename(upload, maxlen=100) @@ -115,6 +122,9 @@ def ajax_upload(request, folder_id=None): ): mime_type = guessed_type + logger.debug("[ajax_upload] filename=%s, mime_type=%s, size=%s", + filename, mime_type, getattr(upload, 'size', '?')) + # Get clipboard clipboard = Clipboard.objects.get_or_create(user=request.user)[0] @@ -134,6 +144,7 @@ def ajax_upload(request, folder_id=None): fields=('original_filename', 'owner', 'file') ) break + logger.debug("[ajax_upload] matched file type: %s", FileSubClass.__name__) uploadform = FileForm({'original_filename': filename, 'owner': request.user.pk}, {'file': upload}) uploadform.request = request @@ -145,10 +156,16 @@ def ajax_upload(request, folder_id=None): # Enforce the FILER_IS_PUBLIC_DEFAULT file_obj.is_public = filer_settings.FILER_IS_PUBLIC_DEFAULT except ValidationError as error: + logger.warning("[ajax_upload] Validation error for '%s': %s", filename, error) messages.error(request, str(error)) return JsonResponse({'error': str(error)}) file_obj.folder = folder - file_obj.save() + try: + file_obj.save() + except Exception as error: + logger.exception("[ajax_upload] Error saving file '%s': %s", filename, error) + messages.error(request, str(error)) + return JsonResponse({'error': str(error)}) clipboard_item = ClipboardItem( clipboard=clipboard, file=file_obj) clipboard_item.save() @@ -170,9 +187,12 @@ def ajax_upload(request, folder_id=None): data['original_image'] = file_obj.url return JsonResponse(data) except Exception as error: + logger.exception("[ajax_upload] Error building response for '%s': %s", filename, error) messages.error(request, str(error)) return JsonResponse({"error": str(error)}) else: + logger.warning("[ajax_upload] Form invalid for '%s' (mime=%s, type=%s): %s", + filename, mime_type, FileSubClass.__name__, uploadform.errors.as_text()) for key, error_list in uploadform.errors.items(): for error in error_list: messages.error(request, error) diff --git a/filer/models/abstract.py b/filer/models/abstract.py index 499e21624..d6d552ee2 100644 --- a/filer/models/abstract.py +++ b/filer/models/abstract.py @@ -139,7 +139,14 @@ def file_data_changed(self, post_init=False): self._width, self._height = pil_image.size self._transparent = easy_thumbnails.utils.is_transparent(pil_image) imgfile.seek(0) - except Exception: + except Exception as e: + import logging + logging.getLogger(__name__).warning( + "Could not read image dimensions for '%s' (mime=%s): %s: %s", + getattr(self, 'original_filename', '?'), + getattr(self, 'mime_type', '?'), + type(e).__name__, e, + ) if post_init is False: # in case `imgfile` could not be found, unset dimensions # but only if not initialized by loading a fixture file @@ -155,13 +162,22 @@ def clean(self): # Only check pixel size for new uploads (no pk yet) if self.file and FILER_MAX_IMAGE_PIXELS and not self.pk: if self._width is None or self._height is None: - # If image size exceeds Pillow's max image size, Pillow will not return width or height - pixels = 2 * FILER_MAX_IMAGE_PIXELS + 1 - aspect = 16 / 9 - else: - width, height = max(1, self.width), max(1, self.height) - pixels: int = width * height - aspect: float = width / height + # Image dimensions could not be determined – this could mean + # the image format is not recognized by Pillow or the image is + # too large for Pillow to handle. + msg = _( + "Image \"%(filename)s\" could not be processed: format not recognized or image " + "too large. Supported formats: JPEG, PNG, GIF, WebP, SVG. " + "Max resolution: %(max_pixels)d million pixels." + ) % dict( + filename=self.original_filename or '?', + max_pixels=FILER_MAX_IMAGE_PIXELS // 1000000, + ) + raise ValidationError(str(msg), code="image_size") + + width, height = max(1, self.width), max(1, self.height) + pixels: int = width * height + aspect: float = width / height res_x: int = int((FILER_MAX_IMAGE_PIXELS * aspect) ** 0.5) res_y: int = int(res_x / aspect) if pixels > 2 * FILER_MAX_IMAGE_PIXELS: diff --git a/filer/static/filer/js/addons/table-dropzone.js b/filer/static/filer/js/addons/table-dropzone.js index 2c64c9a41..377700694 100644 --- a/filer/static/filer/js/addons/table-dropzone.js +++ b/filer/static/filer/js/addons/table-dropzone.js @@ -247,6 +247,12 @@ document.addEventListener('DOMContentLoaded', () => { if (fileEl) { fileEl.remove(); } + if (response && response.error) { + hasErrors = true; + if (window.filerShowError) { + window.filerShowError(`${file.name}: ${response.error}`); + } + } }, queuecomplete: () => { if (submitNum !== 0) { diff --git a/filer/static/filer/js/dist/filer-base.bundle.js b/filer/static/filer/js/dist/filer-base.bundle.js index 1a42c7551..4b0a12dad 100644 --- a/filer/static/filer/js/dist/filer-base.bundle.js +++ b/filer/static/filer/js/dist/filer-base.bundle.js @@ -1,2 +1,2 @@ /*! For license information please see filer-base.bundle.js.LICENSE.txt */ -(()=>{var e={117(){"use strict";document.addEventListener("DOMContentLoaded",()=>{const e=document.getElementById("destination");if(!e)return;const t=e.querySelectorAll("option"),n=t.length,r=document.querySelector(".js-submit-copy-move"),i=document.querySelector(".js-disabled-btn-tooltip");1===n&&t[0].disabled&&(r&&(r.style.display="none"),i&&(i.style.display="inline-block")),Cl.filerTooltip&&Cl.filerTooltip()})},413(){"use strict";(()=>{const e="filer-dropdown-backdrop",t='[data-toggle="filer-dropdown"]';class n{constructor(e){this.element=e,e.addEventListener("click",()=>this.toggle())}toggle(){const t=this.element,n=r(t),o=n.classList.contains("open"),s={relatedTarget:t};if(t.disabled||t.classList.contains("disabled"))return!1;if(i(),!o){if("ontouchstart"in document.documentElement&&!n.closest(".navbar-nav")){const n=document.createElement("div");n.className=e,t.parentNode.insertBefore(n,t.nextSibling),n.addEventListener("click",i)}const r=new CustomEvent("show.bs.filer-dropdown",{bubbles:!0,cancelable:!0,detail:s});if(n.dispatchEvent(r),r.defaultPrevented)return!1;t.focus(),t.setAttribute("aria-expanded","true"),n.classList.add("open");const o=new CustomEvent("shown.bs.filer-dropdown",{bubbles:!0,detail:s});n.dispatchEvent(o)}return!1}keydown(e){const n=this.element,i=r(n),o=i.classList.contains("open"),s=Array.from(i.querySelectorAll(".filer-dropdown-menu li:not(.disabled):visible a")).filter(e=>null!==e.offsetParent),a=s.indexOf(e.target);if(!/(38|40|27|32)/.test(e.which)||/input|textarea/i.test(e.target.tagName))return;if(e.preventDefault(),e.stopPropagation(),n.disabled||n.classList.contains("disabled"))return;if(!o&&27!==e.which||o&&27===e.which)return 27===e.which&&i.querySelector(t)?.focus(),n.click();if(!s.length)return;let l=a;38===e.which&&a>0&&l--,40===e.which&&ae.remove()),document.querySelectorAll(t).forEach(e=>{const t=r(e),i={relatedTarget:e};if(!t.classList.contains("open"))return;if(n&&"click"===n.type&&/input|textarea/i.test(n.target.tagName)&&t.contains(n.target))return;const o=new CustomEvent("hide.bs.filer-dropdown",{bubbles:!0,cancelable:!0,detail:i});if(t.dispatchEvent(o),o.defaultPrevented)return;e.setAttribute("aria-expanded","false"),t.classList.remove("open");const s=new CustomEvent("hidden.bs.filer-dropdown",{bubbles:!0,detail:i});t.dispatchEvent(s)}))}function o(e){return this.forEach(t=>{let r=t._filerDropdownInstance;r||(r=new n(t),t._filerDropdownInstance=r),"string"==typeof e&&r[e].call(t)}),this}NodeList.prototype.dropdown||(NodeList.prototype.dropdown=function(e){return o.call(this,e)}),HTMLCollection.prototype.dropdown||(HTMLCollection.prototype.dropdown=function(e){return o.call(this,e)}),document.addEventListener("click",i),document.addEventListener("click",e=>{e.target.closest(".filer-dropdown form")&&e.stopPropagation()}),document.addEventListener("click",e=>{const r=e.target.closest(t);if(r){const t=r._filerDropdownInstance||new n(r);r._filerDropdownInstance||(r._filerDropdownInstance=t),t.toggle(e)}}),document.addEventListener("keydown",e=>{const r=e.target.closest(t);if(r){const t=r._filerDropdownInstance||new n(r);r._filerDropdownInstance||(r._filerDropdownInstance=t),t.keydown(e)}}),document.addEventListener("keydown",e=>{const r=e.target.closest(".filer-dropdown-menu");if(r){const i=r.parentNode.querySelector(t);if(i){const t=i._filerDropdownInstance||new n(i);i._filerDropdownInstance||(i._filerDropdownInstance=t),t.keydown(e)}}}),window.FilerDropdown=n})()},577(){!function(){"use strict";const e=document.getElementById("django-admin-popup-response-constants");let t;if(e)switch(t=JSON.parse(e.dataset.popupResponse),t.action){case"change":opener.dismissRelatedImageLookupPopup(window,t.new_value,null,t.obj,null);break;case"delete":opener.dismissDeleteRelatedObjectPopup(window,t.value);break;default:opener.dismissAddRelatedObjectPopup(window,t.value,t.obj)}}()},216(e,t,n){"use strict";n.d(t,{A:()=>r}),e=n.hmd(e),window.Cl=window.Cl||{},(()=>{class t{constructor(e={}){this.options={containerSelector:".js-focal-point",imageSelector:".js-focal-point-image",circleSelector:".js-focal-point-circle",locationSelector:".js-focal-point-location",draggableClass:"draggable",hiddenClass:"hidden",dataLocation:"locationSelector",...e},this.focalPointInstances=[],this._init=this._init.bind(this)}_init(e){const t=new n(e,this.options);this.focalPointInstances.push(t)}initialize(){document.querySelectorAll(this.options.containerSelector).forEach(e=>{this._init(e)}),window.Cl.mediator&&window.Cl.mediator.subscribe("focal-point:init",this._init)}destroy(){window.Cl.mediator&&window.Cl.mediator.remove("focal-point:init",this._init),this.focalPointInstances.forEach(e=>{e.destroy()}),this.focalPointInstances=[]}}class n{constructor(e,t={}){this.options={imageSelector:".js-focal-point-image",circleSelector:".js-focal-point-circle",locationSelector:".js-focal-point-location",draggableClass:"draggable",hiddenClass:"hidden",dataLocation:"locationSelector",...t},this.container=e,this.image=this.container.querySelector(this.options.imageSelector),this.circle=this.container.querySelector(this.options.circleSelector),this.ratio=parseFloat(this.image?.dataset.ratio||1),this.location=this._getLocation(),this.isDragging=!1,this.dragStartX=0,this.dragStartY=0,this.circleStartX=0,this.circleStartY=0,this._onImageLoaded=this._onImageLoaded.bind(this),this._onMouseDown=this._onMouseDown.bind(this),this._onMouseMove=this._onMouseMove.bind(this),this._onMouseUp=this._onMouseUp.bind(this),this.image?.complete?this._onImageLoaded():this.image&&this.image.addEventListener("load",this._onImageLoaded)}_updateLocationValue(e,t){const n=`${Math.round(e*this.ratio)},${Math.round(t*this.ratio)}`;this.location&&(this.location.value=n)}_getLocation(){const e=this.container.dataset[this.options.dataLocation];if(e){const t=document.querySelector(e);if(t)return t}return this.container.querySelector(this.options.locationSelector)}_makeDraggable(){this.circle&&(this.circle.classList.add(this.options.draggableClass),this.circle.addEventListener("mousedown",this._onMouseDown),this.circle.addEventListener("touchstart",this._onMouseDown,{passive:!1}))}_onMouseDown(e){e.preventDefault(),this.isDragging=!0;const t="touchstart"===e.type?e.touches[0]:e,n=this.container.getBoundingClientRect();this.dragStartX=t.clientX-n.left,this.dragStartY=t.clientY-n.top;const r=this.circle.getBoundingClientRect();this.circleStartX=r.left-n.left+r.width/2,this.circleStartY=r.top-n.top+r.height/2,document.addEventListener("mousemove",this._onMouseMove),document.addEventListener("mouseup",this._onMouseUp),document.addEventListener("touchmove",this._onMouseMove,{passive:!1}),document.addEventListener("touchend",this._onMouseUp)}_onMouseMove(e){if(!this.isDragging)return;e.preventDefault();const t="touchmove"===e.type?e.touches[0]:e,n=this.container.getBoundingClientRect(),r=t.clientX-n.left,i=t.clientY-n.top,o=r-this.dragStartX,s=i-this.dragStartY;let a=this.circleStartX+o,l=this.circleStartY+s;a=Math.max(0,Math.min(n.width-1,a)),l=Math.max(0,Math.min(n.height-1,l)),this.circle.style.left=`${a}px`,this.circle.style.top=`${l}px`,this._updateLocationValue(a,l)}_onMouseUp(){this.isDragging=!1,document.removeEventListener("mousemove",this._onMouseMove),document.removeEventListener("mouseup",this._onMouseUp),document.removeEventListener("touchmove",this._onMouseMove),document.removeEventListener("touchend",this._onMouseUp)}_onImageLoaded(){if(!this.image||0===this.image.naturalWidth)return;this.circle?.classList.remove(this.options.hiddenClass);const e=this.location?.value||"",t=this.image.offsetWidth,n=this.image.offsetHeight;let r,i;if(e.length){const t=e.split(",");r=Math.round(Number(t[0])/this.ratio),i=Math.round(Number(t[1])/this.ratio)}else r=t/2,i=n/2;isNaN(r)||isNaN(i)||(this.circle&&(this.circle.style.left=`${r}px`,this.circle.style.top=`${i}px`),this._makeDraggable(),this._updateLocationValue(r,i))}destroy(){this.circle?.classList.contains(this.options.draggableClass)&&(this.circle.removeEventListener("mousedown",this._onMouseDown),this.circle.removeEventListener("touchstart",this._onMouseDown)),document.removeEventListener("mousemove",this._onMouseMove),document.removeEventListener("mouseup",this._onMouseUp),document.removeEventListener("touchmove",this._onMouseMove),document.removeEventListener("touchend",this._onMouseUp),this.image&&this.image.removeEventListener("load",this._onImageLoaded),this.options=null,this.container=null,this.image=null,this.circle=null,this.location=null,this.ratio=null}}window.Cl.FocalPoint=t,window.Cl.FocalPointConstructor=n,e.exports&&(e.exports=t)})();const r=window.Cl.FocalPoint},902(){"use strict";const e=e=>{const t=(e=(e=e.replace(/__dot__/g,".")).replace(/__dash__/g,"-")).lastIndexOf("__");return-1===t?e:e.substring(0,t)};window.dismissPopupAndReload=e=>{document.location.reload(),e.close()},window.dismissRelatedImageLookupPopup=(t,n,r,i,o)=>{const s=e(t.name),a=document.getElementById(s);if(!a)return;const l=a.closest(".filerFile");if(!l)return;const c=l.querySelector(".edit"),u=l.querySelector(".thumbnail_img"),d=l.querySelector(".description_text"),f=l.querySelector(".filerClearer"),p=l.parentElement.querySelector(".dz-message"),h=l.querySelector("input"),v=h.value;h.value=n;const m=h.closest(".js-filer-dropzone");m&&m.classList.add("js-object-attached"),r&&u&&(u.src=r,u.classList.remove("hidden"),u.removeAttribute("srcset")),d&&(d.textContent=i),f&&f.classList.remove("hidden"),a.classList.add("related-lookup-change"),c&&c.classList.add("related-lookup-change"),o&&c&&c.setAttribute("href",`${o}?_edit_from_widget=1`),p&&p.classList.add("hidden"),v!==n&&h.dispatchEvent(new Event("change",{bubbles:!0})),t.close()},window.dismissRelatedFolderLookupPopup=(t,n,r)=>{const i=e(t.name),o=document.getElementById(i);if(!o)return;const s=o.closest(".filerFile");if(!s)return;const a=s.querySelector(".thumbnail_img"),l=document.getElementById(`id_${i}_clear`),c=document.getElementById(`id_${i}`),u=s.querySelector(".description_text"),d=document.getElementById(i);c&&(c.value=n),a&&a.classList.remove("hidden"),u&&(u.textContent=r),l&&l.classList.remove("hidden"),d&&d.classList.add("hidden"),t.close()},document.addEventListener("DOMContentLoaded",()=>{document.querySelectorAll(".js-dismiss-popup").forEach(e=>{e.addEventListener("click",function(e){e.preventDefault();const t=this.dataset.fileId,n=this.dataset.iconUrl,r=this.dataset.label;if(this.classList.contains("js-dismiss-image")){const e=this.dataset.changeUrl||"";window.opener.dismissRelatedImageLookupPopup(window,t,n,r,e)}else this.classList.contains("js-dismiss-folder")&&window.opener.dismissRelatedFolderLookupPopup(window,t,r)})});const e=document.getElementById("popup-dismiss-data");if(e&&window.opener){const t=e.dataset.pk,n=e.dataset.label;window.opener.dismissRelatedPopup(window,t,n)}})},221(){"use strict";window.Cl=window.Cl||{},Cl.filerTooltip=()=>{const e=".js-filer-tooltip";document.querySelectorAll(e).forEach(t=>{t.addEventListener("mouseover",function(){const t=this.getAttribute("title");if(!t)return;this.dataset.filerTooltip=t,this.removeAttribute("title");const n=document.createElement("p");n.className="filer-tooltip",n.textContent=t;const r=document.querySelector(e);r&&r.appendChild(n)}),t.addEventListener("mouseout",function(){const e=this.dataset.filerTooltip;e&&this.setAttribute("title",e),document.querySelectorAll(".filer-tooltip").forEach(e=>{e.remove()})})})}},472(){"use strict";document.addEventListener("DOMContentLoaded",()=>{const e=e=>{e.preventDefault();const t=e.currentTarget,n=t.closest(".filerFile");if(!n)return;const r=n.querySelector("input"),i=n.querySelector(".thumbnail_img"),o=n.querySelector(".description_text"),s=n.querySelector(".lookup"),a=n.querySelector(".edit"),l=n.parentElement.querySelector(".dz-message"),c="hidden";if(t.classList.add(c),r&&(r.value=""),i){i.classList.add(c);var u=i.parentElement;"A"===u.tagName&&u.removeAttribute("href")}s&&s.classList.remove("related-lookup-change"),a&&a.classList.remove("related-lookup-change"),l&&l.classList.remove(c),o&&(o.textContent="")};document.querySelectorAll(".filerFile .vForeignKeyRawIdAdminField").forEach(e=>{e.setAttribute("type","hidden")}),document.querySelectorAll(".filerFile .filerClearer").forEach(t=>{t.addEventListener("click",e)})})},628(e){var t;self,t=function(){return function(){var e={3099:function(e){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},6077:function(e,t,n){var r=n(111);e.exports=function(e){if(!r(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},1223:function(e,t,n){var r=n(5112),i=n(30),o=n(3070),s=r("unscopables"),a=Array.prototype;null==a[s]&&o.f(a,s,{configurable:!0,value:i(null)}),e.exports=function(e){a[s][e]=!0}},1530:function(e,t,n){"use strict";var r=n(8710).charAt;e.exports=function(e,t,n){return t+(n?r(e,t).length:1)}},5787:function(e){e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e}},9670:function(e,t,n){var r=n(111);e.exports=function(e){if(!r(e))throw TypeError(String(e)+" is not an object");return e}},4019:function(e){e.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},260:function(e,t,n){"use strict";var r,i=n(4019),o=n(9781),s=n(7854),a=n(111),l=n(6656),c=n(648),u=n(8880),d=n(1320),f=n(3070).f,p=n(9518),h=n(7674),v=n(5112),m=n(9711),y=s.Int8Array,g=y&&y.prototype,b=s.Uint8ClampedArray,w=b&&b.prototype,x=y&&p(y),E=g&&p(g),S=Object.prototype,k=S.isPrototypeOf,L=v("toStringTag"),A=m("TYPED_ARRAY_TAG"),C=i&&!!h&&"Opera"!==c(s.opera),_=!1,T={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},F={BigInt64Array:8,BigUint64Array:8},I=function(e){if(!a(e))return!1;var t=c(e);return l(T,t)||l(F,t)};for(r in T)s[r]||(C=!1);if((!C||"function"!=typeof x||x===Function.prototype)&&(x=function(){throw TypeError("Incorrect invocation")},C))for(r in T)s[r]&&h(s[r],x);if((!C||!E||E===S)&&(E=x.prototype,C))for(r in T)s[r]&&h(s[r].prototype,E);if(C&&p(w)!==E&&h(w,E),o&&!l(E,L))for(r in _=!0,f(E,L,{get:function(){return a(this)?this[A]:void 0}}),T)s[r]&&u(s[r],A,r);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:C,TYPED_ARRAY_TAG:_&&A,aTypedArray:function(e){if(I(e))return e;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(e){if(h){if(k.call(x,e))return e}else for(var t in T)if(l(T,r)){var n=s[t];if(n&&(e===n||k.call(n,e)))return e}throw TypeError("Target is not a typed array constructor")},exportTypedArrayMethod:function(e,t,n){if(o){if(n)for(var r in T){var i=s[r];i&&l(i.prototype,e)&&delete i.prototype[e]}E[e]&&!n||d(E,e,n?t:C&&g[e]||t)}},exportTypedArrayStaticMethod:function(e,t,n){var r,i;if(o){if(h){if(n)for(r in T)(i=s[r])&&l(i,e)&&delete i[e];if(x[e]&&!n)return;try{return d(x,e,n?t:C&&y[e]||t)}catch(e){}}for(r in T)!(i=s[r])||i[e]&&!n||d(i,e,t)}},isView:function(e){if(!a(e))return!1;var t=c(e);return"DataView"===t||l(T,t)||l(F,t)},isTypedArray:I,TypedArray:x,TypedArrayPrototype:E}},3331:function(e,t,n){"use strict";var r=n(7854),i=n(9781),o=n(4019),s=n(8880),a=n(2248),l=n(7293),c=n(5787),u=n(9958),d=n(7466),f=n(7067),p=n(1179),h=n(9518),v=n(7674),m=n(8006).f,y=n(3070).f,g=n(1285),b=n(8003),w=n(9909),x=w.get,E=w.set,S="ArrayBuffer",k="DataView",L="prototype",A="Wrong index",C=r[S],_=C,T=r[k],F=T&&T[L],I=Object.prototype,M=r.RangeError,R=p.pack,z=p.unpack,q=function(e){return[255&e]},j=function(e){return[255&e,e>>8&255]},U=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},O=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},P=function(e){return R(e,23,4)},D=function(e){return R(e,52,8)},N=function(e,t){y(e[L],t,{get:function(){return x(this)[t]}})},$=function(e,t,n,r){var i=f(n),o=x(e);if(i+t>o.byteLength)throw M(A);var s=x(o.buffer).bytes,a=i+o.byteOffset,l=s.slice(a,a+t);return r?l:l.reverse()},B=function(e,t,n,r,i,o){var s=f(n),a=x(e);if(s+t>a.byteLength)throw M(A);for(var l=x(a.buffer).bytes,c=s+a.byteOffset,u=r(+i),d=0;dG;)(W=Y[G++])in _||s(_,W,C[W]);H.constructor=_}v&&h(F)!==I&&v(F,I);var Q=new T(new _(2)),X=F.setInt8;Q.setInt8(0,2147483648),Q.setInt8(1,2147483649),!Q.getInt8(0)&&Q.getInt8(1)||a(F,{setInt8:function(e,t){X.call(this,e,t<<24>>24)},setUint8:function(e,t){X.call(this,e,t<<24>>24)}},{unsafe:!0})}else _=function(e){c(this,_,S);var t=f(e);E(this,{bytes:g.call(new Array(t),0),byteLength:t}),i||(this.byteLength=t)},T=function(e,t,n){c(this,T,k),c(e,_,k);var r=x(e).byteLength,o=u(t);if(o<0||o>r)throw M("Wrong offset");if(o+(n=void 0===n?r-o:d(n))>r)throw M("Wrong length");E(this,{buffer:e,byteLength:n,byteOffset:o}),i||(this.buffer=e,this.byteLength=n,this.byteOffset=o)},i&&(N(_,"byteLength"),N(T,"buffer"),N(T,"byteLength"),N(T,"byteOffset")),a(T[L],{getInt8:function(e){return $(this,1,e)[0]<<24>>24},getUint8:function(e){return $(this,1,e)[0]},getInt16:function(e){var t=$(this,2,e,arguments.length>1?arguments[1]:void 0);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=$(this,2,e,arguments.length>1?arguments[1]:void 0);return t[1]<<8|t[0]},getInt32:function(e){return O($(this,4,e,arguments.length>1?arguments[1]:void 0))},getUint32:function(e){return O($(this,4,e,arguments.length>1?arguments[1]:void 0))>>>0},getFloat32:function(e){return z($(this,4,e,arguments.length>1?arguments[1]:void 0),23)},getFloat64:function(e){return z($(this,8,e,arguments.length>1?arguments[1]:void 0),52)},setInt8:function(e,t){B(this,1,e,q,t)},setUint8:function(e,t){B(this,1,e,q,t)},setInt16:function(e,t){B(this,2,e,j,t,arguments.length>2?arguments[2]:void 0)},setUint16:function(e,t){B(this,2,e,j,t,arguments.length>2?arguments[2]:void 0)},setInt32:function(e,t){B(this,4,e,U,t,arguments.length>2?arguments[2]:void 0)},setUint32:function(e,t){B(this,4,e,U,t,arguments.length>2?arguments[2]:void 0)},setFloat32:function(e,t){B(this,4,e,P,t,arguments.length>2?arguments[2]:void 0)},setFloat64:function(e,t){B(this,8,e,D,t,arguments.length>2?arguments[2]:void 0)}});b(_,S),b(T,k),e.exports={ArrayBuffer:_,DataView:T}},1048:function(e,t,n){"use strict";var r=n(7908),i=n(1400),o=n(7466),s=Math.min;e.exports=[].copyWithin||function(e,t){var n=r(this),a=o(n.length),l=i(e,a),c=i(t,a),u=arguments.length>2?arguments[2]:void 0,d=s((void 0===u?a:i(u,a))-c,a-l),f=1;for(c0;)c in n?n[l]=n[c]:delete n[l],l+=f,c+=f;return n}},1285:function(e,t,n){"use strict";var r=n(7908),i=n(1400),o=n(7466);e.exports=function(e){for(var t=r(this),n=o(t.length),s=arguments.length,a=i(s>1?arguments[1]:void 0,n),l=s>2?arguments[2]:void 0,c=void 0===l?n:i(l,n);c>a;)t[a++]=e;return t}},8533:function(e,t,n){"use strict";var r=n(2092).forEach,i=n(9341)("forEach");e.exports=i?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}},8457:function(e,t,n){"use strict";var r=n(9974),i=n(7908),o=n(3411),s=n(7659),a=n(7466),l=n(6135),c=n(1246);e.exports=function(e){var t,n,u,d,f,p,h=i(e),v="function"==typeof this?this:Array,m=arguments.length,y=m>1?arguments[1]:void 0,g=void 0!==y,b=c(h),w=0;if(g&&(y=r(y,m>2?arguments[2]:void 0,2)),null==b||v==Array&&s(b))for(n=new v(t=a(h.length));t>w;w++)p=g?y(h[w],w):h[w],l(n,w,p);else for(f=(d=b.call(h)).next,n=new v;!(u=f.call(d)).done;w++)p=g?o(d,y,[u.value,w],!0):u.value,l(n,w,p);return n.length=w,n}},1318:function(e,t,n){var r=n(5656),i=n(7466),o=n(1400),s=function(e){return function(t,n,s){var a,l=r(t),c=i(l.length),u=o(s,c);if(e&&n!=n){for(;c>u;)if((a=l[u++])!=a)return!0}else for(;c>u;u++)if((e||u in l)&&l[u]===n)return e||u||0;return!e&&-1}};e.exports={includes:s(!0),indexOf:s(!1)}},2092:function(e,t,n){var r=n(9974),i=n(8361),o=n(7908),s=n(7466),a=n(5417),l=[].push,c=function(e){var t=1==e,n=2==e,c=3==e,u=4==e,d=6==e,f=7==e,p=5==e||d;return function(h,v,m,y){for(var g,b,w=o(h),x=i(w),E=r(v,m,3),S=s(x.length),k=0,L=y||a,A=t?L(h,S):n||f?L(h,0):void 0;S>k;k++)if((p||k in x)&&(b=E(g=x[k],k,w),e))if(t)A[k]=b;else if(b)switch(e){case 3:return!0;case 5:return g;case 6:return k;case 2:l.call(A,g)}else switch(e){case 4:return!1;case 7:l.call(A,g)}return d?-1:c||u?u:A}};e.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterOut:c(7)}},6583:function(e,t,n){"use strict";var r=n(5656),i=n(9958),o=n(7466),s=n(9341),a=Math.min,l=[].lastIndexOf,c=!!l&&1/[1].lastIndexOf(1,-0)<0,u=s("lastIndexOf"),d=c||!u;e.exports=d?function(e){if(c)return l.apply(this,arguments)||0;var t=r(this),n=o(t.length),s=n-1;for(arguments.length>1&&(s=a(s,i(arguments[1]))),s<0&&(s=n+s);s>=0;s--)if(s in t&&t[s]===e)return s||0;return-1}:l},1194:function(e,t,n){var r=n(7293),i=n(5112),o=n(7392),s=i("species");e.exports=function(e){return o>=51||!r(function(){var t=[];return(t.constructor={})[s]=function(){return{foo:1}},1!==t[e](Boolean).foo})}},9341:function(e,t,n){"use strict";var r=n(7293);e.exports=function(e,t){var n=[][e];return!!n&&r(function(){n.call(null,t||function(){throw 1},1)})}},3671:function(e,t,n){var r=n(3099),i=n(7908),o=n(8361),s=n(7466),a=function(e){return function(t,n,a,l){r(n);var c=i(t),u=o(c),d=s(c.length),f=e?d-1:0,p=e?-1:1;if(a<2)for(;;){if(f in u){l=u[f],f+=p;break}if(f+=p,e?f<0:d<=f)throw TypeError("Reduce of empty array with no initial value")}for(;e?f>=0:d>f;f+=p)f in u&&(l=n(l,u[f],f,c));return l}};e.exports={left:a(!1),right:a(!0)}},5417:function(e,t,n){var r=n(111),i=n(3157),o=n(5112)("species");e.exports=function(e,t){var n;return i(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!i(n.prototype)?r(n)&&null===(n=n[o])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)}},3411:function(e,t,n){var r=n(9670),i=n(9212);e.exports=function(e,t,n,o){try{return o?t(r(n)[0],n[1]):t(n)}catch(t){throw i(e),t}}},7072:function(e,t,n){var r=n(5112)("iterator"),i=!1;try{var o=0,s={next:function(){return{done:!!o++}},return:function(){i=!0}};s[r]=function(){return this},Array.from(s,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var n=!1;try{var o={};o[r]=function(){return{next:function(){return{done:n=!0}}}},e(o)}catch(e){}return n}},4326:function(e){var t={}.toString;e.exports=function(e){return t.call(e).slice(8,-1)}},648:function(e,t,n){var r=n(1694),i=n(4326),o=n(5112)("toStringTag"),s="Arguments"==i(function(){return arguments}());e.exports=r?i:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),o))?n:s?i(t):"Object"==(r=i(t))&&"function"==typeof t.callee?"Arguments":r}},9920:function(e,t,n){var r=n(6656),i=n(3887),o=n(1236),s=n(3070);e.exports=function(e,t){for(var n=i(t),a=s.f,l=o.f,c=0;c=74)&&(r=s.match(/Chrome\/(\d+)/))&&(i=r[1]),e.exports=i&&+i},748:function(e){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},2109:function(e,t,n){var r=n(7854),i=n(1236).f,o=n(8880),s=n(1320),a=n(3505),l=n(9920),c=n(4705);e.exports=function(e,t){var n,u,d,f,p,h=e.target,v=e.global,m=e.stat;if(n=v?r:m?r[h]||a(h,{}):(r[h]||{}).prototype)for(u in t){if(f=t[u],d=e.noTargetGet?(p=i(n,u))&&p.value:n[u],!c(v?u:h+(m?".":"#")+u,e.forced)&&void 0!==d){if(typeof f==typeof d)continue;l(f,d)}(e.sham||d&&d.sham)&&o(f,"sham",!0),s(n,u,f,e)}}},7293:function(e){e.exports=function(e){try{return!!e()}catch(e){return!0}}},7007:function(e,t,n){"use strict";n(4916);var r=n(1320),i=n(7293),o=n(5112),s=n(2261),a=n(8880),l=o("species"),c=!i(function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")}),u="$0"==="a".replace(/./,"$0"),d=o("replace"),f=!!/./[d]&&""===/./[d]("a","$0"),p=!i(function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]});e.exports=function(e,t,n,d){var h=o(e),v=!i(function(){var t={};return t[h]=function(){return 7},7!=""[e](t)}),m=v&&!i(function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[l]=function(){return n},n.flags="",n[h]=/./[h]),n.exec=function(){return t=!0,null},n[h](""),!t});if(!v||!m||"replace"===e&&(!c||!u||f)||"split"===e&&!p){var y=/./[h],g=n(h,""[e],function(e,t,n,r,i){return t.exec===s?v&&!i?{done:!0,value:y.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}},{REPLACE_KEEPS_$0:u,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:f}),b=g[0],w=g[1];r(String.prototype,e,b),r(RegExp.prototype,h,2==t?function(e,t){return w.call(e,this,t)}:function(e){return w.call(e,this)})}d&&a(RegExp.prototype[h],"sham",!0)}},9974:function(e,t,n){var r=n(3099);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}}},5005:function(e,t,n){var r=n(857),i=n(7854),o=function(e){return"function"==typeof e?e:void 0};e.exports=function(e,t){return arguments.length<2?o(r[e])||o(i[e]):r[e]&&r[e][t]||i[e]&&i[e][t]}},1246:function(e,t,n){var r=n(648),i=n(7497),o=n(5112)("iterator");e.exports=function(e){if(null!=e)return e[o]||e["@@iterator"]||i[r(e)]}},8554:function(e,t,n){var r=n(9670),i=n(1246);e.exports=function(e){var t=i(e);if("function"!=typeof t)throw TypeError(String(e)+" is not iterable");return r(t.call(e))}},647:function(e,t,n){var r=n(7908),i=Math.floor,o="".replace,s=/\$([$&'`]|\d\d?|<[^>]*>)/g,a=/\$([$&'`]|\d\d?)/g;e.exports=function(e,t,n,l,c,u){var d=n+e.length,f=l.length,p=a;return void 0!==c&&(c=r(c),p=s),o.call(u,p,function(r,o){var s;switch(o.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,n);case"'":return t.slice(d);case"<":s=c[o.slice(1,-1)];break;default:var a=+o;if(0===a)return r;if(a>f){var u=i(a/10);return 0===u?r:u<=f?void 0===l[u-1]?o.charAt(1):l[u-1]+o.charAt(1):r}s=l[a-1]}return void 0===s?"":s})}},7854:function(e,t,n){var r=function(e){return e&&e.Math==Math&&e};e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},6656:function(e){var t={}.hasOwnProperty;e.exports=function(e,n){return t.call(e,n)}},3501:function(e){e.exports={}},490:function(e,t,n){var r=n(5005);e.exports=r("document","documentElement")},4664:function(e,t,n){var r=n(9781),i=n(7293),o=n(317);e.exports=!r&&!i(function(){return 7!=Object.defineProperty(o("div"),"a",{get:function(){return 7}}).a})},1179:function(e){var t=Math.abs,n=Math.pow,r=Math.floor,i=Math.log,o=Math.LN2;e.exports={pack:function(e,s,a){var l,c,u,d=new Array(a),f=8*a-s-1,p=(1<>1,v=23===s?n(2,-24)-n(2,-77):0,m=e<0||0===e&&1/e<0?1:0,y=0;for((e=t(e))!=e||e===1/0?(c=e!=e?1:0,l=p):(l=r(i(e)/o),e*(u=n(2,-l))<1&&(l--,u*=2),(e+=l+h>=1?v/u:v*n(2,1-h))*u>=2&&(l++,u/=2),l+h>=p?(c=0,l=p):l+h>=1?(c=(e*u-1)*n(2,s),l+=h):(c=e*n(2,h-1)*n(2,s),l=0));s>=8;d[y++]=255&c,c/=256,s-=8);for(l=l<0;d[y++]=255&l,l/=256,f-=8);return d[--y]|=128*m,d},unpack:function(e,t){var r,i=e.length,o=8*i-t-1,s=(1<>1,l=o-7,c=i-1,u=e[c--],d=127&u;for(u>>=7;l>0;d=256*d+e[c],c--,l-=8);for(r=d&(1<<-l)-1,d>>=-l,l+=t;l>0;r=256*r+e[c],c--,l-=8);if(0===d)d=1-a;else{if(d===s)return r?NaN:u?-1/0:1/0;r+=n(2,t),d-=a}return(u?-1:1)*r*n(2,d-t)}}},8361:function(e,t,n){var r=n(7293),i=n(4326),o="".split;e.exports=r(function(){return!Object("z").propertyIsEnumerable(0)})?function(e){return"String"==i(e)?o.call(e,""):Object(e)}:Object},9587:function(e,t,n){var r=n(111),i=n(7674);e.exports=function(e,t,n){var o,s;return i&&"function"==typeof(o=t.constructor)&&o!==n&&r(s=o.prototype)&&s!==n.prototype&&i(e,s),e}},2788:function(e,t,n){var r=n(5465),i=Function.toString;"function"!=typeof r.inspectSource&&(r.inspectSource=function(e){return i.call(e)}),e.exports=r.inspectSource},9909:function(e,t,n){var r,i,o,s=n(8536),a=n(7854),l=n(111),c=n(8880),u=n(6656),d=n(5465),f=n(6200),p=n(3501),h=a.WeakMap;if(s){var v=d.state||(d.state=new h),m=v.get,y=v.has,g=v.set;r=function(e,t){return t.facade=e,g.call(v,e,t),t},i=function(e){return m.call(v,e)||{}},o=function(e){return y.call(v,e)}}else{var b=f("state");p[b]=!0,r=function(e,t){return t.facade=e,c(e,b,t),t},i=function(e){return u(e,b)?e[b]:{}},o=function(e){return u(e,b)}}e.exports={set:r,get:i,has:o,enforce:function(e){return o(e)?i(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!l(t)||(n=i(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}}},7659:function(e,t,n){var r=n(5112),i=n(7497),o=r("iterator"),s=Array.prototype;e.exports=function(e){return void 0!==e&&(i.Array===e||s[o]===e)}},3157:function(e,t,n){var r=n(4326);e.exports=Array.isArray||function(e){return"Array"==r(e)}},4705:function(e,t,n){var r=n(7293),i=/#|\.prototype\./,o=function(e,t){var n=a[s(e)];return n==c||n!=l&&("function"==typeof t?r(t):!!t)},s=o.normalize=function(e){return String(e).replace(i,".").toLowerCase()},a=o.data={},l=o.NATIVE="N",c=o.POLYFILL="P";e.exports=o},111:function(e){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},1913:function(e){e.exports=!1},7850:function(e,t,n){var r=n(111),i=n(4326),o=n(5112)("match");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[o])?!!t:"RegExp"==i(e))}},9212:function(e,t,n){var r=n(9670);e.exports=function(e){var t=e.return;if(void 0!==t)return r(t.call(e)).value}},3383:function(e,t,n){"use strict";var r,i,o,s=n(7293),a=n(9518),l=n(8880),c=n(6656),u=n(5112),d=n(1913),f=u("iterator"),p=!1;[].keys&&("next"in(o=[].keys())?(i=a(a(o)))!==Object.prototype&&(r=i):p=!0);var h=null==r||s(function(){var e={};return r[f].call(e)!==e});h&&(r={}),d&&!h||c(r,f)||l(r,f,function(){return this}),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:p}},7497:function(e){e.exports={}},133:function(e,t,n){var r=n(7293);e.exports=!!Object.getOwnPropertySymbols&&!r(function(){return!String(Symbol())})},590:function(e,t,n){var r=n(7293),i=n(5112),o=n(1913),s=i("iterator");e.exports=!r(function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,n="";return e.pathname="c%20d",t.forEach(function(e,r){t.delete("b"),n+=r+e}),o&&!e.toJSON||!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[s]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==n||"x"!==new URL("http://x",void 0).host})},8536:function(e,t,n){var r=n(7854),i=n(2788),o=r.WeakMap;e.exports="function"==typeof o&&/native code/.test(i(o))},1574:function(e,t,n){"use strict";var r=n(9781),i=n(7293),o=n(1956),s=n(5181),a=n(5296),l=n(7908),c=n(8361),u=Object.assign,d=Object.defineProperty;e.exports=!u||i(function(){if(r&&1!==u({b:1},u(d({},"a",{enumerable:!0,get:function(){d(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach(function(e){t[e]=e}),7!=u({},e)[n]||o(u({},t)).join("")!=i})?function(e,t){for(var n=l(e),i=arguments.length,u=1,d=s.f,f=a.f;i>u;)for(var p,h=c(arguments[u++]),v=d?o(h).concat(d(h)):o(h),m=v.length,y=0;m>y;)p=v[y++],r&&!f.call(h,p)||(n[p]=h[p]);return n}:u},30:function(e,t,n){var r,i=n(9670),o=n(6048),s=n(748),a=n(3501),l=n(490),c=n(317),u=n(6200),d="prototype",f="script",p=u("IE_PROTO"),h=function(){},v=function(e){return"<"+f+">"+e+""},m=function(){try{r=document.domain&&new ActiveXObject("htmlfile")}catch(e){}var e,t,n;m=r?function(e){e.write(v("")),e.close();var t=e.parentWindow.Object;return e=null,t}(r):(t=c("iframe"),n="java"+f+":",t.style.display="none",l.appendChild(t),t.src=String(n),(e=t.contentWindow.document).open(),e.write(v("document.F=Object")),e.close(),e.F);for(var i=s.length;i--;)delete m[d][s[i]];return m()};a[p]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(h[d]=i(e),n=new h,h[d]=null,n[p]=e):n=m(),void 0===t?n:o(n,t)}},6048:function(e,t,n){var r=n(9781),i=n(3070),o=n(9670),s=n(1956);e.exports=r?Object.defineProperties:function(e,t){o(e);for(var n,r=s(t),a=r.length,l=0;a>l;)i.f(e,n=r[l++],t[n]);return e}},3070:function(e,t,n){var r=n(9781),i=n(4664),o=n(9670),s=n(7593),a=Object.defineProperty;t.f=r?a:function(e,t,n){if(o(e),t=s(t,!0),o(n),i)try{return a(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},1236:function(e,t,n){var r=n(9781),i=n(5296),o=n(9114),s=n(5656),a=n(7593),l=n(6656),c=n(4664),u=Object.getOwnPropertyDescriptor;t.f=r?u:function(e,t){if(e=s(e),t=a(t,!0),c)try{return u(e,t)}catch(e){}if(l(e,t))return o(!i.f.call(e,t),e[t])}},8006:function(e,t,n){var r=n(6324),i=n(748).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,i)}},5181:function(e,t){t.f=Object.getOwnPropertySymbols},9518:function(e,t,n){var r=n(6656),i=n(7908),o=n(6200),s=n(8544),a=o("IE_PROTO"),l=Object.prototype;e.exports=s?Object.getPrototypeOf:function(e){return e=i(e),r(e,a)?e[a]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?l:null}},6324:function(e,t,n){var r=n(6656),i=n(5656),o=n(1318).indexOf,s=n(3501);e.exports=function(e,t){var n,a=i(e),l=0,c=[];for(n in a)!r(s,n)&&r(a,n)&&c.push(n);for(;t.length>l;)r(a,n=t[l++])&&(~o(c,n)||c.push(n));return c}},1956:function(e,t,n){var r=n(6324),i=n(748);e.exports=Object.keys||function(e){return r(e,i)}},5296:function(e,t){"use strict";var n={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,i=r&&!n.call({1:2},1);t.f=i?function(e){var t=r(this,e);return!!t&&t.enumerable}:n},7674:function(e,t,n){var r=n(9670),i=n(6077);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,o){return r(n),i(o),t?e.call(n,o):n.__proto__=o,n}}():void 0)},288:function(e,t,n){"use strict";var r=n(1694),i=n(648);e.exports=r?{}.toString:function(){return"[object "+i(this)+"]"}},3887:function(e,t,n){var r=n(5005),i=n(8006),o=n(5181),s=n(9670);e.exports=r("Reflect","ownKeys")||function(e){var t=i.f(s(e)),n=o.f;return n?t.concat(n(e)):t}},857:function(e,t,n){var r=n(7854);e.exports=r},2248:function(e,t,n){var r=n(1320);e.exports=function(e,t,n){for(var i in t)r(e,i,t[i],n);return e}},1320:function(e,t,n){var r=n(7854),i=n(8880),o=n(6656),s=n(3505),a=n(2788),l=n(9909),c=l.get,u=l.enforce,d=String(String).split("String");(e.exports=function(e,t,n,a){var l,c=!!a&&!!a.unsafe,f=!!a&&!!a.enumerable,p=!!a&&!!a.noTargetGet;"function"==typeof n&&("string"!=typeof t||o(n,"name")||i(n,"name",t),(l=u(n)).source||(l.source=d.join("string"==typeof t?t:""))),e!==r?(c?!p&&e[t]&&(f=!0):delete e[t],f?e[t]=n:i(e,t,n)):f?e[t]=n:s(t,n)})(Function.prototype,"toString",function(){return"function"==typeof this&&c(this).source||a(this)})},7651:function(e,t,n){var r=n(4326),i=n(2261);e.exports=function(e,t){var n=e.exec;if("function"==typeof n){var o=n.call(e,t);if("object"!=typeof o)throw TypeError("RegExp exec method returned something other than an Object or null");return o}if("RegExp"!==r(e))throw TypeError("RegExp#exec called on incompatible receiver");return i.call(e,t)}},2261:function(e,t,n){"use strict";var r,i,o=n(7066),s=n(2999),a=RegExp.prototype.exec,l=String.prototype.replace,c=a,u=(r=/a/,i=/b*/g,a.call(r,"a"),a.call(i,"a"),0!==r.lastIndex||0!==i.lastIndex),d=s.UNSUPPORTED_Y||s.BROKEN_CARET,f=void 0!==/()??/.exec("")[1];(u||f||d)&&(c=function(e){var t,n,r,i,s=this,c=d&&s.sticky,p=o.call(s),h=s.source,v=0,m=e;return c&&(-1===(p=p.replace("y","")).indexOf("g")&&(p+="g"),m=String(e).slice(s.lastIndex),s.lastIndex>0&&(!s.multiline||s.multiline&&"\n"!==e[s.lastIndex-1])&&(h="(?: "+h+")",m=" "+m,v++),n=new RegExp("^(?:"+h+")",p)),f&&(n=new RegExp("^"+h+"$(?!\\s)",p)),u&&(t=s.lastIndex),r=a.call(c?n:s,m),c?r?(r.input=r.input.slice(v),r[0]=r[0].slice(v),r.index=s.lastIndex,s.lastIndex+=r[0].length):s.lastIndex=0:u&&r&&(s.lastIndex=s.global?r.index+r[0].length:t),f&&r&&r.length>1&&l.call(r[0],n,function(){for(i=1;i=c?e?"":void 0:(o=a.charCodeAt(l))<55296||o>56319||l+1===c||(s=a.charCodeAt(l+1))<56320||s>57343?e?a.charAt(l):o:e?a.slice(l,l+2):s-56320+(o-55296<<10)+65536}};e.exports={codeAt:o(!1),charAt:o(!0)}},3197:function(e){"use strict";var t=2147483647,n=/[^\0-\u007E]/,r=/[.\u3002\uFF0E\uFF61]/g,i="Overflow: input needs wider integers to process",o=Math.floor,s=String.fromCharCode,a=function(e){return e+22+75*(e<26)},l=function(e,t,n){var r=0;for(e=n?o(e/700):e>>1,e+=o(e/t);e>455;r+=36)e=o(e/35);return o(r+36*e/(e+38))},c=function(e){var n=[];e=function(e){for(var t=[],n=0,r=e.length;n=55296&&i<=56319&&n=d&&co((t-f)/y))throw RangeError(i);for(f+=(m-d)*y,d=m,r=0;rt)throw RangeError(i);if(c==d){for(var g=f,b=36;;b+=36){var w=b<=p?1:b>=p+26?26:b-p;if(g0?n:t)(e)}},7466:function(e,t,n){var r=n(9958),i=Math.min;e.exports=function(e){return e>0?i(r(e),9007199254740991):0}},7908:function(e,t,n){var r=n(4488);e.exports=function(e){return Object(r(e))}},4590:function(e,t,n){var r=n(3002);e.exports=function(e,t){var n=r(e);if(n%t)throw RangeError("Wrong offset");return n}},3002:function(e,t,n){var r=n(9958);e.exports=function(e){var t=r(e);if(t<0)throw RangeError("The argument can't be less than 0");return t}},7593:function(e,t,n){var r=n(111);e.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},1694:function(e,t,n){var r={};r[n(5112)("toStringTag")]="z",e.exports="[object z]"===String(r)},9843:function(e,t,n){"use strict";var r=n(2109),i=n(7854),o=n(9781),s=n(3832),a=n(260),l=n(3331),c=n(5787),u=n(9114),d=n(8880),f=n(7466),p=n(7067),h=n(4590),v=n(7593),m=n(6656),y=n(648),g=n(111),b=n(30),w=n(7674),x=n(8006).f,E=n(7321),S=n(2092).forEach,k=n(6340),L=n(3070),A=n(1236),C=n(9909),_=n(9587),T=C.get,F=C.set,I=L.f,M=A.f,R=Math.round,z=i.RangeError,q=l.ArrayBuffer,j=l.DataView,U=a.NATIVE_ARRAY_BUFFER_VIEWS,O=a.TYPED_ARRAY_TAG,P=a.TypedArray,D=a.TypedArrayPrototype,N=a.aTypedArrayConstructor,$=a.isTypedArray,B="BYTES_PER_ELEMENT",W="Wrong length",H=function(e,t){for(var n=0,r=t.length,i=new(N(e))(r);r>n;)i[n]=t[n++];return i},Y=function(e,t){I(e,t,{get:function(){return T(this)[t]}})},G=function(e){var t;return e instanceof q||"ArrayBuffer"==(t=y(e))||"SharedArrayBuffer"==t},Q=function(e,t){return $(e)&&"symbol"!=typeof t&&t in e&&String(+t)==String(t)},X=function(e,t){return Q(e,t=v(t,!0))?u(2,e[t]):M(e,t)},V=function(e,t,n){return!(Q(e,t=v(t,!0))&&g(n)&&m(n,"value"))||m(n,"get")||m(n,"set")||n.configurable||m(n,"writable")&&!n.writable||m(n,"enumerable")&&!n.enumerable?I(e,t,n):(e[t]=n.value,e)};o?(U||(A.f=X,L.f=V,Y(D,"buffer"),Y(D,"byteOffset"),Y(D,"byteLength"),Y(D,"length")),r({target:"Object",stat:!0,forced:!U},{getOwnPropertyDescriptor:X,defineProperty:V}),e.exports=function(e,t,n){var o=e.match(/\d+$/)[0]/8,a=e+(n?"Clamped":"")+"Array",l="get"+e,u="set"+e,v=i[a],m=v,y=m&&m.prototype,L={},A=function(e,t){I(e,t,{get:function(){return function(e,t){var n=T(e);return n.view[l](t*o+n.byteOffset,!0)}(this,t)},set:function(e){return function(e,t,r){var i=T(e);n&&(r=(r=R(r))<0?0:r>255?255:255&r),i.view[u](t*o+i.byteOffset,r,!0)}(this,t,e)},enumerable:!0})};U?s&&(m=t(function(e,t,n,r){return c(e,m,a),_(g(t)?G(t)?void 0!==r?new v(t,h(n,o),r):void 0!==n?new v(t,h(n,o)):new v(t):$(t)?H(m,t):E.call(m,t):new v(p(t)),e,m)}),w&&w(m,P),S(x(v),function(e){e in m||d(m,e,v[e])}),m.prototype=y):(m=t(function(e,t,n,r){c(e,m,a);var i,s,l,u=0,d=0;if(g(t)){if(!G(t))return $(t)?H(m,t):E.call(m,t);i=t,d=h(n,o);var v=t.byteLength;if(void 0===r){if(v%o)throw z(W);if((s=v-d)<0)throw z(W)}else if((s=f(r)*o)+d>v)throw z(W);l=s/o}else l=p(t),i=new q(s=l*o);for(F(e,{buffer:i,byteOffset:d,byteLength:s,length:l,view:new j(i)});uo;)a[o]=t[o++];return a}},7321:function(e,t,n){var r=n(7908),i=n(7466),o=n(1246),s=n(7659),a=n(9974),l=n(260).aTypedArrayConstructor;e.exports=function(e){var t,n,c,u,d,f,p=r(e),h=arguments.length,v=h>1?arguments[1]:void 0,m=void 0!==v,y=o(p);if(null!=y&&!s(y))for(f=(d=y.call(p)).next,p=[];!(u=f.call(d)).done;)p.push(u.value);for(m&&h>2&&(v=a(v,arguments[2],2)),n=i(p.length),c=new(l(this))(n),t=0;n>t;t++)c[t]=m?v(p[t],t):p[t];return c}},9711:function(e){var t=0,n=Math.random();e.exports=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++t+n).toString(36)}},3307:function(e,t,n){var r=n(133);e.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},5112:function(e,t,n){var r=n(7854),i=n(2309),o=n(6656),s=n(9711),a=n(133),l=n(3307),c=i("wks"),u=r.Symbol,d=l?u:u&&u.withoutSetter||s;e.exports=function(e){return o(c,e)||(a&&o(u,e)?c[e]=u[e]:c[e]=d("Symbol."+e)),c[e]}},1361:function(e){e.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},8264:function(e,t,n){"use strict";var r=n(2109),i=n(7854),o=n(3331),s=n(6340),a="ArrayBuffer",l=o[a];r({global:!0,forced:i[a]!==l},{ArrayBuffer:l}),s(a)},2222:function(e,t,n){"use strict";var r=n(2109),i=n(7293),o=n(3157),s=n(111),a=n(7908),l=n(7466),c=n(6135),u=n(5417),d=n(1194),f=n(5112),p=n(7392),h=f("isConcatSpreadable"),v=9007199254740991,m="Maximum allowed index exceeded",y=p>=51||!i(function(){var e=[];return e[h]=!1,e.concat()[0]!==e}),g=d("concat"),b=function(e){if(!s(e))return!1;var t=e[h];return void 0!==t?!!t:o(e)};r({target:"Array",proto:!0,forced:!y||!g},{concat:function(e){var t,n,r,i,o,s=a(this),d=u(s,0),f=0;for(t=-1,r=arguments.length;tv)throw TypeError(m);for(n=0;n=v)throw TypeError(m);c(d,f++,o)}return d.length=f,d}})},7327:function(e,t,n){"use strict";var r=n(2109),i=n(2092).filter;r({target:"Array",proto:!0,forced:!n(1194)("filter")},{filter:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}})},2772:function(e,t,n){"use strict";var r=n(2109),i=n(1318).indexOf,o=n(9341),s=[].indexOf,a=!!s&&1/[1].indexOf(1,-0)<0,l=o("indexOf");r({target:"Array",proto:!0,forced:a||!l},{indexOf:function(e){return a?s.apply(this,arguments)||0:i(this,e,arguments.length>1?arguments[1]:void 0)}})},6992:function(e,t,n){"use strict";var r=n(5656),i=n(1223),o=n(7497),s=n(9909),a=n(654),l="Array Iterator",c=s.set,u=s.getterFor(l);e.exports=a(Array,"Array",function(e,t){c(this,{type:l,target:r(e),index:0,kind:t})},function(){var e=u(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}},"values"),o.Arguments=o.Array,i("keys"),i("values"),i("entries")},1249:function(e,t,n){"use strict";var r=n(2109),i=n(2092).map;r({target:"Array",proto:!0,forced:!n(1194)("map")},{map:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}})},7042:function(e,t,n){"use strict";var r=n(2109),i=n(111),o=n(3157),s=n(1400),a=n(7466),l=n(5656),c=n(6135),u=n(5112),d=n(1194)("slice"),f=u("species"),p=[].slice,h=Math.max;r({target:"Array",proto:!0,forced:!d},{slice:function(e,t){var n,r,u,d=l(this),v=a(d.length),m=s(e,v),y=s(void 0===t?v:t,v);if(o(d)&&("function"!=typeof(n=d.constructor)||n!==Array&&!o(n.prototype)?i(n)&&null===(n=n[f])&&(n=void 0):n=void 0,n===Array||void 0===n))return p.call(d,m,y);for(r=new(void 0===n?Array:n)(h(y-m,0)),u=0;m9007199254740991)throw TypeError("Maximum allowed length exceeded");for(u=l(m,r),p=0;py-r+n;p--)delete m[p-1]}else if(n>r)for(p=y-r;p>g;p--)v=p+n-1,(h=p+r-1)in m?m[v]=m[h]:delete m[v];for(p=0;p=n.length?{value:void 0,done:!0}:(e=r(n,i),t.index+=e.length,{value:e,done:!1})})},4723:function(e,t,n){"use strict";var r=n(7007),i=n(9670),o=n(7466),s=n(4488),a=n(1530),l=n(7651);r("match",1,function(e,t,n){return[function(t){var n=s(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var s=i(e),c=String(this);if(!s.global)return l(s,c);var u=s.unicode;s.lastIndex=0;for(var d,f=[],p=0;null!==(d=l(s,c));){var h=String(d[0]);f[p]=h,""===h&&(s.lastIndex=a(c,o(s.lastIndex),u)),p++}return 0===p?null:f}]})},5306:function(e,t,n){"use strict";var r=n(7007),i=n(9670),o=n(7466),s=n(9958),a=n(4488),l=n(1530),c=n(647),u=n(7651),d=Math.max,f=Math.min,p=function(e){return void 0===e?e:String(e)};r("replace",2,function(e,t,n,r){var h=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,v=r.REPLACE_KEEPS_$0,m=h?"$":"$0";return[function(n,r){var i=a(this),o=null==n?void 0:n[e];return void 0!==o?o.call(n,i,r):t.call(String(i),n,r)},function(e,r){if(!h&&v||"string"==typeof r&&-1===r.indexOf(m)){var a=n(t,e,this,r);if(a.done)return a.value}var y=i(e),g=String(this),b="function"==typeof r;b||(r=String(r));var w=y.global;if(w){var x=y.unicode;y.lastIndex=0}for(var E=[];;){var S=u(y,g);if(null===S)break;if(E.push(S),!w)break;""===String(S[0])&&(y.lastIndex=l(g,o(y.lastIndex),x))}for(var k="",L=0,A=0;A=L&&(k+=g.slice(L,_)+R,L=_+C.length)}return k+g.slice(L)}]})},3123:function(e,t,n){"use strict";var r=n(7007),i=n(7850),o=n(9670),s=n(4488),a=n(6707),l=n(1530),c=n(7466),u=n(7651),d=n(2261),f=n(7293),p=[].push,h=Math.min,v=4294967295,m=!f(function(){return!RegExp(v,"y")});r("split",2,function(e,t,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var r=String(s(this)),o=void 0===n?v:n>>>0;if(0===o)return[];if(void 0===e)return[r];if(!i(e))return t.call(r,e,o);for(var a,l,c,u=[],f=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),h=0,m=new RegExp(e.source,f+"g");(a=d.call(m,r))&&!((l=m.lastIndex)>h&&(u.push(r.slice(h,a.index)),a.length>1&&a.index=o));)m.lastIndex===a.index&&m.lastIndex++;return h===r.length?!c&&m.test("")||u.push(""):u.push(r.slice(h)),u.length>o?u.slice(0,o):u}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var i=s(this),o=null==t?void 0:t[e];return void 0!==o?o.call(t,i,n):r.call(String(i),t,n)},function(e,i){var s=n(r,e,this,i,r!==t);if(s.done)return s.value;var d=o(e),f=String(this),p=a(d,RegExp),y=d.unicode,g=(d.ignoreCase?"i":"")+(d.multiline?"m":"")+(d.unicode?"u":"")+(m?"y":"g"),b=new p(m?d:"^(?:"+d.source+")",g),w=void 0===i?v:i>>>0;if(0===w)return[];if(0===f.length)return null===u(b,f)?[f]:[];for(var x=0,E=0,S=[];E2?arguments[2]:void 0)})},8927:function(e,t,n){"use strict";var r=n(260),i=n(2092).every,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("every",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},3105:function(e,t,n){"use strict";var r=n(260),i=n(1285),o=r.aTypedArray;(0,r.exportTypedArrayMethod)("fill",function(e){return i.apply(o(this),arguments)})},5035:function(e,t,n){"use strict";var r=n(260),i=n(2092).filter,o=n(3074),s=r.aTypedArray;(0,r.exportTypedArrayMethod)("filter",function(e){var t=i(s(this),e,arguments.length>1?arguments[1]:void 0);return o(this,t)})},7174:function(e,t,n){"use strict";var r=n(260),i=n(2092).findIndex,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("findIndex",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},4345:function(e,t,n){"use strict";var r=n(260),i=n(2092).find,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("find",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},2846:function(e,t,n){"use strict";var r=n(260),i=n(2092).forEach,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("forEach",function(e){i(o(this),e,arguments.length>1?arguments[1]:void 0)})},4731:function(e,t,n){"use strict";var r=n(260),i=n(1318).includes,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("includes",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},7209:function(e,t,n){"use strict";var r=n(260),i=n(1318).indexOf,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("indexOf",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},6319:function(e,t,n){"use strict";var r=n(7854),i=n(260),o=n(6992),s=n(5112)("iterator"),a=r.Uint8Array,l=o.values,c=o.keys,u=o.entries,d=i.aTypedArray,f=i.exportTypedArrayMethod,p=a&&a.prototype[s],h=!!p&&("values"==p.name||null==p.name),v=function(){return l.call(d(this))};f("entries",function(){return u.call(d(this))}),f("keys",function(){return c.call(d(this))}),f("values",v,!h),f(s,v,!h)},8867:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=[].join;o("join",function(e){return s.apply(i(this),arguments)})},7789:function(e,t,n){"use strict";var r=n(260),i=n(6583),o=r.aTypedArray;(0,r.exportTypedArrayMethod)("lastIndexOf",function(e){return i.apply(o(this),arguments)})},3739:function(e,t,n){"use strict";var r=n(260),i=n(2092).map,o=n(6707),s=r.aTypedArray,a=r.aTypedArrayConstructor;(0,r.exportTypedArrayMethod)("map",function(e){return i(s(this),e,arguments.length>1?arguments[1]:void 0,function(e,t){return new(a(o(e,e.constructor)))(t)})})},4483:function(e,t,n){"use strict";var r=n(260),i=n(3671).right,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("reduceRight",function(e){return i(o(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)})},9368:function(e,t,n){"use strict";var r=n(260),i=n(3671).left,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("reduce",function(e){return i(o(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)})},2056:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=Math.floor;o("reverse",function(){for(var e,t=this,n=i(t).length,r=s(n/2),o=0;o1?arguments[1]:void 0,1),n=this.length,r=s(e),a=i(r.length),c=0;if(a+t>n)throw RangeError("Wrong length");for(;co;)u[o]=n[o++];return u},o(function(){new Int8Array(1).slice()}))},7462:function(e,t,n){"use strict";var r=n(260),i=n(2092).some,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("some",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},3824:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=[].sort;o("sort",function(e){return s.call(i(this),e)})},5021:function(e,t,n){"use strict";var r=n(260),i=n(7466),o=n(1400),s=n(6707),a=r.aTypedArray;(0,r.exportTypedArrayMethod)("subarray",function(e,t){var n=a(this),r=n.length,l=o(e,r);return new(s(n,n.constructor))(n.buffer,n.byteOffset+l*n.BYTES_PER_ELEMENT,i((void 0===t?r:o(t,r))-l))})},2974:function(e,t,n){"use strict";var r=n(7854),i=n(260),o=n(7293),s=r.Int8Array,a=i.aTypedArray,l=i.exportTypedArrayMethod,c=[].toLocaleString,u=[].slice,d=!!s&&o(function(){c.call(new s(1))});l("toLocaleString",function(){return c.apply(d?u.call(a(this)):a(this),arguments)},o(function(){return[1,2].toLocaleString()!=new s([1,2]).toLocaleString()})||!o(function(){s.prototype.toLocaleString.call([1,2])}))},5016:function(e,t,n){"use strict";var r=n(260).exportTypedArrayMethod,i=n(7293),o=n(7854).Uint8Array,s=o&&o.prototype||{},a=[].toString,l=[].join;i(function(){a.call({})})&&(a=function(){return l.call(this)});var c=s.toString!=a;r("toString",a,c)},2472:function(e,t,n){n(9843)("Uint8",function(e){return function(t,n,r){return e(this,t,n,r)}})},4747:function(e,t,n){var r=n(7854),i=n(8324),o=n(8533),s=n(8880);for(var a in i){var l=r[a],c=l&&l.prototype;if(c&&c.forEach!==o)try{s(c,"forEach",o)}catch(e){c.forEach=o}}},3948:function(e,t,n){var r=n(7854),i=n(8324),o=n(6992),s=n(8880),a=n(5112),l=a("iterator"),c=a("toStringTag"),u=o.values;for(var d in i){var f=r[d],p=f&&f.prototype;if(p){if(p[l]!==u)try{s(p,l,u)}catch(e){p[l]=u}if(p[c]||s(p,c,d),i[d])for(var h in o)if(p[h]!==o[h])try{s(p,h,o[h])}catch(e){p[h]=o[h]}}}},1637:function(e,t,n){"use strict";n(6992);var r=n(2109),i=n(5005),o=n(590),s=n(1320),a=n(2248),l=n(8003),c=n(4994),u=n(9909),d=n(5787),f=n(6656),p=n(9974),h=n(648),v=n(9670),m=n(111),y=n(30),g=n(9114),b=n(8554),w=n(1246),x=n(5112),E=i("fetch"),S=i("Headers"),k=x("iterator"),L="URLSearchParams",A=L+"Iterator",C=u.set,_=u.getterFor(L),T=u.getterFor(A),F=/\+/g,I=Array(4),M=function(e){return I[e-1]||(I[e-1]=RegExp("((?:%[\\da-f]{2}){"+e+"})","gi"))},R=function(e){try{return decodeURIComponent(e)}catch(t){return e}},z=function(e){var t=e.replace(F," "),n=4;try{return decodeURIComponent(t)}catch(e){for(;n;)t=t.replace(M(n--),R);return t}},q=/[!'()~]|%20/g,j={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},U=function(e){return j[e]},O=function(e){return encodeURIComponent(e).replace(q,U)},P=function(e,t){if(t)for(var n,r,i=t.split("&"),o=0;o0?arguments[0]:void 0,u=[];if(C(this,{type:L,entries:u,updateURL:function(){},updateSearchParams:D}),void 0!==c)if(m(c))if("function"==typeof(e=w(c)))for(n=(t=e.call(c)).next;!(r=n.call(t)).done;){if((s=(o=(i=b(v(r.value))).next).call(i)).done||(a=o.call(i)).done||!o.call(i).done)throw TypeError("Expected sequence with length 2");u.push({key:s.value+"",value:a.value+""})}else for(l in c)f(c,l)&&u.push({key:l,value:c[l]+""});else P(u,"string"==typeof c?"?"===c.charAt(0)?c.slice(1):c:c+"")},W=B.prototype;a(W,{append:function(e,t){N(arguments.length,2);var n=_(this);n.entries.push({key:e+"",value:t+""}),n.updateURL()},delete:function(e){N(arguments.length,1);for(var t=_(this),n=t.entries,r=e+"",i=0;ie.key){i.splice(t,0,e);break}t===n&&i.push(e)}r.updateURL()},forEach:function(e){for(var t,n=_(this).entries,r=p(e,arguments.length>1?arguments[1]:void 0,3),i=0;i1&&(m(t=arguments[1])&&(n=t.body,h(n)===L&&((r=t.headers?new S(t.headers):new S).has("content-type")||r.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),t=y(t,{body:g(0,String(n)),headers:g(0,r)}))),i.push(t)),E.apply(this,i)}}),e.exports={URLSearchParams:B,getState:_}},285:function(e,t,n){"use strict";n(8783);var r,i=n(2109),o=n(9781),s=n(590),a=n(7854),l=n(6048),c=n(1320),u=n(5787),d=n(6656),f=n(1574),p=n(8457),h=n(8710).codeAt,v=n(3197),m=n(8003),y=n(1637),g=n(9909),b=a.URL,w=y.URLSearchParams,x=y.getState,E=g.set,S=g.getterFor("URL"),k=Math.floor,L=Math.pow,A="Invalid scheme",C="Invalid host",_="Invalid port",T=/[A-Za-z]/,F=/[\d+-.A-Za-z]/,I=/\d/,M=/^(0x|0X)/,R=/^[0-7]+$/,z=/^\d+$/,q=/^[\dA-Fa-f]+$/,j=/[\u0000\t\u000A\u000D #%/:?@[\\]]/,U=/[\u0000\t\u000A\u000D #/:?@[\\]]/,O=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,P=/[\t\u000A\u000D]/g,D=function(e,t){var n,r,i;if("["==t.charAt(0)){if("]"!=t.charAt(t.length-1))return C;if(!(n=$(t.slice(1,-1))))return C;e.host=n}else if(V(e)){if(t=v(t),j.test(t))return C;if(null===(n=N(t)))return C;e.host=n}else{if(U.test(t))return C;for(n="",r=p(t),i=0;i4)return e;for(n=[],r=0;r1&&"0"==i.charAt(0)&&(o=M.test(i)?16:8,i=i.slice(8==o?1:2)),""===i)s=0;else{if(!(10==o?z:8==o?R:q).test(i))return e;s=parseInt(i,o)}n.push(s)}for(r=0;r=L(256,5-t))return null}else if(s>255)return null;for(a=n.pop(),r=0;r6)return;for(r=0;f();){if(i=null,r>0){if(!("."==f()&&r<4))return;d++}if(!I.test(f()))return;for(;I.test(f());){if(o=parseInt(f(),10),null===i)i=o;else{if(0==i)return;i=10*i+o}if(i>255)return;d++}l[c]=256*l[c]+i,2!=++r&&4!=r||c++}if(4!=r)return;break}if(":"==f()){if(d++,!f())return}else if(f())return;l[c++]=t}else{if(null!==u)return;d++,u=++c}}if(null!==u)for(s=c-u,c=7;0!=c&&s>0;)a=l[c],l[c--]=l[u+s-1],l[u+--s]=a;else if(8!=c)return;return l},B=function(e){var t,n,r,i;if("number"==typeof e){for(t=[],n=0;n<4;n++)t.unshift(e%256),e=k(e/256);return t.join(".")}if("object"==typeof e){for(t="",r=function(e){for(var t=null,n=1,r=null,i=0,o=0;o<8;o++)0!==e[o]?(i>n&&(t=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(t=r,n=i),t}(e),n=0;n<8;n++)i&&0===e[n]||(i&&(i=!1),r===n?(t+=n?":":"::",i=!0):(t+=e[n].toString(16),n<7&&(t+=":")));return"["+t+"]"}return e},W={},H=f({},W,{" ":1,'"':1,"<":1,">":1,"`":1}),Y=f({},H,{"#":1,"?":1,"{":1,"}":1}),G=f({},Y,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),Q=function(e,t){var n=h(e,0);return n>32&&n<127&&!d(t,e)?e:encodeURIComponent(e)},X={ftp:21,file:null,http:80,https:443,ws:80,wss:443},V=function(e){return d(X,e.scheme)},K=function(e){return""!=e.username||""!=e.password},Z=function(e){return!e.host||e.cannotBeABaseURL||"file"==e.scheme},J=function(e,t){var n;return 2==e.length&&T.test(e.charAt(0))&&(":"==(n=e.charAt(1))||!t&&"|"==n)},ee=function(e){var t;return e.length>1&&J(e.slice(0,2))&&(2==e.length||"/"===(t=e.charAt(2))||"\\"===t||"?"===t||"#"===t)},te=function(e){var t=e.path,n=t.length;!n||"file"==e.scheme&&1==n&&J(t[0],!0)||t.pop()},ne=function(e){return"."===e||"%2e"===e.toLowerCase()},re=function(e){return".."===(e=e.toLowerCase())||"%2e."===e||".%2e"===e||"%2e%2e"===e},ie={},oe={},se={},ae={},le={},ce={},ue={},de={},fe={},pe={},he={},ve={},me={},ye={},ge={},be={},we={},xe={},Ee={},Se={},ke={},Le=function(e,t,n,i){var o,s,a,l,c=n||ie,u=0,f="",h=!1,v=!1,m=!1;for(n||(e.scheme="",e.username="",e.password="",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,t=t.replace(O,"")),t=t.replace(P,""),o=p(t);u<=o.length;){switch(s=o[u],c){case ie:if(!s||!T.test(s)){if(n)return A;c=se;continue}f+=s.toLowerCase(),c=oe;break;case oe:if(s&&(F.test(s)||"+"==s||"-"==s||"."==s))f+=s.toLowerCase();else{if(":"!=s){if(n)return A;f="",c=se,u=0;continue}if(n&&(V(e)!=d(X,f)||"file"==f&&(K(e)||null!==e.port)||"file"==e.scheme&&!e.host))return;if(e.scheme=f,n)return void(V(e)&&X[e.scheme]==e.port&&(e.port=null));f="","file"==e.scheme?c=ye:V(e)&&i&&i.scheme==e.scheme?c=ae:V(e)?c=de:"/"==o[u+1]?(c=le,u++):(e.cannotBeABaseURL=!0,e.path.push(""),c=Ee)}break;case se:if(!i||i.cannotBeABaseURL&&"#"!=s)return A;if(i.cannotBeABaseURL&&"#"==s){e.scheme=i.scheme,e.path=i.path.slice(),e.query=i.query,e.fragment="",e.cannotBeABaseURL=!0,c=ke;break}c="file"==i.scheme?ye:ce;continue;case ae:if("/"!=s||"/"!=o[u+1]){c=ce;continue}c=fe,u++;break;case le:if("/"==s){c=pe;break}c=xe;continue;case ce:if(e.scheme=i.scheme,s==r)e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query=i.query;else if("/"==s||"\\"==s&&V(e))c=ue;else if("?"==s)e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query="",c=Se;else{if("#"!=s){e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.path.pop(),c=xe;continue}e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query=i.query,e.fragment="",c=ke}break;case ue:if(!V(e)||"/"!=s&&"\\"!=s){if("/"!=s){e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,c=xe;continue}c=pe}else c=fe;break;case de:if(c=fe,"/"!=s||"/"!=f.charAt(u+1))continue;u++;break;case fe:if("/"!=s&&"\\"!=s){c=pe;continue}break;case pe:if("@"==s){h&&(f="%40"+f),h=!0,a=p(f);for(var y=0;y65535)return _;e.port=V(e)&&w===X[e.scheme]?null:w,f=""}if(n)return;c=we;continue}return _}f+=s;break;case ye:if(e.scheme="file","/"==s||"\\"==s)c=ge;else{if(!i||"file"!=i.scheme){c=xe;continue}if(s==r)e.host=i.host,e.path=i.path.slice(),e.query=i.query;else if("?"==s)e.host=i.host,e.path=i.path.slice(),e.query="",c=Se;else{if("#"!=s){ee(o.slice(u).join(""))||(e.host=i.host,e.path=i.path.slice(),te(e)),c=xe;continue}e.host=i.host,e.path=i.path.slice(),e.query=i.query,e.fragment="",c=ke}}break;case ge:if("/"==s||"\\"==s){c=be;break}i&&"file"==i.scheme&&!ee(o.slice(u).join(""))&&(J(i.path[0],!0)?e.path.push(i.path[0]):e.host=i.host),c=xe;continue;case be:if(s==r||"/"==s||"\\"==s||"?"==s||"#"==s){if(!n&&J(f))c=xe;else if(""==f){if(e.host="",n)return;c=we}else{if(l=D(e,f))return l;if("localhost"==e.host&&(e.host=""),n)return;f="",c=we}continue}f+=s;break;case we:if(V(e)){if(c=xe,"/"!=s&&"\\"!=s)continue}else if(n||"?"!=s)if(n||"#"!=s){if(s!=r&&(c=xe,"/"!=s))continue}else e.fragment="",c=ke;else e.query="",c=Se;break;case xe:if(s==r||"/"==s||"\\"==s&&V(e)||!n&&("?"==s||"#"==s)){if(re(f)?(te(e),"/"==s||"\\"==s&&V(e)||e.path.push("")):ne(f)?"/"==s||"\\"==s&&V(e)||e.path.push(""):("file"==e.scheme&&!e.path.length&&J(f)&&(e.host&&(e.host=""),f=f.charAt(0)+":"),e.path.push(f)),f="","file"==e.scheme&&(s==r||"?"==s||"#"==s))for(;e.path.length>1&&""===e.path[0];)e.path.shift();"?"==s?(e.query="",c=Se):"#"==s&&(e.fragment="",c=ke)}else f+=Q(s,Y);break;case Ee:"?"==s?(e.query="",c=Se):"#"==s?(e.fragment="",c=ke):s!=r&&(e.path[0]+=Q(s,W));break;case Se:n||"#"!=s?s!=r&&("'"==s&&V(e)?e.query+="%27":e.query+="#"==s?"%23":Q(s,W)):(e.fragment="",c=ke);break;case ke:s!=r&&(e.fragment+=Q(s,H))}u++}},Ae=function(e){var t,n,r=u(this,Ae,"URL"),i=arguments.length>1?arguments[1]:void 0,s=String(e),a=E(r,{type:"URL"});if(void 0!==i)if(i instanceof Ae)t=S(i);else if(n=Le(t={},String(i)))throw TypeError(n);if(n=Le(a,s,null,t))throw TypeError(n);var l=a.searchParams=new w,c=x(l);c.updateSearchParams(a.query),c.updateURL=function(){a.query=String(l)||null},o||(r.href=_e.call(r),r.origin=Te.call(r),r.protocol=Fe.call(r),r.username=Ie.call(r),r.password=Me.call(r),r.host=Re.call(r),r.hostname=ze.call(r),r.port=qe.call(r),r.pathname=je.call(r),r.search=Ue.call(r),r.searchParams=Oe.call(r),r.hash=Pe.call(r))},Ce=Ae.prototype,_e=function(){var e=S(this),t=e.scheme,n=e.username,r=e.password,i=e.host,o=e.port,s=e.path,a=e.query,l=e.fragment,c=t+":";return null!==i?(c+="//",K(e)&&(c+=n+(r?":"+r:"")+"@"),c+=B(i),null!==o&&(c+=":"+o)):"file"==t&&(c+="//"),c+=e.cannotBeABaseURL?s[0]:s.length?"/"+s.join("/"):"",null!==a&&(c+="?"+a),null!==l&&(c+="#"+l),c},Te=function(){var e=S(this),t=e.scheme,n=e.port;if("blob"==t)try{return new URL(t.path[0]).origin}catch(e){return"null"}return"file"!=t&&V(e)?t+"://"+B(e.host)+(null!==n?":"+n:""):"null"},Fe=function(){return S(this).scheme+":"},Ie=function(){return S(this).username},Me=function(){return S(this).password},Re=function(){var e=S(this),t=e.host,n=e.port;return null===t?"":null===n?B(t):B(t)+":"+n},ze=function(){var e=S(this).host;return null===e?"":B(e)},qe=function(){var e=S(this).port;return null===e?"":String(e)},je=function(){var e=S(this),t=e.path;return e.cannotBeABaseURL?t[0]:t.length?"/"+t.join("/"):""},Ue=function(){var e=S(this).query;return e?"?"+e:""},Oe=function(){return S(this).searchParams},Pe=function(){var e=S(this).fragment;return e?"#"+e:""},De=function(e,t){return{get:e,set:t,configurable:!0,enumerable:!0}};if(o&&l(Ce,{href:De(_e,function(e){var t=S(this),n=String(e),r=Le(t,n);if(r)throw TypeError(r);x(t.searchParams).updateSearchParams(t.query)}),origin:De(Te),protocol:De(Fe,function(e){var t=S(this);Le(t,String(e)+":",ie)}),username:De(Ie,function(e){var t=S(this),n=p(String(e));if(!Z(t)){t.username="";for(var r=0;re.length)&&(t=e.length);for(var n=0,r=new Array(t);n1?r-1:0),o=1;o=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,a=!0,l=!1;return{s:function(){r=t[Symbol.iterator]()},n:function(){var e=r.next();return a=e.done,e},e:function(e){l=!0,s=e},f:function(){try{a||null==r.return||r.return()}finally{if(l)throw s}}}}(n,!0);try{for(a.s();!(s=a.n()).done;)s.value.apply(this,i)}catch(e){a.e(e)}finally{a.f()}}return this.element&&this.element.dispatchEvent(this.makeEvent("dropzone:"+t,{args:i})),this}},{key:"makeEvent",value:function(e,t){var n={bubbles:!0,cancelable:!0,detail:t};if("function"==typeof window.CustomEvent)return new CustomEvent(e,n);var r=document.createEvent("CustomEvent");return r.initCustomEvent(e,n.bubbles,n.cancelable,n.detail),r}},{key:"off",value:function(e,t){if(!this._callbacks||0===arguments.length)return this._callbacks={},this;var n=this._callbacks[e];if(!n)return this;if(1===arguments.length)return delete this._callbacks[e],this;for(var r=0;r=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,l=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return a=e.done,e},e:function(e){l=!0,o=e},f:function(){try{a||null==n.return||n.return()}finally{if(l)throw o}}}}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n'),this.element.appendChild(e));var i=e.getElementsByTagName("span")[0];return i&&(null!=i.textContent?i.textContent=this.options.dictFallbackMessage:null!=i.innerText&&(i.innerText=this.options.dictFallbackMessage)),this.element.appendChild(this.getFallbackForm())},resize:function(e,t,n,r){var i={srcX:0,srcY:0,srcWidth:e.width,srcHeight:e.height},o=e.width/e.height;null==t&&null==n?(t=i.srcWidth,n=i.srcHeight):null==t?t=n*o:null==n&&(n=t/o);var s=(t=Math.min(t,i.srcWidth))/(n=Math.min(n,i.srcHeight));if(i.srcWidth>t||i.srcHeight>n)if("crop"===r)o>s?(i.srcHeight=e.height,i.srcWidth=i.srcHeight*s):(i.srcWidth=e.width,i.srcHeight=i.srcWidth/s);else{if("contain"!==r)throw new Error("Unknown resizeMethod '".concat(r,"'"));o>s?n=t/o:t=n*o}return i.srcX=(e.width-i.srcWidth)/2,i.srcY=(e.height-i.srcHeight)/2,i.trgWidth=t,i.trgHeight=n,i},transformFile:function(e,t){return(this.options.resizeWidth||this.options.resizeHeight)&&e.type.match(/image.*/)?this.resizeImage(e,this.options.resizeWidth,this.options.resizeHeight,this.options.resizeMethod,t):t(e)},previewTemplate:'
    Check
    Error
    ',drop:function(e){return this.element.classList.remove("dz-drag-hover")},dragstart:function(e){},dragend:function(e){return this.element.classList.remove("dz-drag-hover")},dragenter:function(e){return this.element.classList.add("dz-drag-hover")},dragover:function(e){return this.element.classList.add("dz-drag-hover")},dragleave:function(e){return this.element.classList.remove("dz-drag-hover")},paste:function(e){},reset:function(){return this.element.classList.remove("dz-started")},addedfile:function(e){var t=this;if(this.element===this.previewsContainer&&this.element.classList.add("dz-started"),this.previewsContainer&&!this.options.disablePreviews){e.previewElement=g.createElement(this.options.previewTemplate.trim()),e.previewTemplate=e.previewElement,this.previewsContainer.appendChild(e.previewElement);var n,r=o(e.previewElement.querySelectorAll("[data-dz-name]"),!0);try{for(r.s();!(n=r.n()).done;){var i=n.value;i.textContent=e.name}}catch(e){r.e(e)}finally{r.f()}var s,a=o(e.previewElement.querySelectorAll("[data-dz-size]"),!0);try{for(a.s();!(s=a.n()).done;)(i=s.value).innerHTML=this.filesize(e.size)}catch(e){a.e(e)}finally{a.f()}this.options.addRemoveLinks&&(e._removeLink=g.createElement('
    '.concat(this.options.dictRemoveFile,"")),e.previewElement.appendChild(e._removeLink));var l,c=function(n){return n.preventDefault(),n.stopPropagation(),e.status===g.UPLOADING?g.confirm(t.options.dictCancelUploadConfirmation,function(){return t.removeFile(e)}):t.options.dictRemoveFileConfirmation?g.confirm(t.options.dictRemoveFileConfirmation,function(){return t.removeFile(e)}):t.removeFile(e)},u=o(e.previewElement.querySelectorAll("[data-dz-remove]"),!0);try{for(u.s();!(l=u.n()).done;)l.value.addEventListener("click",c)}catch(e){u.e(e)}finally{u.f()}}},removedfile:function(e){return null!=e.previewElement&&null!=e.previewElement.parentNode&&e.previewElement.parentNode.removeChild(e.previewElement),this._updateMaxFilesReachedClass()},thumbnail:function(e,t){if(e.previewElement){e.previewElement.classList.remove("dz-file-preview");var n,r=o(e.previewElement.querySelectorAll("[data-dz-thumbnail]"),!0);try{for(r.s();!(n=r.n()).done;){var i=n.value;i.alt=e.name,i.src=t}}catch(e){r.e(e)}finally{r.f()}return setTimeout(function(){return e.previewElement.classList.add("dz-image-preview")},1)}},error:function(e,t){if(e.previewElement){e.previewElement.classList.add("dz-error"),"string"!=typeof t&&t.error&&(t=t.error);var n,r=o(e.previewElement.querySelectorAll("[data-dz-errormessage]"),!0);try{for(r.s();!(n=r.n()).done;)n.value.textContent=t}catch(e){r.e(e)}finally{r.f()}}},errormultiple:function(){},processing:function(e){if(e.previewElement&&(e.previewElement.classList.add("dz-processing"),e._removeLink))return e._removeLink.innerHTML=this.options.dictCancelUpload},processingmultiple:function(){},uploadprogress:function(e,t,n){if(e.previewElement){var r,i=o(e.previewElement.querySelectorAll("[data-dz-uploadprogress]"),!0);try{for(i.s();!(r=i.n()).done;){var s=r.value;"PROGRESS"===s.nodeName?s.value=t:s.style.width="".concat(t,"%")}}catch(e){i.e(e)}finally{i.f()}}},totaluploadprogress:function(){},sending:function(){},sendingmultiple:function(){},success:function(e){if(e.previewElement)return e.previewElement.classList.add("dz-success")},successmultiple:function(){},canceled:function(e){return this.emit("error",e,this.options.dictUploadCanceled)},canceledmultiple:function(){},complete:function(e){if(e._removeLink&&(e._removeLink.innerHTML=this.options.dictRemoveFile),e.previewElement)return e.previewElement.classList.add("dz-complete")},completemultiple:function(){},maxfilesexceeded:function(){},maxfilesreached:function(){},queuecomplete:function(){},addedfiles:function(){}};function l(e){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l(e)}function c(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return u(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?u(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return s=e.done,e},e:function(e){a=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n"))),this.clickableElements.length&&function t(){e.hiddenFileInput&&e.hiddenFileInput.parentNode.removeChild(e.hiddenFileInput),e.hiddenFileInput=document.createElement("input"),e.hiddenFileInput.setAttribute("type","file"),(null===e.options.maxFiles||e.options.maxFiles>1)&&e.hiddenFileInput.setAttribute("multiple","multiple"),e.hiddenFileInput.className="dz-hidden-input",null!==e.options.acceptedFiles&&e.hiddenFileInput.setAttribute("accept",e.options.acceptedFiles),null!==e.options.capture&&e.hiddenFileInput.setAttribute("capture",e.options.capture),e.hiddenFileInput.setAttribute("tabindex","-1"),e.hiddenFileInput.style.visibility="hidden",e.hiddenFileInput.style.position="absolute",e.hiddenFileInput.style.top="0",e.hiddenFileInput.style.left="0",e.hiddenFileInput.style.height="0",e.hiddenFileInput.style.width="0",o.getElement(e.options.hiddenInputContainer,"hiddenInputContainer").appendChild(e.hiddenFileInput),e.hiddenFileInput.addEventListener("change",function(){var n=e.hiddenFileInput.files;if(n.length){var r,i=c(n,!0);try{for(i.s();!(r=i.n()).done;){var o=r.value;e.addFile(o)}}catch(e){i.e(e)}finally{i.f()}}e.emit("addedfiles",n),t()})}(),this.URL=null!==window.URL?window.URL:window.webkitURL;var t,n=c(this.events,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.on(r,this.options[r])}}catch(e){n.e(e)}finally{n.f()}this.on("uploadprogress",function(){return e.updateTotalUploadProgress()}),this.on("removedfile",function(){return e.updateTotalUploadProgress()}),this.on("canceled",function(t){return e.emit("complete",t)}),this.on("complete",function(t){if(0===e.getAddedFiles().length&&0===e.getUploadingFiles().length&&0===e.getQueuedFiles().length)return setTimeout(function(){return e.emit("queuecomplete")},0)});var i=function(e){if(function(e){if(e.dataTransfer.types)for(var t=0;t")),n+='');var r=o.createElement(n);return"FORM"!==this.element.tagName?(t=o.createElement('
    '))).appendChild(r):(this.element.setAttribute("enctype","multipart/form-data"),this.element.setAttribute("method",this.options.method)),null!=t?t:r}},{key:"getExistingFallback",value:function(){for(var e=function(e){var t,n=c(e,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;if(/(^| )fallback($| )/.test(r.className))return r}}catch(e){n.e(e)}finally{n.f()}},t=0,n=["div","form"];t0){for(var r=["tb","gb","mb","kb","b"],i=0;i=Math.pow(this.options.filesizeBase,4-i)/10){t=e/Math.pow(this.options.filesizeBase,4-i),n=o;break}}t=Math.round(10*t)/10}return"".concat(t," ").concat(this.options.dictFileSizeUnits[n])}},{key:"_updateMaxFilesReachedClass",value:function(){return null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(this.getAcceptedFiles().length===this.options.maxFiles&&this.emit("maxfilesreached",this.files),this.element.classList.add("dz-max-files-reached")):this.element.classList.remove("dz-max-files-reached")}},{key:"drop",value:function(e){if(e.dataTransfer){this.emit("drop",e);for(var t=[],n=0;n0){var i,o=c(r,!0);try{for(o.s();!(i=o.n()).done;){var s=i.value;s.isFile?s.file(function(e){if(!n.options.ignoreHiddenFiles||"."!==e.name.substring(0,1))return e.fullPath="".concat(t,"/").concat(e.name),n.addFile(e)}):s.isDirectory&&n._addFilesFromDirectory(s,"".concat(t,"/").concat(s.name))}}catch(e){o.e(e)}finally{o.f()}e()}return null},i)}()}},{key:"accept",value:function(e,t){this.options.maxFilesize&&e.size>1024*this.options.maxFilesize*1024?t(this.options.dictFileTooBig.replace("{{filesize}}",Math.round(e.size/1024/10.24)/100).replace("{{maxFilesize}}",this.options.maxFilesize)):o.isValidFile(e,this.options.acceptedFiles)?null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(t(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}",this.options.maxFiles)),this.emit("maxfilesexceeded",e)):this.options.accept.call(this,e,t):t(this.options.dictInvalidFileType)}},{key:"addFile",value:function(e){var t=this;e.upload={uuid:o.uuidv4(),progress:0,total:e.size,bytesSent:0,filename:this._renameFile(e)},this.files.push(e),e.status=o.ADDED,this.emit("addedfile",e),this._enqueueThumbnail(e),this.accept(e,function(n){n?(e.accepted=!1,t._errorProcessing([e],n)):(e.accepted=!0,t.options.autoQueue&&t.enqueueFile(e)),t._updateMaxFilesReachedClass()})}},{key:"enqueueFiles",value:function(e){var t,n=c(e,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.enqueueFile(r)}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"enqueueFile",value:function(e){var t=this;if(e.status!==o.ADDED||!0!==e.accepted)throw new Error("This file can't be queued because it has already been processed or was rejected.");if(e.status=o.QUEUED,this.options.autoProcessQueue)return setTimeout(function(){return t.processQueue()},0)}},{key:"_enqueueThumbnail",value:function(e){var t=this;if(this.options.createImageThumbnails&&e.type.match(/image.*/)&&e.size<=1024*this.options.maxThumbnailFilesize*1024)return this._thumbnailQueue.push(e),setTimeout(function(){return t._processThumbnailQueue()},0)}},{key:"_processThumbnailQueue",value:function(){var e=this;if(!this._processingThumbnail&&0!==this._thumbnailQueue.length){this._processingThumbnail=!0;var t=this._thumbnailQueue.shift();return this.createThumbnail(t,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,!0,function(n){return e.emit("thumbnail",t,n),e._processingThumbnail=!1,e._processThumbnailQueue()})}}},{key:"removeFile",value:function(e){if(e.status===o.UPLOADING&&this.cancelUpload(e),this.files=b(this.files,e),this.emit("removedfile",e),0===this.files.length)return this.emit("reset")}},{key:"removeAllFiles",value:function(e){null==e&&(e=!1);var t,n=c(this.files.slice(),!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;(r.status!==o.UPLOADING||e)&&this.removeFile(r)}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"resizeImage",value:function(e,t,n,r,i){var s=this;return this.createThumbnail(e,t,n,r,!0,function(t,n){if(null==n)return i(e);var r=s.options.resizeMimeType;null==r&&(r=e.type);var a=n.toDataURL(r,s.options.resizeQuality);return"image/jpeg"!==r&&"image/jpg"!==r||(a=E.restore(e.dataURL,a)),i(o.dataURItoBlob(a))})}},{key:"createThumbnail",value:function(e,t,n,r,i,o){var s=this,a=new FileReader;a.onload=function(){e.dataURL=a.result,"image/svg+xml"!==e.type?s.createThumbnailFromUrl(e,t,n,r,i,o):null!=o&&o(a.result)},a.readAsDataURL(e)}},{key:"displayExistingFile",value:function(e,t,n,r){var i=this,o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4];this.emit("addedfile",e),this.emit("complete",e),o?(e.dataURL=t,this.createThumbnailFromUrl(e,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,this.options.fixOrientation,function(t){i.emit("thumbnail",e,t),n&&n()},r)):(this.emit("thumbnail",e,t),n&&n())}},{key:"createThumbnailFromUrl",value:function(e,t,n,r,i,o,s){var a=this,l=document.createElement("img");return s&&(l.crossOrigin=s),i="from-image"!=getComputedStyle(document.body).imageOrientation&&i,l.onload=function(){var s=function(e){return e(1)};return"undefined"!=typeof EXIF&&null!==EXIF&&i&&(s=function(e){return EXIF.getData(l,function(){return e(EXIF.getTag(this,"Orientation"))})}),s(function(i){e.width=l.width,e.height=l.height;var s=a.options.resize.call(a,e,t,n,r),c=document.createElement("canvas"),u=c.getContext("2d");switch(c.width=s.trgWidth,c.height=s.trgHeight,i>4&&(c.width=s.trgHeight,c.height=s.trgWidth),i){case 2:u.translate(c.width,0),u.scale(-1,1);break;case 3:u.translate(c.width,c.height),u.rotate(Math.PI);break;case 4:u.translate(0,c.height),u.scale(1,-1);break;case 5:u.rotate(.5*Math.PI),u.scale(1,-1);break;case 6:u.rotate(.5*Math.PI),u.translate(0,-c.width);break;case 7:u.rotate(.5*Math.PI),u.translate(c.height,-c.width),u.scale(-1,1);break;case 8:u.rotate(-.5*Math.PI),u.translate(-c.height,0)}x(u,l,null!=s.srcX?s.srcX:0,null!=s.srcY?s.srcY:0,s.srcWidth,s.srcHeight,null!=s.trgX?s.trgX:0,null!=s.trgY?s.trgY:0,s.trgWidth,s.trgHeight);var d=c.toDataURL("image/png");if(null!=o)return o(d,c)})},null!=o&&(l.onerror=o),l.src=e.dataURL}},{key:"processQueue",value:function(){var e=this.options.parallelUploads,t=this.getUploadingFiles().length,n=t;if(!(t>=e)){var r=this.getQueuedFiles();if(r.length>0){if(this.options.uploadMultiple)return this.processFiles(r.slice(0,e-t));for(;n1?t-1:0),r=1;rt.options.chunkSize),e[0].upload.totalChunkCount=Math.ceil(r.size/t.options.chunkSize)}if(e[0].upload.chunked){var i=e[0],s=n[0];i.upload.chunks=[];var a=function(){for(var n=0;void 0!==i.upload.chunks[n];)n++;if(!(n>=i.upload.totalChunkCount)){var r=n*t.options.chunkSize,a=Math.min(r+t.options.chunkSize,s.size),l={name:t._getParamName(0),data:s.webkitSlice?s.webkitSlice(r,a):s.slice(r,a),filename:i.upload.filename,chunkIndex:n};i.upload.chunks[n]={file:i,index:n,dataBlock:l,status:o.UPLOADING,progress:0,retries:0},t._uploadData(e,[l])}};if(i.upload.finishedChunkUpload=function(n,r){var s=!0;n.status=o.SUCCESS,n.dataBlock=null,n.xhr=null;for(var l=0;l1?t-1:0),r=1;r=s;a?o++:o--)i[o]=t.charCodeAt(o);return new Blob([r],{type:n})};var b=function(e,t){return e.filter(function(e){return e!==t}).map(function(e){return e})},w=function(e){return e.replace(/[\-_](\w)/g,function(e){return e.charAt(1).toUpperCase()})};g.createElement=function(e){var t=document.createElement("div");return t.innerHTML=e,t.childNodes[0]},g.elementInside=function(e,t){if(e===t)return!0;for(;e=e.parentNode;)if(e===t)return!0;return!1},g.getElement=function(e,t){var n;if("string"==typeof e?n=document.querySelector(e):null!=e.nodeType&&(n=e),null==n)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector or a plain HTML element."));return n},g.getElements=function(e,t){var n,r;if(e instanceof Array){r=[];try{var i,o=c(e,!0);try{for(o.s();!(i=o.n()).done;)n=i.value,r.push(this.getElement(n,t))}catch(e){o.e(e)}finally{o.f()}}catch(e){r=null}}else if("string"==typeof e){r=[];var s,a=c(document.querySelectorAll(e),!0);try{for(a.s();!(s=a.n()).done;)n=s.value,r.push(n)}catch(e){a.e(e)}finally{a.f()}}else null!=e.nodeType&&(r=[e]);if(null==r||!r.length)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector, a plain HTML element or a list of those."));return r},g.confirm=function(e,t,n){return window.confirm(e)?t():null!=n?n():void 0},g.isValidFile=function(e,t){if(!t)return!0;t=t.split(",");var n,r=e.type,i=r.replace(/\/.*$/,""),o=c(t,!0);try{for(o.s();!(n=o.n()).done;){var s=n.value;if("."===(s=s.trim()).charAt(0)){if(-1!==e.name.toLowerCase().indexOf(s.toLowerCase(),e.name.length-s.length))return!0}else if(/\/\*$/.test(s)){if(i===s.replace(/\/.*$/,""))return!0}else if(r===s)return!0}}catch(e){o.e(e)}finally{o.f()}return!1},"undefined"!=typeof jQuery&&null!==jQuery&&(jQuery.fn.dropzone=function(e){return this.each(function(){return new g(this,e)})}),g.ADDED="added",g.QUEUED="queued",g.ACCEPTED=g.QUEUED,g.UPLOADING="uploading",g.PROCESSING=g.UPLOADING,g.CANCELED="canceled",g.ERROR="error",g.SUCCESS="success";var x=function(e,t,n,r,i,o,s,a,l,c){var u=function(e){e.naturalWidth;var t=e.naturalHeight,n=document.createElement("canvas");n.width=1,n.height=t;var r=n.getContext("2d");r.drawImage(e,0,0);for(var i=r.getImageData(1,0,1,t).data,o=0,s=t,a=t;a>o;)0===i[4*(a-1)+3]?s=a:o=a,a=s+o>>1;var l=a/t;return 0===l?1:l}(t);return e.drawImage(t,n,r,i,o,s,a,l,c/u)},E=function(){function e(){d(this,e)}return p(e,null,[{key:"initClass",value:function(){this.KEY_STR="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}},{key:"encode64",value:function(e){for(var t="",n=void 0,r=void 0,i="",o=void 0,s=void 0,a=void 0,l="",c=0;o=(n=e[c++])>>2,s=(3&n)<<4|(r=e[c++])>>4,a=(15&r)<<2|(i=e[c++])>>6,l=63&i,isNaN(r)?a=l=64:isNaN(i)&&(l=64),t=t+this.KEY_STR.charAt(o)+this.KEY_STR.charAt(s)+this.KEY_STR.charAt(a)+this.KEY_STR.charAt(l),n=r=i="",o=s=a=l="",ce.length)break}return n}},{key:"decode64",value:function(e){var t=void 0,n=void 0,r="",i=void 0,o=void 0,s="",a=0,l=[];for(/[^A-Za-z0-9\+\/\=]/g.exec(e)&&console.warn("There were invalid base64 characters in the input text.\nValid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\nExpect errors in decoding."),e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");t=this.KEY_STR.indexOf(e.charAt(a++))<<2|(i=this.KEY_STR.indexOf(e.charAt(a++)))>>4,n=(15&i)<<4|(o=this.KEY_STR.indexOf(e.charAt(a++)))>>2,r=(3&o)<<6|(s=this.KEY_STR.indexOf(e.charAt(a++))),l.push(t),64!==o&&l.push(n),64!==s&&l.push(r),t=n=r="",i=o=s="",at.options.priority?-1:e.options.priority=0;n--)this._subscribers[n].fn!==e&&this._subscribers[n].id!==e||(this._subscribers[n].channel=null,this._subscribers.splice(n,1));else this._subscribers=[];if(t&&this.autoCleanChannel(),n=this._subscribers.length-1,e)for(;n>=0;n--)this._subscribers[n].fn!==e&&this._subscribers[n].id!==e||(this._subscribers[n].channel=null,this._subscribers.splice(n,1));else this._subscribers=[]},t.prototype.autoCleanChannel=function(){if(0===this._subscribers.length){for(var e in this._channels)if(this._channels.hasOwnProperty(e))return;if(null!=this._parent){var t=this.namespace.split(":"),n=t[t.length-1];this._parent.removeChannel(n)}}},t.prototype.removeChannel=function(e){this.hasChannel(e)&&(this._channels[e]=null,delete this._channels[e],this.autoCleanChannel())},t.prototype.publish=function(e){for(var t,n,r,i=0,o=this._subscribers.length,s=!1;i0)for(;i{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";var e=n(295),t=n.n(e),r=n(216);window.Cl=window.Cl||{};class i{constructor(e={}){this.options={linksSelector:".js-toggler-link",dataHeaderSelector:"toggler-header-selector",dataContentSelector:"toggler-content-selector",collapsedClass:"js-collapsed",expandedClass:"js-expanded",hiddenClass:"hidden",...e},this.togglerInstances=[],document.querySelectorAll(this.options.linksSelector).forEach(e=>{const t=new o(e,this.options);this.togglerInstances.push(t)})}destroy(){this.links=null,this.togglerInstances.forEach(e=>e.destroy()),this.togglerInstances=[]}}class o{constructor(e,t={}){this.options={...t},this.link=e,this.headerSelector=this.link.dataset[this.options.dataHeaderSelector],this.contentSelector=this.link.dataset[this.options.dataContentSelector],this.header=document.querySelector(this.headerSelector),this.header=this.header||this.link,this.content=document.querySelector(this.contentSelector),this.content&&this._initLink()}_updateClasses(){this.content.classList.contains(this.options.hiddenClass)?(this.header.classList.remove(this.options.expandedClass),this.header.classList.add(this.options.collapsedClass)):(this.header.classList.add(this.options.expandedClass),this.header.classList.remove(this.options.collapsedClass))}_onTogglerClick(e){this.content.classList.toggle(this.options.hiddenClass),this._updateClasses(),e.preventDefault()}_initLink(){this._updateClasses(),this.link.addEventListener("click",e=>this._onTogglerClick(e))}destroy(){this.options=null,this.link=null}}Cl.Toggler=i,Cl.TogglerConstructor=o;const s=i;n(413);var a=n(628),l=n.n(a);document.addEventListener("DOMContentLoaded",()=>{let e=0,t=1;const n=document.querySelector(".js-upload-button");if(!n)return;const r=document.querySelector(".js-upload-button-disabled"),i=n.dataset.url;if(!i)return;const o=document.querySelector(".js-filer-dropzone-upload-welcome"),s=document.querySelector(".js-filer-dropzone-upload-info-container"),a=document.querySelector(".js-filer-dropzone-upload-info"),c=document.querySelector(".js-filer-dropzone-upload-number"),u=".js-filer-dropzone-progress",d=document.querySelector(".js-filer-dropzone-upload-success"),f=document.querySelector(".js-filer-dropzone-upload-canceled"),p=document.querySelector(".js-filer-dropzone-cancel"),h=document.querySelector(".js-filer-dropzone-info-message"),v="hidden",m=parseInt(n.dataset.maxUploaderConnections||3,10),y=parseInt(n.dataset.maxFilesize||0,10);let g=!1;const b=()=>{c&&(c.textContent=`${t-e}/${t}`)},w=()=>{n&&n.remove()},x=()=>{const e=window.location.toString();window.location.replace(((e,t,n)=>{const r=new RegExp(`([?&])${t}=.*?(&|$)`,"i"),i=-1!==e.indexOf("?")?"&":"?",o=window.location.hash;return(e=e.replace(/#.*$/,"")).match(r)?e.replace(r,`$1${t}=${n}$2`)+o:e+i+t+"="+n+o})(e,"order_by","-modified_at"))};let E;Cl.mediator.subscribe("filer-upload-in-progress",w),n.addEventListener("click",e=>{e.preventDefault()}),l().autoDiscover=!1;try{E=new(l())(n,{url:i,paramName:"file",maxFilesize:y,parallelUploads:m,clickable:n,previewTemplate:"
    ",addRemoveLinks:!1,autoProcessQueue:!0})}catch(e){return void console.error("[Filer Upload] Failed to create Dropzone instance:",e)}E.on("addedfile",n=>{Cl.mediator.remove("filer-upload-in-progress",w),Cl.mediator.publish("filer-upload-in-progress"),e++,t=E.files.length,h&&h.classList.remove(v),o&&o.classList.add(v),d&&d.classList.add(v),s&&s.classList.remove(v),p&&p.classList.remove(v),f&&f.classList.add(v),b()}),E.on("uploadprogress",(e,t)=>{const n=Math.round(t),r=`file-${encodeURIComponent(e.name)}${e.size}${e.lastModified}`,i=document.getElementById(r);let o;if(i){const e=i.querySelector(u);e&&(e.style.width=`${n}%`)}else if(a){o=a.cloneNode(!0);const t=o.querySelector(".js-filer-dropzone-file-name");t&&(t.textContent=e.name);const i=o.querySelector(u);i&&(i.style.width=`${n}%`),o.classList.remove(v),o.setAttribute("id",r),s&&s.appendChild(o)}}),E.on("success",(n,r)=>{const i=`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}`,s=document.getElementById(i);s&&s.remove(),r.error&&(g=!0,window.filerShowError(`${n.name}: ${r.error}`)),e--,b(),0===e&&(t=1,o&&o.classList.add(v),c&&c.classList.add(v),f&&f.classList.add(v),p&&p.classList.add(v),d&&d.classList.remove(v),g?setTimeout(x,1e3):x())}),E.on("error",(n,r)=>{const i=`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}`,s=document.getElementById(i);s&&s.remove(),g=!0,window.filerShowError(`${n.name}: ${r}`),e--,b(),0===e&&(t=1,o&&o.classList.add(v),c&&c.classList.add(v),f&&f.classList.add(v),p&&p.classList.add(v),d&&d.classList.remove(v),setTimeout(x,1e3))}),p&&p.addEventListener("click",e=>{e.preventDefault(),p.classList.add(v),c&&c.classList.add(v),s&&s.classList.add(v),f&&f.classList.remove(v),setTimeout(()=>{window.location.reload()},1e3)}),r&&Cl.filerTooltip&&Cl.filerTooltip(),document.dispatchEvent(new Event("filer-upload-scripts-executed"))}),l()&&(l().autoDiscover=!1),document.addEventListener("DOMContentLoaded",()=>{const e=".js-img-preview",t=".js-filer-dropzone:not(.js-filer-dropzone-base):not(.js-filer-dropzone-folder):not(.js-filer-dropzone-info-message)",n=document.querySelectorAll(t),r=".js-filer-dropzone-progress",i=".js-img-wrapper",o="hidden",s="filer-dropzone-mobile",a="js-object-attached",c=e=>{e.offsetWidth<500?e.classList.add(s):e.classList.remove(s)},u=e=>{try{window.parent.CMS.API.Messages.open({message:e})}catch{window.filerShowError?window.filerShowError(e):alert(e)}},d=function(t){const n=t.dataset.url,s=t.querySelector(".vForeignKeyRawIdAdminField"),d="image"===s?.getAttribute("name"),f=t.querySelector(".js-related-lookup"),p=t.querySelector(".js-related-edit"),h=t.querySelector(".js-filer-dropzone-message"),v=t.querySelector(".filerClearer"),m=t.querySelector(".js-file-selector");t.dropzone||(window.addEventListener("resize",()=>{c(t)}),new(l())(t,{url:n,paramName:"file",maxFiles:1,maxFilesize:t.dataset.maxFilesize,previewTemplate:document.querySelector(".js-filer-dropzone-template")?.innerHTML||"
    ",clickable:!1,addRemoveLinks:!1,init:function(){c(t),this.on("removedfile",()=>{m&&(m.style.display=""),t.classList.remove(a),this.removeAllFiles(),v?.click()}),this.element.querySelectorAll("img").forEach(e=>{e.addEventListener("dragstart",e=>{e.preventDefault()})}),v&&v.addEventListener("click",()=>{t.classList.remove(a)})},maxfilesexceeded:function(){this.removeAllFiles(!0)},drop:function(){this.removeAllFiles(!0),v?.click();const e=t.querySelector(r);e&&e.classList.remove(o),m&&(m.style.display="block"),f?.classList.add("related-lookup-change"),p?.classList.add("related-lookup-change"),h?.classList.add(o),t.classList.remove("dz-drag-hover"),t.classList.add(a)},success:function(n,a){const l=t.querySelector(r);if(l&&l.classList.add(o),n&&"success"===n.status&&a){if(a.file_id&&s){s.value=a.file_id;const e=new Event("change",{bubbles:!0});s.dispatchEvent(e)}if(a.thumbnail_180&&d){const n=t.querySelector(e);n&&(n.style.backgroundImage=`url(${a.thumbnail_180})`);const r=t.querySelector(i);r&&r.classList.remove(o)}}else a&&a.error&&u(`${n.name}: ${a.error}`),this.removeAllFiles(!0);this.element.querySelectorAll("img").forEach(e=>{e.addEventListener("dragstart",e=>{e.preventDefault()})})},error:function(e,t,n){n&&n.error&&(t+=` ; ${n.error}`),u(`${e.name}: ${t}`),this.removeAllFiles(!0)},reset:function(){if(d){const n=t.querySelector(i);n&&n.classList.add(o);const r=t.querySelector(e);r&&(r.style.backgroundImage="none")}if(t.classList.remove(a),s&&(s.value=""),f?.classList.remove("related-lookup-change"),p?.classList.remove("related-lookup-change"),h?.classList.remove(o),s){const e=new Event("change",{bubbles:!0});s.dispatchEvent(e)}}}))};n.length&&l()&&(window.filerDropzoneInitialized||(window.filerDropzoneInitialized=!0,l().autoDiscover=!1),n.forEach(d),document.addEventListener("formset:added",e=>{let n,r,i;e.detail&&e.detail.formsetName?(r=parseInt(document.getElementById(`id_${e.detail.formsetName}-TOTAL_FORMS`).value,10)-1,i=document.getElementById(`${e.detail.formsetName}-${r}`),n=i?.querySelectorAll(t)||[]):(i=e.target,n=i?.querySelectorAll(t)||[]),n?.forEach(d)}))}),document.addEventListener("DOMContentLoaded",()=>{let e=0,t=0;const n=[],r=document.querySelector(".js-filer-dropzone-base"),i=".js-filer-dropzone";let o;const s=document.querySelector(".js-filer-dropzone-info-message"),a=document.querySelector(".js-filer-dropzone-folder-name"),c=document.querySelector(".js-filer-dropzone-upload-info-container"),u=document.querySelector(".js-filer-dropzone-upload-info"),d=document.querySelector(".js-filer-dropzone-upload-welcome"),f=document.querySelector(".js-filer-dropzone-upload-number"),p=document.querySelector(".js-filer-upload-count"),h=document.querySelector(".js-filer-upload-text"),v=".js-filer-dropzone-progress",m=document.querySelector(".js-filer-dropzone-upload-success"),y=document.querySelector(".js-filer-dropzone-upload-canceled"),g=document.querySelector(".js-filer-dropzone-cancel"),b="dz-drag-hover",w=document.querySelector(".drag-hover-border"),x="hidden";let E,S,k,L=!1;const A=()=>{const e=window.location.toString();window.location.replace(((e,t,n)=>{const r=new RegExp(`([?&])${t}=.*?(&|$)`,"i"),i=-1!==e.indexOf("?")?"&":"?",o=window.location.hash;return(e=e.replace(/#.*$/,"")).match(r)?e.replace(r,`$1${t}=${n}$2`)+o:e+i+t+"="+n+o})(e,"order_by","-modified_at"))},C=()=>{f&&(f.textContent=`${t-e}/${t}`),h&&h.classList.remove("hidden"),p&&p.classList.remove("hidden")},_=()=>{n.forEach(e=>{e.destroy()})},T=(e,t)=>document.getElementById(`file-${encodeURIComponent(e.name)}${e.size}${e.lastModified}${t}`);if(r){S=r.dataset.url,k=r.dataset.folderName;const e=document.body;e.dataset.url=S,e.dataset.folderName=k,e.dataset.maxFiles=r.dataset.maxFiles,e.dataset.maxFilesize=r.dataset.maxFilesize,e.classList.add("js-filer-dropzone")}Cl.mediator.subscribe("filer-upload-in-progress",_),o=document.querySelectorAll(i),o.length&&l()&&(l().autoDiscover=!1,o.forEach(r=>{if(r.dropzone)return;const p=r.dataset.url,h=new(l())(r,{url:p,paramName:"file",maxFiles:parseInt(r.dataset.maxFiles)||100,maxFilesize:parseInt(r.dataset.maxFilesize),previewTemplate:"
    ",clickable:!1,addRemoveLinks:!1,parallelUploads:r.dataset["max-uploader-connections"]||3,accept:(n,r)=>{let i;if(Cl.mediator.remove("filer-upload-in-progress",_),Cl.mediator.publish("filer-upload-in-progress"),clearTimeout(E),clearTimeout(E),d&&d.classList.add(x),g&&g.classList.remove(x),T(n,p))r("duplicate");else{i=u.cloneNode(!0);const o=i.querySelector(".js-filer-dropzone-file-name");o&&(o.textContent=n.name);const s=i.querySelector(v);s&&(s.style.width="0"),i.setAttribute("id",`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}${p}`),c&&c.appendChild(i),e++,t++,C(),r()}o.forEach(e=>e.classList.remove("reset-hover")),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b))},dragover:e=>{const t=e.target.closest(i),n=t?.dataset.folderName,l=r.classList.contains("js-filer-dropzone-folder"),c=r.getBoundingClientRect(),u=w?window.getComputedStyle(w):null,d=u?u.borderTopWidth:"0px",f=u?u.borderLeftWidth:"0px",p={top:`${c.top}px`,bottom:`${c.bottom}px`,left:`${c.left}px`,right:`${c.right}px`,width:c.width-2*parseInt(f,10)+"px",height:c.height-2*parseInt(d,10)+"px",display:"block"};l&&w&&Object.assign(w.style,p),o.forEach(e=>e.classList.add("reset-hover")),m&&m.classList.add(x),s&&s.classList.remove(x),r.classList.add(b),r.classList.remove("reset-hover"),a&&n&&(a.textContent=n)},dragend:()=>{clearTimeout(E),E=setTimeout(()=>{s&&s.classList.add(x)},1e3),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b)),w&&Object.assign(w.style,{top:"0",bottom:"0",width:"0",height:"0"})},dragleave:()=>{clearTimeout(E),E=setTimeout(()=>{s&&s.classList.add(x)},1e3),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b)),w&&Object.assign(w.style,{top:"0",bottom:"0",width:"0",height:"0"})},sending:e=>{const t=T(e,p);t&&t.classList.remove(x)},uploadprogress:(e,t)=>{const n=T(e,p);if(n){const e=n.querySelector(v);e&&(e.style.width=`${t}%`)}},success:(t,n)=>{e--,C();const r=T(t,p);r&&r.remove()},queuecomplete:()=>{0===e&&(C(),g&&g.classList.add(x),u&&u.classList.add(x),L?(f&&f.classList.add(x),setTimeout(()=>{A()},1e3)):(m&&m.classList.remove(x),A()))},error:(t,n)=>{if("duplicate"===n)return;e--,C();const r=T(t,p);r&&r.remove(),L=!0,window.filerShowError&&window.filerShowError(`${t.name}: ${n.message||n}`)}});n.push(h),g&&g.addEventListener("click",e=>{e.preventDefault(),g.classList.add(x),y&&y.classList.remove(x),h.removeAllFiles(!0)})}))}),n(117),n(221),n(472),n(902),n(577),window.Cl=window.Cl||{},Cl.mediator=new(t()),Cl.FocalPoint=r.A,Cl.Toggler=s,document.addEventListener("DOMContentLoaded",()=>{let e;window.filerShowError=t=>{const n=document.querySelector(".messagelist"),r=document.querySelector("#header"),i="js-filer-error",o=`
    • {msg}
    `.replace("{msg}",t);n?n.outerHTML=o:r&&r.insertAdjacentHTML("afterend",o),e&&clearTimeout(e),e=setTimeout(()=>{const e=document.querySelector(`.${i}`);e&&e.remove()},5e3)};const t=document.querySelector(".js-filter-files");t&&(t.addEventListener("focus",e=>{const t=e.target.closest(".navigator-top-nav");t&&t.classList.add("search-is-focused")}),t.addEventListener("blur",e=>{const t=e.target.closest(".navigator-top-nav");if(t){const n=t.querySelector(".dropdown-container a");n&&e.relatedTarget===n||t.classList.remove("search-is-focused")}}));const n=document.querySelector(".js-filter-files-container");n&&n.addEventListener("submit",e=>{}),(()=>{const e=document.querySelector(".js-filter-files"),t=".navigator-top-nav",n=document.querySelector(t),r=n?.querySelector(".filter-search-wrapper .filer-dropdown-container");e&&(e.addEventListener("keydown",function(e){e.key;const n=this.closest(t);n&&n.classList.add("search-is-focused")}),r&&(r.addEventListener("show.bs.filer-dropdown",()=>{n&&n.classList.add("search-is-focused")}),r.addEventListener("hide.bs.filer-dropdown",()=>{n&&n.classList.remove("search-is-focused")})))})(),(()=>{const e=document.querySelectorAll(".navigator-table tr, .navigator-list .list-item"),t=document.querySelector(".actions-wrapper"),n=document.querySelectorAll(".action-select, #action-toggle, #files-action-toggle, #folders-action-toggle, .actions .clear a");setTimeout(()=>{n.forEach(e=>{if(e.checked){const t=e.closest(".list-item");t&&t.classList.add("selected")}}),Array.from(e).some(e=>e.classList.contains("selected"))&&t&&t.classList.add("action-selected")},100),n.forEach(n=>{n.addEventListener("change",function(){const n=this.closest(".list-item");n&&(this.checked?n.classList.add("selected"):n.classList.remove("selected")),setTimeout(()=>{const n=Array.from(e).some(e=>e.classList.contains("selected"));t&&(n?t.classList.add("action-selected"):t.classList.remove("action-selected"))},0)})})})(),(()=>{const e=document.querySelector(".js-actions-menu");if(!e)return;const t=e.querySelector(".filer-dropdown-menu"),n=document.querySelector('.actions select[name="action"]'),r=n?.querySelectorAll("option")||[],i=document.querySelector('.actions button[type="submit"]'),o=document.querySelector(".js-action-delete"),s=document.querySelector(".js-action-copy"),a=document.querySelector(".js-action-move"),l="delete_files_or_folders",c="copy_files_and_folders",u="move_files_and_folders",d=document.querySelectorAll(".navigator-table tr, .navigator-list .list-item"),f=(e,t)=>{t&&r.forEach(r=>{r.value===e&&(t.style.display="",t.addEventListener("click",t=>{if(t.preventDefault(),Array.from(d).some(e=>e.classList.contains("selected"))&&n&&i){n.value=e;const t=n.querySelector(`option[value="${e}"]`);t&&(t.selected=!0),i.click()}}))})};f(l,o),f(c,s),f(u,a),r.forEach((e,n)=>{if(0!==n){const n=document.createElement("li"),r=document.createElement("a");r.href="#",r.textContent=e.textContent,e.value!==l&&e.value!==c&&e.value!==u||r.classList.add("hidden"),n.appendChild(r),t&&t.appendChild(n)}}),t&&t.addEventListener("click",e=>{if("A"===e.target.tagName){const r=e.target.closest("li"),o=Array.from(t.querySelectorAll("li")).indexOf(r)+1;if(e.preventDefault(),n&&i){const e=n.querySelectorAll("option");e[o]&&(n.value=e[o].value,e[o].selected=!0),i.click()}}}),e.addEventListener("click",e=>{Array.from(d).some(e=>e.classList.contains("selected"))||(e.preventDefault(),e.stopPropagation())})})(),(()=>{const e=document.querySelector(".navigator-top-nav");if(!e)return;const t=document.querySelector(".breadcrumbs-container");if(!t)return;const n=t.querySelector(".navigator-breadcrumbs"),r=t.querySelector(".filer-dropdown-container"),i=document.querySelector(".filter-files-container"),o=document.querySelector(".actions-wrapper"),s=document.querySelector(".navigator-button-wrapper"),a=n?.offsetWidth||0,l=r?.offsetWidth||0,c=i?.offsetWidth||0,u=o?.offsetWidth||0,d=s?.offsetWidth||0,f=window.getComputedStyle(e),p=parseInt(f.paddingLeft,10)+parseInt(f.paddingRight,10);let h=e.offsetWidth;const v=80+a+l+c+u+d+p,m="breadcrumb-min-width",y=()=>{h{h=e.offsetWidth,y()})})(),(()=>{const e=document.querySelectorAll(".navigator-list .list-item input.action-select"),t=".navigator-list .navigator-folders-body .list-item input.action-select",n=".navigator-list .navigator-files-body .list-item input.action-select",r=document.querySelector("#files-action-toggle"),i=document.querySelector("#folders-action-toggle");i&&i.addEventListener("click",function(){const e=document.querySelectorAll(t);this.checked?e.forEach(e=>{e.checked||e.click()}):e.forEach(e=>{e.checked&&e.click()})}),r&&r.addEventListener("click",function(){const e=document.querySelectorAll(n);this.checked?e.forEach(e=>{e.checked||e.click()}):e.forEach(e=>{e.checked&&e.click()})}),e.forEach(e=>{e.addEventListener("click",function(){const e=document.querySelectorAll(n),o=document.querySelectorAll(t);if(this.checked){const t=Array.from(e).every(e=>e.checked),n=Array.from(o).every(e=>e.checked);t&&r&&(r.checked=!0),n&&i&&(i.checked=!0)}else{const t=Array.from(e).some(e=>!e.checked),n=Array.from(o).some(e=>!e.checked);t&&r&&(r.checked=!1),n&&i&&(i.checked=!1)}})});const o=document.querySelector(".navigator .actions .clear a");o&&o.addEventListener("click",()=>{i&&(i.checked=!1),r&&(r.checked=!1)})})(),document.querySelectorAll(".js-copy-url").forEach(e=>{e.addEventListener("click",function(e){const t=new URL(this.dataset.url,document.location.href),n=this.dataset.msg||"URL copied to clipboard",r=document.createElement("template");e.preventDefault(),document.querySelectorAll(".info.filer-tooltip").forEach(e=>{e.remove()}),navigator.clipboard.writeText(t.href),r.innerHTML=`
    ${n}
    `,this.classList.add("filer-tooltip-wrapper"),this.appendChild(r.content.firstChild);const i=this;setTimeout(()=>{const e=i.querySelector(".info");e&&e.remove()},1200)})}),(new r.A).initialize(),new s})})()})(); \ No newline at end of file +(()=>{var e={117(){"use strict";document.addEventListener("DOMContentLoaded",()=>{const e=document.getElementById("destination");if(!e)return;const t=e.querySelectorAll("option"),n=t.length,r=document.querySelector(".js-submit-copy-move"),i=document.querySelector(".js-disabled-btn-tooltip");1===n&&t[0].disabled&&(r&&(r.style.display="none"),i&&(i.style.display="inline-block")),Cl.filerTooltip&&Cl.filerTooltip()})},413(){"use strict";(()=>{const e="filer-dropdown-backdrop",t='[data-toggle="filer-dropdown"]';class n{constructor(e){this.element=e,e.addEventListener("click",()=>this.toggle())}toggle(){const t=this.element,n=r(t),o=n.classList.contains("open"),s={relatedTarget:t};if(t.disabled||t.classList.contains("disabled"))return!1;if(i(),!o){if("ontouchstart"in document.documentElement&&!n.closest(".navbar-nav")){const n=document.createElement("div");n.className=e,t.parentNode.insertBefore(n,t.nextSibling),n.addEventListener("click",i)}const r=new CustomEvent("show.bs.filer-dropdown",{bubbles:!0,cancelable:!0,detail:s});if(n.dispatchEvent(r),r.defaultPrevented)return!1;t.focus(),t.setAttribute("aria-expanded","true"),n.classList.add("open");const o=new CustomEvent("shown.bs.filer-dropdown",{bubbles:!0,detail:s});n.dispatchEvent(o)}return!1}keydown(e){const n=this.element,i=r(n),o=i.classList.contains("open"),s=Array.from(i.querySelectorAll(".filer-dropdown-menu li:not(.disabled):visible a")).filter(e=>null!==e.offsetParent),a=s.indexOf(e.target);if(!/(38|40|27|32)/.test(e.which)||/input|textarea/i.test(e.target.tagName))return;if(e.preventDefault(),e.stopPropagation(),n.disabled||n.classList.contains("disabled"))return;if(!o&&27!==e.which||o&&27===e.which)return 27===e.which&&i.querySelector(t)?.focus(),n.click();if(!s.length)return;let l=a;38===e.which&&a>0&&l--,40===e.which&&ae.remove()),document.querySelectorAll(t).forEach(e=>{const t=r(e),i={relatedTarget:e};if(!t.classList.contains("open"))return;if(n&&"click"===n.type&&/input|textarea/i.test(n.target.tagName)&&t.contains(n.target))return;const o=new CustomEvent("hide.bs.filer-dropdown",{bubbles:!0,cancelable:!0,detail:i});if(t.dispatchEvent(o),o.defaultPrevented)return;e.setAttribute("aria-expanded","false"),t.classList.remove("open");const s=new CustomEvent("hidden.bs.filer-dropdown",{bubbles:!0,detail:i});t.dispatchEvent(s)}))}function o(e){return this.forEach(t=>{let r=t._filerDropdownInstance;r||(r=new n(t),t._filerDropdownInstance=r),"string"==typeof e&&r[e].call(t)}),this}NodeList.prototype.dropdown||(NodeList.prototype.dropdown=function(e){return o.call(this,e)}),HTMLCollection.prototype.dropdown||(HTMLCollection.prototype.dropdown=function(e){return o.call(this,e)}),document.addEventListener("click",i),document.addEventListener("click",e=>{e.target.closest(".filer-dropdown form")&&e.stopPropagation()}),document.addEventListener("click",e=>{const r=e.target.closest(t);if(r){const t=r._filerDropdownInstance||new n(r);r._filerDropdownInstance||(r._filerDropdownInstance=t),t.toggle(e)}}),document.addEventListener("keydown",e=>{const r=e.target.closest(t);if(r){const t=r._filerDropdownInstance||new n(r);r._filerDropdownInstance||(r._filerDropdownInstance=t),t.keydown(e)}}),document.addEventListener("keydown",e=>{const r=e.target.closest(".filer-dropdown-menu");if(r){const i=r.parentNode.querySelector(t);if(i){const t=i._filerDropdownInstance||new n(i);i._filerDropdownInstance||(i._filerDropdownInstance=t),t.keydown(e)}}}),window.FilerDropdown=n})()},577(){!function(){"use strict";const e=document.getElementById("django-admin-popup-response-constants");let t;if(e)switch(t=JSON.parse(e.dataset.popupResponse),t.action){case"change":opener.dismissRelatedImageLookupPopup(window,t.new_value,null,t.obj,null);break;case"delete":opener.dismissDeleteRelatedObjectPopup(window,t.value);break;default:opener.dismissAddRelatedObjectPopup(window,t.value,t.obj)}}()},216(e,t,n){"use strict";n.d(t,{A:()=>r}),e=n.hmd(e),window.Cl=window.Cl||{},(()=>{class t{constructor(e={}){this.options={containerSelector:".js-focal-point",imageSelector:".js-focal-point-image",circleSelector:".js-focal-point-circle",locationSelector:".js-focal-point-location",draggableClass:"draggable",hiddenClass:"hidden",dataLocation:"locationSelector",...e},this.focalPointInstances=[],this._init=this._init.bind(this)}_init(e){const t=new n(e,this.options);this.focalPointInstances.push(t)}initialize(){document.querySelectorAll(this.options.containerSelector).forEach(e=>{this._init(e)}),window.Cl.mediator&&window.Cl.mediator.subscribe("focal-point:init",this._init)}destroy(){window.Cl.mediator&&window.Cl.mediator.remove("focal-point:init",this._init),this.focalPointInstances.forEach(e=>{e.destroy()}),this.focalPointInstances=[]}}class n{constructor(e,t={}){this.options={imageSelector:".js-focal-point-image",circleSelector:".js-focal-point-circle",locationSelector:".js-focal-point-location",draggableClass:"draggable",hiddenClass:"hidden",dataLocation:"locationSelector",...t},this.container=e,this.image=this.container.querySelector(this.options.imageSelector),this.circle=this.container.querySelector(this.options.circleSelector),this.ratio=parseFloat(this.image?.dataset.ratio||1),this.location=this._getLocation(),this.isDragging=!1,this.dragStartX=0,this.dragStartY=0,this.circleStartX=0,this.circleStartY=0,this._onImageLoaded=this._onImageLoaded.bind(this),this._onMouseDown=this._onMouseDown.bind(this),this._onMouseMove=this._onMouseMove.bind(this),this._onMouseUp=this._onMouseUp.bind(this),this.image?.complete?this._onImageLoaded():this.image&&this.image.addEventListener("load",this._onImageLoaded)}_updateLocationValue(e,t){const n=`${Math.round(e*this.ratio)},${Math.round(t*this.ratio)}`;this.location&&(this.location.value=n)}_getLocation(){const e=this.container.dataset[this.options.dataLocation];if(e){const t=document.querySelector(e);if(t)return t}return this.container.querySelector(this.options.locationSelector)}_makeDraggable(){this.circle&&(this.circle.classList.add(this.options.draggableClass),this.circle.addEventListener("mousedown",this._onMouseDown),this.circle.addEventListener("touchstart",this._onMouseDown,{passive:!1}))}_onMouseDown(e){e.preventDefault(),this.isDragging=!0;const t="touchstart"===e.type?e.touches[0]:e,n=this.container.getBoundingClientRect();this.dragStartX=t.clientX-n.left,this.dragStartY=t.clientY-n.top;const r=this.circle.getBoundingClientRect();this.circleStartX=r.left-n.left+r.width/2,this.circleStartY=r.top-n.top+r.height/2,document.addEventListener("mousemove",this._onMouseMove),document.addEventListener("mouseup",this._onMouseUp),document.addEventListener("touchmove",this._onMouseMove,{passive:!1}),document.addEventListener("touchend",this._onMouseUp)}_onMouseMove(e){if(!this.isDragging)return;e.preventDefault();const t="touchmove"===e.type?e.touches[0]:e,n=this.container.getBoundingClientRect(),r=t.clientX-n.left,i=t.clientY-n.top,o=r-this.dragStartX,s=i-this.dragStartY;let a=this.circleStartX+o,l=this.circleStartY+s;a=Math.max(0,Math.min(n.width-1,a)),l=Math.max(0,Math.min(n.height-1,l)),this.circle.style.left=`${a}px`,this.circle.style.top=`${l}px`,this._updateLocationValue(a,l)}_onMouseUp(){this.isDragging=!1,document.removeEventListener("mousemove",this._onMouseMove),document.removeEventListener("mouseup",this._onMouseUp),document.removeEventListener("touchmove",this._onMouseMove),document.removeEventListener("touchend",this._onMouseUp)}_onImageLoaded(){if(!this.image||0===this.image.naturalWidth)return;this.circle?.classList.remove(this.options.hiddenClass);const e=this.location?.value||"",t=this.image.offsetWidth,n=this.image.offsetHeight;let r,i;if(e.length){const t=e.split(",");r=Math.round(Number(t[0])/this.ratio),i=Math.round(Number(t[1])/this.ratio)}else r=t/2,i=n/2;isNaN(r)||isNaN(i)||(this.circle&&(this.circle.style.left=`${r}px`,this.circle.style.top=`${i}px`),this._makeDraggable(),this._updateLocationValue(r,i))}destroy(){this.circle?.classList.contains(this.options.draggableClass)&&(this.circle.removeEventListener("mousedown",this._onMouseDown),this.circle.removeEventListener("touchstart",this._onMouseDown)),document.removeEventListener("mousemove",this._onMouseMove),document.removeEventListener("mouseup",this._onMouseUp),document.removeEventListener("touchmove",this._onMouseMove),document.removeEventListener("touchend",this._onMouseUp),this.image&&this.image.removeEventListener("load",this._onImageLoaded),this.options=null,this.container=null,this.image=null,this.circle=null,this.location=null,this.ratio=null}}window.Cl.FocalPoint=t,window.Cl.FocalPointConstructor=n,e.exports&&(e.exports=t)})();const r=window.Cl.FocalPoint},902(){"use strict";const e=e=>{const t=(e=(e=e.replace(/__dot__/g,".")).replace(/__dash__/g,"-")).lastIndexOf("__");return-1===t?e:e.substring(0,t)};window.dismissPopupAndReload=e=>{document.location.reload(),e.close()},window.dismissRelatedImageLookupPopup=(t,n,r,i,o)=>{const s=e(t.name),a=document.getElementById(s);if(!a)return;const l=a.closest(".filerFile");if(!l)return;const c=l.querySelector(".edit"),u=l.querySelector(".thumbnail_img"),d=l.querySelector(".description_text"),f=l.querySelector(".filerClearer"),p=l.parentElement.querySelector(".dz-message"),h=l.querySelector("input"),v=h.value;h.value=n;const m=h.closest(".js-filer-dropzone");m&&m.classList.add("js-object-attached"),r&&u&&(u.src=r,u.classList.remove("hidden"),u.removeAttribute("srcset")),d&&(d.textContent=i),f&&f.classList.remove("hidden"),a.classList.add("related-lookup-change"),c&&c.classList.add("related-lookup-change"),o&&c&&c.setAttribute("href",`${o}?_edit_from_widget=1`),p&&p.classList.add("hidden"),v!==n&&h.dispatchEvent(new Event("change",{bubbles:!0})),t.close()},window.dismissRelatedFolderLookupPopup=(t,n,r)=>{const i=e(t.name),o=document.getElementById(i);if(!o)return;const s=o.closest(".filerFile");if(!s)return;const a=s.querySelector(".thumbnail_img"),l=document.getElementById(`id_${i}_clear`),c=document.getElementById(`id_${i}`),u=s.querySelector(".description_text"),d=document.getElementById(i);c&&(c.value=n),a&&a.classList.remove("hidden"),u&&(u.textContent=r),l&&l.classList.remove("hidden"),d&&d.classList.add("hidden"),t.close()},document.addEventListener("DOMContentLoaded",()=>{document.querySelectorAll(".js-dismiss-popup").forEach(e=>{e.addEventListener("click",function(e){e.preventDefault();const t=this.dataset.fileId,n=this.dataset.iconUrl,r=this.dataset.label;if(this.classList.contains("js-dismiss-image")){const e=this.dataset.changeUrl||"";window.opener.dismissRelatedImageLookupPopup(window,t,n,r,e)}else this.classList.contains("js-dismiss-folder")&&window.opener.dismissRelatedFolderLookupPopup(window,t,r)})});const e=document.getElementById("popup-dismiss-data");if(e&&window.opener){const t=e.dataset.pk,n=e.dataset.label;window.opener.dismissRelatedPopup(window,t,n)}})},221(){"use strict";window.Cl=window.Cl||{},Cl.filerTooltip=()=>{const e=".js-filer-tooltip";document.querySelectorAll(e).forEach(t=>{t.addEventListener("mouseover",function(){const t=this.getAttribute("title");if(!t)return;this.dataset.filerTooltip=t,this.removeAttribute("title");const n=document.createElement("p");n.className="filer-tooltip",n.textContent=t;const r=document.querySelector(e);r&&r.appendChild(n)}),t.addEventListener("mouseout",function(){const e=this.dataset.filerTooltip;e&&this.setAttribute("title",e),document.querySelectorAll(".filer-tooltip").forEach(e=>{e.remove()})})})}},472(){"use strict";document.addEventListener("DOMContentLoaded",()=>{const e=e=>{e.preventDefault();const t=e.currentTarget,n=t.closest(".filerFile");if(!n)return;const r=n.querySelector("input"),i=n.querySelector(".thumbnail_img"),o=n.querySelector(".description_text"),s=n.querySelector(".lookup"),a=n.querySelector(".edit"),l=n.parentElement.querySelector(".dz-message"),c="hidden";if(t.classList.add(c),r&&(r.value=""),i){i.classList.add(c);var u=i.parentElement;"A"===u.tagName&&u.removeAttribute("href")}s&&s.classList.remove("related-lookup-change"),a&&a.classList.remove("related-lookup-change"),l&&l.classList.remove(c),o&&(o.textContent="")};document.querySelectorAll(".filerFile .vForeignKeyRawIdAdminField").forEach(e=>{e.setAttribute("type","hidden")}),document.querySelectorAll(".filerFile .filerClearer").forEach(t=>{t.addEventListener("click",e)})})},628(e){var t;self,t=function(){return function(){var e={3099:function(e){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},6077:function(e,t,n){var r=n(111);e.exports=function(e){if(!r(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},1223:function(e,t,n){var r=n(5112),i=n(30),o=n(3070),s=r("unscopables"),a=Array.prototype;null==a[s]&&o.f(a,s,{configurable:!0,value:i(null)}),e.exports=function(e){a[s][e]=!0}},1530:function(e,t,n){"use strict";var r=n(8710).charAt;e.exports=function(e,t,n){return t+(n?r(e,t).length:1)}},5787:function(e){e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e}},9670:function(e,t,n){var r=n(111);e.exports=function(e){if(!r(e))throw TypeError(String(e)+" is not an object");return e}},4019:function(e){e.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},260:function(e,t,n){"use strict";var r,i=n(4019),o=n(9781),s=n(7854),a=n(111),l=n(6656),c=n(648),u=n(8880),d=n(1320),f=n(3070).f,p=n(9518),h=n(7674),v=n(5112),m=n(9711),y=s.Int8Array,g=y&&y.prototype,b=s.Uint8ClampedArray,w=b&&b.prototype,x=y&&p(y),E=g&&p(g),S=Object.prototype,k=S.isPrototypeOf,L=v("toStringTag"),A=m("TYPED_ARRAY_TAG"),C=i&&!!h&&"Opera"!==c(s.opera),_=!1,T={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},F={BigInt64Array:8,BigUint64Array:8},I=function(e){if(!a(e))return!1;var t=c(e);return l(T,t)||l(F,t)};for(r in T)s[r]||(C=!1);if((!C||"function"!=typeof x||x===Function.prototype)&&(x=function(){throw TypeError("Incorrect invocation")},C))for(r in T)s[r]&&h(s[r],x);if((!C||!E||E===S)&&(E=x.prototype,C))for(r in T)s[r]&&h(s[r].prototype,E);if(C&&p(w)!==E&&h(w,E),o&&!l(E,L))for(r in _=!0,f(E,L,{get:function(){return a(this)?this[A]:void 0}}),T)s[r]&&u(s[r],A,r);e.exports={NATIVE_ARRAY_BUFFER_VIEWS:C,TYPED_ARRAY_TAG:_&&A,aTypedArray:function(e){if(I(e))return e;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(e){if(h){if(k.call(x,e))return e}else for(var t in T)if(l(T,r)){var n=s[t];if(n&&(e===n||k.call(n,e)))return e}throw TypeError("Target is not a typed array constructor")},exportTypedArrayMethod:function(e,t,n){if(o){if(n)for(var r in T){var i=s[r];i&&l(i.prototype,e)&&delete i.prototype[e]}E[e]&&!n||d(E,e,n?t:C&&g[e]||t)}},exportTypedArrayStaticMethod:function(e,t,n){var r,i;if(o){if(h){if(n)for(r in T)(i=s[r])&&l(i,e)&&delete i[e];if(x[e]&&!n)return;try{return d(x,e,n?t:C&&y[e]||t)}catch(e){}}for(r in T)!(i=s[r])||i[e]&&!n||d(i,e,t)}},isView:function(e){if(!a(e))return!1;var t=c(e);return"DataView"===t||l(T,t)||l(F,t)},isTypedArray:I,TypedArray:x,TypedArrayPrototype:E}},3331:function(e,t,n){"use strict";var r=n(7854),i=n(9781),o=n(4019),s=n(8880),a=n(2248),l=n(7293),c=n(5787),u=n(9958),d=n(7466),f=n(7067),p=n(1179),h=n(9518),v=n(7674),m=n(8006).f,y=n(3070).f,g=n(1285),b=n(8003),w=n(9909),x=w.get,E=w.set,S="ArrayBuffer",k="DataView",L="prototype",A="Wrong index",C=r[S],_=C,T=r[k],F=T&&T[L],I=Object.prototype,M=r.RangeError,R=p.pack,z=p.unpack,q=function(e){return[255&e]},j=function(e){return[255&e,e>>8&255]},U=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},O=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},P=function(e){return R(e,23,4)},D=function(e){return R(e,52,8)},N=function(e,t){y(e[L],t,{get:function(){return x(this)[t]}})},$=function(e,t,n,r){var i=f(n),o=x(e);if(i+t>o.byteLength)throw M(A);var s=x(o.buffer).bytes,a=i+o.byteOffset,l=s.slice(a,a+t);return r?l:l.reverse()},B=function(e,t,n,r,i,o){var s=f(n),a=x(e);if(s+t>a.byteLength)throw M(A);for(var l=x(a.buffer).bytes,c=s+a.byteOffset,u=r(+i),d=0;dG;)(W=Y[G++])in _||s(_,W,C[W]);H.constructor=_}v&&h(F)!==I&&v(F,I);var Q=new T(new _(2)),X=F.setInt8;Q.setInt8(0,2147483648),Q.setInt8(1,2147483649),!Q.getInt8(0)&&Q.getInt8(1)||a(F,{setInt8:function(e,t){X.call(this,e,t<<24>>24)},setUint8:function(e,t){X.call(this,e,t<<24>>24)}},{unsafe:!0})}else _=function(e){c(this,_,S);var t=f(e);E(this,{bytes:g.call(new Array(t),0),byteLength:t}),i||(this.byteLength=t)},T=function(e,t,n){c(this,T,k),c(e,_,k);var r=x(e).byteLength,o=u(t);if(o<0||o>r)throw M("Wrong offset");if(o+(n=void 0===n?r-o:d(n))>r)throw M("Wrong length");E(this,{buffer:e,byteLength:n,byteOffset:o}),i||(this.buffer=e,this.byteLength=n,this.byteOffset=o)},i&&(N(_,"byteLength"),N(T,"buffer"),N(T,"byteLength"),N(T,"byteOffset")),a(T[L],{getInt8:function(e){return $(this,1,e)[0]<<24>>24},getUint8:function(e){return $(this,1,e)[0]},getInt16:function(e){var t=$(this,2,e,arguments.length>1?arguments[1]:void 0);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=$(this,2,e,arguments.length>1?arguments[1]:void 0);return t[1]<<8|t[0]},getInt32:function(e){return O($(this,4,e,arguments.length>1?arguments[1]:void 0))},getUint32:function(e){return O($(this,4,e,arguments.length>1?arguments[1]:void 0))>>>0},getFloat32:function(e){return z($(this,4,e,arguments.length>1?arguments[1]:void 0),23)},getFloat64:function(e){return z($(this,8,e,arguments.length>1?arguments[1]:void 0),52)},setInt8:function(e,t){B(this,1,e,q,t)},setUint8:function(e,t){B(this,1,e,q,t)},setInt16:function(e,t){B(this,2,e,j,t,arguments.length>2?arguments[2]:void 0)},setUint16:function(e,t){B(this,2,e,j,t,arguments.length>2?arguments[2]:void 0)},setInt32:function(e,t){B(this,4,e,U,t,arguments.length>2?arguments[2]:void 0)},setUint32:function(e,t){B(this,4,e,U,t,arguments.length>2?arguments[2]:void 0)},setFloat32:function(e,t){B(this,4,e,P,t,arguments.length>2?arguments[2]:void 0)},setFloat64:function(e,t){B(this,8,e,D,t,arguments.length>2?arguments[2]:void 0)}});b(_,S),b(T,k),e.exports={ArrayBuffer:_,DataView:T}},1048:function(e,t,n){"use strict";var r=n(7908),i=n(1400),o=n(7466),s=Math.min;e.exports=[].copyWithin||function(e,t){var n=r(this),a=o(n.length),l=i(e,a),c=i(t,a),u=arguments.length>2?arguments[2]:void 0,d=s((void 0===u?a:i(u,a))-c,a-l),f=1;for(c0;)c in n?n[l]=n[c]:delete n[l],l+=f,c+=f;return n}},1285:function(e,t,n){"use strict";var r=n(7908),i=n(1400),o=n(7466);e.exports=function(e){for(var t=r(this),n=o(t.length),s=arguments.length,a=i(s>1?arguments[1]:void 0,n),l=s>2?arguments[2]:void 0,c=void 0===l?n:i(l,n);c>a;)t[a++]=e;return t}},8533:function(e,t,n){"use strict";var r=n(2092).forEach,i=n(9341)("forEach");e.exports=i?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}},8457:function(e,t,n){"use strict";var r=n(9974),i=n(7908),o=n(3411),s=n(7659),a=n(7466),l=n(6135),c=n(1246);e.exports=function(e){var t,n,u,d,f,p,h=i(e),v="function"==typeof this?this:Array,m=arguments.length,y=m>1?arguments[1]:void 0,g=void 0!==y,b=c(h),w=0;if(g&&(y=r(y,m>2?arguments[2]:void 0,2)),null==b||v==Array&&s(b))for(n=new v(t=a(h.length));t>w;w++)p=g?y(h[w],w):h[w],l(n,w,p);else for(f=(d=b.call(h)).next,n=new v;!(u=f.call(d)).done;w++)p=g?o(d,y,[u.value,w],!0):u.value,l(n,w,p);return n.length=w,n}},1318:function(e,t,n){var r=n(5656),i=n(7466),o=n(1400),s=function(e){return function(t,n,s){var a,l=r(t),c=i(l.length),u=o(s,c);if(e&&n!=n){for(;c>u;)if((a=l[u++])!=a)return!0}else for(;c>u;u++)if((e||u in l)&&l[u]===n)return e||u||0;return!e&&-1}};e.exports={includes:s(!0),indexOf:s(!1)}},2092:function(e,t,n){var r=n(9974),i=n(8361),o=n(7908),s=n(7466),a=n(5417),l=[].push,c=function(e){var t=1==e,n=2==e,c=3==e,u=4==e,d=6==e,f=7==e,p=5==e||d;return function(h,v,m,y){for(var g,b,w=o(h),x=i(w),E=r(v,m,3),S=s(x.length),k=0,L=y||a,A=t?L(h,S):n||f?L(h,0):void 0;S>k;k++)if((p||k in x)&&(b=E(g=x[k],k,w),e))if(t)A[k]=b;else if(b)switch(e){case 3:return!0;case 5:return g;case 6:return k;case 2:l.call(A,g)}else switch(e){case 4:return!1;case 7:l.call(A,g)}return d?-1:c||u?u:A}};e.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterOut:c(7)}},6583:function(e,t,n){"use strict";var r=n(5656),i=n(9958),o=n(7466),s=n(9341),a=Math.min,l=[].lastIndexOf,c=!!l&&1/[1].lastIndexOf(1,-0)<0,u=s("lastIndexOf"),d=c||!u;e.exports=d?function(e){if(c)return l.apply(this,arguments)||0;var t=r(this),n=o(t.length),s=n-1;for(arguments.length>1&&(s=a(s,i(arguments[1]))),s<0&&(s=n+s);s>=0;s--)if(s in t&&t[s]===e)return s||0;return-1}:l},1194:function(e,t,n){var r=n(7293),i=n(5112),o=n(7392),s=i("species");e.exports=function(e){return o>=51||!r(function(){var t=[];return(t.constructor={})[s]=function(){return{foo:1}},1!==t[e](Boolean).foo})}},9341:function(e,t,n){"use strict";var r=n(7293);e.exports=function(e,t){var n=[][e];return!!n&&r(function(){n.call(null,t||function(){throw 1},1)})}},3671:function(e,t,n){var r=n(3099),i=n(7908),o=n(8361),s=n(7466),a=function(e){return function(t,n,a,l){r(n);var c=i(t),u=o(c),d=s(c.length),f=e?d-1:0,p=e?-1:1;if(a<2)for(;;){if(f in u){l=u[f],f+=p;break}if(f+=p,e?f<0:d<=f)throw TypeError("Reduce of empty array with no initial value")}for(;e?f>=0:d>f;f+=p)f in u&&(l=n(l,u[f],f,c));return l}};e.exports={left:a(!1),right:a(!0)}},5417:function(e,t,n){var r=n(111),i=n(3157),o=n(5112)("species");e.exports=function(e,t){var n;return i(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!i(n.prototype)?r(n)&&null===(n=n[o])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)}},3411:function(e,t,n){var r=n(9670),i=n(9212);e.exports=function(e,t,n,o){try{return o?t(r(n)[0],n[1]):t(n)}catch(t){throw i(e),t}}},7072:function(e,t,n){var r=n(5112)("iterator"),i=!1;try{var o=0,s={next:function(){return{done:!!o++}},return:function(){i=!0}};s[r]=function(){return this},Array.from(s,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var n=!1;try{var o={};o[r]=function(){return{next:function(){return{done:n=!0}}}},e(o)}catch(e){}return n}},4326:function(e){var t={}.toString;e.exports=function(e){return t.call(e).slice(8,-1)}},648:function(e,t,n){var r=n(1694),i=n(4326),o=n(5112)("toStringTag"),s="Arguments"==i(function(){return arguments}());e.exports=r?i:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),o))?n:s?i(t):"Object"==(r=i(t))&&"function"==typeof t.callee?"Arguments":r}},9920:function(e,t,n){var r=n(6656),i=n(3887),o=n(1236),s=n(3070);e.exports=function(e,t){for(var n=i(t),a=s.f,l=o.f,c=0;c=74)&&(r=s.match(/Chrome\/(\d+)/))&&(i=r[1]),e.exports=i&&+i},748:function(e){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},2109:function(e,t,n){var r=n(7854),i=n(1236).f,o=n(8880),s=n(1320),a=n(3505),l=n(9920),c=n(4705);e.exports=function(e,t){var n,u,d,f,p,h=e.target,v=e.global,m=e.stat;if(n=v?r:m?r[h]||a(h,{}):(r[h]||{}).prototype)for(u in t){if(f=t[u],d=e.noTargetGet?(p=i(n,u))&&p.value:n[u],!c(v?u:h+(m?".":"#")+u,e.forced)&&void 0!==d){if(typeof f==typeof d)continue;l(f,d)}(e.sham||d&&d.sham)&&o(f,"sham",!0),s(n,u,f,e)}}},7293:function(e){e.exports=function(e){try{return!!e()}catch(e){return!0}}},7007:function(e,t,n){"use strict";n(4916);var r=n(1320),i=n(7293),o=n(5112),s=n(2261),a=n(8880),l=o("species"),c=!i(function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")}),u="$0"==="a".replace(/./,"$0"),d=o("replace"),f=!!/./[d]&&""===/./[d]("a","$0"),p=!i(function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]});e.exports=function(e,t,n,d){var h=o(e),v=!i(function(){var t={};return t[h]=function(){return 7},7!=""[e](t)}),m=v&&!i(function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[l]=function(){return n},n.flags="",n[h]=/./[h]),n.exec=function(){return t=!0,null},n[h](""),!t});if(!v||!m||"replace"===e&&(!c||!u||f)||"split"===e&&!p){var y=/./[h],g=n(h,""[e],function(e,t,n,r,i){return t.exec===s?v&&!i?{done:!0,value:y.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}},{REPLACE_KEEPS_$0:u,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:f}),b=g[0],w=g[1];r(String.prototype,e,b),r(RegExp.prototype,h,2==t?function(e,t){return w.call(e,this,t)}:function(e){return w.call(e,this)})}d&&a(RegExp.prototype[h],"sham",!0)}},9974:function(e,t,n){var r=n(3099);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}}},5005:function(e,t,n){var r=n(857),i=n(7854),o=function(e){return"function"==typeof e?e:void 0};e.exports=function(e,t){return arguments.length<2?o(r[e])||o(i[e]):r[e]&&r[e][t]||i[e]&&i[e][t]}},1246:function(e,t,n){var r=n(648),i=n(7497),o=n(5112)("iterator");e.exports=function(e){if(null!=e)return e[o]||e["@@iterator"]||i[r(e)]}},8554:function(e,t,n){var r=n(9670),i=n(1246);e.exports=function(e){var t=i(e);if("function"!=typeof t)throw TypeError(String(e)+" is not iterable");return r(t.call(e))}},647:function(e,t,n){var r=n(7908),i=Math.floor,o="".replace,s=/\$([$&'`]|\d\d?|<[^>]*>)/g,a=/\$([$&'`]|\d\d?)/g;e.exports=function(e,t,n,l,c,u){var d=n+e.length,f=l.length,p=a;return void 0!==c&&(c=r(c),p=s),o.call(u,p,function(r,o){var s;switch(o.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,n);case"'":return t.slice(d);case"<":s=c[o.slice(1,-1)];break;default:var a=+o;if(0===a)return r;if(a>f){var u=i(a/10);return 0===u?r:u<=f?void 0===l[u-1]?o.charAt(1):l[u-1]+o.charAt(1):r}s=l[a-1]}return void 0===s?"":s})}},7854:function(e,t,n){var r=function(e){return e&&e.Math==Math&&e};e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},6656:function(e){var t={}.hasOwnProperty;e.exports=function(e,n){return t.call(e,n)}},3501:function(e){e.exports={}},490:function(e,t,n){var r=n(5005);e.exports=r("document","documentElement")},4664:function(e,t,n){var r=n(9781),i=n(7293),o=n(317);e.exports=!r&&!i(function(){return 7!=Object.defineProperty(o("div"),"a",{get:function(){return 7}}).a})},1179:function(e){var t=Math.abs,n=Math.pow,r=Math.floor,i=Math.log,o=Math.LN2;e.exports={pack:function(e,s,a){var l,c,u,d=new Array(a),f=8*a-s-1,p=(1<>1,v=23===s?n(2,-24)-n(2,-77):0,m=e<0||0===e&&1/e<0?1:0,y=0;for((e=t(e))!=e||e===1/0?(c=e!=e?1:0,l=p):(l=r(i(e)/o),e*(u=n(2,-l))<1&&(l--,u*=2),(e+=l+h>=1?v/u:v*n(2,1-h))*u>=2&&(l++,u/=2),l+h>=p?(c=0,l=p):l+h>=1?(c=(e*u-1)*n(2,s),l+=h):(c=e*n(2,h-1)*n(2,s),l=0));s>=8;d[y++]=255&c,c/=256,s-=8);for(l=l<0;d[y++]=255&l,l/=256,f-=8);return d[--y]|=128*m,d},unpack:function(e,t){var r,i=e.length,o=8*i-t-1,s=(1<>1,l=o-7,c=i-1,u=e[c--],d=127&u;for(u>>=7;l>0;d=256*d+e[c],c--,l-=8);for(r=d&(1<<-l)-1,d>>=-l,l+=t;l>0;r=256*r+e[c],c--,l-=8);if(0===d)d=1-a;else{if(d===s)return r?NaN:u?-1/0:1/0;r+=n(2,t),d-=a}return(u?-1:1)*r*n(2,d-t)}}},8361:function(e,t,n){var r=n(7293),i=n(4326),o="".split;e.exports=r(function(){return!Object("z").propertyIsEnumerable(0)})?function(e){return"String"==i(e)?o.call(e,""):Object(e)}:Object},9587:function(e,t,n){var r=n(111),i=n(7674);e.exports=function(e,t,n){var o,s;return i&&"function"==typeof(o=t.constructor)&&o!==n&&r(s=o.prototype)&&s!==n.prototype&&i(e,s),e}},2788:function(e,t,n){var r=n(5465),i=Function.toString;"function"!=typeof r.inspectSource&&(r.inspectSource=function(e){return i.call(e)}),e.exports=r.inspectSource},9909:function(e,t,n){var r,i,o,s=n(8536),a=n(7854),l=n(111),c=n(8880),u=n(6656),d=n(5465),f=n(6200),p=n(3501),h=a.WeakMap;if(s){var v=d.state||(d.state=new h),m=v.get,y=v.has,g=v.set;r=function(e,t){return t.facade=e,g.call(v,e,t),t},i=function(e){return m.call(v,e)||{}},o=function(e){return y.call(v,e)}}else{var b=f("state");p[b]=!0,r=function(e,t){return t.facade=e,c(e,b,t),t},i=function(e){return u(e,b)?e[b]:{}},o=function(e){return u(e,b)}}e.exports={set:r,get:i,has:o,enforce:function(e){return o(e)?i(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!l(t)||(n=i(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}}},7659:function(e,t,n){var r=n(5112),i=n(7497),o=r("iterator"),s=Array.prototype;e.exports=function(e){return void 0!==e&&(i.Array===e||s[o]===e)}},3157:function(e,t,n){var r=n(4326);e.exports=Array.isArray||function(e){return"Array"==r(e)}},4705:function(e,t,n){var r=n(7293),i=/#|\.prototype\./,o=function(e,t){var n=a[s(e)];return n==c||n!=l&&("function"==typeof t?r(t):!!t)},s=o.normalize=function(e){return String(e).replace(i,".").toLowerCase()},a=o.data={},l=o.NATIVE="N",c=o.POLYFILL="P";e.exports=o},111:function(e){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},1913:function(e){e.exports=!1},7850:function(e,t,n){var r=n(111),i=n(4326),o=n(5112)("match");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[o])?!!t:"RegExp"==i(e))}},9212:function(e,t,n){var r=n(9670);e.exports=function(e){var t=e.return;if(void 0!==t)return r(t.call(e)).value}},3383:function(e,t,n){"use strict";var r,i,o,s=n(7293),a=n(9518),l=n(8880),c=n(6656),u=n(5112),d=n(1913),f=u("iterator"),p=!1;[].keys&&("next"in(o=[].keys())?(i=a(a(o)))!==Object.prototype&&(r=i):p=!0);var h=null==r||s(function(){var e={};return r[f].call(e)!==e});h&&(r={}),d&&!h||c(r,f)||l(r,f,function(){return this}),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:p}},7497:function(e){e.exports={}},133:function(e,t,n){var r=n(7293);e.exports=!!Object.getOwnPropertySymbols&&!r(function(){return!String(Symbol())})},590:function(e,t,n){var r=n(7293),i=n(5112),o=n(1913),s=i("iterator");e.exports=!r(function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,n="";return e.pathname="c%20d",t.forEach(function(e,r){t.delete("b"),n+=r+e}),o&&!e.toJSON||!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[s]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==n||"x"!==new URL("http://x",void 0).host})},8536:function(e,t,n){var r=n(7854),i=n(2788),o=r.WeakMap;e.exports="function"==typeof o&&/native code/.test(i(o))},1574:function(e,t,n){"use strict";var r=n(9781),i=n(7293),o=n(1956),s=n(5181),a=n(5296),l=n(7908),c=n(8361),u=Object.assign,d=Object.defineProperty;e.exports=!u||i(function(){if(r&&1!==u({b:1},u(d({},"a",{enumerable:!0,get:function(){d(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach(function(e){t[e]=e}),7!=u({},e)[n]||o(u({},t)).join("")!=i})?function(e,t){for(var n=l(e),i=arguments.length,u=1,d=s.f,f=a.f;i>u;)for(var p,h=c(arguments[u++]),v=d?o(h).concat(d(h)):o(h),m=v.length,y=0;m>y;)p=v[y++],r&&!f.call(h,p)||(n[p]=h[p]);return n}:u},30:function(e,t,n){var r,i=n(9670),o=n(6048),s=n(748),a=n(3501),l=n(490),c=n(317),u=n(6200),d="prototype",f="script",p=u("IE_PROTO"),h=function(){},v=function(e){return"<"+f+">"+e+""},m=function(){try{r=document.domain&&new ActiveXObject("htmlfile")}catch(e){}var e,t,n;m=r?function(e){e.write(v("")),e.close();var t=e.parentWindow.Object;return e=null,t}(r):(t=c("iframe"),n="java"+f+":",t.style.display="none",l.appendChild(t),t.src=String(n),(e=t.contentWindow.document).open(),e.write(v("document.F=Object")),e.close(),e.F);for(var i=s.length;i--;)delete m[d][s[i]];return m()};a[p]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(h[d]=i(e),n=new h,h[d]=null,n[p]=e):n=m(),void 0===t?n:o(n,t)}},6048:function(e,t,n){var r=n(9781),i=n(3070),o=n(9670),s=n(1956);e.exports=r?Object.defineProperties:function(e,t){o(e);for(var n,r=s(t),a=r.length,l=0;a>l;)i.f(e,n=r[l++],t[n]);return e}},3070:function(e,t,n){var r=n(9781),i=n(4664),o=n(9670),s=n(7593),a=Object.defineProperty;t.f=r?a:function(e,t,n){if(o(e),t=s(t,!0),o(n),i)try{return a(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},1236:function(e,t,n){var r=n(9781),i=n(5296),o=n(9114),s=n(5656),a=n(7593),l=n(6656),c=n(4664),u=Object.getOwnPropertyDescriptor;t.f=r?u:function(e,t){if(e=s(e),t=a(t,!0),c)try{return u(e,t)}catch(e){}if(l(e,t))return o(!i.f.call(e,t),e[t])}},8006:function(e,t,n){var r=n(6324),i=n(748).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,i)}},5181:function(e,t){t.f=Object.getOwnPropertySymbols},9518:function(e,t,n){var r=n(6656),i=n(7908),o=n(6200),s=n(8544),a=o("IE_PROTO"),l=Object.prototype;e.exports=s?Object.getPrototypeOf:function(e){return e=i(e),r(e,a)?e[a]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?l:null}},6324:function(e,t,n){var r=n(6656),i=n(5656),o=n(1318).indexOf,s=n(3501);e.exports=function(e,t){var n,a=i(e),l=0,c=[];for(n in a)!r(s,n)&&r(a,n)&&c.push(n);for(;t.length>l;)r(a,n=t[l++])&&(~o(c,n)||c.push(n));return c}},1956:function(e,t,n){var r=n(6324),i=n(748);e.exports=Object.keys||function(e){return r(e,i)}},5296:function(e,t){"use strict";var n={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,i=r&&!n.call({1:2},1);t.f=i?function(e){var t=r(this,e);return!!t&&t.enumerable}:n},7674:function(e,t,n){var r=n(9670),i=n(6077);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,o){return r(n),i(o),t?e.call(n,o):n.__proto__=o,n}}():void 0)},288:function(e,t,n){"use strict";var r=n(1694),i=n(648);e.exports=r?{}.toString:function(){return"[object "+i(this)+"]"}},3887:function(e,t,n){var r=n(5005),i=n(8006),o=n(5181),s=n(9670);e.exports=r("Reflect","ownKeys")||function(e){var t=i.f(s(e)),n=o.f;return n?t.concat(n(e)):t}},857:function(e,t,n){var r=n(7854);e.exports=r},2248:function(e,t,n){var r=n(1320);e.exports=function(e,t,n){for(var i in t)r(e,i,t[i],n);return e}},1320:function(e,t,n){var r=n(7854),i=n(8880),o=n(6656),s=n(3505),a=n(2788),l=n(9909),c=l.get,u=l.enforce,d=String(String).split("String");(e.exports=function(e,t,n,a){var l,c=!!a&&!!a.unsafe,f=!!a&&!!a.enumerable,p=!!a&&!!a.noTargetGet;"function"==typeof n&&("string"!=typeof t||o(n,"name")||i(n,"name",t),(l=u(n)).source||(l.source=d.join("string"==typeof t?t:""))),e!==r?(c?!p&&e[t]&&(f=!0):delete e[t],f?e[t]=n:i(e,t,n)):f?e[t]=n:s(t,n)})(Function.prototype,"toString",function(){return"function"==typeof this&&c(this).source||a(this)})},7651:function(e,t,n){var r=n(4326),i=n(2261);e.exports=function(e,t){var n=e.exec;if("function"==typeof n){var o=n.call(e,t);if("object"!=typeof o)throw TypeError("RegExp exec method returned something other than an Object or null");return o}if("RegExp"!==r(e))throw TypeError("RegExp#exec called on incompatible receiver");return i.call(e,t)}},2261:function(e,t,n){"use strict";var r,i,o=n(7066),s=n(2999),a=RegExp.prototype.exec,l=String.prototype.replace,c=a,u=(r=/a/,i=/b*/g,a.call(r,"a"),a.call(i,"a"),0!==r.lastIndex||0!==i.lastIndex),d=s.UNSUPPORTED_Y||s.BROKEN_CARET,f=void 0!==/()??/.exec("")[1];(u||f||d)&&(c=function(e){var t,n,r,i,s=this,c=d&&s.sticky,p=o.call(s),h=s.source,v=0,m=e;return c&&(-1===(p=p.replace("y","")).indexOf("g")&&(p+="g"),m=String(e).slice(s.lastIndex),s.lastIndex>0&&(!s.multiline||s.multiline&&"\n"!==e[s.lastIndex-1])&&(h="(?: "+h+")",m=" "+m,v++),n=new RegExp("^(?:"+h+")",p)),f&&(n=new RegExp("^"+h+"$(?!\\s)",p)),u&&(t=s.lastIndex),r=a.call(c?n:s,m),c?r?(r.input=r.input.slice(v),r[0]=r[0].slice(v),r.index=s.lastIndex,s.lastIndex+=r[0].length):s.lastIndex=0:u&&r&&(s.lastIndex=s.global?r.index+r[0].length:t),f&&r&&r.length>1&&l.call(r[0],n,function(){for(i=1;i=c?e?"":void 0:(o=a.charCodeAt(l))<55296||o>56319||l+1===c||(s=a.charCodeAt(l+1))<56320||s>57343?e?a.charAt(l):o:e?a.slice(l,l+2):s-56320+(o-55296<<10)+65536}};e.exports={codeAt:o(!1),charAt:o(!0)}},3197:function(e){"use strict";var t=2147483647,n=/[^\0-\u007E]/,r=/[.\u3002\uFF0E\uFF61]/g,i="Overflow: input needs wider integers to process",o=Math.floor,s=String.fromCharCode,a=function(e){return e+22+75*(e<26)},l=function(e,t,n){var r=0;for(e=n?o(e/700):e>>1,e+=o(e/t);e>455;r+=36)e=o(e/35);return o(r+36*e/(e+38))},c=function(e){var n=[];e=function(e){for(var t=[],n=0,r=e.length;n=55296&&i<=56319&&n=d&&co((t-f)/y))throw RangeError(i);for(f+=(m-d)*y,d=m,r=0;rt)throw RangeError(i);if(c==d){for(var g=f,b=36;;b+=36){var w=b<=p?1:b>=p+26?26:b-p;if(g0?n:t)(e)}},7466:function(e,t,n){var r=n(9958),i=Math.min;e.exports=function(e){return e>0?i(r(e),9007199254740991):0}},7908:function(e,t,n){var r=n(4488);e.exports=function(e){return Object(r(e))}},4590:function(e,t,n){var r=n(3002);e.exports=function(e,t){var n=r(e);if(n%t)throw RangeError("Wrong offset");return n}},3002:function(e,t,n){var r=n(9958);e.exports=function(e){var t=r(e);if(t<0)throw RangeError("The argument can't be less than 0");return t}},7593:function(e,t,n){var r=n(111);e.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},1694:function(e,t,n){var r={};r[n(5112)("toStringTag")]="z",e.exports="[object z]"===String(r)},9843:function(e,t,n){"use strict";var r=n(2109),i=n(7854),o=n(9781),s=n(3832),a=n(260),l=n(3331),c=n(5787),u=n(9114),d=n(8880),f=n(7466),p=n(7067),h=n(4590),v=n(7593),m=n(6656),y=n(648),g=n(111),b=n(30),w=n(7674),x=n(8006).f,E=n(7321),S=n(2092).forEach,k=n(6340),L=n(3070),A=n(1236),C=n(9909),_=n(9587),T=C.get,F=C.set,I=L.f,M=A.f,R=Math.round,z=i.RangeError,q=l.ArrayBuffer,j=l.DataView,U=a.NATIVE_ARRAY_BUFFER_VIEWS,O=a.TYPED_ARRAY_TAG,P=a.TypedArray,D=a.TypedArrayPrototype,N=a.aTypedArrayConstructor,$=a.isTypedArray,B="BYTES_PER_ELEMENT",W="Wrong length",H=function(e,t){for(var n=0,r=t.length,i=new(N(e))(r);r>n;)i[n]=t[n++];return i},Y=function(e,t){I(e,t,{get:function(){return T(this)[t]}})},G=function(e){var t;return e instanceof q||"ArrayBuffer"==(t=y(e))||"SharedArrayBuffer"==t},Q=function(e,t){return $(e)&&"symbol"!=typeof t&&t in e&&String(+t)==String(t)},X=function(e,t){return Q(e,t=v(t,!0))?u(2,e[t]):M(e,t)},V=function(e,t,n){return!(Q(e,t=v(t,!0))&&g(n)&&m(n,"value"))||m(n,"get")||m(n,"set")||n.configurable||m(n,"writable")&&!n.writable||m(n,"enumerable")&&!n.enumerable?I(e,t,n):(e[t]=n.value,e)};o?(U||(A.f=X,L.f=V,Y(D,"buffer"),Y(D,"byteOffset"),Y(D,"byteLength"),Y(D,"length")),r({target:"Object",stat:!0,forced:!U},{getOwnPropertyDescriptor:X,defineProperty:V}),e.exports=function(e,t,n){var o=e.match(/\d+$/)[0]/8,a=e+(n?"Clamped":"")+"Array",l="get"+e,u="set"+e,v=i[a],m=v,y=m&&m.prototype,L={},A=function(e,t){I(e,t,{get:function(){return function(e,t){var n=T(e);return n.view[l](t*o+n.byteOffset,!0)}(this,t)},set:function(e){return function(e,t,r){var i=T(e);n&&(r=(r=R(r))<0?0:r>255?255:255&r),i.view[u](t*o+i.byteOffset,r,!0)}(this,t,e)},enumerable:!0})};U?s&&(m=t(function(e,t,n,r){return c(e,m,a),_(g(t)?G(t)?void 0!==r?new v(t,h(n,o),r):void 0!==n?new v(t,h(n,o)):new v(t):$(t)?H(m,t):E.call(m,t):new v(p(t)),e,m)}),w&&w(m,P),S(x(v),function(e){e in m||d(m,e,v[e])}),m.prototype=y):(m=t(function(e,t,n,r){c(e,m,a);var i,s,l,u=0,d=0;if(g(t)){if(!G(t))return $(t)?H(m,t):E.call(m,t);i=t,d=h(n,o);var v=t.byteLength;if(void 0===r){if(v%o)throw z(W);if((s=v-d)<0)throw z(W)}else if((s=f(r)*o)+d>v)throw z(W);l=s/o}else l=p(t),i=new q(s=l*o);for(F(e,{buffer:i,byteOffset:d,byteLength:s,length:l,view:new j(i)});uo;)a[o]=t[o++];return a}},7321:function(e,t,n){var r=n(7908),i=n(7466),o=n(1246),s=n(7659),a=n(9974),l=n(260).aTypedArrayConstructor;e.exports=function(e){var t,n,c,u,d,f,p=r(e),h=arguments.length,v=h>1?arguments[1]:void 0,m=void 0!==v,y=o(p);if(null!=y&&!s(y))for(f=(d=y.call(p)).next,p=[];!(u=f.call(d)).done;)p.push(u.value);for(m&&h>2&&(v=a(v,arguments[2],2)),n=i(p.length),c=new(l(this))(n),t=0;n>t;t++)c[t]=m?v(p[t],t):p[t];return c}},9711:function(e){var t=0,n=Math.random();e.exports=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++t+n).toString(36)}},3307:function(e,t,n){var r=n(133);e.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},5112:function(e,t,n){var r=n(7854),i=n(2309),o=n(6656),s=n(9711),a=n(133),l=n(3307),c=i("wks"),u=r.Symbol,d=l?u:u&&u.withoutSetter||s;e.exports=function(e){return o(c,e)||(a&&o(u,e)?c[e]=u[e]:c[e]=d("Symbol."+e)),c[e]}},1361:function(e){e.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},8264:function(e,t,n){"use strict";var r=n(2109),i=n(7854),o=n(3331),s=n(6340),a="ArrayBuffer",l=o[a];r({global:!0,forced:i[a]!==l},{ArrayBuffer:l}),s(a)},2222:function(e,t,n){"use strict";var r=n(2109),i=n(7293),o=n(3157),s=n(111),a=n(7908),l=n(7466),c=n(6135),u=n(5417),d=n(1194),f=n(5112),p=n(7392),h=f("isConcatSpreadable"),v=9007199254740991,m="Maximum allowed index exceeded",y=p>=51||!i(function(){var e=[];return e[h]=!1,e.concat()[0]!==e}),g=d("concat"),b=function(e){if(!s(e))return!1;var t=e[h];return void 0!==t?!!t:o(e)};r({target:"Array",proto:!0,forced:!y||!g},{concat:function(e){var t,n,r,i,o,s=a(this),d=u(s,0),f=0;for(t=-1,r=arguments.length;tv)throw TypeError(m);for(n=0;n=v)throw TypeError(m);c(d,f++,o)}return d.length=f,d}})},7327:function(e,t,n){"use strict";var r=n(2109),i=n(2092).filter;r({target:"Array",proto:!0,forced:!n(1194)("filter")},{filter:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}})},2772:function(e,t,n){"use strict";var r=n(2109),i=n(1318).indexOf,o=n(9341),s=[].indexOf,a=!!s&&1/[1].indexOf(1,-0)<0,l=o("indexOf");r({target:"Array",proto:!0,forced:a||!l},{indexOf:function(e){return a?s.apply(this,arguments)||0:i(this,e,arguments.length>1?arguments[1]:void 0)}})},6992:function(e,t,n){"use strict";var r=n(5656),i=n(1223),o=n(7497),s=n(9909),a=n(654),l="Array Iterator",c=s.set,u=s.getterFor(l);e.exports=a(Array,"Array",function(e,t){c(this,{type:l,target:r(e),index:0,kind:t})},function(){var e=u(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}},"values"),o.Arguments=o.Array,i("keys"),i("values"),i("entries")},1249:function(e,t,n){"use strict";var r=n(2109),i=n(2092).map;r({target:"Array",proto:!0,forced:!n(1194)("map")},{map:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}})},7042:function(e,t,n){"use strict";var r=n(2109),i=n(111),o=n(3157),s=n(1400),a=n(7466),l=n(5656),c=n(6135),u=n(5112),d=n(1194)("slice"),f=u("species"),p=[].slice,h=Math.max;r({target:"Array",proto:!0,forced:!d},{slice:function(e,t){var n,r,u,d=l(this),v=a(d.length),m=s(e,v),y=s(void 0===t?v:t,v);if(o(d)&&("function"!=typeof(n=d.constructor)||n!==Array&&!o(n.prototype)?i(n)&&null===(n=n[f])&&(n=void 0):n=void 0,n===Array||void 0===n))return p.call(d,m,y);for(r=new(void 0===n?Array:n)(h(y-m,0)),u=0;m9007199254740991)throw TypeError("Maximum allowed length exceeded");for(u=l(m,r),p=0;py-r+n;p--)delete m[p-1]}else if(n>r)for(p=y-r;p>g;p--)v=p+n-1,(h=p+r-1)in m?m[v]=m[h]:delete m[v];for(p=0;p=n.length?{value:void 0,done:!0}:(e=r(n,i),t.index+=e.length,{value:e,done:!1})})},4723:function(e,t,n){"use strict";var r=n(7007),i=n(9670),o=n(7466),s=n(4488),a=n(1530),l=n(7651);r("match",1,function(e,t,n){return[function(t){var n=s(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var s=i(e),c=String(this);if(!s.global)return l(s,c);var u=s.unicode;s.lastIndex=0;for(var d,f=[],p=0;null!==(d=l(s,c));){var h=String(d[0]);f[p]=h,""===h&&(s.lastIndex=a(c,o(s.lastIndex),u)),p++}return 0===p?null:f}]})},5306:function(e,t,n){"use strict";var r=n(7007),i=n(9670),o=n(7466),s=n(9958),a=n(4488),l=n(1530),c=n(647),u=n(7651),d=Math.max,f=Math.min,p=function(e){return void 0===e?e:String(e)};r("replace",2,function(e,t,n,r){var h=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,v=r.REPLACE_KEEPS_$0,m=h?"$":"$0";return[function(n,r){var i=a(this),o=null==n?void 0:n[e];return void 0!==o?o.call(n,i,r):t.call(String(i),n,r)},function(e,r){if(!h&&v||"string"==typeof r&&-1===r.indexOf(m)){var a=n(t,e,this,r);if(a.done)return a.value}var y=i(e),g=String(this),b="function"==typeof r;b||(r=String(r));var w=y.global;if(w){var x=y.unicode;y.lastIndex=0}for(var E=[];;){var S=u(y,g);if(null===S)break;if(E.push(S),!w)break;""===String(S[0])&&(y.lastIndex=l(g,o(y.lastIndex),x))}for(var k="",L=0,A=0;A=L&&(k+=g.slice(L,_)+R,L=_+C.length)}return k+g.slice(L)}]})},3123:function(e,t,n){"use strict";var r=n(7007),i=n(7850),o=n(9670),s=n(4488),a=n(6707),l=n(1530),c=n(7466),u=n(7651),d=n(2261),f=n(7293),p=[].push,h=Math.min,v=4294967295,m=!f(function(){return!RegExp(v,"y")});r("split",2,function(e,t,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var r=String(s(this)),o=void 0===n?v:n>>>0;if(0===o)return[];if(void 0===e)return[r];if(!i(e))return t.call(r,e,o);for(var a,l,c,u=[],f=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),h=0,m=new RegExp(e.source,f+"g");(a=d.call(m,r))&&!((l=m.lastIndex)>h&&(u.push(r.slice(h,a.index)),a.length>1&&a.index=o));)m.lastIndex===a.index&&m.lastIndex++;return h===r.length?!c&&m.test("")||u.push(""):u.push(r.slice(h)),u.length>o?u.slice(0,o):u}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var i=s(this),o=null==t?void 0:t[e];return void 0!==o?o.call(t,i,n):r.call(String(i),t,n)},function(e,i){var s=n(r,e,this,i,r!==t);if(s.done)return s.value;var d=o(e),f=String(this),p=a(d,RegExp),y=d.unicode,g=(d.ignoreCase?"i":"")+(d.multiline?"m":"")+(d.unicode?"u":"")+(m?"y":"g"),b=new p(m?d:"^(?:"+d.source+")",g),w=void 0===i?v:i>>>0;if(0===w)return[];if(0===f.length)return null===u(b,f)?[f]:[];for(var x=0,E=0,S=[];E2?arguments[2]:void 0)})},8927:function(e,t,n){"use strict";var r=n(260),i=n(2092).every,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("every",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},3105:function(e,t,n){"use strict";var r=n(260),i=n(1285),o=r.aTypedArray;(0,r.exportTypedArrayMethod)("fill",function(e){return i.apply(o(this),arguments)})},5035:function(e,t,n){"use strict";var r=n(260),i=n(2092).filter,o=n(3074),s=r.aTypedArray;(0,r.exportTypedArrayMethod)("filter",function(e){var t=i(s(this),e,arguments.length>1?arguments[1]:void 0);return o(this,t)})},7174:function(e,t,n){"use strict";var r=n(260),i=n(2092).findIndex,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("findIndex",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},4345:function(e,t,n){"use strict";var r=n(260),i=n(2092).find,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("find",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},2846:function(e,t,n){"use strict";var r=n(260),i=n(2092).forEach,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("forEach",function(e){i(o(this),e,arguments.length>1?arguments[1]:void 0)})},4731:function(e,t,n){"use strict";var r=n(260),i=n(1318).includes,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("includes",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},7209:function(e,t,n){"use strict";var r=n(260),i=n(1318).indexOf,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("indexOf",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},6319:function(e,t,n){"use strict";var r=n(7854),i=n(260),o=n(6992),s=n(5112)("iterator"),a=r.Uint8Array,l=o.values,c=o.keys,u=o.entries,d=i.aTypedArray,f=i.exportTypedArrayMethod,p=a&&a.prototype[s],h=!!p&&("values"==p.name||null==p.name),v=function(){return l.call(d(this))};f("entries",function(){return u.call(d(this))}),f("keys",function(){return c.call(d(this))}),f("values",v,!h),f(s,v,!h)},8867:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=[].join;o("join",function(e){return s.apply(i(this),arguments)})},7789:function(e,t,n){"use strict";var r=n(260),i=n(6583),o=r.aTypedArray;(0,r.exportTypedArrayMethod)("lastIndexOf",function(e){return i.apply(o(this),arguments)})},3739:function(e,t,n){"use strict";var r=n(260),i=n(2092).map,o=n(6707),s=r.aTypedArray,a=r.aTypedArrayConstructor;(0,r.exportTypedArrayMethod)("map",function(e){return i(s(this),e,arguments.length>1?arguments[1]:void 0,function(e,t){return new(a(o(e,e.constructor)))(t)})})},4483:function(e,t,n){"use strict";var r=n(260),i=n(3671).right,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("reduceRight",function(e){return i(o(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)})},9368:function(e,t,n){"use strict";var r=n(260),i=n(3671).left,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("reduce",function(e){return i(o(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)})},2056:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=Math.floor;o("reverse",function(){for(var e,t=this,n=i(t).length,r=s(n/2),o=0;o1?arguments[1]:void 0,1),n=this.length,r=s(e),a=i(r.length),c=0;if(a+t>n)throw RangeError("Wrong length");for(;co;)u[o]=n[o++];return u},o(function(){new Int8Array(1).slice()}))},7462:function(e,t,n){"use strict";var r=n(260),i=n(2092).some,o=r.aTypedArray;(0,r.exportTypedArrayMethod)("some",function(e){return i(o(this),e,arguments.length>1?arguments[1]:void 0)})},3824:function(e,t,n){"use strict";var r=n(260),i=r.aTypedArray,o=r.exportTypedArrayMethod,s=[].sort;o("sort",function(e){return s.call(i(this),e)})},5021:function(e,t,n){"use strict";var r=n(260),i=n(7466),o=n(1400),s=n(6707),a=r.aTypedArray;(0,r.exportTypedArrayMethod)("subarray",function(e,t){var n=a(this),r=n.length,l=o(e,r);return new(s(n,n.constructor))(n.buffer,n.byteOffset+l*n.BYTES_PER_ELEMENT,i((void 0===t?r:o(t,r))-l))})},2974:function(e,t,n){"use strict";var r=n(7854),i=n(260),o=n(7293),s=r.Int8Array,a=i.aTypedArray,l=i.exportTypedArrayMethod,c=[].toLocaleString,u=[].slice,d=!!s&&o(function(){c.call(new s(1))});l("toLocaleString",function(){return c.apply(d?u.call(a(this)):a(this),arguments)},o(function(){return[1,2].toLocaleString()!=new s([1,2]).toLocaleString()})||!o(function(){s.prototype.toLocaleString.call([1,2])}))},5016:function(e,t,n){"use strict";var r=n(260).exportTypedArrayMethod,i=n(7293),o=n(7854).Uint8Array,s=o&&o.prototype||{},a=[].toString,l=[].join;i(function(){a.call({})})&&(a=function(){return l.call(this)});var c=s.toString!=a;r("toString",a,c)},2472:function(e,t,n){n(9843)("Uint8",function(e){return function(t,n,r){return e(this,t,n,r)}})},4747:function(e,t,n){var r=n(7854),i=n(8324),o=n(8533),s=n(8880);for(var a in i){var l=r[a],c=l&&l.prototype;if(c&&c.forEach!==o)try{s(c,"forEach",o)}catch(e){c.forEach=o}}},3948:function(e,t,n){var r=n(7854),i=n(8324),o=n(6992),s=n(8880),a=n(5112),l=a("iterator"),c=a("toStringTag"),u=o.values;for(var d in i){var f=r[d],p=f&&f.prototype;if(p){if(p[l]!==u)try{s(p,l,u)}catch(e){p[l]=u}if(p[c]||s(p,c,d),i[d])for(var h in o)if(p[h]!==o[h])try{s(p,h,o[h])}catch(e){p[h]=o[h]}}}},1637:function(e,t,n){"use strict";n(6992);var r=n(2109),i=n(5005),o=n(590),s=n(1320),a=n(2248),l=n(8003),c=n(4994),u=n(9909),d=n(5787),f=n(6656),p=n(9974),h=n(648),v=n(9670),m=n(111),y=n(30),g=n(9114),b=n(8554),w=n(1246),x=n(5112),E=i("fetch"),S=i("Headers"),k=x("iterator"),L="URLSearchParams",A=L+"Iterator",C=u.set,_=u.getterFor(L),T=u.getterFor(A),F=/\+/g,I=Array(4),M=function(e){return I[e-1]||(I[e-1]=RegExp("((?:%[\\da-f]{2}){"+e+"})","gi"))},R=function(e){try{return decodeURIComponent(e)}catch(t){return e}},z=function(e){var t=e.replace(F," "),n=4;try{return decodeURIComponent(t)}catch(e){for(;n;)t=t.replace(M(n--),R);return t}},q=/[!'()~]|%20/g,j={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},U=function(e){return j[e]},O=function(e){return encodeURIComponent(e).replace(q,U)},P=function(e,t){if(t)for(var n,r,i=t.split("&"),o=0;o0?arguments[0]:void 0,u=[];if(C(this,{type:L,entries:u,updateURL:function(){},updateSearchParams:D}),void 0!==c)if(m(c))if("function"==typeof(e=w(c)))for(n=(t=e.call(c)).next;!(r=n.call(t)).done;){if((s=(o=(i=b(v(r.value))).next).call(i)).done||(a=o.call(i)).done||!o.call(i).done)throw TypeError("Expected sequence with length 2");u.push({key:s.value+"",value:a.value+""})}else for(l in c)f(c,l)&&u.push({key:l,value:c[l]+""});else P(u,"string"==typeof c?"?"===c.charAt(0)?c.slice(1):c:c+"")},W=B.prototype;a(W,{append:function(e,t){N(arguments.length,2);var n=_(this);n.entries.push({key:e+"",value:t+""}),n.updateURL()},delete:function(e){N(arguments.length,1);for(var t=_(this),n=t.entries,r=e+"",i=0;ie.key){i.splice(t,0,e);break}t===n&&i.push(e)}r.updateURL()},forEach:function(e){for(var t,n=_(this).entries,r=p(e,arguments.length>1?arguments[1]:void 0,3),i=0;i1&&(m(t=arguments[1])&&(n=t.body,h(n)===L&&((r=t.headers?new S(t.headers):new S).has("content-type")||r.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),t=y(t,{body:g(0,String(n)),headers:g(0,r)}))),i.push(t)),E.apply(this,i)}}),e.exports={URLSearchParams:B,getState:_}},285:function(e,t,n){"use strict";n(8783);var r,i=n(2109),o=n(9781),s=n(590),a=n(7854),l=n(6048),c=n(1320),u=n(5787),d=n(6656),f=n(1574),p=n(8457),h=n(8710).codeAt,v=n(3197),m=n(8003),y=n(1637),g=n(9909),b=a.URL,w=y.URLSearchParams,x=y.getState,E=g.set,S=g.getterFor("URL"),k=Math.floor,L=Math.pow,A="Invalid scheme",C="Invalid host",_="Invalid port",T=/[A-Za-z]/,F=/[\d+-.A-Za-z]/,I=/\d/,M=/^(0x|0X)/,R=/^[0-7]+$/,z=/^\d+$/,q=/^[\dA-Fa-f]+$/,j=/[\u0000\t\u000A\u000D #%/:?@[\\]]/,U=/[\u0000\t\u000A\u000D #/:?@[\\]]/,O=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,P=/[\t\u000A\u000D]/g,D=function(e,t){var n,r,i;if("["==t.charAt(0)){if("]"!=t.charAt(t.length-1))return C;if(!(n=$(t.slice(1,-1))))return C;e.host=n}else if(V(e)){if(t=v(t),j.test(t))return C;if(null===(n=N(t)))return C;e.host=n}else{if(U.test(t))return C;for(n="",r=p(t),i=0;i4)return e;for(n=[],r=0;r1&&"0"==i.charAt(0)&&(o=M.test(i)?16:8,i=i.slice(8==o?1:2)),""===i)s=0;else{if(!(10==o?z:8==o?R:q).test(i))return e;s=parseInt(i,o)}n.push(s)}for(r=0;r=L(256,5-t))return null}else if(s>255)return null;for(a=n.pop(),r=0;r6)return;for(r=0;f();){if(i=null,r>0){if(!("."==f()&&r<4))return;d++}if(!I.test(f()))return;for(;I.test(f());){if(o=parseInt(f(),10),null===i)i=o;else{if(0==i)return;i=10*i+o}if(i>255)return;d++}l[c]=256*l[c]+i,2!=++r&&4!=r||c++}if(4!=r)return;break}if(":"==f()){if(d++,!f())return}else if(f())return;l[c++]=t}else{if(null!==u)return;d++,u=++c}}if(null!==u)for(s=c-u,c=7;0!=c&&s>0;)a=l[c],l[c--]=l[u+s-1],l[u+--s]=a;else if(8!=c)return;return l},B=function(e){var t,n,r,i;if("number"==typeof e){for(t=[],n=0;n<4;n++)t.unshift(e%256),e=k(e/256);return t.join(".")}if("object"==typeof e){for(t="",r=function(e){for(var t=null,n=1,r=null,i=0,o=0;o<8;o++)0!==e[o]?(i>n&&(t=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(t=r,n=i),t}(e),n=0;n<8;n++)i&&0===e[n]||(i&&(i=!1),r===n?(t+=n?":":"::",i=!0):(t+=e[n].toString(16),n<7&&(t+=":")));return"["+t+"]"}return e},W={},H=f({},W,{" ":1,'"':1,"<":1,">":1,"`":1}),Y=f({},H,{"#":1,"?":1,"{":1,"}":1}),G=f({},Y,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),Q=function(e,t){var n=h(e,0);return n>32&&n<127&&!d(t,e)?e:encodeURIComponent(e)},X={ftp:21,file:null,http:80,https:443,ws:80,wss:443},V=function(e){return d(X,e.scheme)},K=function(e){return""!=e.username||""!=e.password},Z=function(e){return!e.host||e.cannotBeABaseURL||"file"==e.scheme},J=function(e,t){var n;return 2==e.length&&T.test(e.charAt(0))&&(":"==(n=e.charAt(1))||!t&&"|"==n)},ee=function(e){var t;return e.length>1&&J(e.slice(0,2))&&(2==e.length||"/"===(t=e.charAt(2))||"\\"===t||"?"===t||"#"===t)},te=function(e){var t=e.path,n=t.length;!n||"file"==e.scheme&&1==n&&J(t[0],!0)||t.pop()},ne=function(e){return"."===e||"%2e"===e.toLowerCase()},re=function(e){return".."===(e=e.toLowerCase())||"%2e."===e||".%2e"===e||"%2e%2e"===e},ie={},oe={},se={},ae={},le={},ce={},ue={},de={},fe={},pe={},he={},ve={},me={},ye={},ge={},be={},we={},xe={},Ee={},Se={},ke={},Le=function(e,t,n,i){var o,s,a,l,c=n||ie,u=0,f="",h=!1,v=!1,m=!1;for(n||(e.scheme="",e.username="",e.password="",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,t=t.replace(O,"")),t=t.replace(P,""),o=p(t);u<=o.length;){switch(s=o[u],c){case ie:if(!s||!T.test(s)){if(n)return A;c=se;continue}f+=s.toLowerCase(),c=oe;break;case oe:if(s&&(F.test(s)||"+"==s||"-"==s||"."==s))f+=s.toLowerCase();else{if(":"!=s){if(n)return A;f="",c=se,u=0;continue}if(n&&(V(e)!=d(X,f)||"file"==f&&(K(e)||null!==e.port)||"file"==e.scheme&&!e.host))return;if(e.scheme=f,n)return void(V(e)&&X[e.scheme]==e.port&&(e.port=null));f="","file"==e.scheme?c=ye:V(e)&&i&&i.scheme==e.scheme?c=ae:V(e)?c=de:"/"==o[u+1]?(c=le,u++):(e.cannotBeABaseURL=!0,e.path.push(""),c=Ee)}break;case se:if(!i||i.cannotBeABaseURL&&"#"!=s)return A;if(i.cannotBeABaseURL&&"#"==s){e.scheme=i.scheme,e.path=i.path.slice(),e.query=i.query,e.fragment="",e.cannotBeABaseURL=!0,c=ke;break}c="file"==i.scheme?ye:ce;continue;case ae:if("/"!=s||"/"!=o[u+1]){c=ce;continue}c=fe,u++;break;case le:if("/"==s){c=pe;break}c=xe;continue;case ce:if(e.scheme=i.scheme,s==r)e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query=i.query;else if("/"==s||"\\"==s&&V(e))c=ue;else if("?"==s)e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query="",c=Se;else{if("#"!=s){e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.path.pop(),c=xe;continue}e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query=i.query,e.fragment="",c=ke}break;case ue:if(!V(e)||"/"!=s&&"\\"!=s){if("/"!=s){e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,c=xe;continue}c=pe}else c=fe;break;case de:if(c=fe,"/"!=s||"/"!=f.charAt(u+1))continue;u++;break;case fe:if("/"!=s&&"\\"!=s){c=pe;continue}break;case pe:if("@"==s){h&&(f="%40"+f),h=!0,a=p(f);for(var y=0;y65535)return _;e.port=V(e)&&w===X[e.scheme]?null:w,f=""}if(n)return;c=we;continue}return _}f+=s;break;case ye:if(e.scheme="file","/"==s||"\\"==s)c=ge;else{if(!i||"file"!=i.scheme){c=xe;continue}if(s==r)e.host=i.host,e.path=i.path.slice(),e.query=i.query;else if("?"==s)e.host=i.host,e.path=i.path.slice(),e.query="",c=Se;else{if("#"!=s){ee(o.slice(u).join(""))||(e.host=i.host,e.path=i.path.slice(),te(e)),c=xe;continue}e.host=i.host,e.path=i.path.slice(),e.query=i.query,e.fragment="",c=ke}}break;case ge:if("/"==s||"\\"==s){c=be;break}i&&"file"==i.scheme&&!ee(o.slice(u).join(""))&&(J(i.path[0],!0)?e.path.push(i.path[0]):e.host=i.host),c=xe;continue;case be:if(s==r||"/"==s||"\\"==s||"?"==s||"#"==s){if(!n&&J(f))c=xe;else if(""==f){if(e.host="",n)return;c=we}else{if(l=D(e,f))return l;if("localhost"==e.host&&(e.host=""),n)return;f="",c=we}continue}f+=s;break;case we:if(V(e)){if(c=xe,"/"!=s&&"\\"!=s)continue}else if(n||"?"!=s)if(n||"#"!=s){if(s!=r&&(c=xe,"/"!=s))continue}else e.fragment="",c=ke;else e.query="",c=Se;break;case xe:if(s==r||"/"==s||"\\"==s&&V(e)||!n&&("?"==s||"#"==s)){if(re(f)?(te(e),"/"==s||"\\"==s&&V(e)||e.path.push("")):ne(f)?"/"==s||"\\"==s&&V(e)||e.path.push(""):("file"==e.scheme&&!e.path.length&&J(f)&&(e.host&&(e.host=""),f=f.charAt(0)+":"),e.path.push(f)),f="","file"==e.scheme&&(s==r||"?"==s||"#"==s))for(;e.path.length>1&&""===e.path[0];)e.path.shift();"?"==s?(e.query="",c=Se):"#"==s&&(e.fragment="",c=ke)}else f+=Q(s,Y);break;case Ee:"?"==s?(e.query="",c=Se):"#"==s?(e.fragment="",c=ke):s!=r&&(e.path[0]+=Q(s,W));break;case Se:n||"#"!=s?s!=r&&("'"==s&&V(e)?e.query+="%27":e.query+="#"==s?"%23":Q(s,W)):(e.fragment="",c=ke);break;case ke:s!=r&&(e.fragment+=Q(s,H))}u++}},Ae=function(e){var t,n,r=u(this,Ae,"URL"),i=arguments.length>1?arguments[1]:void 0,s=String(e),a=E(r,{type:"URL"});if(void 0!==i)if(i instanceof Ae)t=S(i);else if(n=Le(t={},String(i)))throw TypeError(n);if(n=Le(a,s,null,t))throw TypeError(n);var l=a.searchParams=new w,c=x(l);c.updateSearchParams(a.query),c.updateURL=function(){a.query=String(l)||null},o||(r.href=_e.call(r),r.origin=Te.call(r),r.protocol=Fe.call(r),r.username=Ie.call(r),r.password=Me.call(r),r.host=Re.call(r),r.hostname=ze.call(r),r.port=qe.call(r),r.pathname=je.call(r),r.search=Ue.call(r),r.searchParams=Oe.call(r),r.hash=Pe.call(r))},Ce=Ae.prototype,_e=function(){var e=S(this),t=e.scheme,n=e.username,r=e.password,i=e.host,o=e.port,s=e.path,a=e.query,l=e.fragment,c=t+":";return null!==i?(c+="//",K(e)&&(c+=n+(r?":"+r:"")+"@"),c+=B(i),null!==o&&(c+=":"+o)):"file"==t&&(c+="//"),c+=e.cannotBeABaseURL?s[0]:s.length?"/"+s.join("/"):"",null!==a&&(c+="?"+a),null!==l&&(c+="#"+l),c},Te=function(){var e=S(this),t=e.scheme,n=e.port;if("blob"==t)try{return new URL(t.path[0]).origin}catch(e){return"null"}return"file"!=t&&V(e)?t+"://"+B(e.host)+(null!==n?":"+n:""):"null"},Fe=function(){return S(this).scheme+":"},Ie=function(){return S(this).username},Me=function(){return S(this).password},Re=function(){var e=S(this),t=e.host,n=e.port;return null===t?"":null===n?B(t):B(t)+":"+n},ze=function(){var e=S(this).host;return null===e?"":B(e)},qe=function(){var e=S(this).port;return null===e?"":String(e)},je=function(){var e=S(this),t=e.path;return e.cannotBeABaseURL?t[0]:t.length?"/"+t.join("/"):""},Ue=function(){var e=S(this).query;return e?"?"+e:""},Oe=function(){return S(this).searchParams},Pe=function(){var e=S(this).fragment;return e?"#"+e:""},De=function(e,t){return{get:e,set:t,configurable:!0,enumerable:!0}};if(o&&l(Ce,{href:De(_e,function(e){var t=S(this),n=String(e),r=Le(t,n);if(r)throw TypeError(r);x(t.searchParams).updateSearchParams(t.query)}),origin:De(Te),protocol:De(Fe,function(e){var t=S(this);Le(t,String(e)+":",ie)}),username:De(Ie,function(e){var t=S(this),n=p(String(e));if(!Z(t)){t.username="";for(var r=0;re.length)&&(t=e.length);for(var n=0,r=new Array(t);n1?r-1:0),o=1;o=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,a=!0,l=!1;return{s:function(){r=t[Symbol.iterator]()},n:function(){var e=r.next();return a=e.done,e},e:function(e){l=!0,s=e},f:function(){try{a||null==r.return||r.return()}finally{if(l)throw s}}}}(n,!0);try{for(a.s();!(s=a.n()).done;)s.value.apply(this,i)}catch(e){a.e(e)}finally{a.f()}}return this.element&&this.element.dispatchEvent(this.makeEvent("dropzone:"+t,{args:i})),this}},{key:"makeEvent",value:function(e,t){var n={bubbles:!0,cancelable:!0,detail:t};if("function"==typeof window.CustomEvent)return new CustomEvent(e,n);var r=document.createEvent("CustomEvent");return r.initCustomEvent(e,n.bubbles,n.cancelable,n.detail),r}},{key:"off",value:function(e,t){if(!this._callbacks||0===arguments.length)return this._callbacks={},this;var n=this._callbacks[e];if(!n)return this;if(1===arguments.length)return delete this._callbacks[e],this;for(var r=0;r=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,l=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return a=e.done,e},e:function(e){l=!0,o=e},f:function(){try{a||null==n.return||n.return()}finally{if(l)throw o}}}}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n'),this.element.appendChild(e));var i=e.getElementsByTagName("span")[0];return i&&(null!=i.textContent?i.textContent=this.options.dictFallbackMessage:null!=i.innerText&&(i.innerText=this.options.dictFallbackMessage)),this.element.appendChild(this.getFallbackForm())},resize:function(e,t,n,r){var i={srcX:0,srcY:0,srcWidth:e.width,srcHeight:e.height},o=e.width/e.height;null==t&&null==n?(t=i.srcWidth,n=i.srcHeight):null==t?t=n*o:null==n&&(n=t/o);var s=(t=Math.min(t,i.srcWidth))/(n=Math.min(n,i.srcHeight));if(i.srcWidth>t||i.srcHeight>n)if("crop"===r)o>s?(i.srcHeight=e.height,i.srcWidth=i.srcHeight*s):(i.srcWidth=e.width,i.srcHeight=i.srcWidth/s);else{if("contain"!==r)throw new Error("Unknown resizeMethod '".concat(r,"'"));o>s?n=t/o:t=n*o}return i.srcX=(e.width-i.srcWidth)/2,i.srcY=(e.height-i.srcHeight)/2,i.trgWidth=t,i.trgHeight=n,i},transformFile:function(e,t){return(this.options.resizeWidth||this.options.resizeHeight)&&e.type.match(/image.*/)?this.resizeImage(e,this.options.resizeWidth,this.options.resizeHeight,this.options.resizeMethod,t):t(e)},previewTemplate:'
    Check
    Error
    ',drop:function(e){return this.element.classList.remove("dz-drag-hover")},dragstart:function(e){},dragend:function(e){return this.element.classList.remove("dz-drag-hover")},dragenter:function(e){return this.element.classList.add("dz-drag-hover")},dragover:function(e){return this.element.classList.add("dz-drag-hover")},dragleave:function(e){return this.element.classList.remove("dz-drag-hover")},paste:function(e){},reset:function(){return this.element.classList.remove("dz-started")},addedfile:function(e){var t=this;if(this.element===this.previewsContainer&&this.element.classList.add("dz-started"),this.previewsContainer&&!this.options.disablePreviews){e.previewElement=g.createElement(this.options.previewTemplate.trim()),e.previewTemplate=e.previewElement,this.previewsContainer.appendChild(e.previewElement);var n,r=o(e.previewElement.querySelectorAll("[data-dz-name]"),!0);try{for(r.s();!(n=r.n()).done;){var i=n.value;i.textContent=e.name}}catch(e){r.e(e)}finally{r.f()}var s,a=o(e.previewElement.querySelectorAll("[data-dz-size]"),!0);try{for(a.s();!(s=a.n()).done;)(i=s.value).innerHTML=this.filesize(e.size)}catch(e){a.e(e)}finally{a.f()}this.options.addRemoveLinks&&(e._removeLink=g.createElement('
    '.concat(this.options.dictRemoveFile,"")),e.previewElement.appendChild(e._removeLink));var l,c=function(n){return n.preventDefault(),n.stopPropagation(),e.status===g.UPLOADING?g.confirm(t.options.dictCancelUploadConfirmation,function(){return t.removeFile(e)}):t.options.dictRemoveFileConfirmation?g.confirm(t.options.dictRemoveFileConfirmation,function(){return t.removeFile(e)}):t.removeFile(e)},u=o(e.previewElement.querySelectorAll("[data-dz-remove]"),!0);try{for(u.s();!(l=u.n()).done;)l.value.addEventListener("click",c)}catch(e){u.e(e)}finally{u.f()}}},removedfile:function(e){return null!=e.previewElement&&null!=e.previewElement.parentNode&&e.previewElement.parentNode.removeChild(e.previewElement),this._updateMaxFilesReachedClass()},thumbnail:function(e,t){if(e.previewElement){e.previewElement.classList.remove("dz-file-preview");var n,r=o(e.previewElement.querySelectorAll("[data-dz-thumbnail]"),!0);try{for(r.s();!(n=r.n()).done;){var i=n.value;i.alt=e.name,i.src=t}}catch(e){r.e(e)}finally{r.f()}return setTimeout(function(){return e.previewElement.classList.add("dz-image-preview")},1)}},error:function(e,t){if(e.previewElement){e.previewElement.classList.add("dz-error"),"string"!=typeof t&&t.error&&(t=t.error);var n,r=o(e.previewElement.querySelectorAll("[data-dz-errormessage]"),!0);try{for(r.s();!(n=r.n()).done;)n.value.textContent=t}catch(e){r.e(e)}finally{r.f()}}},errormultiple:function(){},processing:function(e){if(e.previewElement&&(e.previewElement.classList.add("dz-processing"),e._removeLink))return e._removeLink.innerHTML=this.options.dictCancelUpload},processingmultiple:function(){},uploadprogress:function(e,t,n){if(e.previewElement){var r,i=o(e.previewElement.querySelectorAll("[data-dz-uploadprogress]"),!0);try{for(i.s();!(r=i.n()).done;){var s=r.value;"PROGRESS"===s.nodeName?s.value=t:s.style.width="".concat(t,"%")}}catch(e){i.e(e)}finally{i.f()}}},totaluploadprogress:function(){},sending:function(){},sendingmultiple:function(){},success:function(e){if(e.previewElement)return e.previewElement.classList.add("dz-success")},successmultiple:function(){},canceled:function(e){return this.emit("error",e,this.options.dictUploadCanceled)},canceledmultiple:function(){},complete:function(e){if(e._removeLink&&(e._removeLink.innerHTML=this.options.dictRemoveFile),e.previewElement)return e.previewElement.classList.add("dz-complete")},completemultiple:function(){},maxfilesexceeded:function(){},maxfilesreached:function(){},queuecomplete:function(){},addedfiles:function(){}};function l(e){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l(e)}function c(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return u(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?u(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return s=e.done,e},e:function(e){a=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n"))),this.clickableElements.length&&function t(){e.hiddenFileInput&&e.hiddenFileInput.parentNode.removeChild(e.hiddenFileInput),e.hiddenFileInput=document.createElement("input"),e.hiddenFileInput.setAttribute("type","file"),(null===e.options.maxFiles||e.options.maxFiles>1)&&e.hiddenFileInput.setAttribute("multiple","multiple"),e.hiddenFileInput.className="dz-hidden-input",null!==e.options.acceptedFiles&&e.hiddenFileInput.setAttribute("accept",e.options.acceptedFiles),null!==e.options.capture&&e.hiddenFileInput.setAttribute("capture",e.options.capture),e.hiddenFileInput.setAttribute("tabindex","-1"),e.hiddenFileInput.style.visibility="hidden",e.hiddenFileInput.style.position="absolute",e.hiddenFileInput.style.top="0",e.hiddenFileInput.style.left="0",e.hiddenFileInput.style.height="0",e.hiddenFileInput.style.width="0",o.getElement(e.options.hiddenInputContainer,"hiddenInputContainer").appendChild(e.hiddenFileInput),e.hiddenFileInput.addEventListener("change",function(){var n=e.hiddenFileInput.files;if(n.length){var r,i=c(n,!0);try{for(i.s();!(r=i.n()).done;){var o=r.value;e.addFile(o)}}catch(e){i.e(e)}finally{i.f()}}e.emit("addedfiles",n),t()})}(),this.URL=null!==window.URL?window.URL:window.webkitURL;var t,n=c(this.events,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.on(r,this.options[r])}}catch(e){n.e(e)}finally{n.f()}this.on("uploadprogress",function(){return e.updateTotalUploadProgress()}),this.on("removedfile",function(){return e.updateTotalUploadProgress()}),this.on("canceled",function(t){return e.emit("complete",t)}),this.on("complete",function(t){if(0===e.getAddedFiles().length&&0===e.getUploadingFiles().length&&0===e.getQueuedFiles().length)return setTimeout(function(){return e.emit("queuecomplete")},0)});var i=function(e){if(function(e){if(e.dataTransfer.types)for(var t=0;t")),n+='');var r=o.createElement(n);return"FORM"!==this.element.tagName?(t=o.createElement('
    '))).appendChild(r):(this.element.setAttribute("enctype","multipart/form-data"),this.element.setAttribute("method",this.options.method)),null!=t?t:r}},{key:"getExistingFallback",value:function(){for(var e=function(e){var t,n=c(e,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;if(/(^| )fallback($| )/.test(r.className))return r}}catch(e){n.e(e)}finally{n.f()}},t=0,n=["div","form"];t0){for(var r=["tb","gb","mb","kb","b"],i=0;i=Math.pow(this.options.filesizeBase,4-i)/10){t=e/Math.pow(this.options.filesizeBase,4-i),n=o;break}}t=Math.round(10*t)/10}return"".concat(t," ").concat(this.options.dictFileSizeUnits[n])}},{key:"_updateMaxFilesReachedClass",value:function(){return null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(this.getAcceptedFiles().length===this.options.maxFiles&&this.emit("maxfilesreached",this.files),this.element.classList.add("dz-max-files-reached")):this.element.classList.remove("dz-max-files-reached")}},{key:"drop",value:function(e){if(e.dataTransfer){this.emit("drop",e);for(var t=[],n=0;n0){var i,o=c(r,!0);try{for(o.s();!(i=o.n()).done;){var s=i.value;s.isFile?s.file(function(e){if(!n.options.ignoreHiddenFiles||"."!==e.name.substring(0,1))return e.fullPath="".concat(t,"/").concat(e.name),n.addFile(e)}):s.isDirectory&&n._addFilesFromDirectory(s,"".concat(t,"/").concat(s.name))}}catch(e){o.e(e)}finally{o.f()}e()}return null},i)}()}},{key:"accept",value:function(e,t){this.options.maxFilesize&&e.size>1024*this.options.maxFilesize*1024?t(this.options.dictFileTooBig.replace("{{filesize}}",Math.round(e.size/1024/10.24)/100).replace("{{maxFilesize}}",this.options.maxFilesize)):o.isValidFile(e,this.options.acceptedFiles)?null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(t(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}",this.options.maxFiles)),this.emit("maxfilesexceeded",e)):this.options.accept.call(this,e,t):t(this.options.dictInvalidFileType)}},{key:"addFile",value:function(e){var t=this;e.upload={uuid:o.uuidv4(),progress:0,total:e.size,bytesSent:0,filename:this._renameFile(e)},this.files.push(e),e.status=o.ADDED,this.emit("addedfile",e),this._enqueueThumbnail(e),this.accept(e,function(n){n?(e.accepted=!1,t._errorProcessing([e],n)):(e.accepted=!0,t.options.autoQueue&&t.enqueueFile(e)),t._updateMaxFilesReachedClass()})}},{key:"enqueueFiles",value:function(e){var t,n=c(e,!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;this.enqueueFile(r)}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"enqueueFile",value:function(e){var t=this;if(e.status!==o.ADDED||!0!==e.accepted)throw new Error("This file can't be queued because it has already been processed or was rejected.");if(e.status=o.QUEUED,this.options.autoProcessQueue)return setTimeout(function(){return t.processQueue()},0)}},{key:"_enqueueThumbnail",value:function(e){var t=this;if(this.options.createImageThumbnails&&e.type.match(/image.*/)&&e.size<=1024*this.options.maxThumbnailFilesize*1024)return this._thumbnailQueue.push(e),setTimeout(function(){return t._processThumbnailQueue()},0)}},{key:"_processThumbnailQueue",value:function(){var e=this;if(!this._processingThumbnail&&0!==this._thumbnailQueue.length){this._processingThumbnail=!0;var t=this._thumbnailQueue.shift();return this.createThumbnail(t,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,!0,function(n){return e.emit("thumbnail",t,n),e._processingThumbnail=!1,e._processThumbnailQueue()})}}},{key:"removeFile",value:function(e){if(e.status===o.UPLOADING&&this.cancelUpload(e),this.files=b(this.files,e),this.emit("removedfile",e),0===this.files.length)return this.emit("reset")}},{key:"removeAllFiles",value:function(e){null==e&&(e=!1);var t,n=c(this.files.slice(),!0);try{for(n.s();!(t=n.n()).done;){var r=t.value;(r.status!==o.UPLOADING||e)&&this.removeFile(r)}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"resizeImage",value:function(e,t,n,r,i){var s=this;return this.createThumbnail(e,t,n,r,!0,function(t,n){if(null==n)return i(e);var r=s.options.resizeMimeType;null==r&&(r=e.type);var a=n.toDataURL(r,s.options.resizeQuality);return"image/jpeg"!==r&&"image/jpg"!==r||(a=E.restore(e.dataURL,a)),i(o.dataURItoBlob(a))})}},{key:"createThumbnail",value:function(e,t,n,r,i,o){var s=this,a=new FileReader;a.onload=function(){e.dataURL=a.result,"image/svg+xml"!==e.type?s.createThumbnailFromUrl(e,t,n,r,i,o):null!=o&&o(a.result)},a.readAsDataURL(e)}},{key:"displayExistingFile",value:function(e,t,n,r){var i=this,o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4];this.emit("addedfile",e),this.emit("complete",e),o?(e.dataURL=t,this.createThumbnailFromUrl(e,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,this.options.fixOrientation,function(t){i.emit("thumbnail",e,t),n&&n()},r)):(this.emit("thumbnail",e,t),n&&n())}},{key:"createThumbnailFromUrl",value:function(e,t,n,r,i,o,s){var a=this,l=document.createElement("img");return s&&(l.crossOrigin=s),i="from-image"!=getComputedStyle(document.body).imageOrientation&&i,l.onload=function(){var s=function(e){return e(1)};return"undefined"!=typeof EXIF&&null!==EXIF&&i&&(s=function(e){return EXIF.getData(l,function(){return e(EXIF.getTag(this,"Orientation"))})}),s(function(i){e.width=l.width,e.height=l.height;var s=a.options.resize.call(a,e,t,n,r),c=document.createElement("canvas"),u=c.getContext("2d");switch(c.width=s.trgWidth,c.height=s.trgHeight,i>4&&(c.width=s.trgHeight,c.height=s.trgWidth),i){case 2:u.translate(c.width,0),u.scale(-1,1);break;case 3:u.translate(c.width,c.height),u.rotate(Math.PI);break;case 4:u.translate(0,c.height),u.scale(1,-1);break;case 5:u.rotate(.5*Math.PI),u.scale(1,-1);break;case 6:u.rotate(.5*Math.PI),u.translate(0,-c.width);break;case 7:u.rotate(.5*Math.PI),u.translate(c.height,-c.width),u.scale(-1,1);break;case 8:u.rotate(-.5*Math.PI),u.translate(-c.height,0)}x(u,l,null!=s.srcX?s.srcX:0,null!=s.srcY?s.srcY:0,s.srcWidth,s.srcHeight,null!=s.trgX?s.trgX:0,null!=s.trgY?s.trgY:0,s.trgWidth,s.trgHeight);var d=c.toDataURL("image/png");if(null!=o)return o(d,c)})},null!=o&&(l.onerror=o),l.src=e.dataURL}},{key:"processQueue",value:function(){var e=this.options.parallelUploads,t=this.getUploadingFiles().length,n=t;if(!(t>=e)){var r=this.getQueuedFiles();if(r.length>0){if(this.options.uploadMultiple)return this.processFiles(r.slice(0,e-t));for(;n1?t-1:0),r=1;rt.options.chunkSize),e[0].upload.totalChunkCount=Math.ceil(r.size/t.options.chunkSize)}if(e[0].upload.chunked){var i=e[0],s=n[0];i.upload.chunks=[];var a=function(){for(var n=0;void 0!==i.upload.chunks[n];)n++;if(!(n>=i.upload.totalChunkCount)){var r=n*t.options.chunkSize,a=Math.min(r+t.options.chunkSize,s.size),l={name:t._getParamName(0),data:s.webkitSlice?s.webkitSlice(r,a):s.slice(r,a),filename:i.upload.filename,chunkIndex:n};i.upload.chunks[n]={file:i,index:n,dataBlock:l,status:o.UPLOADING,progress:0,retries:0},t._uploadData(e,[l])}};if(i.upload.finishedChunkUpload=function(n,r){var s=!0;n.status=o.SUCCESS,n.dataBlock=null,n.xhr=null;for(var l=0;l1?t-1:0),r=1;r=s;a?o++:o--)i[o]=t.charCodeAt(o);return new Blob([r],{type:n})};var b=function(e,t){return e.filter(function(e){return e!==t}).map(function(e){return e})},w=function(e){return e.replace(/[\-_](\w)/g,function(e){return e.charAt(1).toUpperCase()})};g.createElement=function(e){var t=document.createElement("div");return t.innerHTML=e,t.childNodes[0]},g.elementInside=function(e,t){if(e===t)return!0;for(;e=e.parentNode;)if(e===t)return!0;return!1},g.getElement=function(e,t){var n;if("string"==typeof e?n=document.querySelector(e):null!=e.nodeType&&(n=e),null==n)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector or a plain HTML element."));return n},g.getElements=function(e,t){var n,r;if(e instanceof Array){r=[];try{var i,o=c(e,!0);try{for(o.s();!(i=o.n()).done;)n=i.value,r.push(this.getElement(n,t))}catch(e){o.e(e)}finally{o.f()}}catch(e){r=null}}else if("string"==typeof e){r=[];var s,a=c(document.querySelectorAll(e),!0);try{for(a.s();!(s=a.n()).done;)n=s.value,r.push(n)}catch(e){a.e(e)}finally{a.f()}}else null!=e.nodeType&&(r=[e]);if(null==r||!r.length)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector, a plain HTML element or a list of those."));return r},g.confirm=function(e,t,n){return window.confirm(e)?t():null!=n?n():void 0},g.isValidFile=function(e,t){if(!t)return!0;t=t.split(",");var n,r=e.type,i=r.replace(/\/.*$/,""),o=c(t,!0);try{for(o.s();!(n=o.n()).done;){var s=n.value;if("."===(s=s.trim()).charAt(0)){if(-1!==e.name.toLowerCase().indexOf(s.toLowerCase(),e.name.length-s.length))return!0}else if(/\/\*$/.test(s)){if(i===s.replace(/\/.*$/,""))return!0}else if(r===s)return!0}}catch(e){o.e(e)}finally{o.f()}return!1},"undefined"!=typeof jQuery&&null!==jQuery&&(jQuery.fn.dropzone=function(e){return this.each(function(){return new g(this,e)})}),g.ADDED="added",g.QUEUED="queued",g.ACCEPTED=g.QUEUED,g.UPLOADING="uploading",g.PROCESSING=g.UPLOADING,g.CANCELED="canceled",g.ERROR="error",g.SUCCESS="success";var x=function(e,t,n,r,i,o,s,a,l,c){var u=function(e){e.naturalWidth;var t=e.naturalHeight,n=document.createElement("canvas");n.width=1,n.height=t;var r=n.getContext("2d");r.drawImage(e,0,0);for(var i=r.getImageData(1,0,1,t).data,o=0,s=t,a=t;a>o;)0===i[4*(a-1)+3]?s=a:o=a,a=s+o>>1;var l=a/t;return 0===l?1:l}(t);return e.drawImage(t,n,r,i,o,s,a,l,c/u)},E=function(){function e(){d(this,e)}return p(e,null,[{key:"initClass",value:function(){this.KEY_STR="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}},{key:"encode64",value:function(e){for(var t="",n=void 0,r=void 0,i="",o=void 0,s=void 0,a=void 0,l="",c=0;o=(n=e[c++])>>2,s=(3&n)<<4|(r=e[c++])>>4,a=(15&r)<<2|(i=e[c++])>>6,l=63&i,isNaN(r)?a=l=64:isNaN(i)&&(l=64),t=t+this.KEY_STR.charAt(o)+this.KEY_STR.charAt(s)+this.KEY_STR.charAt(a)+this.KEY_STR.charAt(l),n=r=i="",o=s=a=l="",ce.length)break}return n}},{key:"decode64",value:function(e){var t=void 0,n=void 0,r="",i=void 0,o=void 0,s="",a=0,l=[];for(/[^A-Za-z0-9\+\/\=]/g.exec(e)&&console.warn("There were invalid base64 characters in the input text.\nValid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\nExpect errors in decoding."),e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");t=this.KEY_STR.indexOf(e.charAt(a++))<<2|(i=this.KEY_STR.indexOf(e.charAt(a++)))>>4,n=(15&i)<<4|(o=this.KEY_STR.indexOf(e.charAt(a++)))>>2,r=(3&o)<<6|(s=this.KEY_STR.indexOf(e.charAt(a++))),l.push(t),64!==o&&l.push(n),64!==s&&l.push(r),t=n=r="",i=o=s="",at.options.priority?-1:e.options.priority=0;n--)this._subscribers[n].fn!==e&&this._subscribers[n].id!==e||(this._subscribers[n].channel=null,this._subscribers.splice(n,1));else this._subscribers=[];if(t&&this.autoCleanChannel(),n=this._subscribers.length-1,e)for(;n>=0;n--)this._subscribers[n].fn!==e&&this._subscribers[n].id!==e||(this._subscribers[n].channel=null,this._subscribers.splice(n,1));else this._subscribers=[]},t.prototype.autoCleanChannel=function(){if(0===this._subscribers.length){for(var e in this._channels)if(this._channels.hasOwnProperty(e))return;if(null!=this._parent){var t=this.namespace.split(":"),n=t[t.length-1];this._parent.removeChannel(n)}}},t.prototype.removeChannel=function(e){this.hasChannel(e)&&(this._channels[e]=null,delete this._channels[e],this.autoCleanChannel())},t.prototype.publish=function(e){for(var t,n,r,i=0,o=this._subscribers.length,s=!1;i0)for(;i{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";var e=n(295),t=n.n(e),r=n(216);window.Cl=window.Cl||{};class i{constructor(e={}){this.options={linksSelector:".js-toggler-link",dataHeaderSelector:"toggler-header-selector",dataContentSelector:"toggler-content-selector",collapsedClass:"js-collapsed",expandedClass:"js-expanded",hiddenClass:"hidden",...e},this.togglerInstances=[],document.querySelectorAll(this.options.linksSelector).forEach(e=>{const t=new o(e,this.options);this.togglerInstances.push(t)})}destroy(){this.links=null,this.togglerInstances.forEach(e=>e.destroy()),this.togglerInstances=[]}}class o{constructor(e,t={}){this.options={...t},this.link=e,this.headerSelector=this.link.dataset[this.options.dataHeaderSelector],this.contentSelector=this.link.dataset[this.options.dataContentSelector],this.header=document.querySelector(this.headerSelector),this.header=this.header||this.link,this.content=document.querySelector(this.contentSelector),this.content&&this._initLink()}_updateClasses(){this.content.classList.contains(this.options.hiddenClass)?(this.header.classList.remove(this.options.expandedClass),this.header.classList.add(this.options.collapsedClass)):(this.header.classList.add(this.options.expandedClass),this.header.classList.remove(this.options.collapsedClass))}_onTogglerClick(e){this.content.classList.toggle(this.options.hiddenClass),this._updateClasses(),e.preventDefault()}_initLink(){this._updateClasses(),this.link.addEventListener("click",e=>this._onTogglerClick(e))}destroy(){this.options=null,this.link=null}}Cl.Toggler=i,Cl.TogglerConstructor=o;const s=i;n(413);var a=n(628),l=n.n(a);document.addEventListener("DOMContentLoaded",()=>{let e=0,t=1;const n=document.querySelector(".js-upload-button");if(!n)return;const r=document.querySelector(".js-upload-button-disabled"),i=n.dataset.url;if(!i)return;const o=document.querySelector(".js-filer-dropzone-upload-welcome"),s=document.querySelector(".js-filer-dropzone-upload-info-container"),a=document.querySelector(".js-filer-dropzone-upload-info"),c=document.querySelector(".js-filer-dropzone-upload-number"),u=".js-filer-dropzone-progress",d=document.querySelector(".js-filer-dropzone-upload-success"),f=document.querySelector(".js-filer-dropzone-upload-canceled"),p=document.querySelector(".js-filer-dropzone-cancel"),h=document.querySelector(".js-filer-dropzone-info-message"),v="hidden",m=parseInt(n.dataset.maxUploaderConnections||3,10),y=parseInt(n.dataset.maxFilesize||0,10);let g=!1;const b=()=>{c&&(c.textContent=`${t-e}/${t}`)},w=()=>{n&&n.remove()},x=()=>{const e=window.location.toString();window.location.replace(((e,t,n)=>{const r=new RegExp(`([?&])${t}=.*?(&|$)`,"i"),i=-1!==e.indexOf("?")?"&":"?",o=window.location.hash;return(e=e.replace(/#.*$/,"")).match(r)?e.replace(r,`$1${t}=${n}$2`)+o:e+i+t+"="+n+o})(e,"order_by","-modified_at"))};let E;Cl.mediator.subscribe("filer-upload-in-progress",w),n.addEventListener("click",e=>{e.preventDefault()}),l().autoDiscover=!1;try{E=new(l())(n,{url:i,paramName:"file",maxFilesize:y,parallelUploads:m,clickable:n,previewTemplate:"
    ",addRemoveLinks:!1,autoProcessQueue:!0})}catch(e){return void console.error("[Filer Upload] Failed to create Dropzone instance:",e)}E.on("addedfile",n=>{Cl.mediator.remove("filer-upload-in-progress",w),Cl.mediator.publish("filer-upload-in-progress"),e++,t=E.files.length,h&&h.classList.remove(v),o&&o.classList.add(v),d&&d.classList.add(v),s&&s.classList.remove(v),p&&p.classList.remove(v),f&&f.classList.add(v),b()}),E.on("uploadprogress",(e,t)=>{const n=Math.round(t),r=`file-${encodeURIComponent(e.name)}${e.size}${e.lastModified}`,i=document.getElementById(r);let o;if(i){const e=i.querySelector(u);e&&(e.style.width=`${n}%`)}else if(a){o=a.cloneNode(!0);const t=o.querySelector(".js-filer-dropzone-file-name");t&&(t.textContent=e.name);const i=o.querySelector(u);i&&(i.style.width=`${n}%`),o.classList.remove(v),o.setAttribute("id",r),s&&s.appendChild(o)}}),E.on("success",(n,r)=>{const i=`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}`,s=document.getElementById(i);s&&s.remove(),r.error&&(g=!0,window.filerShowError(`${n.name}: ${r.error}`)),e--,b(),0===e&&(t=1,o&&o.classList.add(v),c&&c.classList.add(v),f&&f.classList.add(v),p&&p.classList.add(v),d&&d.classList.remove(v),g?setTimeout(x,1e3):x())}),E.on("error",(n,r)=>{const i=`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}`,s=document.getElementById(i);s&&s.remove(),g=!0,window.filerShowError(`${n.name}: ${r}`),e--,b(),0===e&&(t=1,o&&o.classList.add(v),c&&c.classList.add(v),f&&f.classList.add(v),p&&p.classList.add(v),d&&d.classList.remove(v),setTimeout(x,1e3))}),p&&p.addEventListener("click",e=>{e.preventDefault(),p.classList.add(v),c&&c.classList.add(v),s&&s.classList.add(v),f&&f.classList.remove(v),setTimeout(()=>{window.location.reload()},1e3)}),r&&Cl.filerTooltip&&Cl.filerTooltip(),document.dispatchEvent(new Event("filer-upload-scripts-executed"))}),l()&&(l().autoDiscover=!1),document.addEventListener("DOMContentLoaded",()=>{const e=".js-img-preview",t=".js-filer-dropzone:not(.js-filer-dropzone-base):not(.js-filer-dropzone-folder):not(.js-filer-dropzone-info-message)",n=document.querySelectorAll(t),r=".js-filer-dropzone-progress",i=".js-img-wrapper",o="hidden",s="filer-dropzone-mobile",a="js-object-attached",c=e=>{e.offsetWidth<500?e.classList.add(s):e.classList.remove(s)},u=e=>{try{window.parent.CMS.API.Messages.open({message:e})}catch{window.filerShowError?window.filerShowError(e):alert(e)}},d=function(t){const n=t.dataset.url,s=t.querySelector(".vForeignKeyRawIdAdminField"),d="image"===s?.getAttribute("name"),f=t.querySelector(".js-related-lookup"),p=t.querySelector(".js-related-edit"),h=t.querySelector(".js-filer-dropzone-message"),v=t.querySelector(".filerClearer"),m=t.querySelector(".js-file-selector");t.dropzone||(window.addEventListener("resize",()=>{c(t)}),new(l())(t,{url:n,paramName:"file",maxFiles:1,maxFilesize:t.dataset.maxFilesize,previewTemplate:document.querySelector(".js-filer-dropzone-template")?.innerHTML||"
    ",clickable:!1,addRemoveLinks:!1,init:function(){c(t),this.on("removedfile",()=>{m&&(m.style.display=""),t.classList.remove(a),this.removeAllFiles(),v?.click()}),this.element.querySelectorAll("img").forEach(e=>{e.addEventListener("dragstart",e=>{e.preventDefault()})}),v&&v.addEventListener("click",()=>{t.classList.remove(a)})},maxfilesexceeded:function(){this.removeAllFiles(!0)},drop:function(){this.removeAllFiles(!0),v?.click();const e=t.querySelector(r);e&&e.classList.remove(o),m&&(m.style.display="block"),f?.classList.add("related-lookup-change"),p?.classList.add("related-lookup-change"),h?.classList.add(o),t.classList.remove("dz-drag-hover"),t.classList.add(a)},success:function(n,a){const l=t.querySelector(r);if(l&&l.classList.add(o),n&&"success"===n.status&&a){if(a.file_id&&s){s.value=a.file_id;const e=new Event("change",{bubbles:!0});s.dispatchEvent(e)}if(a.thumbnail_180&&d){const n=t.querySelector(e);n&&(n.style.backgroundImage=`url(${a.thumbnail_180})`);const r=t.querySelector(i);r&&r.classList.remove(o)}}else a&&a.error&&u(`${n.name}: ${a.error}`),this.removeAllFiles(!0);this.element.querySelectorAll("img").forEach(e=>{e.addEventListener("dragstart",e=>{e.preventDefault()})})},error:function(e,t,n){n&&n.error&&(t+=` ; ${n.error}`),u(`${e.name}: ${t}`),this.removeAllFiles(!0)},reset:function(){if(d){const n=t.querySelector(i);n&&n.classList.add(o);const r=t.querySelector(e);r&&(r.style.backgroundImage="none")}if(t.classList.remove(a),s&&(s.value=""),f?.classList.remove("related-lookup-change"),p?.classList.remove("related-lookup-change"),h?.classList.remove(o),s){const e=new Event("change",{bubbles:!0});s.dispatchEvent(e)}}}))};n.length&&l()&&(window.filerDropzoneInitialized||(window.filerDropzoneInitialized=!0,l().autoDiscover=!1),n.forEach(d),document.addEventListener("formset:added",e=>{let n,r,i;e.detail&&e.detail.formsetName?(r=parseInt(document.getElementById(`id_${e.detail.formsetName}-TOTAL_FORMS`).value,10)-1,i=document.getElementById(`${e.detail.formsetName}-${r}`),n=i?.querySelectorAll(t)||[]):(i=e.target,n=i?.querySelectorAll(t)||[]),n?.forEach(d)}))}),document.addEventListener("DOMContentLoaded",()=>{let e=0,t=0;const n=[],r=document.querySelector(".js-filer-dropzone-base"),i=".js-filer-dropzone";let o;const s=document.querySelector(".js-filer-dropzone-info-message"),a=document.querySelector(".js-filer-dropzone-folder-name"),c=document.querySelector(".js-filer-dropzone-upload-info-container"),u=document.querySelector(".js-filer-dropzone-upload-info"),d=document.querySelector(".js-filer-dropzone-upload-welcome"),f=document.querySelector(".js-filer-dropzone-upload-number"),p=document.querySelector(".js-filer-upload-count"),h=document.querySelector(".js-filer-upload-text"),v=".js-filer-dropzone-progress",m=document.querySelector(".js-filer-dropzone-upload-success"),y=document.querySelector(".js-filer-dropzone-upload-canceled"),g=document.querySelector(".js-filer-dropzone-cancel"),b="dz-drag-hover",w=document.querySelector(".drag-hover-border"),x="hidden";let E,S,k,L=!1;const A=()=>{const e=window.location.toString();window.location.replace(((e,t,n)=>{const r=new RegExp(`([?&])${t}=.*?(&|$)`,"i"),i=-1!==e.indexOf("?")?"&":"?",o=window.location.hash;return(e=e.replace(/#.*$/,"")).match(r)?e.replace(r,`$1${t}=${n}$2`)+o:e+i+t+"="+n+o})(e,"order_by","-modified_at"))},C=()=>{f&&(f.textContent=`${t-e}/${t}`),h&&h.classList.remove("hidden"),p&&p.classList.remove("hidden")},_=()=>{n.forEach(e=>{e.destroy()})},T=(e,t)=>document.getElementById(`file-${encodeURIComponent(e.name)}${e.size}${e.lastModified}${t}`);if(r){S=r.dataset.url,k=r.dataset.folderName;const e=document.body;e.dataset.url=S,e.dataset.folderName=k,e.dataset.maxFiles=r.dataset.maxFiles,e.dataset.maxFilesize=r.dataset.maxFilesize,e.classList.add("js-filer-dropzone")}Cl.mediator.subscribe("filer-upload-in-progress",_),o=document.querySelectorAll(i),o.length&&l()&&(l().autoDiscover=!1,o.forEach(r=>{if(r.dropzone)return;const p=r.dataset.url,h=new(l())(r,{url:p,paramName:"file",maxFiles:parseInt(r.dataset.maxFiles)||100,maxFilesize:parseInt(r.dataset.maxFilesize),previewTemplate:"
    ",clickable:!1,addRemoveLinks:!1,parallelUploads:r.dataset["max-uploader-connections"]||3,accept:(n,r)=>{let i;if(Cl.mediator.remove("filer-upload-in-progress",_),Cl.mediator.publish("filer-upload-in-progress"),clearTimeout(E),clearTimeout(E),d&&d.classList.add(x),g&&g.classList.remove(x),T(n,p))r("duplicate");else{i=u.cloneNode(!0);const o=i.querySelector(".js-filer-dropzone-file-name");o&&(o.textContent=n.name);const s=i.querySelector(v);s&&(s.style.width="0"),i.setAttribute("id",`file-${encodeURIComponent(n.name)}${n.size}${n.lastModified}${p}`),c&&c.appendChild(i),e++,t++,C(),r()}o.forEach(e=>e.classList.remove("reset-hover")),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b))},dragover:e=>{const t=e.target.closest(i),n=t?.dataset.folderName,l=r.classList.contains("js-filer-dropzone-folder"),c=r.getBoundingClientRect(),u=w?window.getComputedStyle(w):null,d=u?u.borderTopWidth:"0px",f=u?u.borderLeftWidth:"0px",p={top:`${c.top}px`,bottom:`${c.bottom}px`,left:`${c.left}px`,right:`${c.right}px`,width:c.width-2*parseInt(f,10)+"px",height:c.height-2*parseInt(d,10)+"px",display:"block"};l&&w&&Object.assign(w.style,p),o.forEach(e=>e.classList.add("reset-hover")),m&&m.classList.add(x),s&&s.classList.remove(x),r.classList.add(b),r.classList.remove("reset-hover"),a&&n&&(a.textContent=n)},dragend:()=>{clearTimeout(E),E=setTimeout(()=>{s&&s.classList.add(x)},1e3),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b)),w&&Object.assign(w.style,{top:"0",bottom:"0",width:"0",height:"0"})},dragleave:()=>{clearTimeout(E),E=setTimeout(()=>{s&&s.classList.add(x)},1e3),s&&s.classList.remove(x),o.forEach(e=>e.classList.remove(b)),w&&Object.assign(w.style,{top:"0",bottom:"0",width:"0",height:"0"})},sending:e=>{const t=T(e,p);t&&t.classList.remove(x)},uploadprogress:(e,t)=>{const n=T(e,p);if(n){const e=n.querySelector(v);e&&(e.style.width=`${t}%`)}},success:(t,n)=>{e--,C();const r=T(t,p);r&&r.remove(),n&&n.error&&(L=!0,window.filerShowError&&window.filerShowError(`${t.name}: ${n.error}`))},queuecomplete:()=>{0===e&&(C(),g&&g.classList.add(x),u&&u.classList.add(x),L?(f&&f.classList.add(x),setTimeout(()=>{A()},1e3)):(m&&m.classList.remove(x),A()))},error:(t,n)=>{if("duplicate"===n)return;e--,C();const r=T(t,p);r&&r.remove(),L=!0,window.filerShowError&&window.filerShowError(`${t.name}: ${n.message||n}`)}});n.push(h),g&&g.addEventListener("click",e=>{e.preventDefault(),g.classList.add(x),y&&y.classList.remove(x),h.removeAllFiles(!0)})}))}),n(117),n(221),n(472),n(902),n(577),window.Cl=window.Cl||{},Cl.mediator=new(t()),Cl.FocalPoint=r.A,Cl.Toggler=s,document.addEventListener("DOMContentLoaded",()=>{let e;window.filerShowError=t=>{const n=document.querySelector(".messagelist"),r=document.querySelector("#header"),i="js-filer-error",o=`
    • {msg}
    `.replace("{msg}",t);n?n.outerHTML=o:r&&r.insertAdjacentHTML("afterend",o),e&&clearTimeout(e),e=setTimeout(()=>{const e=document.querySelector(`.${i}`);e&&e.remove()},5e3)};const t=document.querySelector(".js-filter-files");t&&(t.addEventListener("focus",e=>{const t=e.target.closest(".navigator-top-nav");t&&t.classList.add("search-is-focused")}),t.addEventListener("blur",e=>{const t=e.target.closest(".navigator-top-nav");if(t){const n=t.querySelector(".dropdown-container a");n&&e.relatedTarget===n||t.classList.remove("search-is-focused")}}));const n=document.querySelector(".js-filter-files-container");n&&n.addEventListener("submit",e=>{}),(()=>{const e=document.querySelector(".js-filter-files"),t=".navigator-top-nav",n=document.querySelector(t),r=n?.querySelector(".filter-search-wrapper .filer-dropdown-container");e&&(e.addEventListener("keydown",function(e){e.key;const n=this.closest(t);n&&n.classList.add("search-is-focused")}),r&&(r.addEventListener("show.bs.filer-dropdown",()=>{n&&n.classList.add("search-is-focused")}),r.addEventListener("hide.bs.filer-dropdown",()=>{n&&n.classList.remove("search-is-focused")})))})(),(()=>{const e=document.querySelectorAll(".navigator-table tr, .navigator-list .list-item"),t=document.querySelector(".actions-wrapper"),n=document.querySelectorAll(".action-select, #action-toggle, #files-action-toggle, #folders-action-toggle, .actions .clear a");setTimeout(()=>{n.forEach(e=>{if(e.checked){const t=e.closest(".list-item");t&&t.classList.add("selected")}}),Array.from(e).some(e=>e.classList.contains("selected"))&&t&&t.classList.add("action-selected")},100),n.forEach(n=>{n.addEventListener("change",function(){const n=this.closest(".list-item");n&&(this.checked?n.classList.add("selected"):n.classList.remove("selected")),setTimeout(()=>{const n=Array.from(e).some(e=>e.classList.contains("selected"));t&&(n?t.classList.add("action-selected"):t.classList.remove("action-selected"))},0)})})})(),(()=>{const e=document.querySelector(".js-actions-menu");if(!e)return;const t=e.querySelector(".filer-dropdown-menu"),n=document.querySelector('.actions select[name="action"]'),r=n?.querySelectorAll("option")||[],i=document.querySelector('.actions button[type="submit"]'),o=document.querySelector(".js-action-delete"),s=document.querySelector(".js-action-copy"),a=document.querySelector(".js-action-move"),l="delete_files_or_folders",c="copy_files_and_folders",u="move_files_and_folders",d=document.querySelectorAll(".navigator-table tr, .navigator-list .list-item"),f=(e,t)=>{t&&r.forEach(r=>{r.value===e&&(t.style.display="",t.addEventListener("click",t=>{if(t.preventDefault(),Array.from(d).some(e=>e.classList.contains("selected"))&&n&&i){n.value=e;const t=n.querySelector(`option[value="${e}"]`);t&&(t.selected=!0),i.click()}}))})};f(l,o),f(c,s),f(u,a),r.forEach((e,n)=>{if(0!==n){const n=document.createElement("li"),r=document.createElement("a");r.href="#",r.textContent=e.textContent,e.value!==l&&e.value!==c&&e.value!==u||r.classList.add("hidden"),n.appendChild(r),t&&t.appendChild(n)}}),t&&t.addEventListener("click",e=>{if("A"===e.target.tagName){const r=e.target.closest("li"),o=Array.from(t.querySelectorAll("li")).indexOf(r)+1;if(e.preventDefault(),n&&i){const e=n.querySelectorAll("option");e[o]&&(n.value=e[o].value,e[o].selected=!0),i.click()}}}),e.addEventListener("click",e=>{Array.from(d).some(e=>e.classList.contains("selected"))||(e.preventDefault(),e.stopPropagation())})})(),(()=>{const e=document.querySelector(".navigator-top-nav");if(!e)return;const t=document.querySelector(".breadcrumbs-container");if(!t)return;const n=t.querySelector(".navigator-breadcrumbs"),r=t.querySelector(".filer-dropdown-container"),i=document.querySelector(".filter-files-container"),o=document.querySelector(".actions-wrapper"),s=document.querySelector(".navigator-button-wrapper"),a=n?.offsetWidth||0,l=r?.offsetWidth||0,c=i?.offsetWidth||0,u=o?.offsetWidth||0,d=s?.offsetWidth||0,f=window.getComputedStyle(e),p=parseInt(f.paddingLeft,10)+parseInt(f.paddingRight,10);let h=e.offsetWidth;const v=80+a+l+c+u+d+p,m="breadcrumb-min-width",y=()=>{h{h=e.offsetWidth,y()})})(),(()=>{const e=document.querySelectorAll(".navigator-list .list-item input.action-select"),t=".navigator-list .navigator-folders-body .list-item input.action-select",n=".navigator-list .navigator-files-body .list-item input.action-select",r=document.querySelector("#files-action-toggle"),i=document.querySelector("#folders-action-toggle");i&&i.addEventListener("click",function(){const e=document.querySelectorAll(t);this.checked?e.forEach(e=>{e.checked||e.click()}):e.forEach(e=>{e.checked&&e.click()})}),r&&r.addEventListener("click",function(){const e=document.querySelectorAll(n);this.checked?e.forEach(e=>{e.checked||e.click()}):e.forEach(e=>{e.checked&&e.click()})}),e.forEach(e=>{e.addEventListener("click",function(){const e=document.querySelectorAll(n),o=document.querySelectorAll(t);if(this.checked){const t=Array.from(e).every(e=>e.checked),n=Array.from(o).every(e=>e.checked);t&&r&&(r.checked=!0),n&&i&&(i.checked=!0)}else{const t=Array.from(e).some(e=>!e.checked),n=Array.from(o).some(e=>!e.checked);t&&r&&(r.checked=!1),n&&i&&(i.checked=!1)}})});const o=document.querySelector(".navigator .actions .clear a");o&&o.addEventListener("click",()=>{i&&(i.checked=!1),r&&(r.checked=!1)})})(),document.querySelectorAll(".js-copy-url").forEach(e=>{e.addEventListener("click",function(e){const t=new URL(this.dataset.url,document.location.href),n=this.dataset.msg||"URL copied to clipboard",r=document.createElement("template");e.preventDefault(),document.querySelectorAll(".info.filer-tooltip").forEach(e=>{e.remove()}),navigator.clipboard.writeText(t.href),r.innerHTML=`
    ${n}
    `,this.classList.add("filer-tooltip-wrapper"),this.appendChild(r.content.firstChild);const i=this;setTimeout(()=>{const e=i.querySelector(".info");e&&e.remove()},1200)})}),(new r.A).initialize(),new s})})()})(); \ No newline at end of file diff --git a/test_image_upload.py b/test_image_upload.py new file mode 100644 index 000000000..0c1f4cdac --- /dev/null +++ b/test_image_upload.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python3 +"""Test uploading images through the full ajax_upload flow to find what fails.""" +import os +os.environ['DJANGO_SETTINGS_MODULE'] = 'test_settings' +import django; django.setup() +from django.conf import settings; settings.ALLOWED_HOSTS = ['*'] + +from django.core.management import call_command +call_command('migrate', '--run-syncdb', verbosity=0) + +from django.contrib.auth.models import User +from django.core.files.uploadedfile import SimpleUploadedFile +from django.test.client import Client +from django.urls import reverse +from filer.models.filemodels import File +from filer.models.foldermodels import Folder +from filer.models.clipboardmodels import Clipboard, ClipboardItem +from PIL import Image as PILImage +import io, json + +user = User.objects.filter(username='imgtest').first() +if not user: + user = User.objects.create_superuser('imgtest', 'a@a.com', 'secret') + +folder, _ = Folder.objects.get_or_create(name='img_test', owner=user) + +client = Client() +client.login(username='imgtest', password='secret') + +def test_upload(name, data, content_type): + """Test uploading through ajax_upload endpoint.""" + ClipboardItem.objects.filter(clipboard__user=user).delete() + upload = SimpleUploadedFile(name, data, content_type=content_type) + url = reverse('admin:filer-ajax_upload', kwargs={'folder_id': folder.pk}) + response = client.post(url, {'file': upload}) + result = json.loads(response.content.decode()) + success = 'file_id' in result + return success, result + +# Test 1: Normal JPEG +print("=" * 60) +print("Test 1: Standard JPEG image") +buf = io.BytesIO() +img = PILImage.new('RGB', (800, 600), color='red') +img.save(buf, format='JPEG') +ok, res = test_upload('test1.jpg', buf.getvalue(), 'image/jpeg') +print(f" Result: {'PASS' if ok else 'FAIL'} - {res}") + +# Test 2: WebP image saved as .jpg +print("\nTest 2: WebP image saved with .jpg extension") +buf = io.BytesIO() +img = PILImage.new('RGB', (800, 600), color='blue') +img.save(buf, format='WEBP') +ok, res = test_upload('test2.jpg', buf.getvalue(), 'image/webp') +print(f" Result: {'PASS' if ok else 'FAIL'} - {res}") + +# Test 3: WebP image with .webp extension +print("\nTest 3: WebP image with proper .webp extension") +buf = io.BytesIO() +img = PILImage.new('RGB', (800, 600), color='green') +img.save(buf, format='WEBP') +ok, res = test_upload('test3.webp', buf.getvalue(), 'image/webp') +print(f" Result: {'PASS' if ok else 'FAIL'} - {res}") + +# Test 4: JPEG image with no extension +print("\nTest 4: JPEG image with no extension") +buf = io.BytesIO() +img = PILImage.new('RGB', (800, 600), color='yellow') +img.save(buf, format='JPEG') +ok, res = test_upload('image_no_ext', buf.getvalue(), 'image/jpeg') +print(f" Result: {'PASS' if ok else 'FAIL'} - {res}") + +# Test 5: Large JPEG image (high resolution) +print("\nTest 5: Large JPEG (4000x3000)") +buf = io.BytesIO() +img = PILImage.new('RGB', (4000, 3000), color='purple') +img.save(buf, format='JPEG') +ok, res = test_upload('test5_large.jpg', buf.getvalue(), 'image/jpeg') +print(f" Result: {'PASS' if ok else 'FAIL'} - {res}") + +# Test 6: JPEG with long filename +print("\nTest 6: JPEG with very long filename") +buf = io.BytesIO() +img = PILImage.new('RGB', (800, 600), color='orange') +img.save(buf, format='JPEG') +long_name = 'a' * 200 + '.jpg' +ok, res = test_upload(long_name, buf.getvalue(), 'image/jpeg') +print(f" Result: {'PASS' if ok else 'FAIL'} - {res}") + +# Test 7: JPEG with EXIF data +print("\nTest 7: JPEG with EXIF orientation data") +buf = io.BytesIO() +img = PILImage.new('RGB', (800, 600), color='cyan') +try: + import piexif + exif_dict = {"0th": {piexif.ImageIFD.Orientation: 6}} + exif_bytes = piexif.dump(exif_dict) + img.save(buf, format='JPEG', exif=exif_bytes) +except ImportError: + print(" (piexif not available, using plain JPEG)") + img.save(buf, format='JPEG') +ok, res = test_upload('test7_exif.jpg', buf.getvalue(), 'image/jpeg') +print(f" Result: {'PASS' if ok else 'FAIL'} - {res}") + +# Test 8: image/jpg non-standard MIME type +print("\nTest 8: Non-standard image/jpg MIME type") +buf = io.BytesIO() +img = PILImage.new('RGB', (800, 600), color='pink') +img.save(buf, format='JPEG') +ok, res = test_upload('test8.jpg', buf.getvalue(), 'image/jpg') +print(f" Result: {'PASS' if ok else 'FAIL'} - {res}") + +# Test 9: JFIF extension +print("\nTest 9: JPEG with .jfif extension") +buf = io.BytesIO() +img = PILImage.new('RGB', (800, 600), color='brown') +img.save(buf, format='JPEG') +ok, res = test_upload('test9.jfif', buf.getvalue(), 'image/jpeg') +print(f" Result: {'PASS' if ok else 'FAIL'} - {res}") + From 5e8e393bccdbed4922745525220e34a1f1f69c6b Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Thu, 11 Jun 2026 09:05:00 +0300 Subject: [PATCH 700/715] BEN-2954: bump-my-version added and configed with makefile --- .bumpversion.toml | 35 +++++++++++++++++++++++++++++++++++ Makefile | 29 +++++++++++++++++++---------- 2 files changed, 54 insertions(+), 10 deletions(-) create mode 100755 .bumpversion.toml diff --git a/.bumpversion.toml b/.bumpversion.toml new file mode 100755 index 000000000..278ffb298 --- /dev/null +++ b/.bumpversion.toml @@ -0,0 +1,35 @@ +[tool.bumpversion] +current_version = "3.4.4+pbs.4.dev.gdc8739a0.20260611" +commit = false +tag = false +parse = """(?x) + (?P0|[1-9]\\d*)\\. + (?P0|[1-9]\\d*)\\. + (?P0|[1-9]\\d*) + \\+pbs\\. + (?P0|[1-9]\\d*) + (?: + \\.(?Pdev) + \\.g[0-9a-f]{7,40} + \\.\\d{8} + )? +""" + +serialize = [ + "{major}.{minor}.{patch}+pbs.{pbs}.{prekind}.g{$GITHUB_SHA}.{now:%Y%m%d}", + "{major}.{minor}.{patch}+pbs.{pbs}" +] + + +[tool.bumpversion.parts.prekind] +values = [ + "", + "dev" +] +optional_value = "" + + +[[tool.bumpversion.files]] +filename = "filer/__init__.py" +search = "{current_version}" +replace = "{new_version}" diff --git a/Makefile b/Makefile index 42b7ab51c..7d137356d 100644 --- a/Makefile +++ b/Makefile @@ -3,32 +3,41 @@ help: ## This help. @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n\nTargets:\n"} /^[a-zA-Z_-]+:.*?##/ { printf " \033[36m%-10s\033[0m %s\n", $$1, $$2 }' $(MAKEFILE_LIST) .DEFAULT_GOAL := help +.PHONY: bump-pbs bump-prekind + IMAGE_NAME := django-filer-test CONTAINER_NAME := django-filer-test-run SHELL:=/bin/bash -## Build the test Docker image -test-build: +test-build: ## Build the test Docker image docker build -f Dockerfile.test -t $(IMAGE_NAME) . -## Run unit tests in a Docker container -test: +test: ## Run unit tests in a Docker container @if [ -z "$$(docker images -q $(IMAGE_NAME) 2>/dev/null)" ]; then \ echo "Image not found, building..."; \ $(MAKE) test-build; \ fi docker run --rm --name $(CONTAINER_NAME) $(IMAGE_NAME) -## Run tests with verbose output and stop on first failure -test-verbose: test-build +test-verbose: test-build ## Run tests with verbose output and stop on first failure docker run --rm --name $(CONTAINER_NAME) $(IMAGE_NAME) \ pytest -vx --ds=filer.test_settings --pyargs filer.tests -## Open a shell in the test container (useful for debugging) -test-shell: test-build +test-shell: test-build ## Open a shell in the test container (useful for debugging) docker run --rm -it --name $(CONTAINER_NAME) $(IMAGE_NAME) /bin/bash -## Remove the test Docker image -test-clean: +test-clean: ## Remove the test Docker image -docker rmi $(IMAGE_NAME) + +bump-pbs: ## Bump PBS number: 3.4.4+pbs.3 -> 3.4.4+pbs.4 + bump-my-version bump --allow-dirty pbs + +bump-prekind: ## Bump prekind dev version: 3.4.4+pbs.3 -> 3.4.4+pbs.3.dev.g.YYYYMMDD + @current=$$(grep "^__version__" filer/__init__.py | sed "s/^__version__ = '//;s/'.*//"); \ + if echo "$$current" | grep -q '\.dev\.'; then \ + echo "Nothing to bump: '$$current' is already a dev release from this commit. To create another dev release you must make at least one new commit first. To create a release bump run 'make bump-pbs'."; \ + exit 1; \ + fi; \ + GITHUB_SHA="$${GITHUB_SHA:-$$(git rev-parse --short=8 HEAD)}" bump-my-version bump --allow-dirty prekind + From 3deb34fca99ad8bba3d6a325886e32101c3d3afc Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Thu, 11 Jun 2026 09:41:30 +0300 Subject: [PATCH 701/715] BEN-2954: fix version in .bumpversion.toml --- .bumpversion.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.bumpversion.toml b/.bumpversion.toml index 278ffb298..f5f14423c 100755 --- a/.bumpversion.toml +++ b/.bumpversion.toml @@ -1,5 +1,5 @@ [tool.bumpversion] -current_version = "3.4.4+pbs.4.dev.gdc8739a0.20260611" +current_version = "3.4.4+pbs.1" commit = false tag = false parse = """(?x) From 913a81a0a0606b1d39e19aaeb5326473ea5f4170 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Thu, 11 Jun 2026 09:59:37 +0300 Subject: [PATCH 702/715] BEN-2954: use short sha --- Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 7d137356d..3cff811bc 100644 --- a/Makefile +++ b/Makefile @@ -39,5 +39,6 @@ bump-prekind: ## Bump prekind dev version: 3.4.4+pbs.3 -> 3.4.4+pbs.3.dev.g echo "Nothing to bump: '$$current' is already a dev release from this commit. To create another dev release you must make at least one new commit first. To create a release bump run 'make bump-pbs'."; \ exit 1; \ fi; \ - GITHUB_SHA="$${GITHUB_SHA:-$$(git rev-parse --short=8 HEAD)}" bump-my-version bump --allow-dirty prekind + sha="$${GITHUB_SHA:-$$(git rev-parse --short=8 HEAD)}"; \ + GITHUB_SHA="$${sha:0:8}" bump-my-version bump --allow-dirty prekind From ea07107e7d2b0c5c82f3d0561e55f40ad9e37e1a Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Thu, 11 Jun 2026 10:31:19 +0300 Subject: [PATCH 703/715] BEN-2954: nexus publish commands --- Makefile | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 3cff811bc..861f6d461 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ help: ## This help. @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n\nTargets:\n"} /^[a-zA-Z_-]+:.*?##/ { printf " \033[36m%-10s\033[0m %s\n", $$1, $$2 }' $(MAKEFILE_LIST) .DEFAULT_GOAL := help -.PHONY: bump-pbs bump-prekind +.PHONY: bump-pbs bump-prekind build publish-nexus publish-nexus-dry-run IMAGE_NAME := django-filer-test CONTAINER_NAME := django-filer-test-run @@ -42,3 +42,17 @@ bump-prekind: ## Bump prekind dev version: 3.4.4+pbs.3 -> 3.4.4+pbs.3.dev.g sha="$${GITHUB_SHA:-$$(git rev-parse --short=8 HEAD)}"; \ GITHUB_SHA="$${sha:0:8}" bump-my-version bump --allow-dirty prekind + +build: ## Build distribution packages (sdist and wheel) + rm -rf dist/ build/ *.egg-info + python3 -m pip install --upgrade --break-system-packages build + python3 -m build + +publish-nexus: build ## Publish to Nexus using ~/.pypirc config + python3 -m pip install --upgrade --break-system-packages twine + python3 -m twine upload -r nexus dist/* + +publish-nexus-dry-run: build ## Validate packages ready for Nexus (without uploading) + python3 -m pip install --upgrade --break-system-packages twine + python3 -m twine check dist/* + From 7f83356f73e488f4a94f57c6c717348f453eca0e Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Thu, 11 Jun 2026 10:57:23 +0300 Subject: [PATCH 704/715] BEN-2954: fix makefile for second prekind bump version --- Makefile | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 861f6d461..79ee7b379 100644 --- a/Makefile +++ b/Makefile @@ -35,12 +35,24 @@ bump-pbs: ## Bump PBS number: 3.4.4+pbs.3 -> 3.4.4+pbs.4 bump-prekind: ## Bump prekind dev version: 3.4.4+pbs.3 -> 3.4.4+pbs.3.dev.g.YYYYMMDD @current=$$(grep "^__version__" filer/__init__.py | sed "s/^__version__ = '//;s/'.*//"); \ + sha="$${GITHUB_SHA:-$$(git rev-parse --short=8 HEAD)}"; \ + sha8="$${sha:0:8}"; \ if echo "$$current" | grep -q '\.dev\.'; then \ - echo "Nothing to bump: '$$current' is already a dev release from this commit. To create another dev release you must make at least one new commit first. To create a release bump run 'make bump-pbs'."; \ - exit 1; \ + current_sha=$$(echo "$$current" | sed -nE "s/.*\.dev\.g([0-9a-f]{7,40})\.[0-9]{8}/\1/p"); \ + current_sha8="$${current_sha:0:8}"; \ + if [ "$$current_sha8" = "$$sha8" ]; then \ + echo "Nothing to bump: '$$current' already targets commit '$$sha8'. Create a new commit first or run 'make bump-pbs'."; \ + exit 1; \ + fi; \ + base=$$(echo "$$current" | sed -E "s/\.dev\.g[0-9a-f]+\.[0-9]{8}$$//"); \ + new_version="$$base.dev.g$$sha8.$$(date +%Y%m%d)"; \ + echo "Updating dev release for new commit: $$current -> $$new_version"; \ + bump-my-version bump --allow-dirty --new-version "$$new_version" || exit $$?; \ + sed -i.bak -E "s/^current_version = \".*\"/current_version = \"$$new_version\"/" .bumpversion.toml; \ + rm -f .bumpversion.toml.bak; \ + exit 0; \ fi; \ - sha="$${GITHUB_SHA:-$$(git rev-parse --short=8 HEAD)}"; \ - GITHUB_SHA="$${sha:0:8}" bump-my-version bump --allow-dirty prekind + GITHUB_SHA="$$sha8" bump-my-version bump --allow-dirty prekind build: ## Build distribution packages (sdist and wheel) From 1c4c07918042ce39779540a3905d7c17fedc9633 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Thu, 11 Jun 2026 11:19:34 +0300 Subject: [PATCH 705/715] BEN-2954: fix prekind second attempt from a different github hash --- Makefile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 79ee7b379..165ac45dd 100644 --- a/Makefile +++ b/Makefile @@ -46,13 +46,13 @@ bump-prekind: ## Bump prekind dev version: 3.4.4+pbs.3 -> 3.4.4+pbs.3.dev.g fi; \ base=$$(echo "$$current" | sed -E "s/\.dev\.g[0-9a-f]+\.[0-9]{8}$$//"); \ new_version="$$base.dev.g$$sha8.$$(date +%Y%m%d)"; \ - echo "Updating dev release for new commit: $$current -> $$new_version"; \ - bump-my-version bump --allow-dirty --new-version "$$new_version" || exit $$?; \ - sed -i.bak -E "s/^current_version = \".*\"/current_version = \"$$new_version\"/" .bumpversion.toml; \ - rm -f .bumpversion.toml.bak; \ - exit 0; \ + else \ + base="$$current"; \ + new_version="$$base.dev.g$$sha8.$$(date +%Y%m%d)"; \ fi; \ - GITHUB_SHA="$$sha8" bump-my-version bump --allow-dirty prekind + echo "Bumping: $$current -> $$new_version"; \ + sed -i.bak "s/__version__ = '$$current'/__version__ = '$$new_version'/" filer/__init__.py && rm -f filer/__init__.py.bak; \ + sed -i.bak -E "s/^current_version = \"[^\"]+\"/current_version = \"$$new_version\"/" .bumpversion.toml && rm -f .bumpversion.toml.bak build: ## Build distribution packages (sdist and wheel) From 68a01890cc01404adf0228b77ec24bfd031ab933 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Thu, 11 Jun 2026 11:45:38 +0300 Subject: [PATCH 706/715] BEN-2954: debug file upload --- filer/admin/clipboardadmin.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/filer/admin/clipboardadmin.py b/filer/admin/clipboardadmin.py index d4eccbe42..6f7cb3c60 100644 --- a/filer/admin/clipboardadmin.py +++ b/filer/admin/clipboardadmin.py @@ -122,8 +122,8 @@ def ajax_upload(request, folder_id=None): ): mime_type = guessed_type - logger.debug("[ajax_upload] filename=%s, mime_type=%s, size=%s", - filename, mime_type, getattr(upload, 'size', '?')) + logger.warning("[ajax_upload] filename=%s, mime_type=%s, size=%s", + filename, mime_type, getattr(upload, 'size', '?')) # Get clipboard clipboard = Clipboard.objects.get_or_create(user=request.user)[0] @@ -144,7 +144,7 @@ def ajax_upload(request, folder_id=None): fields=('original_filename', 'owner', 'file') ) break - logger.debug("[ajax_upload] matched file type: %s", FileSubClass.__name__) + logger.warning("[ajax_upload] matched file type: %s", FileSubClass.__name__) uploadform = FileForm({'original_filename': filename, 'owner': request.user.pk}, {'file': upload}) uploadform.request = request From b0545da4dde7af5b2ca0a59a9c58b4add56cbbb8 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Thu, 11 Jun 2026 12:07:21 +0300 Subject: [PATCH 707/715] BEN-2954: use sha param when executed from GHA in order to create package with django-filer and not bento3 commit sha --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 165ac45dd..41e4579b9 100644 --- a/Makefile +++ b/Makefile @@ -33,9 +33,9 @@ test-clean: ## Remove the test Docker image bump-pbs: ## Bump PBS number: 3.4.4+pbs.3 -> 3.4.4+pbs.4 bump-my-version bump --allow-dirty pbs -bump-prekind: ## Bump prekind dev version: 3.4.4+pbs.3 -> 3.4.4+pbs.3.dev.g.YYYYMMDD +bump-prekind: ## Bump prekind dev version: 3.4.4+pbs.3 -> 3.4.4+pbs.3.dev.g.YYYYMMDD. Pass sha= to override. @current=$$(grep "^__version__" filer/__init__.py | sed "s/^__version__ = '//;s/'.*//"); \ - sha="$${GITHUB_SHA:-$$(git rev-parse --short=8 HEAD)}"; \ + sha="$${sha:-$${GITHUB_SHA:-$$(git rev-parse --short=8 HEAD)}}"; \ sha8="$${sha:0:8}"; \ if echo "$$current" | grep -q '\.dev\.'; then \ current_sha=$$(echo "$$current" | sed -nE "s/.*\.dev\.g([0-9a-f]{7,40})\.[0-9]{8}/\1/p"); \ From a5e264f38e53e5572fe87c58e839a25f8ff401c2 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Thu, 11 Jun 2026 12:08:56 +0300 Subject: [PATCH 708/715] BEN-2954: use print --- filer/admin/clipboardadmin.py | 21 ++++++++++----------- filer/models/abstract.py | 12 ++++++------ 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/filer/admin/clipboardadmin.py b/filer/admin/clipboardadmin.py index 6f7cb3c60..a91dcbd0d 100644 --- a/filer/admin/clipboardadmin.py +++ b/filer/admin/clipboardadmin.py @@ -1,4 +1,4 @@ -import logging +import sys from django.contrib import admin, messages from django.core.exceptions import ValidationError @@ -77,7 +77,6 @@ def ajax_upload(request, folder_id=None): """ Receives an upload from the uploader. Receives only one file at a time. """ - logger = logging.getLogger(__name__) if not request.user.has_perm("filer.add_file"): messages.error(request, NO_PERMISSIONS) @@ -106,7 +105,7 @@ def ajax_upload(request, folder_id=None): # else process the request as usual upload, filename, is_raw, mime_type = handle_upload(request) except Exception as e: - logger.exception("[ajax_upload] Error handling upload: %s", e) + print(f"[ajax_upload] Error handling upload: {e}", flush=True) return JsonResponse({'error': str(e)}) # Truncate long filenames @@ -122,8 +121,7 @@ def ajax_upload(request, folder_id=None): ): mime_type = guessed_type - logger.warning("[ajax_upload] filename=%s, mime_type=%s, size=%s", - filename, mime_type, getattr(upload, 'size', '?')) + print(f"[ajax_upload] filename={filename}, mime_type={mime_type}, size={getattr(upload, 'size', '?')}", flush=True) # Get clipboard clipboard = Clipboard.objects.get_or_create(user=request.user)[0] @@ -144,7 +142,7 @@ def ajax_upload(request, folder_id=None): fields=('original_filename', 'owner', 'file') ) break - logger.warning("[ajax_upload] matched file type: %s", FileSubClass.__name__) + print(f"[ajax_upload] matched file type: {FileSubClass.__name__}", flush=True) uploadform = FileForm({'original_filename': filename, 'owner': request.user.pk}, {'file': upload}) uploadform.request = request @@ -156,14 +154,15 @@ def ajax_upload(request, folder_id=None): # Enforce the FILER_IS_PUBLIC_DEFAULT file_obj.is_public = filer_settings.FILER_IS_PUBLIC_DEFAULT except ValidationError as error: - logger.warning("[ajax_upload] Validation error for '%s': %s", filename, error) + print(f"[ajax_upload] Validation error for '{filename}': {error}", flush=True) messages.error(request, str(error)) return JsonResponse({'error': str(error)}) file_obj.folder = folder try: file_obj.save() except Exception as error: - logger.exception("[ajax_upload] Error saving file '%s': %s", filename, error) + print(f"[ajax_upload] Error saving file '{filename}': {error}", flush=True) + import traceback; traceback.print_exc() messages.error(request, str(error)) return JsonResponse({'error': str(error)}) clipboard_item = ClipboardItem( @@ -187,12 +186,12 @@ def ajax_upload(request, folder_id=None): data['original_image'] = file_obj.url return JsonResponse(data) except Exception as error: - logger.exception("[ajax_upload] Error building response for '%s': %s", filename, error) + print(f"[ajax_upload] Error building response for '{filename}': {error}", flush=True) + import traceback; traceback.print_exc() messages.error(request, str(error)) return JsonResponse({"error": str(error)}) else: - logger.warning("[ajax_upload] Form invalid for '%s' (mime=%s, type=%s): %s", - filename, mime_type, FileSubClass.__name__, uploadform.errors.as_text()) + print(f"[ajax_upload] Form invalid for '{filename}' (mime={mime_type}, type={FileSubClass.__name__}): {uploadform.errors.as_text()}", flush=True) for key, error_list in uploadform.errors.items(): for error in error_list: messages.error(request, error) diff --git a/filer/models/abstract.py b/filer/models/abstract.py index d6d552ee2..efa073566 100644 --- a/filer/models/abstract.py +++ b/filer/models/abstract.py @@ -140,12 +140,12 @@ def file_data_changed(self, post_init=False): self._transparent = easy_thumbnails.utils.is_transparent(pil_image) imgfile.seek(0) except Exception as e: - import logging - logging.getLogger(__name__).warning( - "Could not read image dimensions for '%s' (mime=%s): %s: %s", - getattr(self, 'original_filename', '?'), - getattr(self, 'mime_type', '?'), - type(e).__name__, e, + print( + f"[ajax_upload] Could not read image dimensions for " + f"'{getattr(self, 'original_filename', '?')}' " + f"(mime={getattr(self, 'mime_type', '?')}): " + f"{type(e).__name__}: {e}", + flush=True, ) if post_init is False: # in case `imgfile` could not be found, unset dimensions From c52b9ba22dceff6afa063cee20a35fbe1abcbc58 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Thu, 11 Jun 2026 12:23:22 +0300 Subject: [PATCH 709/715] BEN-2954: fix stale clipboard --- filer/admin/clipboardadmin.py | 11 ++++++++--- filer/tests/admin.py | 11 +++++------ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/filer/admin/clipboardadmin.py b/filer/admin/clipboardadmin.py index a91dcbd0d..9d2c9032b 100644 --- a/filer/admin/clipboardadmin.py +++ b/filer/admin/clipboardadmin.py @@ -126,11 +126,16 @@ def ajax_upload(request, folder_id=None): # Get clipboard clipboard = Clipboard.objects.get_or_create(user=request.user)[0] - # Check for duplicate files in clipboard + # Remove any stale clipboard entries with the same filename + # (e.g. from previous failed upload attempts) to allow re-upload existing_in_clipboard = clipboard.files.filter(original_filename=filename) if existing_in_clipboard.exists(): - error_msg = ClipboardAdmin.messages['already-exists'].format(filename) - return JsonResponse({'error': error_msg}) + print(f"[ajax_upload] Removing {existing_in_clipboard.count()} stale clipboard entry for '{filename}'", flush=True) + # Get the actual file pks before clearing the M2M + stale_file_pks = list(existing_in_clipboard.values_list('pk', flat=True)) + ClipboardItem.objects.filter(clipboard=clipboard, file_id__in=stale_file_pks).delete() + from ..models import File as FilerFile + FilerFile.objects.filter(pk__in=stale_file_pks).delete() # find the file type for filer_class in filer_settings.FILER_FILE_MODELS: diff --git a/filer/tests/admin.py b/filer/tests/admin.py index c064f94fb..120e507e8 100644 --- a/filer/tests/admin.py +++ b/filer/tests/admin.py @@ -246,19 +246,18 @@ def test_file_upload_no_duplicate_files(self, extra_headers={}): self.assertEqual(Clipboard.objects.count(), 1) clip = Clipboard.objects.get(id=1) # there is(or should be) just one clipboard self.assertEqual(clip.files.count(), 1) - # upload the same file again. This must fail since the - # clipboard can't contain two files with the same name + # upload the same file again with a fresh file handle. + # The stale clipboard entry should be replaced, not rejected. + file_obj2 = dj_files.File(open(self.filename, 'rb')) response = self.client.post( reverse('admin:filer-ajax_upload'), { 'Filename': self.image_name, - 'Filedata': file_obj, + 'Filedata': file_obj2, 'jsessionid': self.client.session.session_key, }, **extra_headers ) self.assertEqual(Image.objects.count(), 1) - self.assertIn('error', response.content.decode()) - errormsg = ClipboardAdmin.messages['already-exists'].format(self.image_name) - self.assertIn(errormsg, response.content.decode()) + self.assertNotIn('error', response.content.decode()) self.assertEqual(clip.files.count(), 1) def test_filer_ajax_upload_file(self): From 0c382f2fe15cd3da5a60628bc32d9af131336666 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Thu, 11 Jun 2026 12:49:03 +0300 Subject: [PATCH 710/715] BEN-2954: remove debug logs --- filer/admin/clipboardadmin.py | 11 ----------- filer/models/abstract.py | 12 ++++++------ 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/filer/admin/clipboardadmin.py b/filer/admin/clipboardadmin.py index 9d2c9032b..fbcc41cf2 100644 --- a/filer/admin/clipboardadmin.py +++ b/filer/admin/clipboardadmin.py @@ -1,4 +1,3 @@ -import sys from django.contrib import admin, messages from django.core.exceptions import ValidationError @@ -105,7 +104,6 @@ def ajax_upload(request, folder_id=None): # else process the request as usual upload, filename, is_raw, mime_type = handle_upload(request) except Exception as e: - print(f"[ajax_upload] Error handling upload: {e}", flush=True) return JsonResponse({'error': str(e)}) # Truncate long filenames @@ -121,7 +119,6 @@ def ajax_upload(request, folder_id=None): ): mime_type = guessed_type - print(f"[ajax_upload] filename={filename}, mime_type={mime_type}, size={getattr(upload, 'size', '?')}", flush=True) # Get clipboard clipboard = Clipboard.objects.get_or_create(user=request.user)[0] @@ -130,7 +127,6 @@ def ajax_upload(request, folder_id=None): # (e.g. from previous failed upload attempts) to allow re-upload existing_in_clipboard = clipboard.files.filter(original_filename=filename) if existing_in_clipboard.exists(): - print(f"[ajax_upload] Removing {existing_in_clipboard.count()} stale clipboard entry for '{filename}'", flush=True) # Get the actual file pks before clearing the M2M stale_file_pks = list(existing_in_clipboard.values_list('pk', flat=True)) ClipboardItem.objects.filter(clipboard=clipboard, file_id__in=stale_file_pks).delete() @@ -147,7 +143,6 @@ def ajax_upload(request, folder_id=None): fields=('original_filename', 'owner', 'file') ) break - print(f"[ajax_upload] matched file type: {FileSubClass.__name__}", flush=True) uploadform = FileForm({'original_filename': filename, 'owner': request.user.pk}, {'file': upload}) uploadform.request = request @@ -159,15 +154,12 @@ def ajax_upload(request, folder_id=None): # Enforce the FILER_IS_PUBLIC_DEFAULT file_obj.is_public = filer_settings.FILER_IS_PUBLIC_DEFAULT except ValidationError as error: - print(f"[ajax_upload] Validation error for '{filename}': {error}", flush=True) messages.error(request, str(error)) return JsonResponse({'error': str(error)}) file_obj.folder = folder try: file_obj.save() except Exception as error: - print(f"[ajax_upload] Error saving file '{filename}': {error}", flush=True) - import traceback; traceback.print_exc() messages.error(request, str(error)) return JsonResponse({'error': str(error)}) clipboard_item = ClipboardItem( @@ -191,12 +183,9 @@ def ajax_upload(request, folder_id=None): data['original_image'] = file_obj.url return JsonResponse(data) except Exception as error: - print(f"[ajax_upload] Error building response for '{filename}': {error}", flush=True) - import traceback; traceback.print_exc() messages.error(request, str(error)) return JsonResponse({"error": str(error)}) else: - print(f"[ajax_upload] Form invalid for '{filename}' (mime={mime_type}, type={FileSubClass.__name__}): {uploadform.errors.as_text()}", flush=True) for key, error_list in uploadform.errors.items(): for error in error_list: messages.error(request, error) diff --git a/filer/models/abstract.py b/filer/models/abstract.py index efa073566..67e23060b 100644 --- a/filer/models/abstract.py +++ b/filer/models/abstract.py @@ -140,12 +140,12 @@ def file_data_changed(self, post_init=False): self._transparent = easy_thumbnails.utils.is_transparent(pil_image) imgfile.seek(0) except Exception as e: - print( - f"[ajax_upload] Could not read image dimensions for " - f"'{getattr(self, 'original_filename', '?')}' " - f"(mime={getattr(self, 'mime_type', '?')}): " - f"{type(e).__name__}: {e}", - flush=True, + logger.warning( + "Could not read image dimensions for '%s' (mime=%s): %s: %s", + getattr(self, 'original_filename', '?'), + getattr(self, 'mime_type', '?'), + type(e).__name__, + e, ) if post_init is False: # in case `imgfile` could not be found, unset dimensions From 840997d564c57be613626b6809c5a9149b9da5e1 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Thu, 11 Jun 2026 12:55:57 +0300 Subject: [PATCH 711/715] BEN-2954: lazy load folder tree --- filer/admin/folderadmin.py | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 8a39324f9..3ebad8917 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -1043,6 +1043,29 @@ def _move_files_and_folders_impl(self, files_queryset, folders_queryset, destina f.parent = destination f.save() + def _validate_destination(self, request, destination, folders_queryset, current_folder, allow_self=False): + """ + Validate that destination is a legitimate target for copy/move without + recursively traversing the entire folder tree. Returns True if valid. + """ + if not destination.has_read_permission(request): + return False + if not destination.has_add_children_permission(request): + return False + if not allow_self and destination == current_folder: + return False + # Cannot move/copy into one of the selected folders or their descendants + selected_pks = set(folders_queryset.values_list('pk', flat=True)) + if destination.pk in selected_pks: + return False + # Check that destination is not a descendant of any selected folder + ancestor = destination.parent + while ancestor is not None: + if ancestor.pk in selected_pks: + return False + ancestor = ancestor.parent + return True + def move_files_and_folders(self, request, files_queryset, folders_queryset): opts = self.model._meta app_label = opts.app_label @@ -1057,7 +1080,6 @@ def move_files_and_folders(self, request, files_queryset, folders_queryset): current_folder = self._get_current_action_folder(request, files_queryset, folders_queryset) perms_needed = self._check_move_perms(request, files_queryset, folders_queryset) to_move = self._list_all_to_copy_or_move(request, files_queryset, folders_queryset) - folders = self._list_all_destination_folders(request, folders_queryset, current_folder, False) if request.method == 'POST' and request.POST.get('post'): if perms_needed: @@ -1066,8 +1088,7 @@ def move_files_and_folders(self, request, files_queryset, folders_queryset): destination = self.get_queryset(request).get(pk=request.POST.get('destination')) except self.model.DoesNotExist: raise PermissionDenied - folders_dict = dict(folders) - if destination not in folders_dict or not folders_dict[destination][1]: + if not self._validate_destination(request, destination, folders_queryset, current_folder): raise PermissionDenied # PBS: validate destination is not a core folder @@ -1121,7 +1142,7 @@ def move_files_and_folders(self, request, files_queryset, folders_queryset): "instance": current_folder, "breadcrumbs_action": _("Move files and/or folders"), "to_move": to_move, - "destination_folders": folders, + "destination_folders": [], "files_queryset": files_queryset, "folders_queryset": folders_queryset, "perms_lacking": perms_needed, @@ -1429,7 +1450,6 @@ def copy_files_and_folders(self, request, files_queryset, folders_queryset): current_folder = self._get_current_action_folder(request, files_queryset, folders_queryset) perms_needed = self._check_copy_perms(request, files_queryset, folders_queryset) to_copy = self._list_all_to_copy_or_move(request, files_queryset, folders_queryset) - folders = self._list_all_destination_folders(request, folders_queryset, current_folder, False) if request.method == 'POST' and request.POST.get('post'): if perms_needed: @@ -1440,8 +1460,7 @@ def copy_files_and_folders(self, request, files_queryset, folders_queryset): destination = self.get_queryset(request).get(pk=request.POST.get('destination')) except self.model.DoesNotExist: raise PermissionDenied - folders_dict = dict(folders) - if destination not in folders_dict or not folders_dict[destination][1]: + if not self._validate_destination(request, destination, folders_queryset, current_folder): raise PermissionDenied # PBS: validate destination is not a core folder @@ -1486,7 +1505,7 @@ def copy_files_and_folders(self, request, files_queryset, folders_queryset): "instance": current_folder, "breadcrumbs_action": _("Copy files and/or folders"), "to_copy": to_copy, - "destination_folders": folders, + "destination_folders": [], "selected_destination_folder": selected_destination_folder, "copy_form": form, "files_queryset": files_queryset, From a1ba3a68d86fd821f0da88051f2c9b96f3520ba3 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Mon, 15 Jun 2026 15:01:11 +0300 Subject: [PATCH 712/715] BEN-2954: fallback improved --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 41e4579b9..7202313c9 100644 --- a/Makefile +++ b/Makefile @@ -35,7 +35,7 @@ bump-pbs: ## Bump PBS number: 3.4.4+pbs.3 -> 3.4.4+pbs.4 bump-prekind: ## Bump prekind dev version: 3.4.4+pbs.3 -> 3.4.4+pbs.3.dev.g.YYYYMMDD. Pass sha= to override. @current=$$(grep "^__version__" filer/__init__.py | sed "s/^__version__ = '//;s/'.*//"); \ - sha="$${sha:-$${GITHUB_SHA:-$$(git rev-parse --short=8 HEAD)}}"; \ + sha="$${sha:-$$(git rev-parse --short=8 HEAD)}"; \ sha8="$${sha:0:8}"; \ if echo "$$current" | grep -q '\.dev\.'; then \ current_sha=$$(echo "$$current" | sed -nE "s/.*\.dev\.g([0-9a-f]{7,40})\.[0-9]{8}/\1/p"); \ From df51be834a1d62db3940bbe2c0d32f4a42d9bf67 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Tue, 16 Jun 2026 10:26:55 +0300 Subject: [PATCH 713/715] BEN-2954: make uploads looser due to pillow limitations --- filer/models/abstract.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/filer/models/abstract.py b/filer/models/abstract.py index 67e23060b..f4747fd23 100644 --- a/filer/models/abstract.py +++ b/filer/models/abstract.py @@ -162,18 +162,19 @@ def clean(self): # Only check pixel size for new uploads (no pk yet) if self.file and FILER_MAX_IMAGE_PIXELS and not self.pk: if self._width is None or self._height is None: - # Image dimensions could not be determined – this could mean - # the image format is not recognized by Pillow or the image is - # too large for Pillow to handle. - msg = _( - "Image \"%(filename)s\" could not be processed: format not recognized or image " - "too large. Supported formats: JPEG, PNG, GIF, WebP, SVG. " - "Max resolution: %(max_pixels)d million pixels." - ) % dict( - filename=self.original_filename or '?', - max_pixels=FILER_MAX_IMAGE_PIXELS // 1000000, + # Image dimensions could not be determined – this can happen + # for valid images that Pillow cannot fully parse (e.g. unusual + # JPEG markers, CMYK colour space, progressive encoding, etc.). + # Do NOT reject the upload; just skip the pixel-limit check and + # log a warning so operators can investigate if needed. + logger.warning( + "Skipping pixel-limit check for '%s' (mime=%s): " + "image dimensions could not be determined.", + getattr(self, 'original_filename', '?'), + getattr(self, 'mime_type', '?'), ) - raise ValidationError(str(msg), code="image_size") + super().clean() + return width, height = max(1, self.width), max(1, self.height) pixels: int = width * height From b8be6e2c4413fd1a610f1acc38797c6c36771c71 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Tue, 16 Jun 2026 11:07:59 +0300 Subject: [PATCH 714/715] BEN-2954: role restriction --- filer/admin/folderadmin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/filer/admin/folderadmin.py b/filer/admin/folderadmin.py index 3ebad8917..482d98b44 100644 --- a/filer/admin/folderadmin.py +++ b/filer/admin/folderadmin.py @@ -1366,13 +1366,13 @@ def enable_restriction(self, request, files_qs, folders_qs): return self.files_toggle_restriction( request, True, files_qs, folders_qs) - enable_restriction.short_description = _("Enable restriction for selected files and/or folders") + enable_restriction.short_description = _("Enable role restriction for selected files and/or folders") def disable_restriction(self, request, files_qs, folders_qs): return self.files_toggle_restriction( request, False, files_qs, folders_qs) - disable_restriction.short_description = _("Disable restriction for selected files and/or folders") + disable_restriction.short_description = _("Disable role restriction for selected files and/or folders") def _generate_new_filename(self, filename, suffix): basename, extension = os.path.splitext(filename) From 4811f1f61bcf65de9aef72678fcf7499c208eba7 Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Wed, 17 Jun 2026 12:46:11 +0300 Subject: [PATCH 715/715] BEN-2954: developer guide readme --- README_PBS.md | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 README_PBS.md diff --git a/README_PBS.md b/README_PBS.md new file mode 100644 index 000000000..40ba51006 --- /dev/null +++ b/README_PBS.md @@ -0,0 +1,150 @@ +# PBS Fork – Developer Guide + +## Versioning Scheme + +This fork uses a PBS-specific versioning scheme: + +``` ++pbs. +``` + +Example: `3.4.4+pbs.1`, `3.4.4+pbs.2` + +Development (pre-release) versions append a dev suffix: + +``` ++pbs..dev.g.YYYYMMDD +``` + +Example: `3.4.4+pbs.1.dev.g1a2b3c4d.20260617` + +The version is stored in `filer/__init__.py` and read dynamically by `pyproject.toml`. + +--- + +## Makefile Targets + +Run `make help` to see all available targets. Summary: + +| Target | Description | +|--------|-------------| +| `make help` | Show all available targets | +| `make test-build` | Build the test Docker image | +| `make test` | Run unit tests in a Docker container (builds image if missing) | +| `make test-verbose` | Run tests with verbose output, stop on first failure | +| `make test-shell` | Open a shell in the test container (for debugging) | +| `make test-clean` | Remove the test Docker image | +| `make bump-pbs` | Bump the PBS version number (e.g. `+pbs.1` → `+pbs.2`) | +| `make bump-prekind` | Create a dev pre-release version from the current commit | +| `make build` | Build sdist and wheel packages into `dist/` | +| `make publish-nexus` | Build and upload packages to Nexus | +| `make publish-nexus-dry-run` | Build and validate packages without uploading | + +--- + +## How to Publish a New Version + +### Prerequisites + +- Python 3 installed +- `bump-my-version` installed (`pip install bump-my-version`) +- `~/.pypirc` configured with a `[nexus]` section containing your repository URL and credentials + +### Steps + +#### 1. Run tests + +```bash +make test +``` + +Ensure all tests pass before proceeding. + +#### 2. Bump the PBS version + +```bash +make bump-pbs +``` + +This increments the PBS number (e.g. `3.4.4+pbs.1` → `3.4.4+pbs.2`) in both `filer/__init__.py` and `.bumpversion.toml`. + +#### 3. Commit and push + +```bash +git add filer/__init__.py .bumpversion.toml +git commit -m "Bump to $(grep __version__ filer/__init__.py | sed "s/.*'//;s/'.*//")" +git push +``` + +#### 4. Publish to Nexus + +```bash +make publish-nexus +``` + +This will: +1. Clean previous build artifacts +2. Build source distribution and wheel (`python3 -m build`) +3. Upload to Nexus using `twine` with the `[nexus]` section from `~/.pypirc` + +#### 5. (Optional) Validate without uploading + +```bash +make publish-nexus-dry-run +``` + +Runs `twine check` on the built packages to verify they are well-formed. + +--- + +## Publishing a Dev (Pre-release) Version + +Use this when you need to test unreleased changes without a formal PBS bump: + +```bash +make bump-prekind +``` + +This creates a version like `3.4.4+pbs.1.dev.g1a2b3c4d.20260617` based on the current HEAD commit and date. + +You can override the commit SHA: + +```bash +make bump-prekind sha=abc12345 +``` + +Then publish normally: + +```bash +make publish-nexus +``` + +> **Note:** To bump again on the same commit, you must first run `make bump-pbs` to move to the next PBS number. + +--- + +## Publishing via GitHub Actions (Bento3) + +You can also publish a new version using the **bento3** GitHub Actions workflow: + +🔗 [publish_django_filer.yml](https://github.com/pbs-digital/bento3/actions/workflows/publish_django_filer.yml) + +Trigger the workflow manually from the Actions tab. This is the recommended approach for CI-driven releases. + +--- + +## `~/.pypirc` Configuration (for local publishing) + +Ensure your `~/.pypirc` contains a `[nexus]` entry: + +```ini +[distutils] +index-servers = + nexus + +[nexus] +repository = https://your-nexus-instance/repository/pypi-hosted/ +username = your-username +password = your-password-or-token +``` +