From 75c9ef9da9c23a03658c4f8c804eca043d4063f4 Mon Sep 17 00:00:00 2001 From: usmannasir <01-134132-158@student.bahria.edu.pk> Date: Mon, 4 Feb 2019 01:03:18 +0500 Subject: [PATCH] dns replication --- dns/dnsManager.py | 12 +- dns/models.py | 14 - dockerManager/decorators.py | 8 +- manageServices/models.py | 6 + manageServices/serviceManager.py | 87 +++ .../static/manageServices/manageServices.js | 542 +++++++++--------- .../manageServices/managePowerDNS.html | 137 +++-- manageServices/views.py | 56 +- plogical/dnsUtilities.py | 22 +- .../assets/image-resources/logo-admin.png | Bin 5708 -> 2598 bytes static/dockerManager/dockerManager.js | 10 +- static/emailMarketing/checklist.png | Bin 2961 -> 1755 bytes static/emailMarketing/compose.png | Bin 2557 -> 1842 bytes static/emailMarketing/mailing.png | Bin 2124 -> 1950 bytes static/emailMarketing/paper-plane.png | Bin 3260 -> 2226 bytes static/emailMarketing/post-office.png | Bin 2511 -> 1548 bytes static/filemanager/css/fileManager.css | 138 ++++- static/filemanager/images/fileManager.png | Bin 11191 -> 2598 bytes static/filemanager/js/fileManager.js | 5 +- static/images/change-license.png | Bin 0 -> 1669 bytes static/images/icons/add-ssl.png | Bin 0 -> 1376 bytes static/images/icons/change-php.png | Bin 0 -> 1720 bytes static/images/icons/checklist.png | Bin 0 -> 1755 bytes static/images/icons/compose.png | Bin 0 -> 1842 bytes static/images/icons/delete-ftp.png | Bin 1523 -> 2155 bytes static/images/icons/domains.png | Bin 3206 -> 2419 bytes static/images/icons/file.png | Bin 1044 -> 1878 bytes static/images/icons/ftp-upload.png | Bin 1824 -> 2036 bytes static/images/icons/git-logo.png | Bin 1879 -> 877 bytes static/images/icons/joomla-logo.png | Bin 2072 -> 1276 bytes static/images/icons/laptop.png | Bin 834 -> 1965 bytes static/images/icons/locked.png | Bin 888 -> 1878 bytes static/images/icons/log-file-format.png | Bin 1631 -> 1636 bytes static/images/icons/mailing.png | Bin 0 -> 1950 bytes static/images/icons/office-material.png | Bin 1708 -> 1038 bytes static/images/icons/open_basedir.png | Bin 1741 -> 2159 bytes static/images/icons/paper-plane.png | Bin 0 -> 2226 bytes static/images/icons/pencilcase.png | Bin 3951 -> 1593 bytes static/images/icons/post-office.png | Bin 0 -> 1548 bytes static/images/icons/prestashop.png | Bin 4314 -> 2501 bytes static/images/icons/repeat.png | Bin 2865 -> 2986 bytes static/images/icons/sort.png | Bin 1908 -> 1426 bytes static/images/icons/warning.png | Bin 2429 -> 1519 bytes static/images/icons/web-domain.png | Bin 2832 -> 1652 bytes static/images/icons/wordpress.png | Bin 1797 -> 1525 bytes static/images/license-status.png | Bin 0 -> 1420 bytes static/images/not-available-preview.png | Bin 0 -> 9295 bytes static/manageSSL/manageSSL.js | 2 - static/manageServices/manageServices.js | 542 +++++++++--------- static/websiteFunctions/websiteFunctions.css | 229 +++++++- static/websiteFunctions/websiteFunctions.js | 54 +- 51 files changed, 1230 insertions(+), 634 deletions(-) create mode 100644 manageServices/serviceManager.py create mode 100644 static/images/change-license.png create mode 100644 static/images/icons/add-ssl.png create mode 100644 static/images/icons/change-php.png create mode 100644 static/images/icons/checklist.png create mode 100644 static/images/icons/compose.png create mode 100644 static/images/icons/mailing.png create mode 100644 static/images/icons/paper-plane.png create mode 100644 static/images/icons/post-office.png create mode 100644 static/images/license-status.png create mode 100644 static/images/not-available-preview.png diff --git a/dns/dnsManager.py b/dns/dnsManager.py index cc7765ace..67cf5f9e9 100644 --- a/dns/dnsManager.py +++ b/dns/dnsManager.py @@ -15,6 +15,7 @@ from models import Domains,Records from re import match,I,M from plogical.mailUtilities import mailUtilities from plogical.acl import ACLManager +from manageServices.models import PDNSStatus class DNSManager: @@ -56,7 +57,16 @@ class DNSManager: secondNSIP = data['secondNSIP'] if Domains.objects.filter(name=domainForNS).count() == 0: - newZone = Domains(admin=admin, name=domainForNS, type="NATIVE") + + try: + pdns = PDNSStatus.objects.get(pk=1) + if pdns.type == 'MASTER': + newZone = Domains(admin=admin, name=domainForNS, type="MASTER") + else: + newZone = Domains(admin=admin, name=domainForNS, type="NATIVE") + except: + newZone = Domains(admin=admin, name=domainForNS, type="NATIVE") + newZone.save() content = "ns1." + domainForNS + " hostmaster." + domainForNS + " 1 10800 3600 604800 3600" diff --git a/dns/models.py b/dns/models.py index 3a9e27305..8db112e90 100644 --- a/dns/models.py +++ b/dns/models.py @@ -1,10 +1,3 @@ -# This is an auto-generated Django model module. -# You'll have to do the following manually to clean this up: -# * Rearrange models' order -# * Make sure each model has one field with primary_key=True -# * Make sure each ForeignKey has `on_delete` set to the desired behavior. -# * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table -# Feel free to rename the models, but don't rename db_table values or field names. from __future__ import unicode_literals from django.db import models @@ -91,10 +84,3 @@ class Tsigkeys(models.Model): class Meta: db_table = 'tsigkeys' unique_together = (('name', 'algorithm'),) - - - -class DNSMaster: - type = models.CharField(max_length=5, default='NATIVE') - allow_axfr_ips = models.CharField(max_length=500, default='') - also_notify = models.CharField(max_length=500, default='') diff --git a/dockerManager/decorators.py b/dockerManager/decorators.py index 0b128d144..bd06190c7 100644 --- a/dockerManager/decorators.py +++ b/dockerManager/decorators.py @@ -11,11 +11,11 @@ from plogical.acl import ACLManager def preDockerRun(function): def wrap(request, *args, **kwargs): - try: - userID = request.session['userID'] + try: + userID = request.session['userID'] except KeyError: return redirect(loadLoginPage) - + currentACL = ACLManager.loadedACL(userID) if request.method == "POST": @@ -49,4 +49,4 @@ def preDockerRun(function): return function(request, *args, **kwargs) - return wrap + return wrap \ No newline at end of file diff --git a/manageServices/models.py b/manageServices/models.py index 1dfab7604..d0e84cea8 100644 --- a/manageServices/models.py +++ b/manageServices/models.py @@ -4,3 +4,9 @@ from __future__ import unicode_literals from django.db import models # Create your models here. + +class PDNSStatus(models.Model): + serverStatus = models.IntegerField(default=1) + type = models.CharField(max_length=6, default='NATIVE') + allow_axfr_ips = models.CharField(max_length=500, default='') + also_notify = models.CharField(max_length=500, default='') \ No newline at end of file diff --git a/manageServices/serviceManager.py b/manageServices/serviceManager.py new file mode 100644 index 000000000..79e8db8eb --- /dev/null +++ b/manageServices/serviceManager.py @@ -0,0 +1,87 @@ +import subprocess, shlex +from random import randint +from plogical.processUtilities import ProcessUtilities + +class ServiceManager: + + def __init__(self, extraArgs): + self.extraArgs = extraArgs + + + def managePDNS(self): + type = self.extraArgs['type'] + path = '/etc/pdns/pdns.conf' + + data = subprocess.check_output(shlex.split('sudo cat ' + path)).splitlines() + + if type == 'MASTER': + counter = 0 + + slaveIPData = self.extraArgs['slaveIPData'] + ipsString = slaveIPData.replace(',', '/32,') + + + for items in data: + if items.find('allow-axfr-ips') > -1: + data[counter] = '#' + data[counter] + + if items.find('also-notify') > -1: + data[counter] = '#' + data[counter] + + if items.find('daemon=') > -1: + data[counter] = '#' + data[counter] + + if items.find('disable-axfr') > -1: + data[counter] = '#' + data[counter] + + if items.find('slave') > -1: + data[counter] = '#' + data[counter] + + counter = counter + 1 + + tempPath = "/home/cyberpanel/" + str(randint(1000, 9999)) + writeToFile = open(tempPath, 'w') + + for items in data: + writeToFile.writelines(items + '\n') + + writeToFile.writelines('allow-axfr-ips=' + ipsString + '\n') + writeToFile.writelines('also-notify=' + slaveIPData + '\n') + writeToFile.writelines('daemon=no\n') + writeToFile.writelines('disable-axfr=no\n') + writeToFile.writelines('master=yes\n') + writeToFile.close() + else: + counter = 0 + + for items in data: + if items.find('allow-axfr-ips') > -1: + data[counter] = '#' + data[counter] + + if items.find('also-notify') > -1: + data[counter] = '#' + data[counter] + + if items.find('daemon=') > -1: + data[counter] = '#' + data[counter] + + if items.find('disable-axfr') > -1: + data[counter] = '#' + data[counter] + + if items.find('slave') > -1: + data[counter] = '#' + data[counter] + + counter = counter + 1 + + tempPath = "/home/cyberpanel/" + str(randint(1000, 9999)) + writeToFile = open(tempPath, 'w') + + for items in data: + writeToFile.writelines(items + '\n') + + writeToFile.writelines('slave=yes\n') + writeToFile.writelines('daemon=no\n') + writeToFile.close() + + command = 'sudo mv ' + tempPath + ' ' + path + ProcessUtilities.executioner(command) + diff --git a/manageServices/static/manageServices/manageServices.js b/manageServices/static/manageServices/manageServices.js index 4cbee2c59..ca700620a 100644 --- a/manageServices/static/manageServices/manageServices.js +++ b/manageServices/static/manageServices/manageServices.js @@ -5,128 +5,148 @@ /* Java script code */ -app.controller('powerDNS', function($scope, $http, $timeout, $window) { +app.controller('powerDNS', function ($scope, $http, $timeout, $window) { - $scope.pdnsLoading = true; - $scope.failedToFetch = true; - $scope.couldNotConnect = true; - $scope.changesApplied = true; + $scope.pdnsLoading = true; + $scope.failedToFetch = true; + $scope.couldNotConnect = true; + $scope.changesApplied = true; + $scope.slaveIPs = true; - var pdnsStatus = false; + var pdnsStatus = false; - $('#pdnsStatus').change(function() { - pdnsStatus = $(this).prop('checked'); - }); + $('#pdnsStatus').change(function () { + pdnsStatus = $(this).prop('checked'); + }); - fetchPDNSStatus('powerdns'); - function fetchPDNSStatus(service){ + fetchPDNSStatus('powerdns'); + function fetchPDNSStatus(service) { - $scope.pdnsLoading = false; + $scope.pdnsLoading = false; - $('#pdnsStatus').bootstrapToggle('off'); + $('#pdnsStatus').bootstrapToggle('off'); - url = "/manageservices/fetchStatus"; + url = "/manageservices/fetchStatus"; - var data = { - 'service' : service - }; + var data = { + 'service': service + }; - var config = { - headers : { - 'X-CSRFToken': getCookie('csrftoken') - } - }; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; - $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); - function ListInitialDatas(response) { + function ListInitialDatas(response) { - $scope.pdnsLoading = true; + $scope.pdnsLoading = true; - if(response.data.status === 1){ + if (response.data.status === 1) { - if (response.data.installCheck === 1) { - $('#pdnsStatus').bootstrapToggle('on'); - } - - }else{ - $scope.failedToFetch = false; - $scope.couldNotConnect = true; - $scope.changesApplied = true; - - $scope.errorMessage = response.data.error_message; - - } - - } - function cantLoadInitialDatas(response) { - $scope.pdnsLoading = true; - $scope.failedToFetch = true; - $scope.couldNotConnect = false; - $scope.changesApplied = true; + if (response.data.installCheck === 1) { + $('#pdnsStatus').bootstrapToggle('on'); } - } + $scope.slaveIPData = response.data.slaveIPData; + + } else { + $scope.failedToFetch = false; + $scope.couldNotConnect = true; + $scope.changesApplied = true; + + $scope.errorMessage = response.data.error_message; + + } + + } + + function cantLoadInitialDatas(response) { + $scope.pdnsLoading = true; + $scope.failedToFetch = true; + $scope.couldNotConnect = false; + $scope.changesApplied = true; + } + + } + + $scope.saveStatus = function (service) { + + $scope.pdnsLoading = false; + $scope.failedToFetch = true; + $scope.couldNotConnect = true; + $scope.changesApplied = true; - $scope.saveStatus = function (service) { + url = "/manageservices/saveStatus"; - $scope.pdnsLoading = false; - $scope.failedToFetch = true; - $scope.couldNotConnect = true; - $scope.changesApplied = true; + if (service === 'powerdns') { + var data = { + status: pdnsStatus, + service: service, + dnsMode: $scope.dnsMode, + slaveIPData: $scope.slaveIPData + }; + }else { + var data = { + status: pdnsStatus, + service: service + }; + } + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; - - url = "/manageservices/saveStatus"; - - var data = { - status:pdnsStatus, - service: service - }; - - var config = { - headers : { - 'X-CSRFToken': getCookie('csrftoken') - } - }; + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + function ListInitialDatas(response) { + $scope.pdnsLoading = true; - $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); + if (response.data.status === 1) { + + $scope.failedToFetch = true; + $scope.couldNotConnect = true; + $scope.changesApplied = false; + + } + else { + $scope.errorMessage = response.data.error_message; + + $scope.failedToFetch = false; + $scope.couldNotConnect = true; + $scope.changesApplied = true; + } + + } + + function cantLoadInitialDatas(response) { + $scope.policyServerLoading = true; + $scope.failedToFetch = true; + $scope.couldNotConnect = false; + $scope.changesApplied = true; + } - function ListInitialDatas(response) { - $scope.pdnsLoading = true; + }; - if(response.data.status === 1){ + $scope.modeChange = function () { + if ($scope.dnsMode === 'MASTER') { + $scope.slaveIPs = false; - $scope.failedToFetch = true; - $scope.couldNotConnect = true; - $scope.changesApplied = false; - - } - else{ - $scope.errorMessage = response.data.error_message; - - $scope.failedToFetch = false; - $scope.couldNotConnect = true; - $scope.changesApplied = true; - } - - } - function cantLoadInitialDatas(response) { - $scope.policyServerLoading = true; - $scope.failedToFetch = true; - $scope.couldNotConnect = false; - $scope.changesApplied = true; - } - - - }; + } else { + $scope.slaveIPs = true; + } + } }); @@ -137,129 +157,129 @@ app.controller('powerDNS', function($scope, $http, $timeout, $window) { /* Java script code */ -app.controller('postfix', function($scope, $http, $timeout, $window) { +app.controller('postfix', function ($scope, $http, $timeout, $window) { - $scope.serviceLoading = true; - $scope.failedToFetch = true; - $scope.couldNotConnect = true; - $scope.changesApplied = true; + $scope.serviceLoading = true; + $scope.failedToFetch = true; + $scope.couldNotConnect = true; + $scope.changesApplied = true; - var serviceStatus = false; + var serviceStatus = false; - $('#serviceStatus').change(function() { - serviceStatus = $(this).prop('checked'); - }); + $('#serviceStatus').change(function () { + serviceStatus = $(this).prop('checked'); + }); - fetchPDNSStatus('postfix'); - function fetchPDNSStatus(service){ + fetchPDNSStatus('postfix'); + function fetchPDNSStatus(service) { - $scope.serviceLoading = false; + $scope.serviceLoading = false; - $('#serviceStatus').bootstrapToggle('off'); + $('#serviceStatus').bootstrapToggle('off'); - url = "/manageservices/fetchStatus"; + url = "/manageservices/fetchStatus"; - var data = { - 'service' : service - }; + var data = { + 'service': service + }; - var config = { - headers : { - 'X-CSRFToken': getCookie('csrftoken') - } - }; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; - $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); - function ListInitialDatas(response) { + function ListInitialDatas(response) { - $scope.serviceLoading = true; + $scope.serviceLoading = true; - if(response.data.status === 1){ + if (response.data.status === 1) { - if (response.data.installCheck === 1) { - $('#serviceStatus').bootstrapToggle('on'); - } - - }else{ - $scope.failedToFetch = false; - $scope.couldNotConnect = true; - $scope.changesApplied = true; - - $scope.errorMessage = response.data.error_message; - - } - - } - function cantLoadInitialDatas(response) { - $scope.serviceLoading = true; - $scope.failedToFetch = true; - $scope.couldNotConnect = false; - $scope.changesApplied = true; + if (response.data.installCheck === 1) { + $('#serviceStatus').bootstrapToggle('on'); } - } + } else { + $scope.failedToFetch = false; + $scope.couldNotConnect = true; + $scope.changesApplied = true; + + $scope.errorMessage = response.data.error_message; + + } + + } + + function cantLoadInitialDatas(response) { + $scope.serviceLoading = true; + $scope.failedToFetch = true; + $scope.couldNotConnect = false; + $scope.changesApplied = true; + } + + } - $scope.saveStatus = function (service) { + $scope.saveStatus = function (service) { - $scope.serviceLoading = false; - $scope.failedToFetch = true; - $scope.couldNotConnect = true; - $scope.changesApplied = true; + $scope.serviceLoading = false; + $scope.failedToFetch = true; + $scope.couldNotConnect = true; + $scope.changesApplied = true; + url = "/manageservices/saveStatus"; - url = "/manageservices/saveStatus"; + var data = { + status: serviceStatus, + service: service + }; - var data = { - status:serviceStatus, - service: service - }; - - var config = { - headers : { - 'X-CSRFToken': getCookie('csrftoken') - } - }; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; - - $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); - function ListInitialDatas(response) { - $scope.serviceLoading = true; + function ListInitialDatas(response) { + $scope.serviceLoading = true; - if(response.data.status === 1){ + if (response.data.status === 1) { - $scope.failedToFetch = true; - $scope.couldNotConnect = true; - $scope.changesApplied = false; + $scope.failedToFetch = true; + $scope.couldNotConnect = true; + $scope.changesApplied = false; - } - else{ - $scope.errorMessage = response.data.error_message; + } + else { + $scope.errorMessage = response.data.error_message; - $scope.failedToFetch = false; - $scope.couldNotConnect = true; - $scope.changesApplied = true; - } + $scope.failedToFetch = false; + $scope.couldNotConnect = true; + $scope.changesApplied = true; + } - } - function cantLoadInitialDatas(response) { - $scope.serviceLoading = true; - $scope.failedToFetch = true; - $scope.couldNotConnect = false; - $scope.changesApplied = true; - } + } + + function cantLoadInitialDatas(response) { + $scope.serviceLoading = true; + $scope.failedToFetch = true; + $scope.couldNotConnect = false; + $scope.changesApplied = true; + } - }; + }; }); @@ -268,129 +288,129 @@ app.controller('postfix', function($scope, $http, $timeout, $window) { /* Java script code */ -app.controller('pureFTPD', function($scope, $http, $timeout, $window) { +app.controller('pureFTPD', function ($scope, $http, $timeout, $window) { - $scope.serviceLoading = true; - $scope.failedToFetch = true; - $scope.couldNotConnect = true; - $scope.changesApplied = true; + $scope.serviceLoading = true; + $scope.failedToFetch = true; + $scope.couldNotConnect = true; + $scope.changesApplied = true; - var serviceStatus = false; + var serviceStatus = false; - $('#serviceStatus').change(function() { - serviceStatus = $(this).prop('checked'); - }); + $('#serviceStatus').change(function () { + serviceStatus = $(this).prop('checked'); + }); - fetchPDNSStatus('pureftpd'); - function fetchPDNSStatus(service){ + fetchPDNSStatus('pureftpd'); + function fetchPDNSStatus(service) { - $scope.serviceLoading = false; + $scope.serviceLoading = false; - $('#serviceStatus').bootstrapToggle('off'); + $('#serviceStatus').bootstrapToggle('off'); - url = "/manageservices/fetchStatus"; + url = "/manageservices/fetchStatus"; - var data = { - 'service' : service - }; + var data = { + 'service': service + }; - var config = { - headers : { - 'X-CSRFToken': getCookie('csrftoken') - } - }; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; - $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); - function ListInitialDatas(response) { + function ListInitialDatas(response) { - $scope.serviceLoading = true; + $scope.serviceLoading = true; - if(response.data.status === 1){ + if (response.data.status === 1) { - if (response.data.installCheck === 1) { - $('#serviceStatus').bootstrapToggle('on'); - } - - }else{ - $scope.failedToFetch = false; - $scope.couldNotConnect = true; - $scope.changesApplied = true; - - $scope.errorMessage = response.data.error_message; - - } - - } - function cantLoadInitialDatas(response) { - $scope.serviceLoading = true; - $scope.failedToFetch = true; - $scope.couldNotConnect = false; - $scope.changesApplied = true; + if (response.data.installCheck === 1) { + $('#serviceStatus').bootstrapToggle('on'); } - } + } else { + $scope.failedToFetch = false; + $scope.couldNotConnect = true; + $scope.changesApplied = true; + + $scope.errorMessage = response.data.error_message; + + } + + } + + function cantLoadInitialDatas(response) { + $scope.serviceLoading = true; + $scope.failedToFetch = true; + $scope.couldNotConnect = false; + $scope.changesApplied = true; + } + + } - $scope.saveStatus = function (service) { + $scope.saveStatus = function (service) { - $scope.serviceLoading = false; - $scope.failedToFetch = true; - $scope.couldNotConnect = true; - $scope.changesApplied = true; + $scope.serviceLoading = false; + $scope.failedToFetch = true; + $scope.couldNotConnect = true; + $scope.changesApplied = true; + url = "/manageservices/saveStatus"; - url = "/manageservices/saveStatus"; + var data = { + status: serviceStatus, + service: service + }; - var data = { - status:serviceStatus, - service: service - }; - - var config = { - headers : { - 'X-CSRFToken': getCookie('csrftoken') - } - }; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; - - $http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); - function ListInitialDatas(response) { - $scope.serviceLoading = true; + function ListInitialDatas(response) { + $scope.serviceLoading = true; - if(response.data.status === 1){ + if (response.data.status === 1) { - $scope.failedToFetch = true; - $scope.couldNotConnect = true; - $scope.changesApplied = false; + $scope.failedToFetch = true; + $scope.couldNotConnect = true; + $scope.changesApplied = false; - } - else{ - $scope.errorMessage = response.data.error_message; + } + else { + $scope.errorMessage = response.data.error_message; - $scope.failedToFetch = false; - $scope.couldNotConnect = true; - $scope.changesApplied = true; - } + $scope.failedToFetch = false; + $scope.couldNotConnect = true; + $scope.changesApplied = true; + } - } - function cantLoadInitialDatas(response) { - $scope.serviceLoading = true; - $scope.failedToFetch = true; - $scope.couldNotConnect = false; - $scope.changesApplied = true; - } + } + + function cantLoadInitialDatas(response) { + $scope.serviceLoading = true; + $scope.failedToFetch = true; + $scope.couldNotConnect = false; + $scope.changesApplied = true; + } - }; + }; }); diff --git a/manageServices/templates/manageServices/managePowerDNS.html b/manageServices/templates/manageServices/managePowerDNS.html index 50b0569f2..ca0b14ca5 100644 --- a/manageServices/templates/manageServices/managePowerDNS.html +++ b/manageServices/templates/manageServices/managePowerDNS.html @@ -3,86 +3,107 @@ {% block title %}{% trans "Manage PowerDNS - CyberPanel" %}{% endblock %} {% block content %} -{% load static %} -{% get_current_language as LANGUAGE_CODE %} - + {% load static %} + {% get_current_language as LANGUAGE_CODE %} + -
{% trans "Enable or disable DNS services. " %}
-{% trans "Enable or disable DNS services. " %}
+
-
+ {% trans "Only administrator can manage services." %}
+{% trans "Only administrator can manage services." %}
-N!mjxF~{d>%jcaFPw-?1^_=Mfdg@SupUl*|t@!1;N=n;h}FZBL*P5H{}H`C1aojYZQ~G zzd^XR9(J`5co1Hipe& zL5NYfQ+=NMha1K%L#+r`*+=-!rw1Vi;mU0pGpw3POMlkFR=#ukcsEwh#v!I27QIj= zx4yM_6uWbr|CFXK*QwI^RBrP%fxZf}x{Y0L4ml(OK&&@6u@;u`s*0S9j6!!tX>sKG z_woCg&KI~hw`dTQmDCW^dm?foyf9u~c{>|vHIKdJqp&K&k_tRTs9Dp(toeONDC!6_ zw==R?DW9Vr5*$3%T6=leE=ohtv^Ui5(kJRY4lskXKJKJQeVktOa%|F=H@d}hEK$t7 zXqBdkuao;BGo1!2mBQQ~8aj;O840?5s01aeLvI=BzoSbKXjI^9ca_i!KZ|L3^;nds zklUo_{@&^lsc&jF7JEhKAVrMS jFE9Esg2?I7F zxhC&E4|<8me&nBdYH?Lf^tL2%87RW<^@qbXfDbNopKYlnjw<9Rn~J)8FV^9w &cME_ZR2Wq<&A&MT>9;QmE|G_ z`!G1ua>1ZK)Q3Or3yDCfJpYu)9H)`smHuG37=6DI-w{ikf~4aeD(@>IQHpHu7T!7o zI$%wN&idi<2Cp>w();po(7^`*3NeyKbNcQjYg7#Nm3=26nAa>ywk7ag8)v)aW)=;H zm*YD|p|^Gzyr5x}T8+Jb6RAP!EkZm0b-(>1A{$&v>K1fdc+VxIGB`mC{_OI4a6__c zXYqrKRai$B-?NY 3{vkDO$5nu&RM zA-)M@I!R^*)UY|553T#1Ok)<(J6(4FhN2HLFm1+VeFYZC7MmcRj( E9Rlc9v{UFP?S1KeCRB#Jle*DO_QnFOZe_S^e_q+ q;%FK zY)hAuI|Tnz$|K`gn3MbV;yj}zdZs)r;1-b|+4^>s9ad7(ZGn6m99ec^R`bmUDGkWV zyvAk(NMRgdGS9Q)d#uCgiTkzxrk{VBk_LQPiMql2ziwtnFcWit2xetu_|=@eQAU6o z#tbIouXNXd6bmE^qRs335L*%eLuLS!m;mz$3M^ReDZ9>GeI&hW$ocXtJ#>!nGg>o6 zxI7j~y?K%V8nx_XCtU6|um-F|Q1p@=tXf?E(gzBQFsnSCyPbfpK`l&v??u$GD=o%r z!Q5Hn<}SE=R=D+bE50G<2F3^cW7>`j?78cXl24K=L!EPDP=Gx}D(C>$Mp9Lo7#H4B z11?(MzIl6Ra)JkXmNp42u><~4#?#j0j5f_J5ugs(!BMG3@XiIfFi4*bSV`7_lF|Y! zVRJyEfj+jK(B;zi_20|3dF6X0!QBZJ&1)6O9T>qHDxrg kFLT4>>H0hb8gTc! z7qHlk>Kn)1%j9f Tw!Mf b99cCm-gu9LH zET~Pj{(n#P2e;OfpI+~5@&hOTRO{9+E)3Xr{&73*Bq5f+{{9~GEW5V)TP}EJ`gFdc tE~<3Y&3rFNdq4cx_-nn&3Evgted?Fm@vr_;{qGV3C> U$1R{|EXso5}zH diff --git a/static/dockerManager/dockerManager.js b/static/dockerManager/dockerManager.js index e77e55ed6..a89bcf670 100644 --- a/static/dockerManager/dockerManager.js +++ b/static/dockerManager/dockerManager.js @@ -169,9 +169,13 @@ app.controller('runContainer', function ($scope, $http) { }; - $.each($scope.portType, function (port, protocol) { - data[port + "/" + protocol] = $scope.eport[port]; - }); + try { + $.each($scope.portType, function (port, protocol) { + data[port + "/" + protocol] = $scope.eport[port]; + }); + } + catch (err) { + } var config = { headers: { diff --git a/static/emailMarketing/checklist.png b/static/emailMarketing/checklist.png index bb709fb21690ff7679504ba461ea2c4bf7d746ac..5236aa0a87fb11b17312bd64530956d122d68d34 100644 GIT binary patch literal 1755 zcmV<11|<23P) |<;2OGaYU(8jkPktPJAPRCPf`LNF zB0dz0xTP8jE$ya>1!>&zKf5!Vx#{lSeoju DlH0iZIBB|@5Kp4{Ee3qmPl3uxp307f!5e3r06bYvq VT3YxIr z^mPRXj2{35b4O_hz=%z1bY6lvxJtdm=4Ch+Q$Ws0jOC;IEOii8z|Ro^b4R+X7z%m9 zWC0x yCi3{ceaT*3uVg?&|Lo`FaJdL_>V5C@>|Md!5L_^hVR9Zr#XP;`zx?K(P8>h&G} z@!C89m`fQ1eJx<+nLXFt>+2_8?cP& lw{5PtIDD7|>c@6Z-(motbJprGyqX#qb|eog?>pbiS#Vz%yJ zOD4W^B4&d&JnbHARM`pX0X&g|J4CRAoCU0aT0mbglui-j!HFCK ;_B1yhGzeJ`n8W?mz)RN?d}Jr$hSF69z+W>NF5`1VA+@7PN9MmdN( `q7^IvAT#G;Dcl_>02o$5Y4eURHYVYzH$(t5r~mS_W+ku! zE{md)07#4zR+PFR DNI0tyX`zfX;|0YEdQ3;5;zMX7Y2O&Sa{DV8b& zQsn8UZfb)yOn~x}NdQF1`<{iIyZRW4lM+)xz}{+bG(wL2^{{55 7g>l#=r9`j|b&_&kFw7d>L(S-JY(E7w6 fBWL}14|b! zAN=q_BZd_$NGWlir^KtUHb1lRg41$S20?r?R3`BOV7Fe-a7e`%miOh-`L`=?pslSj zr{|~)LVrsv_{#Twa!J4M Jo(oX72yB*QR42r;1mP1I z$0`B @OvL1_X13|aB7F&Pd0TzJa-TP1kuONTV!Ivxv)@j zD#j`UV8HLGfIw(K9B45sFvNEHpogNoPAD_tVN2KVU%b@>3z%ZoAOfg=H9Kw%$Oy4y zN9qK;{f&?Z#819`X@8HF&fEnC0Z1$yfXeK!?Fxf~(KoM*$Eg?-2?wAwF!CY^=UgmB zw*+=S|0=ZvAtIBVr$Flj<$;k0#IijMW{_QAj9(`VktKKlY{d(xVTuVHfZ~c#{ID8z zVKKyl6ZXC|^_I3mb%}&8QN>bMG-q)! }#x7yu{dX;VSswQ&Fd002ovPDHLkV1g`o6f*z- literal 2961 zcmV;C3vTp@P) 47#YFj z;l10`w$4(|thGk~II=bgFNNHx{0na#;EU6jS+!~vQ>RXKssHHFqdfie(?tEGD;u7l zVpmsLYvSSOwgT-WK&g 9q09033qt$BB z>2$5q)2< Ti;znz_ZgHWajuGt#0S* f2 zRQJRTU}owv Y4MD phO>vWFq!N5;%pJ-`kM)nYel7m2B?wA<)~CD zWOC=p5l=!$l7tXK3H%9o0cbIOGH3lNV#bebv!UYLEBy7LSuNHn ^6r;;B#w=wTz8{$2ml@fcqFbrGsZ^q z!{rj{%odwKb*;(zYc^4Cs%^8O$~psJ4fu3!kzL)xBO)m-tK!x4FFA1PDv4twk?QNo z$uGuak(%iW5A8ybzYj$>s<>X}Ugig^y>C$OP`fe(FcctuY%~DBU;8nIy2@sabIPw% zR-Es)v0G7HY7JUnZQ$|0yl+=`V#8dfjvB<;_p_+1t)r~UNT9EZm$qhd=F;_Mx|S!7 zA%1K$X@^d;Y5%uw`_LoUk5ASl+LbAQK!9FdyVzBPhlit5snBY*7z_rCCFN9Kw!d?& zLCrO5+Da~$)2B}#BuOGKFV9xrMdOX1T7|BnhH9gkK;N5laadRwYPFi;;$pj8U$CE= zKHUS|_Muy#rdgT8b-;!V8;FXEB0fHztgI}~{yp7oL(UKw7|7wnhcOzBL`Fus)g~n+ zg)w8sFmK*G_U_$lE1xxC2(u=%K26pXE*C-p0Re=BgtW^@Q?x~wUazO5qy(eU{%KTW zsH4VM=dhhpA)|}N8;hl$vMK{|nIO>5$4 SC<6j<>fJB#th76Gx729Y}jCZjl4B@0B>(^yuBSy zTJEBv*7395({M>ZSXdbS`}gPAv13ky2gu0CASETmslK3~AU^ou16O8$30!g| 41a!H9$*WQ)-0}vn5ITq_My)0*po@X0sWM zMq?LzY-}t$cI-f-v8I}0V`F*w<(Hl6^6{}IB+O $)+qZAW*Vor38xavfL_~xWZ8u@DSlGF9Cjc)zHi}kk24w+H0gnnHQY1-|8iGFv z+z;r0g_0!gY}!Z&A%JA8n?Lh}5GN%`ddDRJ1qB71Jb4nmUeA;%){l-`3LYRkJDYv` z_Bqw(>+9<1yY3&pSmQV zU%!5&rKOROkbqvVXV|b|Y}>Z2S@2+;8ydgeb%c >Kv6dwl~G6T=~_2 zh=!vn9(A*=ACTnM91tBHO F{`%{-F@Gx}BO^&lN^)+s;nle*CO*H-x`hsO z2?)essKsb75I?a$-9uZpbt|&ZmvT6(fY7ep85nh+L%H1ZKTxQ>(s()4?WaI=bTpeb zZE`9zWXKSP3~`>OuCK4>z<~pHx=dyZ_w RxPE(aE*nD_w&Gg&Uc|3 z@pk%Y4rdk6vsWLcOrPmgcHf>fjvU+%ts%e@$j;7Y?%cUtxnjEm`1< u8+0be;4=*&I1}iTZj8V45UJdpgHDwtcc^ z028 3baJ5pn{ z72Lgfva1ILJ!IoQ3Svnx6v1k;R4^AcdlJ251EP4^)I*{EAsa|R)X*r#OAfmMi(c9+ zMS7DCQKBtsM$?pl$vnR|^JeFpw{Ld4voo_1=7Y(6d9yn+@Atm%_x*WGNFs?Ol1L(n zh@wPx=Swt8DAC{`#Ds&LDf}^M8@l~}Kb-f$ST79p!M##2#ts$6drfLw9X(jvdmvn* z $^!I%m<0AK+Ddj85ut-N p@<*Ck6nja9(jIih+^n77&UBKp$}dVCK(6_3DEFKu)p2NW)N T3>bw5e|0q?0BWvz)96^;B1f={T{xSxiy$-tPzC@B9$$}07$-0Q zm=&bD27(NL$CZ5D$DMOT;sDS+ckly%h!G)LcNm~+ R)bFR1Bp=K$5#&3 z_yi~6gngV5U#$sGEW-6dgdjAD{ma`q_{?Mo05F}c>JTS5yuvdu!Ey_p$VZnan27mh zKv0V;^$-AH`U+p+Qi~P#<%#aN!*l!D!!x)X-smh6Tx+(%t#~4$JRzRKhyzeT05q&H ze5Qzb;^r z2gvH?`&JpPm~oZTEs~{;7y7G5zPY)WqEvGLaP|jO-U@S@ARhf|NhBx(0L5lJadBh0 z{O|4oD X_Y5l~VBLRqzg}7BA5)@kT#I2qCtx{U;ke>p&1F_oT5fw!a5#mTt zlJSIPNha;s9oj9W-ApjN=rAjZ1cnd^CS^RKaJP!r9Z)9N$CDu}4=wzY1|MHlZL;&r z1R)yG%=hC124CUf7Lj1qk0+ef@6;XI<^(4dX0p}L0;lN~0I(I)Ku_}tP6_~&1)iv& z>kT}iP_H$_0)kizh$->a(Sy~8zc30gS&f5IH&YZ5jEUX>Ls(%ZgD~+jZ;*&Qp^I+P zHFv-Oq OK?mMAma;Zow>ML=p+4MUewQtkJ<+4R-Y4L0lRmJ TLSJ@v`;^6CAD&j_7jhx8VOT%gPVfbUh< zcSk?aGhe-v) H6ptIar|!d(CZz;=@Ib|k5< zwkC52#q1o2wk$y`hD2dK!6)bb7=jnh;qYZ|mQtOsHg1BXQCA3Chn0GR3(SB8Fl(rN z`EEw)4hnTGA{G!Z0IJVJFOJ<)MP}Y0 XOvi}NG|@c |4kAAH!z4<^j6cD-*9dIom&(f#?QNU19M8M=|u{l+A5|Y#b zh&wvqVn~$AYlrn`&;6c(>scNV>Mv_IVHEw_w~mGfg4u;+>2`i2wEX&gMziP;s)XbY zJwe<-=`b$;@7=-41Y_TpZsrbVjPBq~g}ZMFmOGd+yF fE$Nl>%^8x&rpMxQYP0Mo3jm1lyK;LQ-yLMMWS5Q*gw zQ8%d{0Qry4Wdnl{XdCJH+4Y=KpA35$#oY;#n6sZQ145Nep6R>Tg81ZZAoNZENF t7wG{i9PytL;ojt5um)K(i6lB#x~eqc~RUSVRS7L O`>|P #2@~M= zH|sHnwNZrMa^{tuYy_3!zCuIW5(xOri71*70p5nDS_|%1uw+1X)9NZVZM iWU&x%b9}th#!BE-I%DTDCWM*Ee6IY5Kc}x_*fK#)Wuq zT$ne*rV3dRP}>l=T{P=egxQ1TGu3&>kO05GS+Bh<@Q^~D1PTV1osG_$rr7-cW<8U- zX$kQAoApS6wL^()9$t1fIuBrp=#c_zM l=eI`Bm;ZP!*Ya0T$k5^|*0=(;+uTjXOBjhv0`2i^8QSbWZYsM-cm4LPN+p9#k zb}|D#cp0ETbZh6@`t4Pt6^=R)(lo7c_)zDoy^uB6&L?S(KXVjoa-++fAk0op+_+(Q z(Fg*(4NbK$bdm#5_k(X@w`DzVI(s1MdT&EhZOhiWw!z{d9{K&vx&`-7t!4Q~+>9~z z$^)Et*&%dC; uc^@oc{MjcCH z4r?Ru#6aEC(V%xzn^VH!PZ=YmeQt{{qb|@J@8Z2 tUZaa$M|Mn9&8WDr>>Ftb*wyj; zsB+C_Qgy@ooI1F`lS sz%j49{OS*ay b%b%!SebT#=|sHOOU!tOJ$*mq)x%-*!uXK#j(=aq@x3(wg07w4+UPr) z^2n5R pT)LC mw15r>{5#h&=r`h@c7_xVjDk&|%KT^GYYtf6eBF#WxRi9zbwJ z9Oh~pqH1z!RM&OHmQzkOuP}p0h`s#=042+oqB{NyKzGDOB@oBX+b36y9`=c *r!?&DQ64ge}kSp+Ls3}{_$U73pj?&lu zG62QPmZ9}^0uUB=s$AK5!}YDP6(~HKl9@}u$!E48ris#ZT;UD?)SL_G-up2C|8ZVH zSaXhfzY;t)$#pqPgz1d@lbv7F`${VS?q!#uef1sy5qmjE2T7%~%e8V`9ReO3ITFy_ z-94?NK&0`nNHPJMMo}aPfU5M+wPzmy?-pH7ujWpt#&dShZO4Gsa|+}2e*oaP_!8_r z#{h^r=cYc0HXE g M3G7XVd0hps()0dTKb zOZNvEjZ#5Pr3lCxN~vkNtll1a+EU@RYsoV7&LaTCN){ld37W>Nx{aCn06|SuZUjsh zPVLx+6^jDkrvK@eR?@ZSBLGTPeGmJ*1sUlQMNmU#4gprEk5ex`3xIR+5^N_917MUd z#7e|LX;iHLN#+WLpiNR6l(I%&Z!gJ2B7Ma?BD`ZORwN97Q%n67S1BjoPd)wOYu8Y4 zK{bhFW?s^HTt# adJ#cXGMiZmdb(VmBB)&$S_;J^;#!H3$RFVtV&~ma^xn>u}UuoVh}U z;WYGiTOi;It!rp%2fm+;K{mTRo9YvS7zRDhKLbGFqKmK}`vicbXEEmIy8)=E|7n&= zX%7T^q5g@GYRQ|mlYs7*c3^gQ0Z>ws%Ic^h7hQV~0N`5j9SSd5nx)p1&nW_Q)e6%( zwI3Un$;s`H15j91js0jU&`Hj}ltf>uOH|bVEL*M8?{g|G-rDFp>aB0uEs7PHYKTT6 zQ}Pj1eaDc2ao-(>C{W;_^P^PXcPzaEvg!MP5_Y%r?>Zfn(vc=m853X_#*_p@4&xN_ z?z$B#5<`D$7Xl AUyw7+@I9zCGTLeCy zxY>C`GCD$}mljj8VKeqQqi*^b69OL>8rqh@vLR{RK)`2u8=CGFXicZAx3`Z(h95zt z6y;^Ph0l^Sh6*$rwuRTB6=$Ev(cs?Uo2y6UwOh8 k*=w{ig&xFeu6?A5DKuG#5t91bPBTAseOZMb;UjF4qn8&I6c zzLosrvoF8q!Drv$PyalQs{U?{&U3=DtPP_TjY_~v+tz=fOzjq6T9 e$;jIF>`_~+kI~e>W*Am%ojqT2y^Gm=GVX2#O%t7oOB54 zj+X7dH^(X;H!0e-)&G 9ut=K%!;c7ApD&zV)4+bWbO^>Eu(|5M}DNxQh`G}Jwj z0;yrxe&NfPUCNv}nf1ql94AaA#o3MVgCX#u(@^)MuPBoC^7#UKJYgkGOJpWo@r0H1 z`2u<-zGZx7$P!|Z qK={8`xaqi&cxudh^4p0AoAD{mp{ceWv T|KVWZ00000NkvXXu0mjfO;z3U diff --git a/static/emailMarketing/mailing.png b/static/emailMarketing/mailing.png index b8586aea2c6ae186c8d02b71572fd44ae17f9dc6..da227aa3207373a3ed7acc26ade5ce0ecd3095d5 100644 GIT binary patch literal 1950 zcmV;P2VwY$P) rZhnjia)!hX%&5Fimfk#*{TIm zVn!cC=!08JN*k;lseLle_1v9%XV1Mmo6KfsX4|p{ZuZXHJG*nf`OfczkhZj?Ep2Iw zBw9neXQ)9aVS^AC2K%J&$ECsZ$}yVz*HO{|^EI%y6AnAzcm>Q;a89SxIr;E)_T>q} z4BZP#jCcx?0Ob~&69kB-^h%hla=m$qdH{5~-dv}o`0FFr=PoZ0W~d4GJe?2#q{C&O zv}ixRHW45?LhYi&L;#dQsdDvLC`zizOLGB=<^!<82Y_Gz(g45!2Y`WL-F4_M^5f1M za+eDTm;w9A7Cpb5A6ww#5{wJV+J?{nHbMDm4gg637#aYv`M`Pd{nIzb3WOeNmy1mx zrW>I?0|Wp>XAE(vbx-lnLhC`0XiZ}T!3UrO02Bon8l~3I$Mc02gP=IO7$oJ&3}7Yz z^P(mg;u7oL56%@@Xby_EkBJEa0FATlJF6?lq67d?ImZ~WZQt2K>&(H8*BmNO-17ky zRtP!%OgAusaz<1@vhI8TOr$_`G;9uW`2=JRps- aR7j{#|UCQ@a`Nr zw!0^n90 #AptnXjv!?CSbsPjGF)liE@+h=5Qa@_KCUUM~8cgSB*KG$aVn;beuau z;RA#Tr~vqkxvI>8$+x+iM!^jBgL0XQ!ae}L((E3FU~cLWMyUosh%Y>1DLvcGD#*H3 z6t~0z8X^|U@^tFu{kpJmKNa?#9`*;4Z*cL`WyhMh#y;}WtyA^QA;CNWcZE|_ z1;7~qr3+O*AbbE;nkYViB5GIXUM8qXl;838AA^TqUT4=ZAwqKq1ws{oS`e@!Y$6Ky zsW4_mP#DAjBy0|HR~XALkEQK9KfN#rH=eE*I;cG6%8AFOqfAe$naj?PRgQ;WS!b)} zAbuxNCamB;-09Xbfyqx#thJMNj3jBFz~2n{iBPN4W*>kg^8^fluKe)k1Lv6;6jEMx z7w7|0XugyWz>W{XAWNHbpS{}asOF%#2{S?X0WTG WSfZ*i; zEf*?hjmbp^SAH*`%GM9hvBszoE)}Mz9HvrfteOUU@%u^swsO6+Iq~SAz8Fye_&t0o zj1>v)6yY$q^R<(`hhFb%eNzR$7*V4GV?absu$l_X3<+$iMClj8F+qMYBCUP>+|8wJ z`_7K)ex86CK 9Mdj6L2xcnejegwuajC6PU8@z1t;lMtYPmC`IjL_zQTVhEGC^i5evoOXO z0BA{7G|l(S@@t}Jg6Ie6Zg5z-|GhIKa6Y} K16 zB*OtP_?U+CTVanKn>naV002xlzqgqvfV_S`On30FE+7DkFh*6X^JBJF1jX5Yi(kX$ zgOM` P)_MyP)tGvi(uDVB=;|NmHca%G;aaY{ m3xh2TC?=+)!F|jaL`2C$Bth2R&g&i7X}$kpyR!OFrZ Nf zJ^+V8Db0=)gjNYplEy-A-xIc8xS~MdKp4EKk_kwF7(3YiFiZdd%Szp^2oM4~O*K_y kTiVi=wzMTe`Cotm0FRy#x^sZB+yDRo07*qoM6N<$g8R^R(EtDd literal 2124 zcmV-S2($NzP) HbQF`&wWpDkcGLJS6~i*v}e$FcwDX>RuP2TBzX z454Onmwt)l?EG=@jC&ePi;HGc^ $6JK3g$fwcN z$`=MBsYQ#)T~t0 lV8{T1WPk@HnRYtNvB8uuy(2VjK(GY_8`A~^TR^ZeZ9uRE1RI*` z0JF<{q~F}1t`@WRZzmt??C$-k=Q-LM{=M4!i{4Nx^UJsDK6Xoz`YxVDF@_F4{FT)e zYVma+{I&YZ<<_S?&+$o#&y`g^_>Ni`_kh!(mJdD{P?1JInE#^|v!lJE139!+extXy zqiU8$ncICXfX j+p*Jlcb&M{kCTAF|V?V52PEKd0@Fy#$U?E;H` zc3=%|u||tT3NdT4&x! ?b7k-CX5xtzhVP(Lj=yOEVxXM%zv%-{V>n1n7fw~LH3XKI8@*KCvOI?!OVl{;f zkQLKGYqyoFw=FiccroTZ!PY010Ivesqci2ZNY;_GyTyNbs|>W+o<#Bkzzjgw?$7cJ zU`l--XV?nz9R43Dek$x3*bP*Tk=umi8x+VxBQr*Kfwpx!fsYuo@&KX=ML1}CLiGaT zC|p>dK%1=&$#Zxr?}b4aIR8bIw(B$(75c^P5H%QaFm~kuvJrelqu4nz!`pz?b*qtL z`>6DhkVGQc%hk1h+(weGAX%gtH`r;x-S)oEy#Ejx2=*e0)QD7&Y{wy1dnbBubzMC0 zqR%ge2wa9e;KP-%w)NjaQ0+6b>q;!==KMxGPzV(E01-ZO3tq$_;ysT;2Dp@!AZGeZ zbQk4ZS*v|dMam6+@`Cf)W12B%$OrsAOq_|rO3%ZvrY-}!f#5Qzmup;Q0_OV7>%JLI zV}V6IhQKsSN<2S@_w}NH$dKygB5iqq$$wrqm=yJHBLdaT=l5)e8xYtv4n?D!O9aLX zAPvnL5rJ}F_52tzKyo}VE}>p7_1A3(+We+f!rWw?Jf#}r4p8&3x(*qj@b>_ydT|<# z`S3#jxs@pGg_h(P;QxJHF{Ee6fP|OdLyCQVQf(vUS6$j+t|vis`^+j#5+!DpX53ua zg =>dsaTO{}51wQNlyFp{(cL8 9X+pw6oFP|0ihZu2+BQRo4 z&6<7JgxDCEVS(#iaIFKH{{`(M2Ve0Eb`EYCRrzDx_u=Lc!@fGhm0rp%b)=Xsk!)(g za_c3!N#%lTE-!RGLz^>kh!uzoRo1+=)HZrm_;BJbkej{IQk*cq4-%aa?}8f!xEun_ zq44RbhI*Wv?WIC)XETUh_wdbENTe+0N78H5-df*%0;xV%pX+w1Wn)t4+xI|pxL0D0 zy%0Hgf^lz1%Pk60Xl{G^0D jV922@snhoAV_?>GpGngTA~IuW?dBIgWA>j787OrprWXqMq^@t76~FKY>OIW z5GWti7|>lq %*V}fbO}r<0a@Vc9>-jzB{LgvL9b>M!=9+7+ zx#pT{t`#(;8aMsqW40F;KUM-OwDduis%HqED&5yFt{T=LpalPq5Ter8KCBo(^kJ#h zcIcY;3GLdAC-&a3{_nwApQQpdO9zn>6b);z z%7H*pvKRM?RuUD{KR-#IB?f2JJOEfjnmdB*E#q%TazeZkqkEMMp?UKuUn8X&=fQEp z`8)ua!r8uR3FD?Q%$7u{zc6Xb=`a8cdW!&Pu)a>#R2Xy8XN^=g?ew5j=yrM^@0Qd4 z@wg8h4>WPkiUIIoeG|G|sa85Tb>1h!J)CFvoi|WhhkXe9FykyjjynZ_D$(y4aFqaP zV)x~~K*#EY^UhOX>#zpr*LXQoFLeeW1pq#Jt#F>KDFj$N=XJLTe`mYDZCJ(bL-?46 z+-D8}Bmp3WYrtbT7sYBquuEc6?7rjBWZQ?kn87+2SA6880FVNJ1f18feECuUPKR*q z^B9@eHIIZAN`;b~|LWfWg+4R5A6F&;NC3cxa6VQT0FO4F=P6u$wkB+QY+7w0z }x;-(C$hAIsqUc0Z0xkpOR_0@jbr Bn<#l>wOTE&%u>=TrE=J?yro5vRvO04AI@ zsKXqT0Q3XEh%*N?0I9%)D6)b27_WVo_Oox(eWLDX0hpzWx3C4y0PKF?vR;}O*sU;i zgo>yJBb*ST=&}ArjU(ZEgB*^)`EX9?)9#1ZtrIRdH;e}0=H9 xA*I2NN2ls} zAjqOvG6ZD|0cd8wZ?GKU QPwuD;J~CnAJDsNi3OnbgX3lzNQa@&_7zj}mOat~I~B?i#quHS;@QKF={U1@ zA34uE0YEPUK*$1c%%_Yjhl%YgrWKq);OBlNBZ?Oz5`M&vlk=Pfvw6=%%}40BHjdh< z6$4;7#o}@`D3k_LI#~0AGDWep61kfPNvJLWK%q}%uLuCL26Au|0D9h2c;jTMbwU zN8*BmnEPHD^k)D7*r$ zZpwYL>5 w9v{p&ZJFrN+;0?_u}F%^zP zq;i<}^6}}3B2kbnjYjzoa-2cntThJ!maz#}y#xTkLI6Z=XR3jdG!UXVn^~tu`u%}& zAvjA1qC8Rq=t{yk#J)ZgXWNIhN&wul?r7Ma4VnT609&7!UVI*DiXs!`kteGQ;U=XM zPKU4(Ih`Oa9E@0;eK9;VY0K%@l+CC7r2v@w?ok!rk9e|a& PiDLN>O79p4 z&Z(y3X|q32b0$LeR9K&o=1Bn1Mgu^0>pMqiI4UN@T!$F8Y l63*Wwx1VGrg>qvG!|EJBJ__4ptlbP<>N1U z{(kRyqckx?8rcvSuQLc_dlom-SUe#OMVHw>yX~z*)C)u;0Q8<9UJu>#+8^;nujpE_ z`v+J4BI`ja_Qs8R-9a#0WP@+=WK%+u&IVz8a8&|e*Lk{X_*wk^7k?jG{K9XsC6NRE z!u^3rr8KYjUw*1KV}wH#3HE7Foxk?5M*lv8*B#lRDA#fAfkVs8^vD9C$uT{c2|oDj zeqAvPyoV)F2K9_6A`6ss<)S#YlchX{PB7je<^tF?dT>I!7_=h*j m!)`wUfihzbbrTx9PW+mzt0{Q?FK)VX06!UD5nF=T3PtR!2_j^m8 zKS1E_rf5)dL0Bok1ONg#bKTps^ty#09*hi04@Ow#fP~I4zVfP3Km0?hf29G72B$kR zCq@|n(rMk=*)!`_6J%|WQ$WlDdp54Rs_5=P1E_nXkz4Qb&Yx5OpvYK8?Yd%)-+6Q_ zK4aA*;f|g^O~se0fWC3n)fMgDBP;f)hyZ=8K4aA(klp>p!6A>O_>{x#8=kp3!Rp8^ z$^%)XLJLwLNHf5C1K^r#uDRx#Yp%IAn*Arh0CI>x*Sney$N&HU07*qoM6N<$f~>6$ Ag8%>k literal 3260 zcmV;t3`6sYP) 9zw0s!fdi K;yfW@q9~x5W@#!W z8ohiu^|Uaf48uSTamZ3bv-~tz4k!_yN=u(FO_OXehs;t-%Bh?{hP&S%=X$x9$$PmM zvRa?d`S3aWtiAU7{q8<%@3qcGlv4bYL_{2c$AAgIHu)zJAR>1IOMw7GQ_(+y01@#A z76T(oKXa^kcWO>V#1)tYJPFh)Pv>t-fQSqQQi0}`>FH|5othI7xl2T{fUQ&j-o?4( zcmLZEAR- zeL;!f#^`LzlKQleQhP9deV2JVlZ$W^Fi~)`UvjJxZ2Oa+!AIi+Q zaK1fy)>Mx*i^fsMt0Wx!r3ny`AQ9OGYykWK`gCi_=b7 2td=u z^;n#6AJGE?je5KHeb30ruW+NF$gF?2;HJd?JEB7Sw>1GGG8IS!JOSKXotQmk5Rb=& z tut$A0*gh%rmKaOoN%5I;76m$n=Spl)q {sFsN zaF(8#Y2X^Hn+ q z01+7rqyWAEx#zA#8J2c@>UmV!_x#1H3>uxr_a}b?VETQnd16ce17_~v`i){lgjW}j zr?#h?RX)`S0V2{7SO)aD*%s2hC9$J>Th#y3AJ-ZD;8MOju4Q(Q3~kBtlLA?=;V}D; zTm;~;iD88GYHhV|)k=Vf)B)xLaexD8`FQf2d%1sD7mI9Mxt34V_~jfrd VOY9YXow8Ww%E#9CdEz>6TC;qX)c(}V*WaoNb0YhU} zu>Z>+0l2@vKg*|gCcmJV*pz(~6)T(^9ay(yg4xc{8nHV8BGLmbY3Y2kEuvpL7C&>J zF=??x@^2J!Z|q9;>^}j(J$)LndR8}dA|#}L&9T#00GK;HlHm4@tL(4c2oRC_Xi3Wi z43Vvwzc-5$MiLbsSXtLHQczgL{c)?=vF9iN5#4-Q7vCKRov<_KS5|J-HatB#HD~st z18wr#WTBe|FX1qX4LS|1H#LR~WSUok1iu61 @4b=fpOgjy~d`1f|5=ItG)02mzB-mJ1~iZ~h&Tg}15W|&0G=MM zJUt_dDHHnP=vejXI4$9AUVG;=00LXoCL^gY9&Va@xfk=9w)7yNmAYS9IJU~;lopE# z5Rt)X`FShDJ!407Cn^3O8hCr! !N4_hkEmzIb_*#EwT6?>8noFD)2D zLm%75GnHEsAR^6yB|!AewoV=VS@PT{dUUGvtCL0Y?4oU?uKoysmUnvaeo83yyh`>7 ztGA!vLqno7c0_mXiRftan5I%G0U|OTZE14>ZTdYoYbX;R=#5S%HV^*7@()N_mIXkQ z2JU1ghti;qtMU2wKVN0eDlO4z>{pj1&smq~SRxg^w1#423I^~1y}Gubfww35HwtYY zIBm@i5*B6v;OFf|W^yQvd`iC96zdg}QuY}Wo%Gc4czU>2WUk6m;S5kp<%-BUv@NX; zAS3$_8QF($b9JJB?>0n*2NF4;gVpcksyB8sEAd?b>eq4Q{p3)Z`MR6wEPCsRG0~Ye zsXw7T?y_nOOXZdaBn&&eC}0>cfKuPtMTD*$n-Dc1km&G0+O_s8&x}#lZ`{k|S+Ap% zqOPYi*$ev-(A2zolXLtMVbga|Sfr<2Yd`jGf70xWuC0=onn~i4OwE65PKbzz8yX2i z(Sl-w(mG8W*CRSSkf`uLLb|mwTN>ZVIKcR6Ytic!p6*U$rG(P4WgWBr`31%Fn(`4x zPhG~@$&o!7vk3}lR27^RiYWnB(W;cn1GWL%L_~n@Xk-k-aPH>E(-&BlzLRC?JE`sI zMnqV9qQe6z*6W!#^ELE(g@>CXTb>Uo10EnD{cDb%(rSGPGb8N|zO>lwjF5=5poEM* z81nzp;^yMO=J_Fn1eV>#e){EaL_YZ`N (qcLT>{b(0N}W(jr7ETR z0ri1#z((MTsb13LpmM=qzE;S?hD681-G#NOG1UUTv{Xw`R4H{)DfNa@Y7|;QWEfBg zuxZ!na{J6!k;9pD*8y0RFp_5e-qqn+8L9TFuu`f(DU|`N1lax6IkNVhHPbot{qMZ> z@lVG4>`xA}VbeY?{(h~x-K){6a3T-`c+Fk&6$86A#KADdPyJ>NbaPe?o3nCoaM01a zYYU>ogNP3AK=UTHr@y7eZZkkchKR@k5t&xrbEVXIv~4v 7(Q_&4TEMe^5Iulzi}_;E?l+Be_KmpQNVkYfFG%pdjA&PUI%6XK}$9s zC3Z;VDfRXIBA#2dmp`uDxY_hE@D|$2ayQ_1J+Hu+r|5J-&(6(>3J+vxc+f2?(N&%S zA`*!?_z_B}ZMW*Dl+vS}=i_Q#5zoJVxI*2ld4&w0v6WBu8<);(AWA8 G49dN0{o(|{@Bm+lG`WY{udLAlfR8JKZ9$3;| z1;>W~`6l2at4LxHPz KxF()cGxdvz7Mm0{#Q+zBx|0mkr?as|w!4 z-n!BbWiA`8g6{G$ZF?7RvT+=5v=26$fU739&st+-a4GOZY;nq9voVloN`QB5H&gI$ z0*;kT`96TFm1DXZUf~ykyQ>|%!O=vt= Y9qkT;12?KRG>T6L~j*_I)w$`v#4Zcu!#Vm zE^y5Re1whQ>)t{?9_=8srQqMU6}%+`TsDwUZQw1mSsHw%J-}B=fC&i}J6}WKw`1j= zz+wUbf1s-k&c19<@CKW!O>AznCwMagN(DTtNdSE84c=fk!(cPR-r$V{loRdCtk)Jg zn~av2*af`7W-XvsMZwVy_8C|Tyu|^}U|=Fz8fc`N(g7V>|jAr_iqt;+EL0000 KD?R1`j$nccOlU|6V> zwb0Z@@kh4clR{^p(8`KTQ505TGJ>EM-1;i0>mN{dTd_V)7TTh=& $%CjnVY+rnRF((X(0zLNzTn=bH4kX@0^ T?j!`~<68fg_N7M8ieUo@S!A1eEOX#P^B3>7}1T^m) z*b(n>Lp}$u?JLJ-ouoi0#RR~@7#d#i8~_?1zb2%Q&p%G#VNw8~Nc>SCz=j_z4OC-3 zt&fiZQo~2iB?Uqu)?EZ@e((@;^?T>j1iZj^2>?(A@YSa*;lUQWzONwo3U1HG8KJpg zzIbxeRLcZ01qj$UHu|qV_i4EDJplaG2LzzE`XzCt#bB9FBR!vgAE_Y#hCfGiwIGC3 zU=^M#HiNlq+a~%PI5gFfe|8tgEjE&{`BR$*5dgynB{^Y?mkuJ`UE!}^+ooF4!nqcF zcSlcK#XYtNX`z@2LcWWCoKn(fiLRuS38?| ->xRq2LzM{?_3iZU})@~jM5>{1xrC6;L%+pApjr%AR}R1 zSKJ4%ve^#+(mwxz(NxQX%H$GOf({04q}vBT&oB6ZgaDwvl_a&M6#LGuiy(mE?*#x; zz=hN`Kwt~>!0KpjvVt2AgsXR|2*5?<8o*cqJ9S|(i@n2QmKqS@GZ#MkHH*DN0Dz4E zY$( !g^zzb=z)+$$0(-2 zlpsn^o_8!fw2%R 4fS_XRtPTMHB!j&J0 h}&9 zY%OCA@aMYBhkJ*&-np)J?;rtS<8ec!1_%Jupw~95-8+a3K-#aazximO%tub&FzNpX zuN<2lx_3Bx#(QyV)XmSIf4u_T|7H*X7iMNI)XHa|JmB{B>u 7m1BmzuTxWT#58Kw^3mM}8 zFrqCc&IB%k+%N@J=0Dx+VBU7VS=>8}1;&6mx>`St8LXbVFbY+m_QGdd<)9Dfdh=%W z#2?i`eZbE*&+U6^_lNwEj`Y%$AzveP?RyOX8P<@V<=iVEu|SZ@pfyS#aC`glkZ9rf zglUA%Mgs$axIi$GU6!;#d~V`>!ur^KfVBU|U}=S^u$ALRfjAx$fHet#OA*gYjtN)a z-m`S%^cKy1W7IxidgAwevZ5mpZ49WwR*q}NGWwpux%v s2DewkH=2O9)og~b5H4<@EiMR*BpN{nf7#yoH!^jYCLQk;rq)Q1xa zK!wfQ5>RWS0#V2i04rjJE4)v@Eh3m*+RnJn!tx5Jd=ynsAv+cZ?~@GhUOaq2F%5 zI%KsLU$WUAn2f$mTw_sD|G1_obE(sxdSha)(N6+(Cnu9GDtx-_cF(ZYx}!5I>(*%l zfI59Yb+mwLfIBUU0}yr2;rMOPW~&~ySmxfC0343nyo$1X%w#H~PW~Ru@lXIn^(Q9& z?6F#lM$G2BraXYL=;&DL^t;rtA455<1prr%!|{jPX6qiYT63osfZ4O}995L(sWUCI zPLBtGsNSTcQIE~`-B3cp!;=FbD(aTe*w{4cz*kh>@i-m{08uWx{laiU!p;FY?F {> zYm1LAna%f(8vspc@uMbFA?@U4y`45109Uuefwe{N1&ifbDFDAjNB@&1w0zpJP9vS3 zC;)zIi=?D68WpAIEf&QOz}~%ka|#O!w;#{Xf3G()v%GK7qRNSsGd0!iOi3A =|{UZGci6Y1oK9 zw6(QqivWxY7e+A{fCC2(u#v_0Cr+IBTjx)oKFuHm10X)bF^p(QNeLTKI9ps??2882 zc6N69A^`$`g9i^X8}wHkc|he+3GoP%1|TCI0sQ&YsZ%VZ;S9cm<2+o00e}r`Q3jyG zMF2h#DX_&e+C~&LG&J~}gAi5X$OEkA93UeQ4$KW0IgiKVdln-H9Sf`jwkX5@7V8u3 z#lKM}>>xmc#B!*wqoc#8-ring0NkjG2mnSM;l|1HB&KH1Gco32cXu}%4UCXDXCo1! z27N$ZP(P23Q1y=s02)Fv!u&(B!|M;iT*TbRTS5$dbO3X&y1JUp^P@+PGJ7PflP6D- zvuDrxLVr90bY4I50Phd4ANfJ8e$4 #w |Q@G8oK zRQ2M)<*)Jar1rVZBu2s^{2tH(0QPzSFsEcOXYCYdJpGN~tAFV_c>tq|vOv7L7N}FR zEFmFazAaesv?c%xS3VOlfLvP|xx6@oT-~^lT+PcPzi!=1zKXZA@6aDP0E%+=n9212 zaL3qtEXk_QAOs)H*&q!7^D|@3^AQ8cx26#9iWS6LP(Zxfwh`~{-J~MU!UiNOce5M- zI`S{doa6tZD8!VU5!9iS$MZA+K=|tc0GgNd7)cdmc4UwQIwi87%9jLSGL^_)W>}h- z9yI)yuHU2y0G!tgKrmtNLJNS-pOjcq8keA|R`YBIU^5N5z{VU)*0RQA0oZ7=g1u1y z%qiI v=wfCWooliH5G|Q&HyR3nkG>`Vm+AbjnKegM z02B;Bs?eAWfO%QDK6@hoAQ|)eH35*#0V06JjMaXPg#*A7lTiS$S&LjWApjgp*7!9P z4uE~}lO*e}d1(Xyb80rLFR)L#1K4Uy@e6wy0Q0hQgWBr_z>>bwmxl}oP%wWnnVYpf zs4yi&07!Tkc{O`PQKSGct+1j@Ulm-s1E_obO}5jjrk3_DGUyo&X(I}-v;r6y^hno_ zvj-^vS7KsF(?bub$~AK)1JJf>m+$I|Uc#{&Iw%8xU!fUK{UHJTNC6z0F+){=008cy zA~s@1DBOuL0Prnzt-`*dE&zV`{BzBRnR*ETa2*HJMT@YNj 0q|{VE}Yhg&p4|$ z0sx%BRKc#XjBuX;;jcRYY*UNd);PexsV#pN?+)n=08Yu?3Izm10Pt;VoC3pnE*xm^ zt?X$HfD2PWY|x0%pV9zuWGzNOB-dUh6~HKVd?*ApUHxkzG}&(f!vNs_g0L@0L41GB z;UK}}r9YXc0suIIV{;ktOBG=Oj48^~;jYPzTCI}~;PBzY>{^W$;fC6@0f75H<58%U Z;GZ;>Ulnqt#w!2-002ovPDHLkV1kgQjobhL diff --git a/static/filemanager/css/fileManager.css b/static/filemanager/css/fileManager.css index 104fb0e6d..b69fd4538 100644 --- a/static/filemanager/css/fileManager.css +++ b/static/filemanager/css/fileManager.css @@ -2,12 +2,21 @@ width: 25%; } -#navBar{ +/*#navBar{ background: -moz-linear-gradient(#a4dbf5, #8cc5e0); background: -webkit-linear-gradient(#a4dbf5, #8cc5e0); background: -o-linear-gradient(#a4dbf5, #8cc5e0); +}*/ +#navBar { + background: #0daeff; /* Old browsers */ + background: -moz-linear-gradient(-45deg, #0daeff 0%,#3939ad 30%); /* FF3.6-15 */ + background: -webkit-linear-gradient(-45deg, #0daeff 0%,#3939ad 30%); /* Chrome10-25,Safari5.1-6 */ + background: linear-gradient(-45deg, #0daeff 0%,#3939ad 30%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3939ad', endColorstr='#0daeff',GradientType=1 ); /* IE6-9 fallback on horizontal gradient */ +} +.navbar-brand { + margin: 0 1rem 0 1rem; } - #mainRow{ margin: 1%; } @@ -41,4 +50,127 @@ #htmlEditorStyles{ margin-bottom: 2%; margin-top: 2%; -} \ No newline at end of file +} +.flex-wrap { + display: flex; + flex-wrap: wrap; +} +.mt-5 { + margin-top: 5px !important; +} +.mt-10 { + margin-top: 10px; +} +.mt-20 { + margin-top: 20px; +} +.mt-30 { + margin-top: 30px; +} +.mr-10 { + margin-right: 10px; +} +.mb-10 { + margin-bottom: 10px; +} +.ml-10 { + margin-left: 10px; +} +.my-10 { + margin-top: 10px; + margin-bottom: 10px; +} + +.mx-5 { + margin-left: 5px; + margin-right: 5px; +} +.mx-10 { + margin-left: 10px; + margin-right: 10px; +} +.header-logo { + width: 315px; +/* text-align: center;*/ + font-size: 16px; + float: left; + position: relative; +} + +a.nav-link { + color: #add8e6; +} +a.nav-link:hover { + color: #E4F2F7; +} + +.point-events { + pointer-events: all; +} + +.card-header { + padding: .75rem 1.25rem; + margin-bottom: 0; + background-color: transparent; + border-bottom: none; +} +.form-control { + padding: 0 .5rem; + border: 1px solid #eeeeee; + color: #777; + font-size: .95em; +} + .form-control[readonly] { + background-color: transparent; +} +a { + color: #6C6CA4; + text-decoration: none; + background-color: transparent; + -webkit-text-decoration-skip: objects; +} +a:hover { + color: #8989B6; + text-decoration: none; + background-color: transparent; + -webkit-text-decoration-skip: objects; +} + +#tableHead { + background: #8989B6; + color: #E1E1EC; +} +.table td, .table th { + padding: .15em; + vertical-align: top; + border-top: 1px solid #e9ecef; +} +.table thead th { + vertical-align: bottom; + border-bottom: 1px solid #e9ecef; + font-weight: 400; +} + +.table td { + font-size: 14px; + color: #666666; +} +.list-group-item { + padding: .2em 1.25rem; +} + +i.fa.fa-file { + color: #6C6CA4 !important; +} +i.fa.fa-minus { + color: #6C6CA4 !important; +} +i.fa.fa-plus { + color: #6C6CA4 !important; +} +.list-group-item { + background-color: transparent; +} +.bg-lightgray { + background: #F9F9FA; +} diff --git a/static/filemanager/images/fileManager.png b/static/filemanager/images/fileManager.png index eeb27580ffcf809f57e8d38e8940a4186df3fafe..03deb86e9d9794705e1bac6b03682c5f5f010f1a 100644 GIT binary patch literal 2598 zcmV+>3fc9EP) @c8kX)sl FnIX*Sm=RozlghLv?gogk}$N z*udX_enD4)CmCJc0RA9{3;gdvuLAgkycGHAPq3M+2gGJz1PO8&jQ{I@f7eW({qo0Z z>|p)C{6P)}_yY7A=<@*nAO{V63+Pn C@GWhi`C(|{!Hz3!-K)<3Z-q)C) z>is}h8esHd`eQ=Z;#q+20lf?S*}v5F@x#OEz2e+{SnvkfC&sS`dL7Or1pW&KKLLLD z&xe1r-YYP^3g8d&obvMyK|iPK<1c^v>#cnF@Ezz-$p3GfkJGrFDOQJ=1n+8kw27Vx*m{N!)^T(LN8B@J~`v~6v@E&OGhaozrJ zq9=75=p{|t)h3-Cfj%=>o*U>!=yW@OSId&!T^$}ZW`1-EhgLn|8$VmpHI_bNL3Bya zmKDmJX? )IjbiJkf*L1D;JA-u!G_X&&(_^EKx=muk)?0vT z;bJ&?J_C5U6FYRVeh0JRdq;+X>-HY?;{os*dVP=Y>?gBy4} ?ynkcXf&M-RTQeBu@;l5t z-E~4>0{|PKm? pGn>+Lh3>uqHnF-t)a_tH&V3XTsV30s=3uPo25w_UyG57d-ZPDX8FFktWie%Lc z_?1Ba$I7O gQNE4iE~NgTLpnT?K?+jM*;%YZt!G zCENP_WgFQH*9>DJt+<2;6LWA_vU6s?Rsud4JTi#TC0Qw yZ0Y$6{JZ(dmzwYekfQ#9}=0+TP)^Gcn;^Qt7nqS=-|?>)e; zE4q(o81!Y5G@bpb0AC+4iyWZ$0dgoZEb9sp_%i~3Zeh-=63{D8+}?)pEO5b#Ib%i` zArxv;@``0%R%E}nB{CMbGx*YXq&rVqwtrcp9oq*!rrWN1++j6AzXAT&yBM*$$@)0~ z{Z@cE!u`aE^Cw8}xj;WOcY$lpQkB90@?oyy`I_-~?OD^eZ?FTY6Ayp0WM(GM=xf#> zW7Td}2MdX=1N6#~wb0p}f$?2t15pLgS6y6j`Cj(nbRuGUTey>oT|(btxeAz0j4&f> zx+vRLDkcaL&7@-B&!59TK?cb#?fg{3A^t^Gu8bV-lW@S;Y$DJn#`_F--nGqk1bQ9E z_A0zLGFVLxaxP;e7PVy=hJRGB)ic7CCF 0KCh)nf24$dz&BW6;EdhT6 z{;UN2DY3o|gLE2{-#a#UY;jnrZP4p<-4LKUcYt1>x5*u4%rVtZJ#4QR#5XqZ!~WD^ zYmByWZP`x&wze15OPfs`uG8nK#+E^PVbO_jK4#QrD1`Q(E5~sU^x?%e$&O~nk{SGb zbognuN6Qyt`w6CZZe$zF_W+2vP0-7RBO3+4KN2hd82<7??aEUOv;N5A#}e 5ZC9eWj!+n(AdwVu@=xo zm^#|WH)9pbl4j-O3}ovYNTsm!;n>nQ{LZT??XcZ%Zol3o2Ka9u9!@{t*(Cvf0+1&n z9!@=3m#si=VTVN8tC~px`|0yGO>7lar(t7LsFrRG-?-fuI9O)0nfo@k!1!?;ofdsp zb^CC4!2cfneF8pbFjk$;UAzYR(dp0=((DZMTQoHL{u|gYR|g;_@PBmK{>SD|WBv;Q z{71UZFoh2|=Eo_#`96Ri!oDvL1@uAMit)>1elz{X;MXymaxnj&4tm7BG8{V&@Cb~* zZMLV3`CkI)W!%aK%8n0^?eiUEi1t?6kN3V`@Jg8*G5<>nZ-NBiKMVMKHO}4y39<*k z_k+Jr;NL6IfBN)ky&3oJ-MgIb2lP3o&mMi=(q}BzE=zj0q-QDC3hNCZdR7?arFd^0 zW^uWA&gI0=$%XCpu?LGirQbEmjOaeo&rpum%h`WR9VfC5!Z!Pti85?uYrpy3iLB#c z$N1G_{^7oX9>VqL0nqx_RQfPn46sZ@N2dTluIy)rQlT3Q@D$LypuaU~Oz|vY;4#QG zxL`B4lsScdDs1v56mQ(+8qlVoTzO8WXZ-CdJBBY4OC5h8;6DX_4&X4;?`2F6aPj{X zz<~J(;K)O6XUv!w7?MF5G&a^d5#Rs63}$rP%ip51y(yTs>Y|%B63^uf1AjGOZ8Py3 z!~Y2V_D#=Bwz7rpM9dmLNLHr|{70v6>3Y4VOfThLJ)T^g8i2kw7+ f}5X819fx+;t6Ur6a$iSJ*D*`ll*y<0s{kN=m=prmY;Zx+UXvGTJDQb(4U z(iwo6j(Y)wGk{XZ$GKoX+knr7u9ho=IQNL>^*fO$>&jAwwM@kO?{Qzy{R%V3y~C%K z8Iy~6{oGZyxkeD+e}iY%HARphL4pJc5+q2FAVGq(CI1s(03{iRe@Q0%aR2}S07*qo IM6N<$f|be-&j0`b literal 11191 zcmV;oD@fFdP) >sRpxijz3=5(dv#THs~5GT?$&DUGG4|S+sI&R@C+DZGcXY02;&$-um^Yu#uG5} zV`6X+5DYNE3}$SGF_>ildBX-Q+X&mTEL)Pbw$xp{sh8@mJu8>@?m6@0zL%NRU0G{p zRaSL>5m`&-doSO;_j~7@d+s^slB(hwuA$xFl@7RuYgiAi5$hT{f@{ROhK}GGv96&b zxJImN=m>194?g z@b!s#9GkCVx*9`70abtqU_x(Tu)h%E?x6zy`1$kbFNS#Ao_>7t YkeD?G-F3eT%BS%K@)rmPAo2dY?!+Vd6x))|Dcy*zM3*{OR z2>@jf2~?MU_|ngqC6h7OoeQzAkik7edHnWMXG|^|;LgE39@^7~|NQOKxM#SCC(q8J zCm-P52Z!*{qZ4?~!6E$l_#}Sf@Cg2L{1PVSt9ba}5Wae09+Tx7{?ontaD1+cnVLh@ z2|z%W8GWI_jlJ0=Z)+|1fvlohi{YFD)Q_Dpj7%n2>C`%IJ-m0x_gfNchr>1f&42pR z1@WW>gBd1c0FVGJNR^xikf G+> z)j%u<03UnqEW 8BQHlcxn D65wzIHeOZn_e)%@`KcB~-g@r_LZz&9Oqr z7%`#YPanI4oglrov&3?L{QP;Cj9~#u?8AQ=cGUJj{XSKM9g*0K;mOMOmtNat04|67 z&cr<1jAf?~P3G1UFlW*k-K6s X`kt~3NV^s-q0e|lJ_A=_X3$YxSn3?^oZ)cM#MSXQ3l7w8_XvVl5h~)rWZKO)U z=|XrUDmEMNUvCq&*zLq};)IR4DoK^XlPgh+CTsa)&!0!PldGHkSZ;E@>SurMswGtl zuNGC=fdrx94?l5I26G|4YgcilbL;rXfg&a@&7!nWMI1Ze`q7n6SvR^>V!0q)JhbXk{V+fxB61ZHmO2|Kwj_bk_jxy7fjpHhTTC$A0S6G)~NxK^e<+Kh-s) zU=Tr6VGU!lR0VbwT{n8?H-%Vhgag1t tYBFGP5$>@W?+$%P0i%1}U9L80OQ z`O*b>*MY%BH~7I!gqhg|V7T|nyYDczj99xr^S8MFmV@|<1GfVJ9z8P+3XG3Q?`{>C z5(>O?9@=B{rsVYMpLIAI^ggdRu zy9)tM#lW{~f`6C` izQ2AR&O6eC}cdpz4(2V%!}P;!Bf)Vs6XHwN=FOIe#ZF;N_e51F=^Z zT_mmQBsWaroU#(hoxK5mywBp^kl>u~LhO?vn#q*5VFN^338@CH`?gFX%@%z91+LC6 zV5>u$H=9_VP*1<&gu5dHu~yWj6rk*4U?^+k{euA>$}vcUXJe^L zCu|OxT452%D7kNI4WP=ib7gE5!8Vgv?va1^8Vb2A=Q0@tmgI%}0N`AG4Qz|mU|m`= zlZf*^r|%sM@cw>_T~N%%{$5Qpp*EjPt&kEMqRIq_wFaun6BlP;3~wsIHiK9W0M1{W z;+{edq7aT_o-X#|Oppg+2PN8SHCXpa8GxNr6api^IFi9zGm3@S@iYKSX$6|DBGl!m zPc|i)g$99zs`Am}=cK 9f)`)XbpQR-5 z0|fvB{eYsbf?8dyL#V5^R2u#4Xa?`e12fLsQ?zn5zwL~MlvYR>T0VPj8to=mJ3G!X z5gTK~$rYpm0MTT?PTO4L-Nd=KNod$h>SuR9Ig-V@a=>&f-qD!6-{!vQHgLo4Qcte) z?Il;cI?oXiTVq6)CKZsBQ?!A_844SQd;9KTHK@=2RDt&nhWMe&Nwxj$snwz`l~Z!P zdTt8sB3C;)&^aew{VhW(z{@O?&BEle4a0r&AOOSwEKcRYzCb?E$Cz_hC8<(eMlQpr zUTu%fwNZD2o0*;GTrMllx#dYk1csu_7G<`8lO@7(I|iTK;@ACfs2JcwLjfwWt1sPL zg``Ts-dXQWfWR7l<@h qbk76-9BYkMQhEConZLhhjd* zsh_Il!70>-;m#?cESn~&;G=z0mjTJo42L*u6jKhc$ &>CRH-~&KL?#SiErXepNv+@3#1l(Utwxw%s7Y<+ zJj$0|MjX{p33sC$i~>YZ7qO8l2o6N-lTDlB*t-`Em1qnuPR^mXXKjfY%NXxhs@Cz- z=TOLH{ZqZhHMG>ma Q&4Z@4#g7UYXAvKn1;k z#%!blCKazPyWe+~N-bhqv(#FP#B$ac)`qlN>G(xRZLFwT>%5JXNGo-~%>|1$WeM}C zBQz=8uc|UMP{iIn1L*I|fyf8=MR9{fDbj~XRhtNg#Qstr>s~wv^d5rU_b;XY LNL&!G%$S{9K>r$St(L^f zWy3}PKmYP6 3A*XXTtAlL_SD{vnL+ z>P1SllrV`3SW?X|A*Dsr8Lm_TSAnCD +83)F+@@p(5+!1S3fHEfWZ2#J zb5gnP^{`+5C83MYa=|@|L$lwK{n 0zyt= IH$Y3^N&B=I@mM2+8?&bL5{|nvwMsaZsRol;8xybuo{TS|l z<)?7_#P6e^(-PTUKNCw9QM<@L#&rqqCvL0KHLK}J7e$UKF?d&b&Jys?qE@SjD;3mJ zgxig}-^$1vbA*a0iwLgUJs?MJ97WPm!j$9zwqH7UiKEIefp9b@k{RUqZ6Ag1d$Vw5 z5^A!jnO;UT&--5eI376m(>OHqS1`s%L^+1~HB4 5u#d*5vestjc(|gmqF5cRCi_>`z@gqIb1i|CpR731(61kR680S z%E_!0LWbE@MQo1axBebv>;a+LY~tcFQZv2Gl?gs{;v=~K 7@;FX$Opk z)q~ZS2uPRuR+L&TJN4GX2XO1*1DKecL11kvnl~~C_5G4>)N141c1Dn<*HYjuJr;2k z^I(5LZaO%!h*TYrQmw!Qh!8Woib&YY@mqce=-De2SCWViC*VM;+{4A`C;6UNegU^k z{t3v062m5{u_F)Rnm|d49ue_{i?c{yt*}z(Iwe99=9452g|dN&*n&70^TE@Fgzg8h04$-P-de_sw`yLu5tF>@lx+R}#gBAtP<5sfPx-}#f! z;vSHz0>n^nmx-#EUa{$Avv7* !>D}52M=|vZitJ$f&tew@eqhEXXEvVLF=EiJr z!_Xv(Gm2t9Qk!oW@a+hnX;RmR17P2tL4X=b0~?)qv;hej7!;SG{Wrng{KKGlLDVmC z*Y8sRX2hZ mT=op0r}n>#MLjkRVwguFjNw$Rc3eihnl3857|Mz&@uty z7{*Gh%tucAH{3M)Hxk<|B^Rf5) -u$5XTNT9B92|O3Ry?o|%XBvCnOPB8Ui4wT2@L(*T?1T)qv!`;GSG zECz~MIJqJ~uUo*W%2Nfq>)!!l+e$Muk&7ilz=uzM1pDT{D6#1kQpX_Pu(V$zn%7ZV z+F31$H8ZyWV@z`dWxK!(k_g0mrzcP(*Suc1-VXBTiQ>-T0 YU8%dtpuIZ?jl^hdC(_8ml=2f<;JJ@oaAp3*|4 *Rt71<@Se zar(caM=wc?V6lh3^GNzsxmIhPaI;Lux6LtnIXImiR%6GvOq~NWZOn*os>5(|Pnbq& zVqMqTJTQSo!Hl8XKz=)u<;ang25@kkM`r#QZhiH)V3 Ra7%;48jI)5) zz)8*Y@X*wkaMRSE!`Y&w3)h_(ugjrHAf }4KplBJrmf>_6Yo*(u0tyO%&8;@< zu^t;mYz0w?51;!31nfkVRwMP=00ogxk86bv-@vk{ORZ`Y@jVw#A}~$1);c;TWJ18y ziJ5F?K#Tue!)+(_mLN6-^vyhh>t{X p7{o4XR)^mCP9Nn*Al1ib&kpQ7l_!BODjCD!p^t`*DOZO6ZS1+ZUqC0S7L z9cRZeh8iS|dRU`MtcalMB;7o+`=Ri%%0+;y!AJM39^|VJLO6p= >Nt6l9U64)$`ap^LJ2_5mi}n zhPhs(xdO(t7O~5^8;CZ?>6SY83?L;1-*Nh79CGteGU*Mjs1lh7am``8RD<7=1X$^u zEk!+YgoP$wZ2n}e_srtcR3xG-k4=36#rQlVv9;E5y%j-3A}VZ5>lDM5q)8V^+Z8gi z0vc0jW2924@mo$G#jugOS9t|;B`N#Lk587t4a2hI55+nm0HAC^)k)B$=K!t`(wgtt zOD% _i7?6Q7}4j`FAE5sOJdK%wz<|PD{ zMOP+Q-Cp_fL M+#;Jxeum<)947-)7JFj=6rzi}n7j}}yMN<2FCj|frq zel2Qy`vr;Mxjb9G87+y`-&;iNi(#}nq!XyyTamTgckw)b|HLtnHBw*lSejfcs(>MU zd#ZwGrYp!>hBWMfu0oph!6uOD)6WCdnP!Q#E+ny8aGXWY!i(syy$r{hwyVQ5yeH|` zmN(t9(+B#Ba86ncWXF)&TMS6qSd5%K#Xm4P4p_T9xm4LOi>t=`H)m!M8uo*?3gds1 zApl?uV}7B6@~cn57?ZYVBM$+4Z@dvib38i#H7MD(tHYF3OeEu{CR!fX@(cHl4I^D7 z-C%>)iuw~_04b5h?$amu2Pelt*0xrQK2{tsg#R->jWY`oLPOmqwFF6cZzc@z+|h9? zoO-f3VP#_vK;pVlSoF_+6IoQ+t`3O^B8qG_M0P!@FcEXIRwref&>$B 99f~*HRSNkG3i(XS16wxau_vBGZ?S-Qa}D@rEG8El48MAc zfAGxn7`6}rbKTF?AU_L8V2FS7#fx}(u7 GXZym$j>1Qw+ z&LHx;A+B`(>OmG l`?(fZ`zqfUjzm{Ki-PjPW8yi9t#nO~X zyxCZ!7AwZ0c<}<>HU2bil(MJ^k|MPY>E*LX2p8w7{NZQLBWHa$FE%j{ZV7nOiy#wP zoVzfIPyORJaqrM2ATER2nPTT%dZHlioBuX|)X?6z+o;*TTB%M}%f{StXg_W_v>(YX zUTtgmI#B<91|%|;-OMb%{n*p^7Yi4FAn>ZO;iYG%5DE=GaeNAYcx)0wSu0VZ61O1o zq1hf}faDX8d x65DX?N5b*kt?4-77NhT)k<3l;_WLzKA*wa3)47z zVY=nPE0M)y!XVvvX)EoNdRZR^M6H#DYK`wY_B`Hm{wPM+iLgy$-~Bxj2?+etPoBkN z6D16U29eb3k7ASBQYV#&a3P ?5=r{3q zU-~A(Yyo!_$6@2?#3j%Hu!X5!gsq&1a 2()i{9EtVL~p zf$ur?JpS#O=W&}`5LizzC&GbcIWt$~hrc|I@61$XIAf)DWl5uULXuiyQ1!L&3;B$E z_R%Nsm!J73unBlD8_PYJXAwE(rX-5Cq3*;K$Gv(HZ7^k+h~Pv}EM_r1TdKcWq2=Q; zajBs{2l|RASE`-LGh7cAsYV!s5|pzO=kb=ANx6M+1m7CmBQFI7M50U QlR5EGHch}Lp&RcL78bn+FcL<;?qOxanV5MV$<%o6HZ8t9Z|Ix2LC54>frW)^C zjk;=7^`*9*4KN=I_n$q3@0pyCd;5p*?7)~D&Gw>fEMF|g{P35?<=1Z?!7toAEFlxm z#=c^5Q;)B8kR=_s d`CQ1Vg3yw@splC;95GQg4a!^T zJJyPNZHJ&bQCDNwfU{dfkqIqUqXw~ts>vpk37xFB6nAIQ7#Q&ci-Q2Q*m3Xqvv_dw zg4|c^!>RsZd8IIblQxGBKQn>9y->z~xoub;8Yw_jc|P{M01?s&KoemuZ|~)5R78ZW zHOK}bN(&YF%om@)7ryc>%*-utK9>POq~rp=XYc}!*cVZ$24L=7`E4(;AXJ@1D!ruX zVO%A=UB!$zcCvTRFe=s7Nvh3Q^|o^N-EjzyJ@K3r^4aE{8rt3=8^F>86J DVgZ23Wkc8GdRWU1ZYHiEm>7!+l(ib8P`QMj$%{A~1~Q+` z hTgN;q@w5}tW}9M8Nsj)}=x z7$(kTGl1WBhYdqYF2MZ*=WrW8g>szfsI*F %(;uWI5mrj$yvm);~+5U zjvk4xEZILug!36I-#73zXjEq6Y)7S)hc7fh>Oc_4+NqUFD`YYO)*`L2Mu`OgW@w $?a|yGH;76&3aS>R5|%Qs^OL!K#AtTnQ(pXL0=0xg_rYvYJ&52mrRm zAhZUV&`M)}oz(s!VF=H;4Bk0*6gS{m`ebbY000YeNkl gOJZG` zUb=?&_4~$f{k}0g`OHxi^10NIU-H;(f<+Q7*^{vDr(VkUlfKvd*`k$+x`R>}HZSkp z_4nwhy~+!egGJ|Us}ux93 nOP_EU8Zp*@WjXodv4R*CQTQ;cj5^WzD%3Il1|!>y|%y z8Ek|I#yP3)t(*q2t#r~3ho9n;q7+-aW@r}QU;G>@HE+{3MdWrIsk=e5!}TQ{T6uhg z2pmOD#&-2#z0wNHNv!Mlwk}-S{P|ye`YX~?%(KX%`1p+wcDq7U!G=|;G4V)| 8L7FyQ)~oVk4wN8yaaI{I1tvc78z&b2F({dNOtz zBpDZp95@U^`M}ucFcKX_6 d8N1T(NIPf^$Kwsce6vFxix~-Tk3kWb8p=5?p;$g5xxV(5~ zCrO14G}t_F*AdLjF9z>+6+(a;ic6!m?v)+heFNg-$ixyz6`4fJ!Bj zICgA|5!4rEx2 Jv#)KUGgL*D+FI1D^NQz`$3naZ@vMT*zmkx+wi>Yde4SNY$EGeKFXXf;==fj`#L` z4w>pXE+N-ssBbB$1Vk{din;7 n~7rDLSRCUt J?t;{LMsNLNSv-h0C!4 z+fd##d>TK{_eJb-$FNY#Fmosdf~LY7TSuxyTB$hJuum=&?uUUxEXpEIMt1dKYP!^M zLZ#U3jxgW-#=D`a>CRDX3`??xmCm-d$_85`p$Nj&n7FKYIn-a4pWF9&e4y`7&|e$p zlFM;QIt8WidYj#smq8iCFjB!>;WkVKH^5a(lFwx~O-eOmvm{nC3;?|T-do%^pE)WE z6~~!Oh=3dvl*BhBg~U2PSar7mAt^sB!ewWn9Lf!SbNKH5C-6Y{1j1;F7pfT$XT(C$ z1@=@kBr(vL3396VW>ApBtp^5i>g?2}5-P=35G#cNfH&WFgM0RcW4I9YfF -xMC~eHM3zPb23pqFfEQOgS*Cmr}{@S8ckV zcEFd}j4P=19K>czr=_r!#7bd)^|r6Or_M6IQF)ELQX0T~jhG<_C_=!Rh6wv`-emWQ zm9tK?UTGzjNJN^3f{Und)fqSnz{E0Etl;*-G2EYj4ma6j2;v!3Y5|v!gJBhhLeK>U z`jtpb2*ZfW9d#kB1zSq2Km2!n0Hy)F9d9}R(|B;?X`HN%;3aoNo}Sx{Gqqt{EL#xL zFya`N1eO&{B)VeFCtqtoRJbMt2Lq6WD3A>x2a5AJkU53B3deAh9Y-H7Kw`($YJiAx zVA4eGfkD2WdY6$3URtrJtAcv>f!zXbzVt^pyX&1Ro!3!pDY2Sh%0u@#z4QX_59e{v zzJ#~!D#-bG2(QW*PP_f`;!F_>W(b$6Sxi+;z2N?GF-EBuIv1+!$;HU)40Z)GxV3K* zBk^(U&rTxeE<#1P7BNZ)z!V6vB9%~yry5;IC^Sneib`T%`-}At9>OCS#}6%gawpL( z#DZUXi(M5xOzK3dF%QvcjPWVl!`}c#1F4unT&iU;Rm&m@hh%~Ku;8*%c8r>1C rLPWq(g;0eBD3i`OK@4!ZQ&vi*?lQ`k2aza<$yK|?wo0)j#99W1Oz2eo zsyn5d0HjlU3J?K^6i{gtzG!tZB1n2%N+KjgYBs{R6`4GI7LBox$_&g6-{apr`}m@R z_Md$m`;))Fg