SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GC_SECTIONS_FLAGS}")
SET(CMAKE_C_FLAGS_RELEASE "-g -O2")
SET(CMAKE_CXX_FLAGS_RELEASE "-g -std=c++0x -O2")
-SET(CMAKE_C_FLAGS_DEBUG "-g -O0")
-SET(CMAKE_CXX_FLAGS_DEBUG "-g -std=c++0x -O0")
+SET(CMAKE_C_FLAGS_DEBUG "-g -O0 -Wp,-U_FORTIFY_SOURCE")
+SET(CMAKE_CXX_FLAGS_DEBUG "-g -std=c++0x -O0 -Wp,-U_FORTIFY_SOURCE")
SET(CMAKE_C_FLAGS_CCOV "-g -O2 --coverage")
SET(CMAKE_CXX_FLAGS_CCOV "-g -std=c++0x -O2 --coverage")
SET(CMAKE_SHARED_LINKER_FLAGS "-Wl,--as-needed")
SET(TARGET_VCORE_LIB "cert-svc-vcore")
SET(TARGET_CERT_SERVER "cert-server")
-# test binaries
-SET(TARGET_VCOREC_TEST "cert-svc-tests-capi")
-SET(TARGET_TEST_CERT_SVC_OGIG "cert-svc-tests-orig")
-SET(TARGET_PKCS12_TEST "cert-svc-tests-pkcs12")
-SET(TARGET_VCORE_TEST "cert-svc-tests-vcore")
-
ADD_DEFINITIONS("-DCERTSVC_SYSTEM_STORE_DB=\"${TZ_SYS_SHARE}/cert-svc/dbspace/certs-meta.db\"")
-ADD_DEFINITIONS("-DCERTSVC_VCORE_DB=\"${TZ_SYS_DB}/.cert_svc_vcore.db\"")
ADD_DEFINITIONS("-DCERTSVC_CRT_FILE_PATH=\"${TZ_SYS_SHARE}/cert-svc/ca-certificate.crt\"")
ADD_DEFINITIONS("-DFINGERPRINT_LIST_PATH=\"${TZ_SYS_SHARE}/ca-certificates/fingerprint/fingerprint_list.xml\"")
ADD_DEFINITIONS("-DFINGERPRINT_LIST_SCHEMA_PATH=\"${TZ_SYS_SHARE}/ca-certificates/fingerprint/fingerprint_list.xsd\"")
BuildRequires: pkgconfig(key-manager)
BuildRequires: pkgconfig(libtzplatform-config)
BuildRequires: pkgconfig(libsystemd-journal)
-BuildRequires: boost-devel
Requires: pkgconfig(libtzplatform-config)
Requires: ca-certificates-tizen
Requires: ca-certificates-mozilla
%package test
Summary: Certification service (tests)
Group: Security/Testing
-BuildRequires: pkgconfig(dpl-test-efl)
-Requires: boost-devel
Requires: ca-certificates-tizen
Requires: %{name} = %{version}-%{release}
cmake . -DPREFIX=%{_prefix} \
-DEXEC_PREFIX=%{_exec_prefix} \
-DLIBDIR=%{_libdir} \
- -DBINDIR=%{_bindir} \
-DINCLUDEDIR=%{_includedir} \
-DTZ_SYS_SHARE=%TZ_SYS_SHARE \
-DTZ_SYS_BIN=%TZ_SYS_BIN \
-DTZ_SYS_ETC=%TZ_SYS_ETC \
-DTZ_SYS_RO_WRT_ENGINE=%TZ_SYS_RO_WRT_ENGINE \
- -DTZ_SYS_DB=%TZ_SYS_DB \
%if 0%{?certsvc_test_build}
-DCERTSVC_TEST_BUILD=1 \
-DTZ_SYS_RO_APP=%TZ_SYS_RO_APP \
%files test
%defattr(644,system,system,755)
%attr(755,root,root) %{TZ_SYS_BIN}/cert-svc-test*
-%{TZ_SYS_RO_APP}/widget/tests/vcore_widget_uncompressed/*
-%{TZ_SYS_RO_APP}/widget/tests/vcore_widget_uncompressed_negative_hash/*
-%{TZ_SYS_RO_APP}/widget/tests/vcore_widget_uncompressed_negative_signature/*
-%{TZ_SYS_RO_APP}/widget/tests/vcore_widget_uncompressed_negative_certificate/*
-%{TZ_SYS_RO_APP}/widget/tests/vcore_widget_uncompressed_partner/*
-%{TZ_SYS_RO_APP}/widget/tests/vcore_widget_uncompressed_partner_operator/*
-%{TZ_SYS_RO_APP}/widget/tests/vcore_keys/*
-%{TZ_SYS_RO_APP}/widget/tests/vcore_certs/*
-%{TZ_SYS_RO_APP}/widget/tests/vcore_config/*
-%{TZ_SYS_RO_APP}/widget/tests/pkcs12/*
-%{TZ_SYS_RO_APP}/widget/tests/reference/*
+%{TZ_SYS_RO_APP}/widget/tests/*
%{TZ_SYS_ETC}/ssl/certs/8956b9bc.0
-%{TZ_SYS_SHARE}/ca-certificates/wac/root_cacert0.pem
%{TZ_SYS_SHARE}/cert-svc/pkcs12/*
%{TZ_SYS_SHARE}/cert-svc/cert-type/*
-%{TZ_SYS_SHARE}/cert-svc/tests/orig_c/data/caflag/*
%{TZ_SYS_SHARE}/cert-svc/certs/root_ca*.der
%{TZ_SYS_SHARE}/cert-svc/tests/*
%endif
# limitations under the License.
#
-PKG_CHECK_MODULES(VCORE_TEST_DEP
+SET(TARGET_VCOREC_TEST "cert-svc-tests-capi")
+SET(TARGET_TEST_CERT_SVC_OGIG "cert-svc-tests-orig")
+SET(TARGET_PKCS12_TEST "cert-svc-tests-pkcs12")
+SET(TARGET_VCORE_TEST "cert-svc-tests-vcore")
+
+PKG_CHECK_MODULES(TEST_DEP
REQUIRED
- dpl-test-efl
- sqlite3
+ libpcrecpp
+ )
+
+SET(TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR})
+
+SET(DPL_TEST_SOURCES
+ ${TEST_DIR}/dpl/src/assert.cpp
+ ${TEST_DIR}/dpl/src/binary_queue.cpp
+ ${TEST_DIR}/dpl/src/colors.cpp
+ ${TEST_DIR}/dpl/src/errno_string.cpp
+ ${TEST_DIR}/dpl/src/exception.cpp
+ ${TEST_DIR}/dpl/src/noncopyable.cpp
+ ${TEST_DIR}/dpl/src/singleton.cpp
+ ${TEST_DIR}/dpl/src/test_results_collector.cpp
+ ${TEST_DIR}/dpl/src/test_runner.cpp
+ ${TEST_DIR}/dpl/src/test_runner_child.cpp
+ ${TEST_DIR}/dpl/src/test_runner_multiprocess.cpp
+ ${TEST_DIR}/dpl/src/value_separated_policies.cpp
+ ${TEST_DIR}/dpl/src/value_separated_tokens.cpp
+
)
INCLUDE_DIRECTORIES(
SYSTEM
- ${VCORE_TEST_DEP_INCLUDE_DIRS}
+ ${TEST_DEP_INCLUDE_DIRS}
${PROJECT_SOURCE_DIR}/include
- ${PROJECT_SOURCE_DIR}/vcore/src
+ ${PROJECT_SOURCE_DIR}/vcore
+ ${TEST_DIR}/dpl/include
)
ADD_SUBDIRECTORY(capi)
${PROJECT_SOURCE_DIR}/include
)
-ADD_EXECUTABLE(${TARGET_VCOREC_TEST} ${VCOREC_TESTS_SOURCES})
+ADD_EXECUTABLE(${TARGET_VCOREC_TEST} ${VCOREC_TESTS_SOURCES} ${DPL_TEST_SOURCES})
TARGET_LINK_LIBRARIES(${TARGET_VCOREC_TEST}
${TARGET_VCORE_LIB}
- ${TARGET_CERT_SVC_LIB}
- ${VCORE_TEST_DEP_LIBRARIES}
- -ldl
+ ${TEST_DEP_LIBRARIES}
)
INSTALL(TARGETS ${TARGET_VCOREC_TEST}
${PROJECT_SOURCE_DIR}/tests/capi/data/cert1.der
${PROJECT_SOURCE_DIR}/tests/capi/data/cert2fake.pem
${PROJECT_SOURCE_DIR}/tests/capi/data/cert3fake.der
+ ${PROJECT_SOURCE_DIR}/tests/capi/data/root_cacert0.pem
DESTINATION ${TZ_SYS_SHARE}/cert-svc/cert-type/
PERMISSIONS OWNER_READ
GROUP_READ
WORLD_READ
)
-
* limitations under the License.
*/
/*
- * @file main.cpp
+ * @file api_tests.cpp
* @author Bartlomiej Grzelewski (b.grzelewski@samsung.com)
* @version 1.0
* @brief This file is the implementation file of main
*/
+
#include <dpl/test/test_runner.h>
-#include <cert-svc/ccert.h>
+#include <api_tests.h>
CertSvcInstance vinstance;
int main (int argc, char *argv[])
{
certsvc_instance_new(&vinstance);
- int status = DPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv);
+ int status = VcoreDPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv);
certsvc_instance_free(vinstance);
return status;
}
*/
#include <cert-svc/cinstance.h>
-#include <cert-svc/ccert.h>
-#include <cert-svc/cpkcs12.h>
-#include <cert-svc/cprimitives.h>
extern CertSvcInstance vinstance;
ca:bc:44:d9:ce:7d:5a:f2:f3
Exponent: 65537 (0x10001)
X509v3 extensions:
- X509v3 Subject Key Identifier:
+ X509v3 Subject Key Identifier:
82:08:7F:DB:00:02:86:E8:53:2A:A5:FA:58:AE:67:7F:14:38:C8:60
- X509v3 Authority Key Identifier:
+ X509v3 Authority Key Identifier:
keyid:82:08:7F:DB:00:02:86:E8:53:2A:A5:FA:58:AE:67:7F:14:38:C8:60
DirName:/C=PL/ST=Maz/O=Samsung/OU=SPRC/CN=Samsung/emailAddress=samsung@samsung.com
serial:C7:4A:82:F6:9D:1B:F6:7D
- X509v3 Basic Constraints:
+ X509v3 Basic Constraints:
CA:TRUE
Signature Algorithm: sha1WithRSAEncryption
0f:cb:a3:cd:25:02:00:17:a9:c5:21:4a:6e:bb:ce:d9:14:74:
* limitations under the License.
*/
#include <string>
-
+#include <cstring>
#include <openssl/x509.h>
-
#include <dpl/test/test_runner.h>
-#include <dpl/log/log.h>
+
+#include <cert-svc/ccert.h>
+#include <cert-svc/cpkcs12.h>
+#include <cert-svc/cprimitives.h>
#include <api_tests.h>
CertSvcCertificate cert;
int result = certsvc_certificate_new_from_file(
vinstance,
- "/usr/share/ca-certificates/wac/root_cacert0.pem",
+ "/usr/share/cert-svc/cert-type/root_cacert0.pem",
&cert);
RUNNER_ASSERT_MSG(CERTSVC_TRUE == result, "Error reading certificate");
int result, status;
for (int i=0; i<MAXC; ++i) {
- LogDebug("Reading certificate: " << i);
int result = certsvc_certificate_new_from_memory(
vinstance,
(const unsigned char*)cert[i].c_str(),
X509_NAME_oneline(name, buffer, MAXB);
std::string expected = "/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority";
- LogDebug("NAME: " << buffer);
-
RUNNER_ASSERT_MSG(expected == buffer, "Content does not match");
certsvc_certificate_free_x509(x509);
int result, status;
for (int i=0; i<MAXC; ++i) {
- LogDebug("Reading certificate: " << i);
int result = certsvc_certificate_new_from_memory(
vinstance,
(const unsigned char*)cert[i].c_str(),
#include <openssl/x509.h>
#include <dpl/test/test_runner.h>
-#include <dpl/log/log.h>
#include <memory>
#include <api_tests.h>
${PROJECT_SOURCE_DIR}/include
)
-ADD_EXECUTABLE(${TARGET_TEST_CERT_SVC_OGIG} ${CERT_SVC_OGIG_TESTS_SOURCES})
+ADD_EXECUTABLE(${TARGET_TEST_CERT_SVC_OGIG} ${CERT_SVC_OGIG_TESTS_SOURCES} ${DPL_TEST_SOURCES})
-TARGET_LINK_LIBRARIES(
- ${TARGET_TEST_CERT_SVC_OGIG}
+TARGET_LINK_LIBRARIES(${TARGET_TEST_CERT_SVC_OGIG}
${TARGET_CERT_SVC_LIB}
- ${VCORE_TEST_DEP_LIBRARIES}
+ ${TEST_DEP_LIBRARIES}
)
INSTALL(TARGETS ${TARGET_TEST_CERT_SVC_OGIG}
--- /dev/null
+/*
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * @file assert.cpp
+ * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
+ * @version 1.0
+ * @brief This file is the implementation file of assert
+ */
+#include <cstdlib>
+#include <sstream>
+#include <iostream>
+#include <stddef.h>
+#include <dpl/assert.h>
+#include <dpl/colors.h>
+#include <dpl/exception.h>
+
+namespace VcoreDPL {
+void AssertProc(const char *condition,
+ const char *file,
+ int line,
+ const char *function)
+{
+
+#define INTERNAL_LOG(message) \
+do { \
+ std::cerr << message << std::endl; \
+} while (0)
+
+ // Try to log failed assertion to log system
+ Try {
+ INTERNAL_LOG("########################################################################");
+ INTERNAL_LOG("### DPL assertion failed! ###");
+ INTERNAL_LOG("########################################################################");
+ INTERNAL_LOG("### Condition: " << condition);
+ INTERNAL_LOG("### File: " << file);
+ INTERNAL_LOG("### Line: " << line);
+ INTERNAL_LOG("### Function: " << function);
+ INTERNAL_LOG("########################################################################");
+ } catch (Exception) {
+ // Just ignore possible double errors
+ }
+
+ // Fail with c-library abort
+ abort();
+}
+} // namespace VcoreDPL
* limitations under the License.
*/
/*
- * @file naive_synchronization_object.cpp
+ * @file exception.cpp
* @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
* @version 1.0
- * @brief This file is the implementation file of SQL naive
- * synchronization object
+ * @brief This file is the implementation of exception system
*/
#include <stddef.h>
-#include <dpl/db/naive_synchronization_object.h>
-#include <dpl/thread.h>
-
-namespace {
- unsigned int seed = time(NULL);
-}
+#include <dpl/exception.h>
+#include <iostream>
namespace VcoreDPL {
-namespace DB {
-void NaiveSynchronizationObject::Synchronize()
+Exception* Exception::m_lastException = NULL;
+unsigned int Exception::m_exceptionCount = 0;
+void (*Exception::m_terminateHandler)() = NULL;
+
+void LogUnhandledException(const std::string &str)
{
- // Sleep for about 10ms - 30ms
- Thread::MiliSleep(10 + rand_r(&seed) % 20);
+ std::cerr << str << std::endl;
}
-void NaiveSynchronizationObject::NotifyAll()
+void LogUnhandledException(const std::string &str,
+ const char *filename,
+ int line,
+ const char *function)
{
- // No need to inform about anything
+ std::cerr << "Exception occured on file[" << filename
+ << "] line[" << line
+ << "] function[" << function
+ << "] msg[" << str << "]" << std::endl;
}
-} // namespace DB
} // namespace VcoreDPL
#include <dpl/test/test_runner.h>
#include <dpl/test/test_runner_child.h>
#include <dpl/test/test_runner_multiprocess.h>
+#include <dpl/exception.h>
#include <poll.h>
#include <limits.h>
#include <sys/wait.h>
${PROJECT_SOURCE_DIR}/tests/pkcs12
)
-ADD_EXECUTABLE(${TARGET_PKCS12_TEST} ${PKCS12_TEST_SOURCES})
+ADD_EXECUTABLE(${TARGET_PKCS12_TEST} ${PKCS12_TEST_SOURCES} ${DPL_TEST_SOURCES})
TARGET_LINK_LIBRARIES(${TARGET_PKCS12_TEST}
${TARGET_VCORE_LIB}
- ${VCORE_TEST_DEP_LIBRARIES}
- -ldl
+ ${TEST_DEP_LIBRARIES}
)
INSTALL(TARGETS ${TARGET_PKCS12_TEST}
/*
* @file new_test_cases.cpp
* @author Madhan A K (madhan.ak@samsung.com)
- * @version 1.0
+ * @author Kyungwook Tak (k.tak@samsung.com)
+ * @version 2.0
* @brief PKCS#12 test cases.
*/
-#include <string.h>
#include <unistd.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <dpl/test/test_runner.h>
-#include <cert-svc/cinstance.h>
-#include <cert-svc/ccert.h>
-#include <cert-svc/cpkcs12.h>
-#include <cert-svc/cerror.h>
-#include <cert-svc/cprimitives.h>
-#include <cert-service.h>
-#include <cert-service-debug.h>
+#include <cstring>
+#include <new>
+
#include <openssl/err.h>
#include <openssl/pkcs12.h>
#include <openssl/sha.h>
#include <openssl/x509.h>
#include <openssl/pem.h>
-#include <time.h>
+
+#include <cert-svc/cinstance.h>
+#include <cert-svc/ccert.h>
+#include <cert-svc/cpkcs12.h>
+#include <cert-svc/cerror.h>
+#include <cert-svc/cprimitives.h>
+
+#include <dpl/test/test_runner.h>
static CertSvcInstance instance;
-#define CREATE_INSTANCE \
+static CertSvcString wrapper_certsvc_string_new(const char *cStr)
+{
+ CertSvcString certsvcStr;
+
+ if (!cStr) {
+ certsvcStr.privateHandler = NULL;
+ return certsvcStr;
+ }
+
+ RUNNER_ASSERT_MSG(
+ certsvc_string_new(instance, cStr, strlen(cStr), &certsvcStr) == CERTSVC_SUCCESS,
+ "Failed to certsvc_string_new");
+
+ return certsvcStr;
+}
+
+const CertStoreType allStoreType = (CertStoreType)(WIFI_STORE | VPN_STORE | EMAIL_STORE);
+
+#define CREATE_INSTANCE \
certsvc_instance_new(&instance);
-#define FREE_INSTANCE \
+#define FREE_INSTANCE \
certsvc_instance_free(instance);
-/* Getting the certificate list from system_store */
-RUNNER_TEST(CERTSVC_PKCS12_1001_certsvc_get_root_cert_list) {
-
- CertStoreType storeType = SYSTEM_STORE;
- CertSvcStoreCertList* certList = NULL;
- CertSvcStoreCertList* tmpNode = NULL;
- int result;
- int count = 0;
+RUNNER_TEST(CERTSVC_PKCS12_1001_certsvc_get_root_cert_list)
+{
CREATE_INSTANCE
+ CertSvcStoreCertList* certList = NULL;
size_t length = 0;
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from system store failed");
- if(result == CERTSVC_SUCCESS)
- {
- tmpNode = certList;
- while(tmpNode != NULL)
- {
- count++;
- tmpNode = tmpNode->next;
- }
-
- result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Freeing certificate list from system store failed");
- }
+ int result = certsvc_pkcs12_get_certificate_list_from_store(instance, SYSTEM_STORE, DISABLED, &certList, &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from system store failed");
+
+ result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Freeing certificate list from system store failed");
FREE_INSTANCE
}
-/* Set the status of the certificate to disabled/enabled in system store and get the status */
RUNNER_TEST(CERTSVC_PKCS12_1002_certsvc_set_cert_to_disabled_and_get_status_for_system_store)
{
- CertStoreType storeType = SYSTEM_STORE;
- CertStatus Status;
- CertStatus status;
+ CertStatus status = ENABLED;
int result;
- CertSvcString Alias;
CREATE_INSTANCE
- result = certsvc_string_new(instance, "Certum_Root_CA.pem", strlen("Certum_Root_CA.pem"), &Alias);
- RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "certsvc_string_new failed. result : " << result);
+ CertSvcString Alias = wrapper_certsvc_string_new("Certum_Root_CA.pem");
- result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Get certificate status from system store failed.");
+ result = certsvc_pkcs12_get_certificate_status_from_store(instance, SYSTEM_STORE, Alias, &status);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from system store failed.");
// if status is already disabled, roll it back to enable and go on
if (status == DISABLED) {
- result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, DISABLED, Alias, ENABLED);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Roll back certificate status to system store failed.");
+ result = certsvc_pkcs12_set_certificate_status_to_store(instance, SYSTEM_STORE, DISABLED, Alias, ENABLED);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Roll back certificate status to system store failed.");
}
- Status=DISABLED;
- result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, DISABLED, Alias, Status);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Set certificate status to system store failed.");
+ result = certsvc_pkcs12_set_certificate_status_to_store(instance, SYSTEM_STORE, DISABLED, Alias, DISABLED);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Set certificate status to system store failed.");
- result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Get certificate status from system store failed.");
+ result = certsvc_pkcs12_get_certificate_status_from_store(instance, SYSTEM_STORE, Alias, &status);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from system store failed.");
+ RUNNER_ASSERT_MSG(status == DISABLED, "invalid status from system store cert");
- Status=ENABLED;
- result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, DISABLED, Alias, Status);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Set certificate status to system store failed.");
+ result = certsvc_pkcs12_set_certificate_status_to_store(instance, SYSTEM_STORE, DISABLED, Alias, ENABLED);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Set certificate status to system store failed.");
- result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Get certificate status from system store failed.");
+ result = certsvc_pkcs12_get_certificate_status_from_store(instance, SYSTEM_STORE, Alias, &status);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from system store failed.");
+ RUNNER_ASSERT_MSG(status == ENABLED, "invalid status from system store cert");
certsvc_string_free(Alias);
/* Install a CRT file to individual stores */
RUNNER_TEST(CERTSVC_PKCS12_1003_add_pem_file_in_individual_store)
{
- CertSvcStoreCertList* certList = NULL;
- CertSvcStoreCertList* tmpNode = NULL;
- CertSvcStoreCertList* tmp = NULL;
- CertStoreType type;
int result;
- size_t length = 0;
- int count = 0;
-
- CertSvcStoreCertList* certList1 = NULL;
- CertSvcString buffer1, gname;
- CertSvcString buffer2;
- const char *temp = NULL;
- CertSvcCertificate certificate;
-
- CertSvcString Alias;
- CertSvcString Path;
- CertSvcString Pass;
CREATE_INSTANCE
- Pass.privateHandler = NULL;
+ CertSvcString Path = wrapper_certsvc_string_new("/usr/share/cert-svc/tests/wifi-server.pem");
+ CertSvcString Pass = wrapper_certsvc_string_new(NULL);
- const char *path = "/usr/share/cert-svc/tests/wifi-server.pem";
- result = certsvc_string_new(instance, path, strlen(path), &Path);
- RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "certsvc_string_new failed. result : " << result);
-
- type = WIFI_STORE;
- const char *cAlias = "PEM-wifi-server-1";
- result = certsvc_string_new(instance, cAlias, strlen(cAlias), &Alias);
- RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "certsvc_string_new failed. result : " << result);
-
- result = certsvc_pkcs12_import_from_file_to_store(instance, type, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing PEM file to WIFI store failed.");
+ CertSvcString Alias = wrapper_certsvc_string_new("PEM-wifi-server-1");
+ result = certsvc_pkcs12_import_from_file_to_store(instance, WIFI_STORE, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PEM file to WIFI store failed.");
certsvc_string_free(Alias);
- type = VPN_STORE;
- cAlias = "PEM-wifi-server-2";
- result = certsvc_string_new(instance, cAlias, strlen(cAlias), &Alias);
- RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "certsvc_string_new failed. result : " << result);
- result = certsvc_pkcs12_import_from_file_to_store(instance, type, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing PEM file to VPN store failed.");
+ Alias = wrapper_certsvc_string_new("PEM-wifi-server-2");
+ result = certsvc_pkcs12_import_from_file_to_store(instance, VPN_STORE, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PEM file to VPN store failed.");
certsvc_string_free(Alias);
- type = EMAIL_STORE;
- cAlias = "PEM-wifi-server-3";
- result = certsvc_string_new(instance, cAlias, strlen(cAlias), &Alias);
- RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "certsvc_string_new failed. result : " << result);
-
- result = certsvc_pkcs12_import_from_file_to_store(instance, type, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing PEM file to EMAIL store failed.");
+ Alias = wrapper_certsvc_string_new("PEM-wifi-server-3");
+ result = certsvc_pkcs12_import_from_file_to_store(instance, EMAIL_STORE, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PEM file to EMAIL store failed.");
certsvc_string_free(Alias);
- type = (CertStoreType) (WIFI_STORE | VPN_STORE | EMAIL_STORE);
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, type, DISABLED, &certList, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from system store failed");
-
- if(result == CERTSVC_SUCCESS)
- {
-
- tmpNode = certList;
- while(tmpNode != NULL)
- {
- count++;
- tmp = tmpNode;
- tmpNode = tmpNode->next;
- }
- result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Freeing certificate list from system store failed");
+ certsvc_string_free(Path);
- }
+ CertSvcStoreCertList *certList = NULL;
+ size_t length = 0;
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from store failed.");
- certList = NULL;
- type = (CertStoreType) (WIFI_STORE | VPN_STORE | EMAIL_STORE);
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, type, DISABLED, &certList, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from store failed.");
- certList1=certList;
- count = 0;
+ CertSvcStoreCertList *certListOrig = certList;
+ int count = 0;
+ CertSvcString strSubject;
+ CertSvcString strIssuer;
+ CertSvcCertificate certificate;
while (certList) {
result = certsvc_pkcs12_get_certificate_from_store(instance, certList->storeType, certList->gname, &certificate);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get certificate from store.");
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get certificate from store.");
- result = certsvc_certificate_get_string_field(certificate, CERTSVC_SUBJECT, &buffer1);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get string field.");
-
- result = certsvc_certificate_get_string_field(certificate, CERTSVC_ISSUER_COMMON_NAME, &buffer2);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get string field.");
+ result = certsvc_certificate_get_string_field(certificate, CERTSVC_SUBJECT, &strSubject);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get string field.");
- certsvc_string_to_cstring(buffer1, &temp, &length);
- certsvc_string_to_cstring(buffer2, &temp, &length);
+ result = certsvc_certificate_get_string_field(certificate, CERTSVC_ISSUER_COMMON_NAME, &strIssuer);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get string field.");
- certsvc_string_free(buffer1);
- certsvc_string_free(buffer2);
+ certsvc_string_free(strSubject);
+ certsvc_string_free(strIssuer);
certsvc_certificate_free(certificate);
certList = certList->next;
count++;
}
- certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList1);
- if (certList1 != NULL)
- certList=NULL;
- certList1=NULL;
-
- certsvc_string_free(Path);
+ certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certListOrig);
FREE_INSTANCE
}
-/* Installing pem file in all store at once */
-RUNNER_TEST(CERTSVC_PKCS12_1004_add_pem_file_in_all_store) {
-
- const char path[] = "/usr/share/cert-svc/tests/wifi-server.pem";
- CertSvcStoreCertList* certList = NULL;
- CertSvcStoreCertList* tmpNode = NULL;
- CertSvcStoreCertList* tmp = NULL;
- char* pass = NULL;
- char *alias = "PEM-wifi-server-all-store";
- CertStoreType type;
+RUNNER_TEST(CERTSVC_PKCS12_1004_add_pem_file_in_all_store)
+{
int result;
- int count = 0;
- size_t length = 0;
CREATE_INSTANCE
- CertSvcString Alias, Path, Pass;
-
- Alias.privateHandler = alias;
- Alias.privateLength = strlen(alias);
- Pass.privateHandler = pass;
- Path.privateHandler = (char *)path;
- Path.privateLength = strlen(path);
-
- type = (CertStoreType) (VPN_STORE | EMAIL_STORE | WIFI_STORE);
- result = certsvc_pkcs12_import_from_file_to_store(instance, type, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing PEM file to all store failed.");
-
- type = (CertStoreType) (WIFI_STORE | VPN_STORE | EMAIL_STORE);
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, type, DISABLED, &certList, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from system store failed");
-
- if(result == CERTSVC_SUCCESS)
- {
- tmpNode = certList;
- while(tmpNode != NULL)
- {
- count++;
- tmp = tmpNode;
- tmpNode = tmpNode->next;
- }
- result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Freeing certificate list from system store failed");
- }
- FREE_INSTANCE
-}
+ CertSvcString Alias = wrapper_certsvc_string_new("PEM-wifi-server-all-store");
+ CertSvcString Path = wrapper_certsvc_string_new("/usr/share/cert-svc/tests/wifi-server.pem");
+ CertSvcString Pass = wrapper_certsvc_string_new(NULL);
-/* Install a CRT file to individual stores */
-RUNNER_TEST(CERTSVC_PKCS12_1005_add_crt_file_in_individual_store) {
+ result = certsvc_pkcs12_import_from_file_to_store(instance, allStoreType, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PEM file to all store failed.");
- const char path[] = "/usr/share/cert-svc/tests/Testing.crt";
- CertSvcStoreCertList* certList = NULL;
- CertSvcStoreCertList* tmpNode = NULL;
- CertSvcStoreCertList* tmp = NULL;
- char* pass = NULL;
- char *alias = "CRT-TestingCRT1";
- CertStoreType type;
- int result;
+ CertSvcStoreCertList *certList = NULL;
size_t length = 0;
- int count = 0;
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list failed");
- CertSvcStoreCertList* certList1 = NULL;
- CertSvcString buffer1, gname;
- CertSvcString buffer2;
- const char *temp = NULL;
- CertSvcCertificate certificate;
+ result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Freeing certificate list failed");
+
+ certsvc_string_free(Alias);
+ certsvc_string_free(Path);
+
+ FREE_INSTANCE
+}
+
+RUNNER_TEST(CERTSVC_PKCS12_1005_add_crt_file_in_individual_store)
+{
+ int result;
CREATE_INSTANCE
- CertSvcString Alias, Path, Pass;
-
- Alias.privateHandler = alias;
- Alias.privateLength = strlen(alias);
- Pass.privateHandler = pass;
- Path.privateHandler = (char *)path;
- Path.privateLength = strlen(path);
-
- type = WIFI_STORE;
- result = certsvc_pkcs12_import_from_file_to_store(instance, type, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing CRT file to WIFI store failed.");
-
- type = VPN_STORE;
- result = certsvc_pkcs12_import_from_file_to_store(instance, type, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing CRT file to VPN store failed.");
-
- type = EMAIL_STORE;
- result = certsvc_pkcs12_import_from_file_to_store(instance, type, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing CRT file to EMAIL store failed.");
-
- type = (CertStoreType) (WIFI_STORE | VPN_STORE | EMAIL_STORE);
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, type, DISABLED, &certList, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from system store failed");
-
- if(result == CERTSVC_SUCCESS)
- {
- tmpNode = certList;
- while(tmpNode != NULL)
- {
- count++;
- tmp = tmpNode;
- tmpNode = tmpNode->next;
- }
- result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Freeing certificate list from system store failed");
- }
- certList = NULL;
- type = (CertStoreType) (WIFI_STORE | VPN_STORE | EMAIL_STORE);
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, type, DISABLED, &certList, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from store failed.");
- certList1=certList;
- count = 0;
- while(certList!=NULL)
- {
- gname.privateHandler = (char *)certList->gname;
- gname.privateLength = strlen(certList->gname);
+ CertSvcString Alias = wrapper_certsvc_string_new("CRT-TestingCRT1");
+ CertSvcString Path = wrapper_certsvc_string_new("/usr/share/cert-svc/tests/Testing.crt");
+ CertSvcString Pass = wrapper_certsvc_string_new(NULL);
+
+ result = certsvc_pkcs12_import_from_file_to_store(instance, WIFI_STORE, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing CRT file to WIFI store failed.");
+
+ result = certsvc_pkcs12_import_from_file_to_store(instance, VPN_STORE, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing CRT file to VPN store failed.");
+
+ result = certsvc_pkcs12_import_from_file_to_store(instance, EMAIL_STORE, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing CRT file to EMAIL store failed.");
+
+ CertSvcStoreCertList *certList = NULL;
+ size_t length = 0;
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from store failed.");
+
+ CertSvcStoreCertList *certListOrig = certList;
+ int count = 0;
+ CertSvcString strSubject;
+ CertSvcString strIssuer;
+ CertSvcCertificate certificate;
+ while (certList) {
result = certsvc_pkcs12_get_certificate_from_store(instance, certList->storeType, certList->gname, &certificate);
RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get certificate from store.");
- result = certsvc_certificate_get_string_field(certificate, CERTSVC_SUBJECT, &buffer1);
+ result = certsvc_certificate_get_string_field(certificate, CERTSVC_SUBJECT, &strSubject);
RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get string field.");
- result = certsvc_certificate_get_string_field(certificate, CERTSVC_ISSUER_COMMON_NAME, &buffer2);
+ result = certsvc_certificate_get_string_field(certificate, CERTSVC_ISSUER_COMMON_NAME, &strIssuer);
RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get string field.");
- certsvc_string_to_cstring(buffer1, &temp, &length);
- certsvc_string_to_cstring(buffer2, &temp, &length);
-
- certsvc_string_free(buffer1);
- certsvc_string_free(buffer2);
+ certsvc_string_free(strSubject);
+ certsvc_string_free(strIssuer);
certsvc_certificate_free(certificate);
certList = certList->next;
count++;
}
- certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList1);
- certList=NULL;
- certList1=NULL;
+
+ certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certListOrig);
FREE_INSTANCE
}
-/* Install a CRT file to all store at once */
-RUNNER_TEST(CERTSVC_PKCS12_1006_add_crt_file_in_all_store) {
-
- const char path[] = "/usr/share/cert-svc/tests/Testing.crt";
- CertSvcStoreCertList* certList = NULL;
- CertSvcStoreCertList* tmpNode = NULL;
- CertSvcStoreCertList* tmp = NULL;
- char* pass = NULL;
- char *alias = "CRT-TestingCRT1-all-store";
- CertStoreType type;
+RUNNER_TEST(CERTSVC_PKCS12_1006_add_crt_file_in_all_store)
+{
int result;
- int count = 0;
- size_t length = 0;
CREATE_INSTANCE
- CertSvcString Alias, Path, Pass;
-
- Alias.privateHandler = alias;
- Alias.privateLength = strlen(alias);
- Pass.privateHandler = pass;
- Path.privateHandler = (char *)path;
- Path.privateLength = strlen(path);
-
- type = (CertStoreType )(WIFI_STORE | VPN_STORE | EMAIL_STORE);
- result = certsvc_pkcs12_import_from_file_to_store(instance, type, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing CRT file to all store failed.");
-
- type = (CertStoreType) (WIFI_STORE | VPN_STORE | EMAIL_STORE);
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, type, DISABLED, &certList, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from system store failed");
-
- if(result == CERTSVC_SUCCESS)
- {
- tmpNode = certList;
- while(tmpNode != NULL)
- {
- count++;
- tmp = tmpNode;
- tmpNode = tmpNode->next;
- }
- result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Freeing certificate list from system store failed");
- }
+ CertSvcString Alias = wrapper_certsvc_string_new("CRT-TestingCRT1-all-store");
+ CertSvcString Path = wrapper_certsvc_string_new("/usr/share/cert-svc/tests/Testing.crt");
+ CertSvcString Pass = wrapper_certsvc_string_new(NULL);
+
+ result = certsvc_pkcs12_import_from_file_to_store(instance, allStoreType, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing CRT file to all store failed.");
+
+ CertSvcStoreCertList *certList = NULL;
+ size_t length = 0;
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from system store failed");
+
+ result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Freeing certificate list from system store failed");
+
+ certsvc_string_free(Alias);
+ certsvc_string_free(Path);
FREE_INSTANCE
}
-/* Import a P12 file to individual store */
-RUNNER_TEST(CERTSVC_PKCS12_1007_install_p12_file_to_individual_store) {
-
- const char path[] = "/usr/share/cert-svc/tests/wifiuser.p12";
- CertSvcStoreCertList* certList = NULL;
- CertSvcStoreCertList* tmpNode = NULL;
- CertSvcStoreCertList* tmp = NULL;
- const char pass[] = "wifi";
- char *alias = "P12-WifiUser";
- CertStoreType storeType;
+RUNNER_TEST(CERTSVC_PKCS12_1007_install_p12_file_to_individual_store)
+{
int result;
- size_t length = 0;
- int count = 0;
CREATE_INSTANCE
- CertSvcString Alias, Path, Pass;
- Alias.privateHandler = (char *)alias;
- Alias.privateLength = strlen(alias);
- Pass.privateHandler = (char *)pass;
- Pass.privateLength = strlen(pass);
- Path.privateHandler = (char *)path;
- Path.privateLength = strlen(path);
+ CertSvcString Alias = wrapper_certsvc_string_new("P12-WifiUser");
+ CertSvcString Path = wrapper_certsvc_string_new("/usr/share/cert-svc/tests/wifiuser.p12");
+ CertSvcString Pass = wrapper_certsvc_string_new("wifi");
-/*
- result = certsvc_pkcs12_import_from_file(instance, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "certsvc_pkcs12_import_from_file failed.");
-*/
-
- storeType = WIFI_STORE;
- result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing p12 file to WIFI store failed.");
-
- storeType = VPN_STORE;
- result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing p12 file to VPN store failed.");
-
- storeType = EMAIL_STORE;
- result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing p12 file to EMAIL store failed.");
-
- storeType = (CertStoreType) (WIFI_STORE | VPN_STORE | EMAIL_STORE);
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from system store failed");
-
- if(result == CERTSVC_SUCCESS)
- {
- tmpNode = certList;
- while(tmpNode != NULL)
- {
- count++;
- tmp = tmpNode;
- tmpNode = tmpNode->next;
- }
- result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Freeing certificate list from system store failed");
- }
+ result = certsvc_pkcs12_import_from_file_to_store(instance, WIFI_STORE, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing p12 file to WIFI store failed.");
- FREE_INSTANCE
-}
+ result = certsvc_pkcs12_import_from_file_to_store(instance, VPN_STORE, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing p12 file to VPN store failed.");
-/* Import a P12 file to all store */
-RUNNER_TEST(CERTSVC_PKCS12_1008_install_p12_file_to_all_store) {
+ result = certsvc_pkcs12_import_from_file_to_store(instance, EMAIL_STORE, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing p12 file to EMAIL store failed.");
- const char path[] = "/usr/share/cert-svc/tests/wifiuser.p12";
CertSvcStoreCertList* certList = NULL;
- CertSvcStoreCertList* tmpNode = NULL;
- CertSvcStoreCertList* tmp = NULL;
- const char pass[] = "wifi";
- char *alias = "P12-WifiUser-all-store";
- CertStoreType storeType;
- int result;
size_t length = 0;
- int count =0;
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from system store failed");
- CREATE_INSTANCE
- CertSvcString Alias, Path, Pass;
-
- Alias.privateHandler = (char *)alias;
- Alias.privateLength = strlen(alias);
- Pass.privateHandler = (char *)pass;
- Pass.privateLength = strlen(pass);
- Path.privateHandler = (char *)path;
- Path.privateLength = strlen(path);
-
- storeType = (CertStoreType )(WIFI_STORE | VPN_STORE | EMAIL_STORE);
- result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing p12 file to WIFI store failed.");
-
- storeType = (CertStoreType) (WIFI_STORE | VPN_STORE | EMAIL_STORE);
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from system store failed");
-
- if(result == CERTSVC_SUCCESS)
- {
- tmpNode = certList;
- while(tmpNode != NULL)
- {
- count++;
- tmp = tmpNode;
- tmpNode = tmpNode->next;
- }
- result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Freeing certificate list from system store failed");
- }
+ result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Freeing certificate list from system store failed");
+
+ certsvc_string_free(Alias);
+ certsvc_string_free(Path);
+ certsvc_string_free(Pass);
FREE_INSTANCE
}
-/* Import a P12 file to individual store */
-RUNNER_TEST(CERTSVC_PKCS12_1009_install_pfx_file_to_individual_store) {
+RUNNER_TEST(CERTSVC_PKCS12_1008_install_p12_file_to_all_store)
+{
+ int result;
+
+ CREATE_INSTANCE
+
+ CertSvcString Alias = wrapper_certsvc_string_new("P12-WifiUser-all-store");
+ CertSvcString Path = wrapper_certsvc_string_new("/usr/share/cert-svc/tests/wifiuser.p12");
+ CertSvcString Pass = wrapper_certsvc_string_new("wifi");
+
+ result = certsvc_pkcs12_import_from_file_to_store(instance, allStoreType, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing p12 file to WIFI store failed.");
- const char path[] = "/usr/share/cert-svc/tests/wifiserver.pfx";
CertSvcStoreCertList* certList = NULL;
- CertSvcStoreCertList* tmpNode = NULL;
- CertSvcStoreCertList* tmp = NULL;
- const char pass[] = "wifi";
- char *alias = "PFX-WifiServer";
- CertStoreType storeType;
- int result;
- int count = 0;
size_t length = 0;
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from system store failed");
- CREATE_INSTANCE
- CertSvcString Alias, Path, Pass;
-
- Alias.privateHandler = (char *)alias;
- Alias.privateLength = strlen(alias);
- Pass.privateHandler = (char *)pass;
- Pass.privateLength = strlen(pass);
- Path.privateHandler = (char *)path;
- Path.privateLength = strlen(path);
-
- storeType = WIFI_STORE;
- result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing PFX file to WIFI store failed.");
-
- storeType = VPN_STORE;
- result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing PFX file to VPN store failed.");
-
- storeType = EMAIL_STORE;
- result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing PFX file to EMAIL store failed.");
-
- storeType = (CertStoreType) (WIFI_STORE | VPN_STORE | EMAIL_STORE);
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from system store failed");
-
- if(result == CERTSVC_SUCCESS)
- {
- tmpNode = certList;
- while(tmpNode != NULL)
- {
- count++;
- tmp = tmpNode;
- tmpNode = tmpNode->next;
- }
- result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Freeing certificate list from system store failed");
- }
+ result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Freeing certificate list from system store failed");
+
+ certsvc_string_free(Alias);
+ certsvc_string_free(Path);
+ certsvc_string_free(Pass);
FREE_INSTANCE
}
-RUNNER_TEST(CERTSVC_PKCS12_1010_install_pfx_file_to_all_store) {
+RUNNER_TEST(CERTSVC_PKCS12_1009_install_pfx_file_to_individual_store)
+{
+ int result;
+
+ CREATE_INSTANCE
+
+ CertSvcString Alias = wrapper_certsvc_string_new("PFX-WifiServer");
+ CertSvcString Path = wrapper_certsvc_string_new("/usr/share/cert-svc/tests/wifiserver.pfx");
+ CertSvcString Pass = wrapper_certsvc_string_new("wifi");
+
+ result = certsvc_pkcs12_import_from_file_to_store(instance, WIFI_STORE, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PFX file to WIFI store failed.");
+
+ result = certsvc_pkcs12_import_from_file_to_store(instance, VPN_STORE, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PFX file to VPN store failed.");
+
+ result = certsvc_pkcs12_import_from_file_to_store(instance, EMAIL_STORE, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PFX file to EMAIL store failed.");
- const char path[] = "/usr/share/cert-svc/tests/wifiserver.pfx";
- const char pass[] = "wifi";
- char *alias = "PFX-WifiServer-all-store";
- CertStoreType storeType;
CertSvcStoreCertList* certList = NULL;
- CertSvcStoreCertList* tmpNode = NULL;
- CertSvcStoreCertList* tmp = NULL;
size_t length = 0;
- int count = 0;
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from system store failed");
+
+ result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Freeing certificate list from system store failed");
+
+ certsvc_string_free(Alias);
+ certsvc_string_free(Path);
+ certsvc_string_free(Pass);
+
+ FREE_INSTANCE
+}
+
+RUNNER_TEST(CERTSVC_PKCS12_1010_install_pfx_file_to_all_store)
+{
int result;
CREATE_INSTANCE
- CertSvcString Alias, Path, Pass;
-
- Alias.privateHandler = (char *)alias;
- Alias.privateLength = strlen(alias);
- Pass.privateHandler = (char *)pass;
- Pass.privateLength = strlen(pass);
- Path.privateHandler = (char *)path;
- Path.privateLength = strlen(path);
-
- storeType = (CertStoreType) (VPN_STORE | EMAIL_STORE | WIFI_STORE);
- result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing PFX file to WIFI store failed.");
-
- storeType = (CertStoreType) (WIFI_STORE | VPN_STORE | EMAIL_STORE);
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from system store failed");
-
- if(result == CERTSVC_SUCCESS)
- {
-
- tmpNode = certList;
- while(tmpNode != NULL)
- {
- count++;
- tmp = tmpNode;
- tmpNode = tmpNode->next;
- }
- result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Freeing certificate list from system store failed");
- }
+
+ CertSvcString Alias = wrapper_certsvc_string_new("PFX-WifiServer-all-store");
+ CertSvcString Path = wrapper_certsvc_string_new("/usr/share/cert-svc/tests/wifiserver.pfx");
+ CertSvcString Pass = wrapper_certsvc_string_new("wifi");
+
+ result = certsvc_pkcs12_import_from_file_to_store(instance, allStoreType, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PFX file to WIFI store failed.");
+
+ CertSvcStoreCertList* certList = NULL;
+ size_t length = 0;
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from system store failed");
+
+ result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Freeing certificate list from system store failed");
+
+ certsvc_string_free(Alias);
+ certsvc_string_free(Path);
+ certsvc_string_free(Pass);
FREE_INSTANCE
}
/* Getting all end user & root certificate list from WIFI,VPN,EMAIL store */
-RUNNER_TEST(CERTSVC_PKCS12_1011_get_all_end_user_certificate_from_store) {
-
- CertSvcStoreCertList* certList = NULL;
- CertSvcStoreCertList* tmpNode = NULL;
- CertStoreType storeType = (CertStoreType) (WIFI_STORE);
+RUNNER_TEST(CERTSVC_PKCS12_1011_get_all_end_user_certificate_from_store)
+{
int result;
- size_t length;
CREATE_INSTANCE
- result = certsvc_pkcs12_get_end_user_certificate_list_from_store(instance, storeType, &certList, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting end user certificate list from store failed.");
- tmpNode=certList;
- while(tmpNode!=NULL)
- {
- tmpNode = tmpNode->next;
- }
+ CertSvcStoreCertList *certList = NULL;
+ size_t length;
+ result = certsvc_pkcs12_get_end_user_certificate_list_from_store(instance, WIFI_STORE, &certList, &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting end user certificate list from WIFI_STORE failed.");
certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
- certList = NULL;
- tmpNode = NULL;
-
- storeType = (CertStoreType) (VPN_STORE);
- result = certsvc_pkcs12_get_end_user_certificate_list_from_store(instance, storeType, &certList, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting end user certificate list from store failed.");
- tmpNode=certList;
- while(tmpNode!=NULL)
- {
- tmpNode = tmpNode->next;
- }
+
+ result = certsvc_pkcs12_get_end_user_certificate_list_from_store(instance, VPN_STORE, &certList, &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting end user certificate list from VPN_STORE failed.");
certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
- certList = NULL;
- tmpNode = NULL;
-
- storeType = (CertStoreType) (EMAIL_STORE);
- result = certsvc_pkcs12_get_end_user_certificate_list_from_store(instance, storeType, &certList, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting end user certificate list from store failed.");
- tmpNode=certList;
- while(tmpNode!=NULL)
- {
- tmpNode = tmpNode->next;
- }
+
+ result = certsvc_pkcs12_get_end_user_certificate_list_from_store(instance, EMAIL_STORE, &certList, &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting end user certificate list from EMAIL_STORE failed.");
certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
- certList = NULL;
- tmpNode = NULL;
-
- storeType = (CertStoreType) (WIFI_STORE);
- result = certsvc_pkcs12_get_root_certificate_list_from_store(instance, storeType, &certList, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting end user certificate list from store failed.");
- tmpNode=certList;
- while(tmpNode!=NULL)
- {
- tmpNode = tmpNode->next;
- }
+
+ result = certsvc_pkcs12_get_root_certificate_list_from_store(instance, WIFI_STORE, &certList, &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting root certificate list from WIFI_STORE failed.");
certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
- certList = NULL;
- tmpNode = NULL;
-
- storeType = (CertStoreType) (VPN_STORE);
- result = certsvc_pkcs12_get_root_certificate_list_from_store(instance, storeType, &certList, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting end user certificate list from store failed.");
- tmpNode=certList;
- while(tmpNode!=NULL)
- {
- tmpNode = tmpNode->next;
- }
+
+ result = certsvc_pkcs12_get_root_certificate_list_from_store(instance, VPN_STORE, &certList, &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting root certificate list from VPN_STORE failed.");
certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
- certList = NULL;
- tmpNode = NULL;
-
- storeType = (CertStoreType) (EMAIL_STORE);
- result = certsvc_pkcs12_get_root_certificate_list_from_store(instance, storeType, &certList, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting end user certificate list from store failed.");
- tmpNode=certList;
- while(tmpNode!=NULL)
- {
- tmpNode = tmpNode->next;
- }
+
+ result = certsvc_pkcs12_get_root_certificate_list_from_store(instance, EMAIL_STORE, &certList, &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting root certificate list from EMAIL_STORE failed.");
certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
- certList = NULL;
- tmpNode = NULL;
FREE_INSTANCE
}
-/* Delete all certificate from WIFI,VPN,EMAIL store */
-RUNNER_TEST(CERTSVC_PKCS12_1012_delete_all_cert_from_multiple_store) {
-
- CertSvcStoreCertList* certList = NULL;
- CertSvcStoreCertList* certList1 = NULL;
- CertStoreType storeType = (CertStoreType) (WIFI_STORE | VPN_STORE | EMAIL_STORE);
+RUNNER_TEST(CERTSVC_PKCS12_1012_delete_all_cert_from_multiple_store)
+{
int result;
- size_t length;
CertSvcString gname;
CREATE_INSTANCE
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from store failed.");
- certList1=certList;
- while(certList1!=NULL)
- {
- gname.privateHandler = (char *)certList1->gname;
- gname.privateLength = strlen(certList1->gname);
- result = certsvc_pkcs12_delete_certificate_from_store(instance, (CertStoreType) certList1->storeType, gname);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Deleting certificate from store failed.");
- certList1 = certList1->next;
+ CertSvcStoreCertList *certList = NULL;
+ size_t length;
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from store failed.");
+
+ CertSvcStoreCertList *certListOrig = certList;
+ while (certList) {
+ gname = wrapper_certsvc_string_new(certList->gname);
+ result = certsvc_pkcs12_delete_certificate_from_store(instance, certList->storeType, gname);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Deleting certificate from store failed.");
+
+ certsvc_string_free(gname);
+
+ certList = certList->next;
}
- certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
- certList=NULL;
+
+ certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certListOrig);
FREE_INSTANCE
}
-/* Import the file to one store and try to get the certlist from all store */
-RUNNER_TEST(CERTSVC_PKCS12_1013_install_pfx_file_to_one_store_and_get_list_from_multiple_store) {
-
- const char path[] = "/usr/share/cert-svc/tests/wifiserver.pfx";
- const char pass[] = "wifi";
- char *alias = "PFX-WifiServer-one-store";
- CertStoreType storeType;
- CertSvcStoreCertList* certList = NULL;
- CertSvcStoreCertList* tmpNode = NULL;
- CertSvcStoreCertList* tmp = NULL;
- size_t length = 0;
- int count = 0;
- int result = -1;
- gboolean exists = FALSE;
+RUNNER_TEST(CERTSVC_PKCS12_1013_install_pfx_file_to_one_store_and_get_list_from_multiple_store)
+{
+ int result;
CREATE_INSTANCE
- CertSvcString Alias, Path, Pass;
-
- Alias.privateHandler = (char *)alias;
- Alias.privateLength = strlen(alias);
- Pass.privateHandler = (char *)pass;
- Pass.privateLength = strlen(pass);
- Path.privateHandler = (char *)path;
- Path.privateLength = strlen(path);
-
- storeType = (CertStoreType) (VPN_STORE | WIFI_STORE | EMAIL_STORE);
- result = certsvc_pkcs12_check_alias_exists_in_store(instance, storeType, Alias, &exists);
- if (exists==TRUE) {
- /* installing the pfx in one store and getting the list from multiple store */
- storeType = (CertStoreType) ( EMAIL_STORE );
- result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing PFX file to WIFI store failed.");
-
- storeType = (CertStoreType) ( VPN_STORE | WIFI_STORE );
- result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing PFX file to WIFI store failed.");
-
- storeType = (CertStoreType) ( VPN_STORE | WIFI_STORE | EMAIL_STORE);
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from system store failed");
-
- if(result == CERTSVC_SUCCESS)
- {
- tmpNode = certList;
- while(tmpNode != NULL)
- {
- count++;
- tmp = tmpNode;
- tmpNode = tmpNode->next;
- }
- result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Freeing certificate list from system store failed");
- }
+
+ CertSvcString Alias = wrapper_certsvc_string_new("PFX-WifiServer-one-store");
+ CertSvcString Path = wrapper_certsvc_string_new("/usr/share/cert-svc/tests/wifiserver.pfx");
+ CertSvcString Pass = wrapper_certsvc_string_new("wifi");
+
+ int isUnique = 0;
+ result = certsvc_pkcs12_check_alias_exists_in_store(instance, allStoreType, Alias, &isUnique);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "check alias exists in store failed. result : " << result);
+
+ if (!isUnique) {
+ /* TODO: remove certificate which already exists and test continue */
+ RUNNER_ASSERT_MSG(0, "Remove certificate which already exists and test continue");
}
+ result = certsvc_pkcs12_import_from_file_to_store(instance, EMAIL_STORE, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PFX file to EMAIL_STORE failed.");
+
+ result = certsvc_pkcs12_import_from_file_to_store(instance, WIFI_STORE, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PFX file to WIFI_STORE failed.");
+
+ CertSvcStoreCertList *certList = NULL;
+ size_t length = 0;
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from all store failed");
+
+ certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
+
+ certsvc_string_free(Alias);
+ certsvc_string_free(Path);
+ certsvc_string_free(Pass);
+
FREE_INSTANCE
}
-/* Set the status of the certificate to disabled and trying to delete store */
-RUNNER_TEST(CERTSVC_PKCS12_1014_installing_pfx_without_password_to_individual_store) {
-
- const char path[] = "/usr/share/cert-svc/tests/without_pass.p12";
- const char pass[] = "";
- char *alias = "PFX-WifiServer-without-password";
- CertStoreType storeType;
+RUNNER_TEST(CERTSVC_PKCS12_1014_installing_pfx_without_password_to_individual_store)
+{
int result;
- int exists;
CREATE_INSTANCE
- CertSvcString Alias, Path, Pass;
-
- Alias.privateHandler = (char *)alias;
- Alias.privateLength = strlen(alias);
- Pass.privateHandler = (char *)pass;
- Pass.privateLength = strlen(pass);
- Path.privateHandler = (char *)path;
- Path.privateLength = strlen(path);
-
- storeType = (CertStoreType) (VPN_STORE | WIFI_STORE | EMAIL_STORE);
- result = certsvc_pkcs12_check_alias_exists_in_store(instance, storeType, Alias, &exists);
- if (exists==TRUE) {
- storeType = (CertStoreType) (VPN_STORE | WIFI_STORE | EMAIL_STORE);
- result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Importing PFX file to WIFI store failed.");
+
+ CertSvcString Alias = wrapper_certsvc_string_new("PFX-WifiServer-without-password");
+ CertSvcString Path = wrapper_certsvc_string_new("/usr/share/cert-svc/tests/without_pass.p12");
+ CertSvcString Pass = wrapper_certsvc_string_new("");
+
+ int isUnique = 0;
+ result = certsvc_pkcs12_check_alias_exists_in_store(instance, allStoreType, Alias, &isUnique);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "check alias exists in store failed. result : " << result);
+
+ if (!isUnique) {
+ /* TODO: remove certificate which already exists and test continue */
+ RUNNER_ASSERT_MSG(0, "Remove certificate which already exists and test continue");
}
+ result = certsvc_pkcs12_import_from_file_to_store(instance, allStoreType, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PFX file to all store failed. result : " << result );
+
+ certsvc_string_free(Alias);
+ certsvc_string_free(Path);
+
FREE_INSTANCE
}
-/* Get certificate from WIFI,VPN,EMAIL store */
RUNNER_TEST(CERTSVC_PKCS12_1015_get_certificate_from_store) {
- CertSvcStoreCertList* certList = NULL;
- CertSvcStoreCertList* certList1 = NULL;
- CertStoreType storeType = (CertStoreType) (WIFI_STORE | VPN_STORE | EMAIL_STORE);
int result;
- size_t length;
- CertSvcString buffer1, gname;
- CertSvcString buffer2;
- const char *temp = NULL;
- CertSvcCertificate certificate;
CREATE_INSTANCE
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from store failed.");
- certList1=certList;
- while(certList!=NULL)
- {
- gname.privateHandler = (char *)certList->gname;
- gname.privateLength = strlen(certList->gname);
- result = certsvc_pkcs12_get_certificate_from_store(instance, certList->storeType, certList->gname, &certificate);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get certificate from store.");
+ CertSvcStoreCertList *certList = NULL;
+ size_t length;
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from all store failed.");
+ if (length == 0 || !certList) {
+ /* TODO: add any cert to store for testing */
+ RUNNER_ASSERT_MSG(0, "add any cert in store for testing");
+ }
- result = certsvc_certificate_get_string_field(certificate, CERTSVC_SUBJECT, &buffer1);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get string field.");
+ CertSvcStoreCertList *certListOrig = certList;
+ CertSvcString strSubject;
+ CertSvcString strIssuer;
+ CertSvcCertificate certificate;
+ while (certList) {
+ result = certsvc_pkcs12_get_certificate_from_store(instance, certList->storeType, certList->gname, &certificate);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get certificate from store.");
- certsvc_string_to_cstring(buffer1, &temp, &length);
+ result = certsvc_certificate_get_string_field(certificate, CERTSVC_SUBJECT, &strSubject);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get string field.");
- result = certsvc_certificate_get_string_field(certificate, CERTSVC_ISSUER_COMMON_NAME, &buffer2);
+ result = certsvc_certificate_get_string_field(certificate, CERTSVC_ISSUER_COMMON_NAME, &strIssuer);
RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get string field.");
- certsvc_string_to_cstring(buffer2, &temp, &length);
-
- certsvc_string_free(buffer1);
- certsvc_string_free(buffer2);
+ certsvc_string_free(strSubject);
+ certsvc_string_free(strIssuer);
certsvc_certificate_free(certificate);
certList = certList->next;
}
- certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList1);
- certList=NULL;
- certList1=NULL;
+
+ certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certListOrig);
FREE_INSTANCE
}
-/* Get certificate from system store */
-RUNNER_TEST(CERTSVC_PKCS12_1016_get_certificate_from_system_store) {
-
- CertSvcStoreCertList* certList = NULL;
- CertSvcStoreCertList* certList1 = NULL;
- CertStoreType storeType = (CertStoreType) (SYSTEM_STORE);
- int result = CERTSVC_SUCCESS;
- size_t length = 0;
- int count = 0;
- CertSvcString buffer1, gname;
- CertSvcString buffer2;
- const char *temp = NULL;
- CertSvcCertificate certificate;
+RUNNER_TEST(CERTSVC_PKCS12_1016_get_certificate_from_system_store)
+{
+ int result;
CREATE_INSTANCE
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from store failed.");
- certList1=certList;
- while(certList!=NULL)
- {
- gname.privateHandler = (char *)certList->gname;
- gname.privateLength = strlen(certList->gname);
+ CertSvcStoreCertList *certList = NULL;
+ size_t length = 0;
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, SYSTEM_STORE, DISABLED, &certList, &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from store failed.");
+ if (length == 0 || !certList) {
+ /* TODO: add any cert to store for testing */
+ RUNNER_ASSERT_MSG(0, "add any cert in store for testing");
+ }
+
+ CertSvcStoreCertList *certListOrig = certList;
+ CertSvcString strSubject;
+ CertSvcString strIssuer;
+ CertSvcCertificate certificate;
+ while (certList) {
result = certsvc_pkcs12_get_certificate_from_store(instance, certList->storeType, certList->gname, &certificate);
RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get certificate from store.");
- result = certsvc_certificate_get_string_field(certificate, CERTSVC_SUBJECT, &buffer1);
+ result = certsvc_certificate_get_string_field(certificate, CERTSVC_SUBJECT, &strSubject);
RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get string field.");
- result = certsvc_certificate_get_string_field(certificate, CERTSVC_ISSUER_COMMON_NAME, &buffer2);
+ result = certsvc_certificate_get_string_field(certificate, CERTSVC_ISSUER_COMMON_NAME, &strIssuer);
RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get string field.");
- certsvc_string_to_cstring(buffer1, &temp, &length);
- certsvc_string_to_cstring(buffer2, &temp, &length);
-
- certsvc_string_free(buffer1);
- certsvc_string_free(buffer2);
+ certsvc_string_free(strSubject);
+ certsvc_string_free(strIssuer);
certsvc_certificate_free(certificate);
certList = certList->next;
- count++;
}
- certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList1);
- certList=NULL;
- certList1=NULL;
+ certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certListOrig);
FREE_INSTANCE
}
-/* Load certificate list form store for a certificate */
-RUNNER_TEST(CERTSVC_PKCS12_1017_load_cert_list_from_store) {
-
- CertStoreType storeType;
- CertSvcCertificateList certList;
- CertSvcStoreCertList* certList1 = NULL;
- CertSvcCertificate cert;
- int result = CERTSVC_SUCCESS;
- size_t length = 0;
- int i=0;
- size_t certListlength = 0;
- const char *temp = NULL;
- CertSvcString buffer1,buffer2, gname;
+RUNNER_TEST(CERTSVC_PKCS12_1017_load_cert_list_from_store)
+{
+ int result;
CREATE_INSTANCE
- storeType = (CertStoreType) (VPN_STORE);
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList1, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from store failed.");
- while(certList1!=NULL)
- {
- gname.privateHandler = (char *)certList1->gname;
- gname.privateLength = strlen(certList1->gname);
+ CertSvcStoreCertList *certListTemp = NULL;
+ size_t length = 0;
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, VPN_STORE, DISABLED, &certListTemp, &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from VPN_STORE failed.");
+ if (length == 0 || !certListTemp) {
+ /* TODO: add any cert to store for testing */
+ RUNNER_ASSERT_MSG(0, "add any cert in store for testing");
+ }
- result = certsvc_pkcs12_load_certificate_list_from_store(instance, storeType, gname, &certList);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Load certificate list form store failed.");
+ CertSvcString strSubject;
+ CertSvcString strIssuer;
+ CertSvcCertificate cert;
+ CertSvcString gname = wrapper_certsvc_string_new(certListTemp->gname);
- result = certsvc_certificate_list_get_length(certList, &certListlength);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Get certificate list get length failed.");
+ CertSvcCertificateList certList;
+ result = certsvc_pkcs12_load_certificate_list_from_store(instance, VPN_STORE, gname, &certList);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Load certificate list form VPN_STORE failed.");
+ certsvc_string_free(gname);
- for(i=0; i<certListlength; i++)
- {
- result = certsvc_certificate_list_get_one(certList, i, &cert);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "certsvc_certificate_list_get_one returned not CERTSVC_SUCCESS");
+ length = 0;
+ result = certsvc_certificate_list_get_length(certList, &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate list get length failed.");
+ RUNNER_ASSERT_MSG(length > 0, "No certificate loaded.");
- result = certsvc_certificate_get_string_field(cert, CERTSVC_SUBJECT, &buffer1);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get string field.");
+ for (size_t i = 0; i < length; i++) {
+ result = certsvc_certificate_list_get_one(certList, i, &cert);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "certsvc_certificate_list_get_one failed.");
- certsvc_string_to_cstring(buffer1, &temp, &length);
+ result = certsvc_certificate_get_string_field(cert, CERTSVC_SUBJECT, &strSubject);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get string field.");
- result = certsvc_certificate_get_string_field(cert, CERTSVC_ISSUER_COMMON_NAME, &buffer2);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get string field.");
+ result = certsvc_certificate_get_string_field(cert, CERTSVC_ISSUER_COMMON_NAME, &strIssuer);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get string field.");
- certsvc_string_to_cstring(buffer2, &temp, &length);
- }
- break; // Should run for only one time //
+ certsvc_string_free(strSubject);
+ certsvc_string_free(strIssuer);
+ certsvc_certificate_free(cert);
}
+ certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certListTemp);
+
FREE_INSTANCE
}
-/* Load certificate list form store for a certificate */
-RUNNER_TEST(CERTSVC_PKCS12_1018_get_duplicate_private_key) {
-
- CertStoreType storeType;
- CertSvcStoreCertList* certList1 = NULL;
- FILE *fp = NULL;
- int result = CERTSVC_SUCCESS;
- size_t length = 0;
- CertSvcString gname;
+RUNNER_TEST(CERTSVC_PKCS12_1018_get_duplicate_private_key)
+{
const char *privatekey_path = "/usr/share/cert-svc/pkcs12/temp.txt";
- EVP_PKEY *privatekey = NULL;
+ int result;
CREATE_INSTANCE
- storeType = (CertStoreType) (VPN_STORE);
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList1, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from store failed.");
- while(certList1!=NULL)
- {
- gname.privateHandler = (char *)certList1->gname;
- gname.privateLength = strlen(certList1->gname);
- result = certsvc_pkcs12_dup_evp_pkey_from_store(instance, storeType, gname, &privatekey);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting duplicate private key from store failed.");
-
- if ((fp = fopen(privatekey_path, "w")) == NULL) {
- result = CERTSVC_FAIL;
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to open file for writing.");
- }
+ CertSvcStoreCertList *certListTemp = NULL;
+ size_t length = 0;
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, VPN_STORE, DISABLED, &certListTemp, &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from VPN_STORE failed.");
+ if (length == 0 || !certListTemp) {
+ /* TODO: add any cert to store for testing */
+ RUNNER_ASSERT_MSG(0, "add any cert in store for testing");
+ }
- result = PEM_write_PrivateKey(fp, privatekey, NULL, NULL, 0, NULL, NULL);
- RUNNER_ASSERT_MSG(result!=0, "Failed to write private key onto file.");
- fclose(fp);
+ CertSvcString gname = wrapper_certsvc_string_new(certListTemp->gname);
+ EVP_PKEY *privatekey = NULL;
+ result = certsvc_pkcs12_dup_evp_pkey_from_store(instance, VPN_STORE, gname, &privatekey);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting duplicate private key from store failed.");
+ certsvc_string_free(gname);
- certsvc_pkcs12_free_evp_pkey(privatekey);
+ FILE *fp = NULL;
+ if (!(fp = fopen(privatekey_path, "w")))
+ RUNNER_ASSERT_MSG(0, "Failed to open file for writing.");
- break; // Should run for only one time //
- }
+ result = PEM_write_PrivateKey(fp, privatekey, NULL, NULL, 0, NULL, NULL);
+ fclose(fp);
+ unlink(privatekey_path);
+
+ RUNNER_ASSERT_MSG(result != 0, "Failed to write private key onto file.");
+
+ certsvc_pkcs12_free_evp_pkey(privatekey);
FREE_INSTANCE
}
-/* Get certificate from system store */
-RUNNER_TEST(CERTSVC_PKCS12_1019_check_alias_exists) {
-
- char *alias = "PFX-WifiServer-without-password";
- CertStoreType storeType;
- int result = CERTSVC_SUCCESS;
- gboolean exists = FALSE;
+RUNNER_TEST(CERTSVC_PKCS12_1019_check_alias_exists)
+{
+ int result;
CREATE_INSTANCE
- CertSvcString Alias;
- Alias.privateHandler = (char *)alias;
- Alias.privateLength = strlen(alias);
- storeType = (CertStoreType) (VPN_STORE | WIFI_STORE | EMAIL_STORE);
- result = certsvc_pkcs12_check_alias_exists_in_store(instance, storeType, Alias, &exists);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from store failed.");
+ CertSvcString Alias = wrapper_certsvc_string_new("PFX-WifiServer-without-password");
+
+ int isUnique = 0;
+ result = certsvc_pkcs12_check_alias_exists_in_store(instance, allStoreType, Alias, &isUnique);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from all store failed.");
+
+ certsvc_string_free(Alias);
FREE_INSTANCE
}
-/* Set the status of the certificate to disabled/enabled in wifi,vpn,email store */
-RUNNER_TEST(CERTSVC_PKCS12_1020_certsvc_set_cert_to_disabled_and_get_status_for_individual_store) {
-
- CertSvcStoreCertList* certList = NULL;
- CertSvcStoreCertList* tmpNode = NULL;
- int array[3]={VPN_STORE,WIFI_STORE,EMAIL_STORE};
- int result = CERTSVC_SUCCESS;
- CertSvcString Alias;
- CertStatus Status;
- CertStatus status;
- size_t length = 0;
- int count = 0;
- int i;
+RUNNER_TEST(CERTSVC_PKCS12_1020_certsvc_set_cert_to_disabled_and_get_status_for_individual_store)
+{
+ CertStoreType storeTypeArr[3] = {VPN_STORE, WIFI_STORE, EMAIL_STORE};
+ int result;
CREATE_INSTANCE
- for(int j=0;j<3;j++)
- {
- i = array[j];
+ for (size_t j = 0; j < 3; j++) {
+ CertStoreType storeType = storeTypeArr[j];
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, (CertStoreType)i, DISABLED, &certList, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from store failed.");
- tmpNode = certList;
- while(certList!=NULL)
- {
- count++;
- Alias.privateHandler = certList->gname;
- Alias.privateLength = strlen((const char*)certList->gname);
+ CertSvcStoreCertList *certList = NULL;
+ size_t length = 0;
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from store failed.");
- result = certsvc_pkcs12_get_certificate_status_from_store(instance, (CertStoreType)i, Alias, &status);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Get certificate status from system store failed.");
+ CertSvcStoreCertList *certListOrig = certList;
+ while (certList) {
+ CertSvcString Alias = wrapper_certsvc_string_new(certList->gname);
- Status=DISABLED;
- result = certsvc_pkcs12_set_certificate_status_to_store(instance, (CertStoreType)i, DISABLED, Alias, Status);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Set certificate status to system store failed.");
+ CertStatus status;
+ result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from system store failed.");
- result = certsvc_pkcs12_get_certificate_status_from_store(instance, (CertStoreType)i, Alias, &status);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Get certificate status from system store failed.");
+ result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, DISABLED, Alias, DISABLED);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Set certificate status to system store failed.");
- Status=ENABLED;
- result = certsvc_pkcs12_set_certificate_status_to_store(instance, (CertStoreType)i, DISABLED, Alias, Status);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Set certificate status to system store failed.");
+ result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from system store failed.");
+ RUNNER_ASSERT_MSG(status == DISABLED, "certificate status should be disabled");
- result = certsvc_pkcs12_get_certificate_status_from_store(instance, (CertStoreType)i, Alias, &status);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Get certificate status from system store failed.");
+ result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, DISABLED, Alias, ENABLED);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Set certificate status to system store failed.");
+
+ result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from system store failed.");
+ RUNNER_ASSERT_MSG(status == ENABLED, "certificate status should be enabled");
+
+ certsvc_string_free(Alias);
certList = certList->next;
}
- certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &tmpNode);
+ certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certListOrig);
}
FREE_INSTANCE
}
-/* Negative test case */
-/* Install a PEM file to invalid store */
-RUNNER_TEST(CERTSVC_PKCS12_1021_add_pem_file_to_invalid_store) {
-
- const char path[] = "/usr/share/cert-svc/tests/wifi-server.pem";
- char* pass = NULL;
- char *alias = "PFX-WifiServer-one-store";
+RUNNER_TEST(CERTSVC_PKCS12_1021_add_pem_file_to_invalid_store)
+{
int result;
- CertStoreType storeType = (CertStoreType) (-1);
- CertSvcString Alias, Path, Pass;
CREATE_INSTANCE
- Alias.privateHandler = alias;
- Alias.privateLength = strlen(alias);
- Pass.privateHandler = pass;
- Path.privateHandler = (char *)path;
- Path.privateLength = strlen(path);
-
- result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result==CERTSVC_INVALID_STORE_TYPE, "Importing certifcate with existing alias to WIFI store failed.");
-
- result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result==CERTSVC_INVALID_STORE_TYPE, "Importing certifcate with existing alias to VPN store failed.");
+ CertSvcString Alias = wrapper_certsvc_string_new("PFX-WifiServer-one-store");
+ CertSvcString Path = wrapper_certsvc_string_new("/usr/share/cert-svc/tests/wifi-server.pem");
+ CertSvcString Pass = wrapper_certsvc_string_new(NULL);
- result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result==CERTSVC_INVALID_STORE_TYPE, "Importing certifcate with existing alias to EMAIL store failed.");
+ result = certsvc_pkcs12_import_from_file_to_store(instance, (CertStoreType)-1, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result == CERTSVC_INVALID_STORE_TYPE, "Importing certifcate should be failed with invalid store type");
- /* Installing a PEM certificate to system store should fail */
- storeType = SYSTEM_STORE;
- result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Importing PEM file to EMAIL store failed.");
+ result = certsvc_pkcs12_import_from_file_to_store(instance, SYSTEM_STORE, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing PEM file to SYSTEM_STORE should be failed");
- /* Removing certificate to system store should fail */
- result = certsvc_pkcs12_delete_certificate_from_store(instance, storeType, Alias);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Deleting certificate from store failed.");
+ result = certsvc_pkcs12_delete_certificate_from_store(instance, SYSTEM_STORE, Alias);
+ RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Deleting certificate from SYSTEM_STORE should be failed");
+ certsvc_string_free(Alias);
+ certsvc_string_free(Path);
FREE_INSTANCE
}
-/* Set the status of the certificate to disabled/enabled from invalid store */
-RUNNER_TEST(CERTSVC_PKCS12_1022_certsvc_set_cert_to_disabled_and_get_status_for_invalid_store) {
-
- char* gname = "eb375c3e.0";
- CertStoreType storeType = (CertStoreType) (DISABLED);
- CertStatus Status;
- CertStatus status;
+RUNNER_TEST(CERTSVC_PKCS12_1022_certsvc_set_cert_to_disabled_and_get_status_for_invalid_store)
+{
int result;
- CertSvcString Alias;
CREATE_INSTANCE
- Alias.privateHandler = gname;
- Alias.privateLength = strlen((const char*)gname);
+ CertSvcString Alias = wrapper_certsvc_string_new("eb375c3e.0");
- /* getting status from a invalid store should fail */
- result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Get certificate status from system store failed.");
+ CertStatus status;
+ result = certsvc_pkcs12_get_certificate_status_from_store(instance, NONE_STORE, Alias, &status);
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Get certificate status with invalid store type should be failed");
- /* setting status to a invalid store should fail */
- Status=DISABLED;
- result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, DISABLED, Alias, Status);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Set certificate status to system store failed.");
+ result = certsvc_pkcs12_set_certificate_status_to_store(instance, NONE_STORE, DISABLED, Alias, DISABLED);
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Set certificate status with invalid store type should be failed");
- /* getting status from a invalid store should fail */
- result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Get certificate status from system store failed.");
+ result = certsvc_pkcs12_get_certificate_status_from_store(instance, NONE_STORE, Alias, &status);
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Get certificate status with invalid store type should be failed");
- /* setting status to a invalid store should fail */
- Status=ENABLED;
- result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, DISABLED, Alias, Status);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Set certificate status to system store failed.");
+ result = certsvc_pkcs12_set_certificate_status_to_store(instance, NONE_STORE, DISABLED, Alias, ENABLED);
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Set certificate status with invalid store type should be failed");
- /* setting status to a invalid store should fail */
- result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Get certificate status from system store failed.");
+ result = certsvc_pkcs12_get_certificate_status_from_store(instance, NONE_STORE, Alias, &status);
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Get certificate status with invalid store type should be failed");
+ certsvc_string_free(Alias);
FREE_INSTANCE
}
-/* Set the status of the certificate to disabled/enabled in wifi,vpn,email store */
-RUNNER_TEST(CERTSVC_PKCS12_1023_certsvc_set_cert_to_disabled_and_get_status_for_invalid_store) {
+RUNNER_TEST(CERTSVC_PKCS12_1023_certsvc_set_cert_to_disabled_and_get_status_for_invalid_store)
+{
+ CREATE_INSTANCE
- CertStoreType storeType = (CertStoreType) (0);
- CertSvcStoreCertList* certList = NULL;
- CertStatus Status;
- CertStatus status;
- size_t length;
+ CertSvcStoreCertList *certList = NULL;
+ size_t length = 0;
+ int result = certsvc_pkcs12_get_certificate_list_from_store(instance, NONE_STORE, DISABLED, &certList, &length);
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Getting certificate list from invalid store should be failed");
+ RUNNER_ASSERT_MSG((length == 0 && certList == NULL), "no output should be returned with invalid store");
+
+ FREE_INSTANCE
+}
+
+RUNNER_TEST(CERTSVC_PKCS12_1024_certsvc_set_and_get_for_invalid_store)
+{
int result;
- CertSvcString Alias;
CREATE_INSTANCE
- /* Getting certificate list from invalid store should fail */
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Getting certificate list from store failed.");
- while(certList!=NULL)
- {
- Alias.privateHandler = certList->gname;
- Alias.privateLength = strlen((const char*)certList->gname);
-
- result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Get certificate status from system store failed.");
+ CertSvcString Alias = wrapper_certsvc_string_new("TestingCRT1");
+ CertSvcString Path = wrapper_certsvc_string_new("/usr/share/cert-svc/tests/Invalidcrt.crt");
+ CertSvcString Pass = wrapper_certsvc_string_new(NULL);
- Status=DISABLED;
- result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, DISABLED, Alias, Status);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Set certificate status to system store failed.");
+ result = certsvc_pkcs12_import_from_file_to_store(instance, WIFI_STORE, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid CRT file should be failed.");
- result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Get certificate status from system store failed.");
+ result = certsvc_pkcs12_import_from_file_to_store(instance, VPN_STORE, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid CRT file should be failed.");
- Status=ENABLED;
- result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, DISABLED, Alias, Status);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Set certificate status to system store failed.");
+ result = certsvc_pkcs12_import_from_file_to_store(instance, EMAIL_STORE, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid CRT file should be failed.");
- result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Get certificate status from system store failed.");
+ result = certsvc_pkcs12_import_from_file_to_store(instance, NONE_STORE, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid CRT file should be failed.");
- certList = certList->next;
- }
+ certsvc_string_free(Alias);
+ certsvc_string_free(Path);
FREE_INSTANCE
}
-/* Intsalling an invalid crt file to valid store & invalid store*/
-RUNNER_TEST(CERTSVC_PKCS12_1024_certsvc_set_and_get_for_invalid_store) {
-
- const char path[] = "/usr/share/cert-svc/tests/Invalidcrt.crt";
- char* pass = NULL;
- char *alias = "TestingCRT1";
- CertStoreType type;
+RUNNER_TEST(CERTSVC_PKCS12_1025_install_invalid_pfx_file_to_individual_and_all_store)
+{
int result;
CREATE_INSTANCE
- CertSvcString Alias, Path, Pass;
-
- Alias.privateHandler = alias;
- Alias.privateLength = strlen(alias);
- Pass.privateHandler = pass;
- Path.privateHandler = (char *)path;
- Path.privateLength = strlen(path);
-
- /* Installing an invalid CRT file to valid store should fail */
- type = WIFI_STORE;
- result = certsvc_pkcs12_import_from_file_to_store(instance, type, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Importing CRT file to WIFI store failed.");
-
- /* Installing an invalid CRT file to valid store should fail */
- type = VPN_STORE;
- result = certsvc_pkcs12_import_from_file_to_store(instance, type, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Importing CRT file to VPN store failed.");
-
- /* Installing an invalid CRT file to valid store should fail */
- type = EMAIL_STORE;
- result = certsvc_pkcs12_import_from_file_to_store(instance, type, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Importing CRT file to EMAIL store failed.");
-
- /* Installing an invalid CRT file to valid store should fail */
- type = (CertStoreType) 0;
- result = certsvc_pkcs12_import_from_file_to_store(instance, type, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Importing CRT file to EMAIL store failed.");
- FREE_INSTANCE
-}
+ CertSvcString Alias = wrapper_certsvc_string_new("WifiServer-123");
+ CertSvcString Path = wrapper_certsvc_string_new("/usr/share/cert-svc/tests/test.pfx");
+ CertSvcString Pass = wrapper_certsvc_string_new("wifi");
-/* Import a invalid P12 file to individual and all store */
-RUNNER_TEST(CERTSVC_PKCS12_1025_install_invalid_pfx_file_to_individual_and_all_store) {
+ result = certsvc_pkcs12_import_from_file_to_store(instance, SYSTEM_STORE, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid PFX file should be failed.");
- const char path[] = "/usr/share/cert-svc/tests/test.pfx";
- const char pass[] = "wifi";
- char *alias = "WifiServer-123";
- CertStoreType storeType;
- int result;
+ result = certsvc_pkcs12_import_from_file_to_store(instance, WIFI_STORE, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid PFX file should be failed.");
- CREATE_INSTANCE
- CertSvcString Alias, Path, Pass;
-
- Alias.privateHandler = (char *)alias;
- Alias.privateLength = strlen(alias);
- Pass.privateHandler = (char *)pass;
- Pass.privateLength = strlen(pass);
- Path.privateHandler = (char *)path;
- Path.privateLength = strlen(path);
-
- /* importing p12/pfx to system store should fail */
- storeType = SYSTEM_STORE;
- result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Importing PFX file to WIFI store failed.");
-
- /* Importing invalid pfx file to valid store should fail */
- storeType = WIFI_STORE;
- result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Importing PFX file to WIFI store failed.");
-
- /* Importing invalid pfx file to valid store should fail */
- storeType = VPN_STORE;
- result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Importing PFX file to VPN store failed.");
-
- /* Importing invalid pfx file to valid store should fail */
- storeType = EMAIL_STORE;
- result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Importing PFX file to EMAIL store failed.");
-
- /* Importing invalid pfx file to valid store should fail */
- storeType = (CertStoreType) (EMAIL_STORE | VPN_STORE | WIFI_STORE);
- result = certsvc_pkcs12_import_from_file_to_store(instance, storeType, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Importing PFX file to EMAIL store failed.");
+ result = certsvc_pkcs12_import_from_file_to_store(instance, VPN_STORE, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid PFX file should be failed.");
+
+ result = certsvc_pkcs12_import_from_file_to_store(instance, EMAIL_STORE, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid PFX file should be failed.");
+
+ result = certsvc_pkcs12_import_from_file_to_store(instance, allStoreType, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid PFX file should be failed.");
+
+ certsvc_string_free(Alias);
+ certsvc_string_free(Path);
+ certsvc_string_free(Pass);
FREE_INSTANCE
}
-/* Set the status of the certificate to disabled/enabled in wifi,vpn,email store */
-RUNNER_TEST(CERTSVC_PKCS12_1026_deleting_a_certificate_from_invalid_store) {
-
- CertStoreType storeType = (CertStoreType) (WIFI_STORE);
- CertSvcStoreCertList* certList = NULL;
- CertStatus Status;
- CertStatus status;
- size_t length;
+RUNNER_TEST(CERTSVC_PKCS12_1026_enable_disable_status_certificate_from_invalid_store)
+{
int result;
- CertSvcString Alias;
CREATE_INSTANCE
- /* Getting certificate list from invalid store should fail */
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from store failed.");
- while(certList!=NULL)
- {
- Alias.privateHandler = certList->gname;
- Alias.privateLength = strlen((const char*)certList->gname);
+ CertSvcStoreCertList *certList = NULL;
+ size_t length = 0;
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, WIFI_STORE, DISABLED, &certList, &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from store failed.");
+ if (length == 0 || !certList) {
+ /* TODO: add any cert to store for testing */
+ RUNNER_ASSERT_MSG(0, "add any cert in store for testing");
+ }
+
+ while (certList) {
+ CertSvcString Alias = wrapper_certsvc_string_new(certList->gname);
- result = certsvc_pkcs12_get_certificate_status_from_store(instance, (CertStoreType)-1, Alias, &status);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Get certificate status from system store failed.");
+ CertStatus status;
+ result = certsvc_pkcs12_get_certificate_status_from_store(instance, NONE_STORE, Alias, &status);
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Get certificate status from invalid store should be failed.");
- Status=DISABLED;
- result = certsvc_pkcs12_set_certificate_status_to_store(instance, (CertStoreType)-1, DISABLED, Alias, Status);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Set certificate status to system store failed.");
+ result = certsvc_pkcs12_set_certificate_status_to_store(instance, NONE_STORE, DISABLED, Alias, DISABLED);
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Set certificate status to invalid store should be failed.");
- result = certsvc_pkcs12_get_certificate_status_from_store(instance, (CertStoreType)-1, Alias, &status);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Get certificate status from system store failed.");
+ result = certsvc_pkcs12_get_certificate_status_from_store(instance, NONE_STORE, Alias, &status);
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Get certificate status from invalid store should be failed.");
- Status=ENABLED;
- result = certsvc_pkcs12_set_certificate_status_to_store(instance, (CertStoreType)-1, DISABLED, Alias, Status);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Set certificate status to system store failed.");
+ result = certsvc_pkcs12_set_certificate_status_to_store(instance, NONE_STORE, DISABLED, Alias, ENABLED);
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Set certificate status to invalid store should be failed.");
- result = certsvc_pkcs12_get_certificate_status_from_store(instance, (CertStoreType)-1, Alias, &status);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Get certificate status from system store failed.");
+ result = certsvc_pkcs12_get_certificate_status_from_store(instance, NONE_STORE, Alias, &status);
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Get certificate status from invalid store should be failed.");
+
+ certsvc_string_free(Alias);
certList = certList->next;
}
}
#define EAP_TLS_USER_CERT_PATH "user_cert.pem"
-#define EAP_TLS_PATH "/tmp/"
-#define EAP_TLS_CA_CERT_PATH "ca_cert.pem"
+#define EAP_TLS_PATH "/tmp/"
+#define EAP_TLS_CA_CERT_PATH "ca_cert.pem"
#define EAP_TLS_PRIVATEKEY_PATH "privatekey.pem"
-/* Set the status of the certificate to disabled/enabled in wifi,vpn,email store */
-RUNNER_TEST(CERTSVC_PKCS12_1027_get_alias_name_from_gname_from_store) {
-
- CertStoreType storeType = (CertStoreType) (WIFI_STORE);
- CertSvcStoreCertList* certList = NULL;
- CertSvcCertificate user_certificate;
- CertSvcCertificateList cert_list;
- CertSvcCertificate ca_certificate;
- CertSvcCertificate *selected_certificate = NULL;
- size_t length;
+RUNNER_TEST(CERTSVC_PKCS12_1027_get_alias_name_from_gname_from_store)
+{
int result;
- int count=1;
- int validity;
- size_t cert_counts = 0;
- CertSvcString Alias;
- char *alias = NULL;
- X509 *x509 = NULL;
- FILE *fp = NULL;
- EVP_PKEY *privatekey = NULL;
- char privatekey_path[512];
- char ca_cert_path[512];
- char user_cert_path[512];
- int cert_index = 0;
CREATE_INSTANCE
- /* Getting certificate list from invalid store should fail */
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from store failed.");
- while(certList!=NULL) {
- Alias.privateHandler = certList->gname;
- Alias.privateLength = strlen((const char*)certList->gname);
+ CertSvcStoreCertList *certList = NULL;
+ size_t length = 0;
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, WIFI_STORE, DISABLED, &certList, &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list failed.");
+ int count = 1;
+ while (certList) {
+ CertSvcString Alias = wrapper_certsvc_string_new(certList->gname);
+
+ char *alias = NULL;
result = certsvc_pkcs12_get_alias_name_for_certificate_in_store(instance, certList->storeType, Alias, &alias);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting alias name from gname failed.");
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting alias name from gname failed.");
- result = certsvc_pkcs12_load_certificate_list_from_store(instance, certList->storeType, Alias, &cert_list);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "failed to certsvc_pkcs12_load_certificate_list");
+ CertSvcCertificateList cert_list;
+ result = certsvc_pkcs12_load_certificate_list_from_store(instance, certList->storeType, Alias, &cert_list);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "certsvc_pkcs12_load_certificate_list failed");
- result = certsvc_certificate_list_get_length(cert_list, &cert_counts);
- RUNNER_ASSERT_MSG(cert_counts >= 1, "there is no certificates");
+ size_t cert_counts = 0;
+ result = certsvc_certificate_list_get_length(cert_list, &cert_counts);
+ RUNNER_ASSERT_MSG(cert_counts > 0, "there is no certificates");
- selected_certificate = new CertSvcCertificate[cert_counts];
- RUNNER_ASSERT_MSG(selected_certificate != NULL, "failed to allocate memory");
+ CertSvcCertificate *selected_certificate = new CertSvcCertificate[cert_counts];
+ RUNNER_ASSERT_MSG(selected_certificate != NULL, "failed to allocate memory");
- result = certsvc_certificate_list_get_one(cert_list, 0, &user_certificate);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "failed to certsvc_certificate_list_get_one");
+ CertSvcCertificate user_certificate;
+ result = certsvc_certificate_list_get_one(cert_list, 0, &user_certificate);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "certsvc_certificate_list_get_one failed");
+ X509 *x509 = NULL;
result = certsvc_certificate_dup_x509(user_certificate, &x509);
- sprintf(user_cert_path, "/usr/share/cert-svc/pkcs12/file_%d", count++);
- fp = fopen(user_cert_path, "w");
- RUNNER_ASSERT_MSG(fp != NULL, "Failed to open the file for writing");
+ char user_cert_path[512];
+ sprintf(user_cert_path, "/usr/share/cert-svc/pkcs12/file_%d", count++);
+ FILE *fp = fopen(user_cert_path, "w");
+ RUNNER_ASSERT_MSG(fp != NULL, "Failed to open the file for writing");
+
+ if (count == 5)
+ break;
- if (count==5) break;
+ result = PEM_write_X509(fp, x509);
+ fclose(fp);
- result = PEM_write_X509(fp, x509);
- fclose(fp);
- certsvc_certificate_free_x509(x509);
+ certsvc_certificate_free_x509(x509);
certList = certList->next;
- cert_index = cert_counts - 1;
+ int cert_index = cert_counts - 1;
selected_certificate[0] = user_certificate;
- sprintf(ca_cert_path, "%s%s_%s", EAP_TLS_PATH, certList->gname, EAP_TLS_CA_CERT_PATH);
- while (cert_index) {
- result = certsvc_certificate_list_get_one(cert_list, cert_index, &ca_certificate);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to certsvc_certificate_list_get_one");
+ char ca_cert_path[512];
+ sprintf(ca_cert_path, "%s%s_%s", EAP_TLS_PATH, certList->gname, EAP_TLS_CA_CERT_PATH);
+ while (cert_index) {
+ CertSvcCertificate ca_certificate;
+ result = certsvc_certificate_list_get_one(cert_list, cert_index, &ca_certificate);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to certsvc_certificate_list_get_one");
- selected_certificate[cert_counts-cert_index] = ca_certificate;
- cert_index--;
+ selected_certificate[cert_counts-cert_index] = ca_certificate;
+ cert_index--;
- result = certsvc_certificate_dup_x509(ca_certificate, &x509);
+ result = certsvc_certificate_dup_x509(ca_certificate, &x509);
- fp = fopen(ca_cert_path, "a");
- RUNNER_ASSERT_MSG(fp != NULL, "Failed to open the file for writing");
+ fp = fopen(ca_cert_path, "a");
+ RUNNER_ASSERT_MSG(fp != NULL, "Failed to open the file for writing");
- result = PEM_write_X509(fp, x509);
- fclose(fp);
- certsvc_certificate_free_x509(x509);
- }
- result = certsvc_certificate_verify(selected_certificate[0], selected_certificate, cert_counts, NULL, 0, &validity);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to verify ca_certificate");
- RUNNER_ASSERT_MSG(validity != 0, "Invalid certificate");
+ result = PEM_write_X509(fp, x509);
+ fclose(fp);
- result = certsvc_pkcs12_dup_evp_pkey_from_store(instance, WIFI_STORE, Alias, &privatekey);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to duplicate the private key for a certificate from wifi store");
+ certsvc_certificate_free_x509(x509);
+ }
- sprintf(privatekey_path, "%s%s_%s", EAP_TLS_PATH, certList->gname, EAP_TLS_PRIVATEKEY_PATH);
- fp = fopen(privatekey_path, "w");
- RUNNER_ASSERT_MSG(fp != NULL, "Failed to open the file for writing");
+ int validity = 0;
+ result = certsvc_certificate_verify(selected_certificate[0], selected_certificate, cert_counts, NULL, 0, &validity);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to verify ca_certificate");
+ RUNNER_ASSERT_MSG(validity != 0, "Invalid certificate");
- result = PEM_write_PrivateKey(fp, privatekey, NULL, NULL, 0, NULL, NULL);
- fclose(fp);
- certsvc_pkcs12_free_evp_pkey(privatekey);
- }
+ EVP_PKEY *privatekey = NULL;
+ result = certsvc_pkcs12_dup_evp_pkey_from_store(instance, WIFI_STORE, Alias, &privatekey);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to duplicate the private key for a certificate from wifi store");
- delete []selected_certificate;
+ char privatekey_path[512];
+ sprintf(privatekey_path, "%s%s_%s", EAP_TLS_PATH, certList->gname, EAP_TLS_PRIVATEKEY_PATH);
+ fp = fopen(privatekey_path, "w");
+ RUNNER_ASSERT_MSG(fp != NULL, "Failed to open the file for writing");
- FREE_INSTANCE
-}
+ result = PEM_write_PrivateKey(fp, privatekey, NULL, NULL, 0, NULL, NULL);
+ fclose(fp);
-/* Set the status of the certificate to disabled/enabled in wifi,vpn,email store */
-RUNNER_TEST(CERTSVC_PKCS12_1028_certsvc_set_cert_to_disabled_and_get_status_for_individual_store) {
+ certsvc_pkcs12_free_evp_pkey(privatekey);
- CertSvcStoreCertList* certList = NULL;
- CertSvcStoreCertList* tmpNode = NULL;
- int array[3]={VPN_STORE,WIFI_STORE,EMAIL_STORE};
- int result = CERTSVC_SUCCESS;
- CertSvcString Alias;
- CertStatus Status;
- CertStatus status;
- size_t length = 0;
- int count = 0;
- int i;
+ certsvc_string_free(Alias);
+ delete []selected_certificate;
+ }
- CREATE_INSTANCE
+ FREE_INSTANCE
+}
- for(int j=0;j<3;j++)
- {
- i = array[j];
+RUNNER_TEST(CERTSVC_PKCS12_1028_certsvc_set_cert_to_disabled_and_get_status_for_individual_store)
+{
+ CertStoreType array[3] = {VPN_STORE, WIFI_STORE, EMAIL_STORE};
+ int result;
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, (CertStoreType)i, ENABLED, &certList, &length);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Getting certificate list from store failed.");
- tmpNode = certList;
- while(certList!=NULL)
- {
- count++;
- Alias.privateHandler = certList->gname;
- Alias.privateLength = strlen((const char*)certList->gname);
+ CREATE_INSTANCE
- result = certsvc_pkcs12_get_certificate_status_from_store(instance, (CertStoreType)i, Alias, &status);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Get certificate status from store failed.");
+ for (size_t j = 0; j < 3; j++) {
+ CertStoreType storeType = array[j];
- Status=DISABLED;
- result = certsvc_pkcs12_set_certificate_status_to_store(instance, (CertStoreType)i, ENABLED, Alias, Status);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Set certificate status to store failed.");
+ CertSvcStoreCertList *certList = NULL;
+ size_t length = 0;
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, ENABLED, &certList, &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list failed.");
- status = DISABLED;
- result = certsvc_pkcs12_get_certificate_status_from_store(instance, (CertStoreType)i, Alias, &status);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Get certificate status from store failed.");
+ CertSvcStoreCertList *certListOrig = certList;
+ while (certList) {
+ CertSvcString Alias = wrapper_certsvc_string_new(certList->gname);
- Status=ENABLED;
- result = certsvc_pkcs12_set_certificate_status_to_store(instance, (CertStoreType)i, ENABLED, Alias, Status);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Set certificate status to store failed.");
+ CertStatus status;
+ result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from store failed.");
- status = DISABLED;
- result = certsvc_pkcs12_get_certificate_status_from_store(instance, (CertStoreType)i, Alias, &status);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Get certificate status from store failed.");
+ result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, ENABLED, Alias, DISABLED);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Set certificate status to store failed.");
- Status=DISABLED;
- result = certsvc_pkcs12_set_certificate_status_to_store(instance, (CertStoreType)i, DISABLED, Alias, Status);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Set certificate status to store failed.");
+ result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from store failed.");
- status = DISABLED;
- result = certsvc_pkcs12_get_certificate_status_from_store(instance, (CertStoreType)i, Alias, &status);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Get certificate status from store failed.");
+ result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, ENABLED, Alias, ENABLED);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Set certificate status to store failed.");
- Status=ENABLED;
- result = certsvc_pkcs12_set_certificate_status_to_store(instance, (CertStoreType)i, DISABLED, Alias, Status);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Set certificate status to store failed.");
+ result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from store failed.");
- status = DISABLED;
- result = certsvc_pkcs12_get_certificate_status_from_store(instance, (CertStoreType)i, Alias, &status);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Get certificate status from store failed.");
+ certsvc_string_free(Alias);
certList = certList->next;
}
- certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &tmpNode);
+ certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certListOrig);
}
FREE_INSTANCE
* @brief PKCS#12 test runner.
*/
#include <dpl/test/test_runner.h>
-#include <cert-svc/ccert.h>
+#include <cert-svc/cinstance.h>
CertSvcInstance vinstance;
int main (int argc, char *argv[]) {
certsvc_instance_new(&vinstance);
- int status = DPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv);
+ int status = VcoreDPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv);
certsvc_instance_free(vinstance);
return status;
}
${PROJECT_SOURCE_DIR}/tests/vcore
)
-ADD_EXECUTABLE(${TARGET_VCORE_TEST} ${VCORE_TESTS_SOURCES})
+ADD_EXECUTABLE(${TARGET_VCORE_TEST} ${VCORE_TESTS_SOURCES} ${DPL_TEST_SOURCES})
TARGET_LINK_LIBRARIES(${TARGET_VCORE_TEST}
- ${SYS_EFL_LIBRARIES}
${TARGET_VCORE_LIB}
- ${VCORE_TEST_DEP_LIBRARIES}
- -ldl
+ ${TEST_DEP_LIBRARIES}
)
INSTALL(TARGETS ${TARGET_VCORE_TEST}
WORLD_EXECUTE
)
-ADD_CUSTOM_COMMAND(TARGET ${TARGET_VCORE_TEST} POST_BUILD
- COMMAND ${PROJECT_SOURCE_DIR}/tests/vcore/certificate-generator/create_certs.sh
- WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/tests/vcore/certificate-generator/
- COMMENT "Generate certificate chains"
- )
-
INSTALL(FILES
${PROJECT_SOURCE_DIR}/tests/vcore/test-cases/widget/author-signature.xml
${PROJECT_SOURCE_DIR}/tests/vcore/test-cases/widget/signature1.xml
${TZ_SYS_RO_APP}/widget/tests/reference
)
-INSTALL(FILES
- ${PROJECT_SOURCE_DIR}/tests/vcore/test-cases/keys/operator.root.cert.pem
- ${PROJECT_SOURCE_DIR}/tests/vcore/test-cases/keys/root_cacert0.pem
- ${PROJECT_SOURCE_DIR}/tests/vcore/test-cases/keys/CAbundle.crt
- DESTINATION
- ${TZ_SYS_RO_APP}/widget/tests/vcore_keys
- )
-
-INSTALL(FILES
- ${PROJECT_SOURCE_DIR}/tests/vcore/test-cases/config/fin_list.xml
- ${PROJECT_SOURCE_DIR}/tests/vcore/test-cases/config/fin_list.xsd
- DESTINATION
- ${TZ_SYS_RO_APP}/widget/tests/vcore_config/
-)
-
-INSTALL(FILES
- ${PROJECT_SOURCE_DIR}/tests/vcore/test-cases/keys/root_cacert0.pem
- DESTINATION
- ${TZ_SYS_SHARE}/ca-certificates/wac/
- )
-
-INSTALL(FILES
- ${PROJECT_SOURCE_DIR}/tests/vcore/certificate-generator/demoCA/cacert.pem
- ${PROJECT_SOURCE_DIR}/tests/vcore/certificate-generator/1second_level.pem
- ${PROJECT_SOURCE_DIR}/tests/vcore/certificate-generator/1third_level.pem
- ${PROJECT_SOURCE_DIR}/tests/vcore/certificate-generator/2second_level.pem
- ${PROJECT_SOURCE_DIR}/tests/vcore/certificate-generator/2third_level.pem
- ${PROJECT_SOURCE_DIR}/tests/vcore/certificate-generator/3second_level.pem
- ${PROJECT_SOURCE_DIR}/tests/vcore/certificate-generator/3third_level.pem
- ${PROJECT_SOURCE_DIR}/tests/vcore/certificate-generator/respcert.pem
- ${PROJECT_SOURCE_DIR}/tests/vcore/certificate-generator/respcert.key
- ${PROJECT_SOURCE_DIR}/tests/vcore/certificate-generator/openssl.cnf
- DESTINATION
- ${TZ_SYS_RO_APP}/widget/tests/vcore_certs/
-)
-
-INSTALL(DIRECTORY
- ${PROJECT_SOURCE_DIR}/tests/vcore/certificate-generator/demoCA
- DESTINATION
- ${TZ_SYS_RO_APP}/widget/tests/vcore_certs/
-)
-
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <algorithm>
-#include <cstring>
-#include <openssl/x509v3.h>
-#include <file_input_mapping.h>
-#include <dpl/log/log.h>
-#include "TestCRL.h"
-
-using namespace ValidationCore;
-using namespace std;
-
-
-namespace {
-const char *CRL_LOOKUP_DIR = "/opt/etc/ssl/certs/";
-const char *beginCertificate = "-----BEGIN CERTIFICATE-----";
-const char *endCertificate = "-----END CERTIFICATE-----";
-const char *beginTrustedCertificate = "-----BEGIN TRUSTED CERTIFICATE-----";
-const char *endTrustedCertificate = "-----END TRUSTED CERTIFICATE-----";
-
-
-bool whiteCharacter(char a){
- return a == '\n';
-}
-
-}
-
-TestCRL::TestCRL()
- : CRLImpl (new CRLCacheDAO)
-{
- //Add additional lookup dir
- int rv = X509_LOOKUP_add_dir(m_lookup, CRL_LOOKUP_DIR, X509_FILETYPE_PEM);
- if (!rv) {
- LogError("Failed to add lookup dir for PEM files.");
- ThrowMsg(CRLException::StorageError,
- "Failed to add lookup dir for PEM files.");
- }
- LogInfo("CRL storage initialization complete.");
-}
-
-std::string TestCRL::getFileContent(const std::string &filename)
-{
- //Only PEM formatted files allowed
- LogInfo("Read file: " << filename);
- FileInputMapping file(filename);
- string content(reinterpret_cast<const char*>(file.GetAddress()),
- file.GetSize());
-
- size_t posBegin = content.find(beginCertificate);
- size_t posEnd = content.find(endCertificate);
- if (posBegin != string::npos &&
- posEnd != string::npos) {
- posBegin += strlen(beginCertificate);
- } else {
- posBegin = content.find(beginTrustedCertificate);
- posEnd = content.find(endTrustedCertificate);
- if (posBegin != string::npos &&
- posEnd != string::npos) {
- posBegin += strlen(beginTrustedCertificate);
- } else {
- LogError("Failed to parse PEM file");
- return string();
- }
- }
- //Remove whitespaces
- string cert(content, posBegin, posEnd - posBegin);
- cert.erase(std::remove_if(cert.begin(), cert.end(), whiteCharacter),
- cert.end());
-
- return cert;
-}
-
-void TestCRL::addCRLToStore(const string &filename, const string &uri)
-{
- LogInfo("Read file: " << filename);
- //Only PEM formatted files allowed
- FileInputMapping file(filename);
- char *buffer = new char[file.GetSize()];
- memcpy(buffer, file.GetAddress(), file.GetSize());
- CRLDataPtr crl(new CRLData(buffer, file.GetSize(), uri));
- updateCRL(crl);
-}
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _TEST_CRL_H
-#define _TEST_CRL_H
-
-#include <string>
-#include <vcore/CRLImpl.h>
-#include <vcore/CRLCacheDAO.h>
-
-class TestCRL : public ValidationCore::CRLImpl
-{
- public:
- TestCRL();
-
- void addCRLToStore(const std::string &filename, const std::string &uri);
-
- //convinient function
- std::string getFileContent(const std::string &filename);
-};
-
-#endif
const std::string widget_partner_operator_path =
"/usr/apps/widget/tests/vcore_widget_uncompressed_partner_operator/";
-
-const std::string keys_path = "/usr/apps/widget/tests/vcore_keys/";
-const std::string widget_store_path = "/usr/apps/widget/tests/vcore_widgets/";
-const std::string cert_store_path = "/usr/apps/widget/tests/vcore_certs/";
-
-const std::string anka_ec_key_type = "urn:oid:1.2.840.10045.3.1.7";
-const std::string anka_ec_public_key =
- "BGi9RmTUjpqCpQjx6SSiKdfmtjQBFNSN7ghm6TuaH9r4x73WddeLxLioH3VEmFLC+QLiR"\
- "kPxDxL/6YmQdgfGrqk=";
-
-const std::string rsa_modulus =
- "ocwjKEFaPxLNcPTz2PtT2Gyu5jzkWaPo4thjZo3rXuNbD4TzjY02UGnTxvflNeORLpSS1"\
- "PeYr/1E/Nhr7qQAzj9g0DwW7p8zQEdOUi3v76VykeB0pFJH+0Fxp6LVBX9Z+EvZk+dbOy"\
- "GJ4Njm9B6M09axXlV11Anj9B/HYUDfDX8=";
-const std::string rsa_exponent = "AQAB";
-
-const std::string magda_dsa_p =
- "2BYIQj0ePUVxzrdBT41eCblraa9Dqag7QXFMCRM2PtyS22JPDKuV77tBc/jg0V3htHWdR"\
- "q9n6/kQDwrP7FIPoLATLIiC3oAYWj46Mr6d9k/tt/JZU6PvULmB2k1wrrmvKUi+U+I5Ro"\
- "qe8ui8lqR9pp9u2WCh2QmFfCohKNjN5qs=";
-const std::string magda_dsa_q = "4p4JcDqz+S7CbWyd8txApZw0sik=";
-const std::string magda_dsa_g =
- "AQrLND1ZGFvzwBpPPXplmPh1ijPx1O2gQEvPvyjR88guWcGqQc0m7dTb6PEvbI/oZ0o91"\
- "k7VEkfthURnNR1WtOLT8dmAuKQfwTQLPwCwUM/QiuWSlCyKLTE4Ev8aOG7ZqWudsKm/td"\
- "n9pUNGtcod1wo1ZtP7PfEJ6rYZGQDOlz8=";
-
-const std::string tizen_partner =
-"MIICozCCAgwCCQD9IBoOxzq2hjANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMC"
-"S1IxDjAMBgNVBAgMBVN1d29uMQ4wDAYDVQQHDAVTdXdvbjEWMBQGA1UECgwNVGl6"
-"ZW4gVGVzdCBDQTEiMCAGA1UECwwZVGl6ZW4gRGlzdHJpYnV0b3IgVGVzdCBDQTEq"
-"MCgGA1UEAwwhVGl6ZW4gUGFydG5lciBEaXN0cmlidXRvciBSb290IENBMB4XDTEy"
-"MTAyNjA4MTIzMVoXDTIyMTAyNDA4MTIzMVowgZUxCzAJBgNVBAYTAktSMQ4wDAYD"
-"VQQIDAVTdXdvbjEOMAwGA1UEBwwFU3V3b24xFjAUBgNVBAoMDVRpemVuIFRlc3Qg"
-"Q0ExIjAgBgNVBAsMGVRpemVuIERpc3RyaWJ1dG9yIFRlc3QgQ0ExKjAoBgNVBAMM"
-"IVRpemVuIFBhcnRuZXIgRGlzdHJpYnV0b3IgUm9vdCBDQTCBnzANBgkqhkiG9w0B"
-"AQEFAAOBjQAwgYkCgYEAnIBA2qQEaMzGalP0kzvwUxdCC6ybSC/fb+M9iGvt8QXp"
-"ic2yARQB+bIhfbEu1XHwE1jCAGxKd6uT91b4FWr04YwnBPoRX4rBGIYlqo/dg+pS"
-"rGyFjy7vfr0BOdWp2+WPlTe7SOS6bVauncrSoHxX0spiLaU5LU686BKr7YaABV0C"
-"AwEAATANBgkqhkiG9w0BAQUFAAOBgQAX0Tcfmxcs1TUPBdr1U1dx/W/6Y4PcAF7n"
-"DnMrR0ZNRPgeSCiVLax1bkHxcvW74WchdKIb24ZtAsFwyrsmUCRV842YHdfddjo6"
-"xgUu7B8n7hQeV3EADh6ft/lE8nalzAl9tALTxAmLtYvEYA7thvDoKi1k7bN48izL"
-"gS9G4WEAUg==";
-
-const std::string tizen_partner_operator =
-"MIICzDCCAjWgAwIBAgIJAJrv22F9wyp/MA0GCSqGSIb3DQEBBQUAMIGeMQswCQYD"
-"VQQGEwJLUjEOMAwGA1UECAwFU3V3b24xDjAMBgNVBAcMBVN1d29uMRYwFAYDVQQK"
-"DA1UaXplbiBUZXN0IENBMSIwIAYDVQQLDBlUaXplbiBEaXN0cmlidXRvciBUZXN0"
-"IENBMTMwMQYDVQQDDCpUaXplbiBQYXJ0bmVyLU9wZXJhdG9yIERpc3RyaWJ1dG9y"
-"IFJvb3QgQ0EwHhcNMTIxMjEzMDUzOTMyWhcNMjIxMjExMDUzOTMyWjCBnjELMAkG"
-"A1UEBhMCS1IxDjAMBgNVBAgMBVN1d29uMQ4wDAYDVQQHDAVTdXdvbjEWMBQGA1UE"
-"CgwNVGl6ZW4gVGVzdCBDQTEiMCAGA1UECwwZVGl6ZW4gRGlzdHJpYnV0b3IgVGVz"
-"dCBDQTEzMDEGA1UEAwwqVGl6ZW4gUGFydG5lci1PcGVyYXRvciBEaXN0cmlidXRv"
-"ciBSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9X0Hw0EfAuagg"
-"De9h6Jtvh8Df4fyVbvLm9VNea/iVP3/qTbG8tNqoQ32lu0SwzAZBnjpvpbxzsWs9"
-"pSYo7Ys1fymHlu+gf+kmTGTVscBrAHWkr4O0m33x2FYfy/wmu+IImnRDYDud83rN"
-"tjQmMO6BihN9Lb6kLiEtVIa8ITwdQwIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0G"
-"CSqGSIb3DQEBBQUAA4GBAHS2M2UnfEsZf80/sT84xTcfASXgpFL/1M5HiAVpR+1O"
-"UwLpLyqHiGQaASuADDeGEfcIqEf8gP1SzvnAZqLx9GchbOrOKRleooVFH7PRxFBS"
-"VWJ5Fq46dJ1mCgTWSkrL6dN5j9hWCzzGfv0Wco+NAf61n9kVbCv7AScIJwQNltOy";
-
const std::string googleCA =
"MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG"
"A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz"
"Q43GPhumSg9a6S3hnyw8DX5OiUGmqgQrtSeDRsNmWqtWizEQbe+fotZpEn/7zYTa"
"tk1ni/k5jDH/QeuG";
-const std::string crlExampleCertificate =
-"MIIFlDCCBHygAwIBAgIBADANBgkqhkiG9w0BAQUFADBDMRIwEAYKCZImiZPyLGQB"
-"GRYCZXMxGDAWBgoJkiaJk/IsZAEZFghpcmlzZ3JpZDETMBEGA1UEAxMKSVJJU0dy"
-"aWRDQTAeFw0wNTA2MjgwNTAyMjhaFw0xNTA2MjYwNTAyMjhaMEMxEjAQBgoJkiaJ"
-"k/IsZAEZFgJlczEYMBYGCgmSJomT8ixkARkWCGlyaXNncmlkMRMwEQYDVQQDEwpJ"
-"UklTR3JpZENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1CQiWlff"
-"ajoMSTuismKqLQ+Mt33Tq4bBpCZvCBXhqan1R0ksILPtK1L7C8QWqPk6AZZpuNmY"
-"cNVtJGc8ksgDWvX0EB3GKwZTZ8RrSRlSEe9Otq+Ur7S9uxM1JMmCr6zZTMFANzBS"
-"4btnduV78C09IhFYG4OW8IPhNrbfPaeOR+PRPAa/qdSONAwTrM1sZkIvGpAkBWM6"
-"Pn7TK9BAK6GLvwgii780fWj3Cwgmp8EDCTievBbWj+z8/apMEy9R0vyB2dWNNCnk"
-"6q8VvrjgMsJt33O3BqOoBuZ8R/SS9OFWLFSU3s7cfrRaUSJk/Mx8OGFizRkcXSzX"
-"0Nidcg7hX5i78wIDAQABo4ICkTCCAo0wDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E"
-"FgQUnUJkLlupXvH/bMg8NtPxtkOYrRowawYDVR0jBGQwYoAUnUJkLlupXvH/bMg8"
-"NtPxtkOYrRqhR6RFMEMxEjAQBgoJkiaJk/IsZAEZFgJlczEYMBYGCgmSJomT8ixk"
-"ARkWCGlyaXNncmlkMRMwEQYDVQQDEwpJUklTR3JpZENBggEAMA4GA1UdDwEB/wQE"
-"AwIBxjARBglghkgBhvhCAQEEBAMCAAcwOwYJYIZIAYb4QgENBC4WLElSSVNHcmlk"
-"IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IENlcnRpZmljYXRlMIGZBgNVHR8EgZEw"
-"gY4wLqAsoCqGKGh0dHA6Ly93d3cuaXJpc2dyaWQuZXMvcGtpL2NybC9jYWNybC5w"
-"ZW0wXKBaoFiGVmxkYXA6Ly9sZGFwLmlyaXNncmlkLmVzOjEzODAvY249SVJJU0dy"
-"aWRDQSxkYz1pcmlzZ3JpZCxkYz1lcz9jZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0"
-"MDcGCWCGSAGG+EIBAwQqFihodHRwOi8vd3d3LmlyaXNncmlkLmVzL3BraS9jcmwv"
-"Y2FjcmwucGVtME4GCWCGSAGG+EIBCARBFj9odHRwOi8vd3d3LmlyaXNncmlkLmVz"
-"L3BraS9wb2xpY3kvMS4zLjYuMS40LjEuNzU0Ny4yLjIuNC4xLjEuMS8waQYDVR0g"
-"BGIwYDBeBg0rBgEEAbp7AgIEAQEBME0wSwYIKwYBBQUHAgEWP2h0dHA6Ly93d3cu"
-"aXJpc2dyaWQuZXMvcGtpL3BvbGljeS8xLjMuNi4xLjQuMS43NTQ3LjIuMi40LjEu"
-"MS4xLzANBgkqhkiG9w0BAQUFAAOCAQEAaqRfyLER+P2QOZLLdz66m7FGsgtFsAEx"
-"wiNrIChFWfyHVZG7Ph1fn/GDD5LMsrU23lx3NBN5/feHuut1XNYKNs8vtV07D70r"
-"DKjUlPbmWV0B+/GDxe1FDGop/tKQfyHSUaBuauXChFU/2INu5lhBerNl7QxNJ1ws"
-"cWGiT7R+L/2EjgzWgH1V/0zmIOMep6kY7MUs8rlyF0O5MNFs232cA1trl9kvhAGU"
-"9p58Enf5DWMrh17SPH586yIJeiWZtPez9G54ftY+XIqfn0X0zso0dnoXNJQYS043"
-"/5vSnoHdRx/EmN8yjeEavZtC48moN0iJ38eB44uKgCD77rZW5s1XqA==";
-
} // namespace anonymous
using namespace ValidationCore;
Certificate cert3(google3rd, Certificate::FORM_BASE64);
RUNNER_ASSERT(cert3.isCA() == 0);
}
-
-/*
- * test: CertificateIdentifier::find(Fingerprint)
- * description: Check implementation of fingerprint_list.
- * expected: Google CA certificate was added to TIZEN_MEMBER group
- * and ORANGE_LEGACY. Both domain should be found.
- */
-/*
-RUNNER_TEST(test90_certificate_identifier_find_fingerprint)
-{
- CertificateIdentifier certIdent;
- CertificateConfigReader reader;
- reader.initialize(
- "/usr/apps/widget/tests/vcore_config/fin_list.xml",
- "/usr/apps/widget/tests/vcore_config/fin_list.xsd");
- reader.read(certIdent);
-
- Certificate cert(googleCA, Certificate::FORM_BASE64);
-
- CertStoreId::Set domain =
- certIdent.find(cert.getFingerprint(Certificate::FINGERPRINT_SHA1));
-
- RUNNER_ASSERT(!domain.contains(CertStoreId::WAC_PUBLISHER));
- RUNNER_ASSERT(!domain.contains(CertStoreId::DEVELOPER));
- RUNNER_ASSERT(!domain.contains(CertStoreId::WAC_ROOT));
- RUNNER_ASSERT(!domain.contains(CertStoreId::WAC_MEMBER));
- RUNNER_ASSERT(domain.contains(CertStoreId::TIZEN_MEMBER));
- RUNNER_ASSERT(domain.contains(CertStoreId::ORANGE_LEGACY));
-}
-*/
-
-/*
- * test: CertificateIdentifier::find(CertificatePtr)
- * description: Check implementation of fingerprint_list.
- * expected: Google CA certificate was added to TIZEN_MEMBER group
- * and ORANGE_LEGACY. Both domain should be found.
- */
-/*
-RUNNER_TEST(test91_certificate_identifier_find_cert)
-{
- CertificateIdentifier certIdent;
- CertificateConfigReader reader;
- reader.initialize(
- "/usr/apps/widget/tests/vcore_config/fin_list.xml",
- "/usr/apps/widget/tests/vcore_config/fin_list.xsd");
- reader.read(certIdent);
-
- CertificatePtr cert(new Certificate(googleCA, Certificate::FORM_BASE64));
-
- CertStoreId::Set domain = certIdent.find(cert);
-
- RUNNER_ASSERT(!domain.contains(CertStoreId::WAC_PUBLISHER));
- RUNNER_ASSERT(!domain.contains(CertStoreId::DEVELOPER));
- RUNNER_ASSERT(!domain.contains(CertStoreId::WAC_ROOT));
- RUNNER_ASSERT(!domain.contains(CertStoreId::WAC_MEMBER));
- RUNNER_ASSERT(domain.contains(CertStoreId::TIZEN_MEMBER));
- RUNNER_ASSERT(domain.contains(CertStoreId::ORANGE_LEGACY));
-}
-*/
-
-/*
- * test: CertificateIdentifier::find(Fingerprint)
- * description: Check implementation of fingerprint_list.
- * expected: google2nd certificate was not added to any group so
- * no domain should be found.
- */
-/*
-RUNNER_TEST(test92_certificate_identifier_negative)
-{
- CertificateIdentifier certIdent;
- CertificateConfigReader reader;
- reader.initialize(
- "/usr/apps/widget/tests/vcore_config/fin_list.xml",
- "/usr/apps/widget/tests/vcore_config/fin_list.xsd");
- reader.read(certIdent);
-
- Certificate cert(google2nd, Certificate::FORM_BASE64);
-
- CertStoreId::Set domain =
- certIdent.find(cert.getFingerprint(Certificate::FINGERPRINT_SHA1));
-
- RUNNER_ASSERT(!domain.contains(CertStoreId::WAC_PUBLISHER));
- RUNNER_ASSERT(!domain.contains(CertStoreId::DEVELOPER));
- RUNNER_ASSERT(!domain.contains(CertStoreId::WAC_ROOT));
- RUNNER_ASSERT(!domain.contains(CertStoreId::WAC_MEMBER));
- RUNNER_ASSERT(!domain.contains(CertStoreId::TIZEN_MEMBER));
- RUNNER_ASSERT(!domain.contains(CertStoreId::ORANGE_LEGACY));
-}
-*/
-/*
- * test: CertificateIdentifier::find(Fingerprint)
- * description: Check implementation of fingerprint_list.
- * expected: Google CA certificate was added to TIZEN_MEMBER group
- * and ORANGE_LEGACY. Both domain should be found.
- */
-/*
-RUNNER_TEST(test93_certificate_identifier_find_fingerprint)
-{
- CertificateIdentifier certIdent;
- CertificateConfigReader reader;
- reader.initialize(
- "/usr/apps/widget/tests/vcore_config/fin_list.xml",
- "/usr/apps/widget/tests/vcore_config/fin_list.xsd");
- reader.read(certIdent);
-
- Certificate cert(googleCA, Certificate::FORM_BASE64);
-
- CertStoreId::Set visibilityLevel =
- certIdent.find(cert.getFingerprint(Certificate::FINGERPRINT_SHA1));
-
- RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::WAC_PUBLISHER));
- RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::DEVELOPER));
- RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::WAC_ROOT));
- RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::WAC_MEMBER));
- RUNNER_ASSERT(visibilityLevel.contains(CertStoreId::TIZEN_MEMBER));
- RUNNER_ASSERT(visibilityLevel.contains(CertStoreId::ORANGE_LEGACY));
-
- RUNNER_ASSERT(visibilityLevel.contains(CertStoreId::VIS_PUBLIC));
- RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::VIS_PARTNER));
- RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::VIS_PARTNER_OPERATOR));
- RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::VIS_PARTNER_MANUFACTURER));
-}
-*/
-
-/*
- * test: CertificateIdentifier::find(CertificatePtr)
- * description: Check implementation of fingerprint_list.
- * expected: Google CA certificate was added to TIZEN_MEMBER group
- * and ORANGE_LEGACY. Both domain should be found.
- */
-/*
-RUNNER_TEST(test94_certificate_identifier_find_cert)
-{
- CertificateIdentifier certIdent;
- CertificateConfigReader reader;
- reader.initialize(
- "/usr/apps/widget/tests/vcore_config/fin_list.xml",
- "/usr/apps/widget/tests/vcore_config/fin_list.xsd");
- reader.read(certIdent);
-
- CertificatePtr cert(new Certificate(googleCA, Certificate::FORM_BASE64));
-
- CertStoreId::Set visibilityLevel = certIdent.find(cert);
-
- RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::WAC_PUBLISHER));
- RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::DEVELOPER));
- RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::WAC_ROOT));
- RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::WAC_MEMBER));
- RUNNER_ASSERT(visibilityLevel.contains(CertStoreId::TIZEN_MEMBER));
- RUNNER_ASSERT(visibilityLevel.contains(CertStoreId::ORANGE_LEGACY));
-
- RUNNER_ASSERT(visibilityLevel.contains(CertStoreId::VIS_PUBLIC));
- RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::VIS_PARTNER));
- RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::VIS_PARTNER_OPERATOR));
- RUNNER_ASSERT(!visibilityLevel.contains(CertStoreId::VIS_PARTNER_MANUFACTURER));
-}
-*/
-
-/*
- * test: CertificateIdentifier::find(Fingerprint)
- * description: Check implementation of fingerprint_list.
- * expected: google2nd certificate was not added to any group so
- * no domain should be found.
- */
-/*
-RUNNER_TEST(test95_certificate_identifier_negative)
-{
- CertificateIdentifier certIdent;
- CertificateConfigReader reader;
- reader.initialize(
- "/usr/apps/widget/tests/vcore_config/fin_list.xml",
- "/usr/apps/widget/tests/vcore_config/fin_list.xsd");
- reader.read(certIdent);
-
- Certificate cert(google2nd, Certificate::FORM_BASE64);
-
- CertStoreId::Set domain =
- certIdent.find(cert.getFingerprint(Certificate::FINGERPRINT_SHA1));
-
- RUNNER_ASSERT_MSG(domain.getTypeString().empty(), "Domain should be empty.");
-}
-*/
+++ /dev/null
-#!/bin/sh
-# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-source /etc/tizen-platform.conf
-
-LOCAL_VCORE_OCSP_WORKSPACE=${TZ_SYS_RO_APP}/widget/tests/vcore_certs
-
-pkill -9 openssl # if previously it was launched and openssl didn't close sockets
-
-OPENSSL_CONF=${LOCAL_VCORE_OCSP_WORKSPACE}/openssl.cnf openssl ocsp \
--nrequest 5 \
--index ${LOCAL_VCORE_OCSP_WORKSPACE}/demoCA/index.txt \
--port 8881 \
--rsigner ${LOCAL_VCORE_OCSP_WORKSPACE}/respcert.pem \
--rkey ${LOCAL_VCORE_OCSP_WORKSPACE}/respcert.key \
--CA ${LOCAL_VCORE_OCSP_WORKSPACE}/demoCA/cacert.pem
-
-echo "--- OCSP server shutdown..."
+++ /dev/null
-1second_level.csr
-1second_level.key
-1second_level.pem
-1third_level.key
-1third_level.pem
-1third_level.request
-2second_level.csr
-2second_level.key
-2second_level.pem
-2third_level.key
-2third_level.pem
-2third_level.request
-3second_level.csr
-3second_level.key
-3second_level.pem
-3third_level.key
-3third_level.pem
-3third_level.request
-cacrl1.pem
-cacrl2.pem
-demoCA/index.txt
-demoCA/index.txt.attr
-demoCA/index.txt.attr.old
-demoCA/index.txt.old
-demoCA/newcerts/
-respcert.csr
-respcert.key
-respcert.pem
+++ /dev/null
-#!/bin/bash
-# Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-#Prerequisite to run script is to
-#create root certificate and directory structure (demoCA) with command:
-#/usr/lib/ssl/misc/CA.sh -newca
-#for automated tests default structure is created in demoCA.init
-
-#make sure current dir has no files from previous generation
-rm -r 1* 2* 3* ca* respcert* demoCA
-cp -R demoCA.init demoCA
-echo "01" > ./demoCA/crlnumber
-
-for index in 1 2 3
-do
- #create certificate A
- openssl genrsa -out ${index}second_level.key 1024 -passin pass:1234 -config ./openssl.cnf
- openssl req -new -key ${index}second_level.key -out ${index}second_level.csr -passin pass:1234 -config ./openssl.cnf <<CONTENT
-PL
-Masovian
-Warsaw
-priv
-priv
-second_level${index}
-
-
-
-CONTENT
-
- openssl ca -in ${index}second_level.csr -out ${index}second_level.pem -passin pass:1234 -config ./openssl.cnf -extensions v3_ca <<CONTENT
-y
-y
-CONTENT
-
- #create certificate B
- openssl req -new -keyout ${index}third_level.key -out ${index}third_level.request -passin pass:1234 -passout pass:1234 -days 365 -config ./openssl.cnf <<CONTENT
-PL
-Masovian
-Warsaw
-priv
-priv
-third_level${index}
-
-
-
-CONTENT
-
- openssl ca -config ./openssl.cnf -extensions v3_ca -policy policy_anything -keyfile ${index}second_level.key -cert ${index}second_level.pem -out ${index}third_level.pem -infiles ${index}third_level.request <<CONTENT
-y
-y
-CONTENT
-
-done
-
-#generate OCSP response signing certificate
-openssl genrsa -out respcert.key 1024 -passin pass:1234 -config ./openssl.cnf
-openssl req -new -key respcert.key -out respcert.csr -passin pass:1234 -config ./openssl.cnf <<CONTENT
-PL
-Masovian
-Warsaw
-priv
-priv
-responce_cert
-
-
-
-CONTENT
-
-openssl ca -in respcert.csr -out respcert.pem -passin pass:1234 -config ./openssl.cnf -extensions ocsp_cert <<CONTENT
-y
-y
-CONTENT
-
-#generate CRL
-openssl ca -passin pass:1234 -gencrl -keyfile ./demoCA/private/cakey.pem -cert ./demoCA/cacert.pem -out cacrl1.pem -crldays 30 -config ./openssl.cnf
-openssl ca -passin pass:1234 -revoke 1third_level.pem -keyfile ./demoCA/private/cakey.pem -cert ./demoCA/cacert.pem -config ./openssl.cnf
-openssl ca -passin pass:1234 -gencrl -keyfile ./demoCA/private/cakey.pem -cert ./demoCA/cacert.pem -out cacrl1.pem -crldays 30 -config ./openssl.cnf
-
-openssl ca -passin pass:1234 -gencrl -keyfile ./demoCA/private/cakey.pem -cert ./demoCA/cacert.pem -out cacrl2.pem -crldays 30 -config ./openssl.cnf
-openssl ca -passin pass:1234 -revoke 2second_level.pem -keyfile ./demoCA/private/cakey.pem -cert ./demoCA/cacert.pem -config ./openssl.cnf
-openssl ca -passin pass:1234 -gencrl -keyfile ./demoCA/private/cakey.pem -cert ./demoCA/cacert.pem -out cacrl2.pem -crldays 30 -config ./openssl.cnf
+++ /dev/null
-Certificate:
- Data:
- Version: 3 (0x2)
- Serial Number: 0 (0x0)
- Signature Algorithm: sha1WithRSAEncryption
- Issuer: C=PL, ST=Masovian, O=priv, OU=priv, CN=priv
- Validity
- Not Before: Jul 29 14:32:12 2011 GMT
- Not After : Jul 28 14:32:12 2014 GMT
- Subject: C=PL, ST=Masovian, O=priv, OU=priv, CN=priv
- Subject Public Key Info:
- Public Key Algorithm: rsaEncryption
- RSA Public Key: (1024 bit)
- Modulus (1024 bit):
- 00:ab:68:cc:1a:41:78:50:0c:f4:43:3f:9e:8d:7b:
- 90:3d:eb:d6:8b:ce:d9:c1:b5:f4:d3:2e:75:f3:e1:
- b3:29:97:1b:38:c6:20:73:8d:a6:cd:61:3f:e1:1c:
- 78:0f:fd:25:e2:a0:95:6d:a9:33:30:fe:24:76:3d:
- e4:9d:23:b2:39:3c:98:a5:b2:20:2f:7d:c8:7d:d5:
- 00:7c:11:2c:6e:58:a2:18:03:02:48:4a:81:c7:eb:
- 7b:e9:e3:8d:b0:eb:3d:ee:21:19:7c:04:c2:ad:4f:
- 45:b3:1a:13:d1:76:35:c4:38:7e:0c:6c:7c:e7:83:
- 41:f0:78:1b:b4:16:d5:93:d9
- Exponent: 65537 (0x10001)
- X509v3 extensions:
- X509v3 Subject Key Identifier:
- F6:6E:9E:36:6D:49:02:FC:91:1A:5A:9D:D3:FA:B4:9F:07:EE:A9:B3
- X509v3 Authority Key Identifier:
- keyid:F6:6E:9E:36:6D:49:02:FC:91:1A:5A:9D:D3:FA:B4:9F:07:EE:A9:B3
- DirName:/C=PL/ST=Masovian/O=priv/OU=priv/CN=priv
- serial:00
-
- X509v3 Basic Constraints:
- CA:TRUE
- Signature Algorithm: sha1WithRSAEncryption
- 96:3c:f7:22:3d:32:c0:67:fc:3a:0a:3c:b7:62:38:7d:a6:d5:
- 2d:86:c2:ce:6a:84:66:d4:56:b3:93:4e:4c:37:d1:49:b6:67:
- 91:76:57:96:96:cc:5a:71:da:69:b7:52:9d:8f:17:f7:66:fa:
- 6c:f1:98:28:44:af:60:df:ad:2a:8b:f5:f3:8c:27:c4:68:a5:
- 2a:35:c1:6c:84:37:20:ee:c2:9c:58:98:a1:ff:ba:fd:38:36:
- 45:c3:d7:38:5d:47:ad:c8:0d:26:2b:a9:9d:2e:39:73:b2:aa:
- da:e5:19:b8:57:28:62:dd:94:2a:c9:50:5b:33:59:b0:56:cf:
- eb:2f
------BEGIN CERTIFICATE-----
-MIICuDCCAiGgAwIBAgIBADANBgkqhkiG9w0BAQUFADBNMQswCQYDVQQGEwJQTDER
-MA8GA1UECBMITWFzb3ZpYW4xDTALBgNVBAoTBHByaXYxDTALBgNVBAsTBHByaXYx
-DTALBgNVBAMTBHByaXYwHhcNMTEwNzI5MTQzMjEyWhcNMTQwNzI4MTQzMjEyWjBN
-MQswCQYDVQQGEwJQTDERMA8GA1UECBMITWFzb3ZpYW4xDTALBgNVBAoTBHByaXYx
-DTALBgNVBAsTBHByaXYxDTALBgNVBAMTBHByaXYwgZ8wDQYJKoZIhvcNAQEBBQAD
-gY0AMIGJAoGBAKtozBpBeFAM9EM/no17kD3r1ovO2cG19NMudfPhsymXGzjGIHON
-ps1hP+EceA/9JeKglW2pMzD+JHY95J0jsjk8mKWyIC99yH3VAHwRLG5YohgDAkhK
-gcfre+njjbDrPe4hGXwEwq1PRbMaE9F2NcQ4fgxsfOeDQfB4G7QW1ZPZAgMBAAGj
-gacwgaQwHQYDVR0OBBYEFPZunjZtSQL8kRpandP6tJ8H7qmzMHUGA1UdIwRuMGyA
-FPZunjZtSQL8kRpandP6tJ8H7qmzoVGkTzBNMQswCQYDVQQGEwJQTDERMA8GA1UE
-CBMITWFzb3ZpYW4xDTALBgNVBAoTBHByaXYxDTALBgNVBAsTBHByaXYxDTALBgNV
-BAMTBHByaXaCAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQCWPPci
-PTLAZ/w6Cjy3Yjh9ptUthsLOaoRm1Fazk05MN9FJtmeRdleWlsxacdppt1Kdjxf3
-Zvps8ZgoRK9g360qi/XzjCfEaKUqNcFshDcg7sKcWJih/7r9ODZFw9c4XUetyA0m
-K6mdLjlzsqra5Rm4Vyhi3ZQqyVBbM1mwVs/rLw==
------END CERTIFICATE-----
+++ /dev/null
------BEGIN CERTIFICATE REQUEST-----
-MIIBnjCCAQcCAQAwXjELMAkGA1UEBhMCUEwxETAPBgNVBAgTCE1hc292aWFuMQ8w
-DQYDVQQHEwZXYXJzYXcxDTALBgNVBAoTBHByaXYxDTALBgNVBAsTBHByaXYxDTAL
-BgNVBAMTBHByaXYwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKtozBpBeFAM
-9EM/no17kD3r1ovO2cG19NMudfPhsymXGzjGIHONps1hP+EceA/9JeKglW2pMzD+
-JHY95J0jsjk8mKWyIC99yH3VAHwRLG5YohgDAkhKgcfre+njjbDrPe4hGXwEwq1P
-RbMaE9F2NcQ4fgxsfOeDQfB4G7QW1ZPZAgMBAAGgADANBgkqhkiG9w0BAQUFAAOB
-gQBfWbLoBMhFCjsTklaKNKIoF4WRNmGXPBQt+BWZhlVjnxh1ncL3QX2M4r/ys3ax
-bKGm24i5XvUvZ1uR8SxOHGbuTzjRALBOgfb9X5mma/8ZytammJmgjdYkVvvRNFXL
-O+WaOykOlw1zUEUVK0VAmdQ5STPQDypyYwGF5JYL24F84A==
------END CERTIFICATE REQUEST-----
+++ /dev/null
-V 140728143212Z 00 unknown /C=PL/ST=Masovian/O=priv/OU=priv/CN=priv
+++ /dev/null
-unique_subject = yes
+++ /dev/null
-Certificate:
- Data:
- Version: 3 (0x2)
- Serial Number: 0 (0x0)
- Signature Algorithm: sha1WithRSAEncryption
- Issuer: C=PL, ST=Masovian, O=priv, OU=priv, CN=priv
- Validity
- Not Before: Jul 29 14:32:12 2011 GMT
- Not After : Jul 28 14:32:12 2014 GMT
- Subject: C=PL, ST=Masovian, O=priv, OU=priv, CN=priv
- Subject Public Key Info:
- Public Key Algorithm: rsaEncryption
- RSA Public Key: (1024 bit)
- Modulus (1024 bit):
- 00:ab:68:cc:1a:41:78:50:0c:f4:43:3f:9e:8d:7b:
- 90:3d:eb:d6:8b:ce:d9:c1:b5:f4:d3:2e:75:f3:e1:
- b3:29:97:1b:38:c6:20:73:8d:a6:cd:61:3f:e1:1c:
- 78:0f:fd:25:e2:a0:95:6d:a9:33:30:fe:24:76:3d:
- e4:9d:23:b2:39:3c:98:a5:b2:20:2f:7d:c8:7d:d5:
- 00:7c:11:2c:6e:58:a2:18:03:02:48:4a:81:c7:eb:
- 7b:e9:e3:8d:b0:eb:3d:ee:21:19:7c:04:c2:ad:4f:
- 45:b3:1a:13:d1:76:35:c4:38:7e:0c:6c:7c:e7:83:
- 41:f0:78:1b:b4:16:d5:93:d9
- Exponent: 65537 (0x10001)
- X509v3 extensions:
- X509v3 Subject Key Identifier:
- F6:6E:9E:36:6D:49:02:FC:91:1A:5A:9D:D3:FA:B4:9F:07:EE:A9:B3
- X509v3 Authority Key Identifier:
- keyid:F6:6E:9E:36:6D:49:02:FC:91:1A:5A:9D:D3:FA:B4:9F:07:EE:A9:B3
- DirName:/C=PL/ST=Masovian/O=priv/OU=priv/CN=priv
- serial:00
-
- X509v3 Basic Constraints:
- CA:TRUE
- Signature Algorithm: sha1WithRSAEncryption
- 96:3c:f7:22:3d:32:c0:67:fc:3a:0a:3c:b7:62:38:7d:a6:d5:
- 2d:86:c2:ce:6a:84:66:d4:56:b3:93:4e:4c:37:d1:49:b6:67:
- 91:76:57:96:96:cc:5a:71:da:69:b7:52:9d:8f:17:f7:66:fa:
- 6c:f1:98:28:44:af:60:df:ad:2a:8b:f5:f3:8c:27:c4:68:a5:
- 2a:35:c1:6c:84:37:20:ee:c2:9c:58:98:a1:ff:ba:fd:38:36:
- 45:c3:d7:38:5d:47:ad:c8:0d:26:2b:a9:9d:2e:39:73:b2:aa:
- da:e5:19:b8:57:28:62:dd:94:2a:c9:50:5b:33:59:b0:56:cf:
- eb:2f
------BEGIN CERTIFICATE-----
-MIICuDCCAiGgAwIBAgIBADANBgkqhkiG9w0BAQUFADBNMQswCQYDVQQGEwJQTDER
-MA8GA1UECBMITWFzb3ZpYW4xDTALBgNVBAoTBHByaXYxDTALBgNVBAsTBHByaXYx
-DTALBgNVBAMTBHByaXYwHhcNMTEwNzI5MTQzMjEyWhcNMTQwNzI4MTQzMjEyWjBN
-MQswCQYDVQQGEwJQTDERMA8GA1UECBMITWFzb3ZpYW4xDTALBgNVBAoTBHByaXYx
-DTALBgNVBAsTBHByaXYxDTALBgNVBAMTBHByaXYwgZ8wDQYJKoZIhvcNAQEBBQAD
-gY0AMIGJAoGBAKtozBpBeFAM9EM/no17kD3r1ovO2cG19NMudfPhsymXGzjGIHON
-ps1hP+EceA/9JeKglW2pMzD+JHY95J0jsjk8mKWyIC99yH3VAHwRLG5YohgDAkhK
-gcfre+njjbDrPe4hGXwEwq1PRbMaE9F2NcQ4fgxsfOeDQfB4G7QW1ZPZAgMBAAGj
-gacwgaQwHQYDVR0OBBYEFPZunjZtSQL8kRpandP6tJ8H7qmzMHUGA1UdIwRuMGyA
-FPZunjZtSQL8kRpandP6tJ8H7qmzoVGkTzBNMQswCQYDVQQGEwJQTDERMA8GA1UE
-CBMITWFzb3ZpYW4xDTALBgNVBAoTBHByaXYxDTALBgNVBAsTBHByaXYxDTALBgNV
-BAMTBHByaXaCAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQCWPPci
-PTLAZ/w6Cjy3Yjh9ptUthsLOaoRm1Fazk05MN9FJtmeRdleWlsxacdppt1Kdjxf3
-Zvps8ZgoRK9g360qi/XzjCfEaKUqNcFshDcg7sKcWJih/7r9ODZFw9c4XUetyA0m
-K6mdLjlzsqra5Rm4Vyhi3ZQqyVBbM1mwVs/rLw==
------END CERTIFICATE-----
+++ /dev/null
------BEGIN RSA PRIVATE KEY-----
-Proc-Type: 4,ENCRYPTED
-DEK-Info: DES-EDE3-CBC,E653123E49750191
-
-OgQe9fnwRSQjEqAuqts2/up+mCfMyiZLwi/ZfhZjBxsRD0n34J5NrLptcWMDNvPT
-TueYJ24eUhE61RE6u9VpcdYd0d/7sbR6i8jiBYa8R15frtTUaD1XCbhz3Sn6REbL
-qDrKW7hHuSKKRfb/6bHVGNGMCR6eCSw9isYcqFDlmRpGiYC5m2nxr/W1JFq4K/te
-KgvZ0kwE9DPeCdLVyHbZ7AcK0aDzUeZOFxxyHvQRLIbprx2DoFi+erPVvPfehJp1
-n2CVa2CXwkY4vIoCKn3KbtRqR+vHbc9UmlSvd2AINPEgCYAr11AGvDl9O6fdLXRJ
-PXq6TMv3se//4qPcyKEiXRhR64a0dxIutyPvESLrnz4BZGsQN695ym3s96x1IEtK
-yb7AGws3kr/zMVFilFFtHZgsMse9kzsMmoQZ31VfyIM1CpmieCVyN2gYV+iQN04f
-1HaT498quauFvxezDe9UC4d9yaFKAM8lqeuMwoisTCu18LR5jA4ODzEJDENnny4O
-ejLVKkdPViJOW5UwGpjl2MQYtmRyN6/FHjFIx9FEIClaxLiYMFXNxIGSWdq85JUb
-/VpkmCiJqjy2eIW137ThbmN2GblLg6l9Hkz1wTBqhqhBK/uznwE7Mh0VL3QNTnys
-4Ib2WoApWS3b9a6UAeybZvZ1vvK/9hryG19iwZsqpmuJoTTSlwZQbBYpVHRiSmrw
-S26rP4kBnId4ftf3oIGCwUgFXhj1cQ7V/PC4EAOzo0opAMQkI6TR1DP8gv1ESmIN
-mdrHvKbzmrRe5enDjrk3G2HVhd2+fPwC0Go8mORvxRtRfDDYeySEPQ==
------END RSA PRIVATE KEY-----
+++ /dev/null
-Certificate:
- Data:
- Version: 3 (0x2)
- Serial Number: 0 (0x0)
- Signature Algorithm: sha1WithRSAEncryption
- Issuer: C=PL, ST=Masovian, O=priv, OU=priv, CN=priv
- Validity
- Not Before: Jul 29 14:32:12 2011 GMT
- Not After : Jul 28 14:32:12 2014 GMT
- Subject: C=PL, ST=Masovian, O=priv, OU=priv, CN=priv
- Subject Public Key Info:
- Public Key Algorithm: rsaEncryption
- RSA Public Key: (1024 bit)
- Modulus (1024 bit):
- 00:ab:68:cc:1a:41:78:50:0c:f4:43:3f:9e:8d:7b:
- 90:3d:eb:d6:8b:ce:d9:c1:b5:f4:d3:2e:75:f3:e1:
- b3:29:97:1b:38:c6:20:73:8d:a6:cd:61:3f:e1:1c:
- 78:0f:fd:25:e2:a0:95:6d:a9:33:30:fe:24:76:3d:
- e4:9d:23:b2:39:3c:98:a5:b2:20:2f:7d:c8:7d:d5:
- 00:7c:11:2c:6e:58:a2:18:03:02:48:4a:81:c7:eb:
- 7b:e9:e3:8d:b0:eb:3d:ee:21:19:7c:04:c2:ad:4f:
- 45:b3:1a:13:d1:76:35:c4:38:7e:0c:6c:7c:e7:83:
- 41:f0:78:1b:b4:16:d5:93:d9
- Exponent: 65537 (0x10001)
- X509v3 extensions:
- X509v3 Subject Key Identifier:
- F6:6E:9E:36:6D:49:02:FC:91:1A:5A:9D:D3:FA:B4:9F:07:EE:A9:B3
- X509v3 Authority Key Identifier:
- keyid:F6:6E:9E:36:6D:49:02:FC:91:1A:5A:9D:D3:FA:B4:9F:07:EE:A9:B3
- DirName:/C=PL/ST=Masovian/O=priv/OU=priv/CN=priv
- serial:00
-
- X509v3 Basic Constraints:
- CA:TRUE
- Signature Algorithm: sha1WithRSAEncryption
- 96:3c:f7:22:3d:32:c0:67:fc:3a:0a:3c:b7:62:38:7d:a6:d5:
- 2d:86:c2:ce:6a:84:66:d4:56:b3:93:4e:4c:37:d1:49:b6:67:
- 91:76:57:96:96:cc:5a:71:da:69:b7:52:9d:8f:17:f7:66:fa:
- 6c:f1:98:28:44:af:60:df:ad:2a:8b:f5:f3:8c:27:c4:68:a5:
- 2a:35:c1:6c:84:37:20:ee:c2:9c:58:98:a1:ff:ba:fd:38:36:
- 45:c3:d7:38:5d:47:ad:c8:0d:26:2b:a9:9d:2e:39:73:b2:aa:
- da:e5:19:b8:57:28:62:dd:94:2a:c9:50:5b:33:59:b0:56:cf:
- eb:2f
------BEGIN CERTIFICATE-----
-MIICuDCCAiGgAwIBAgIBADANBgkqhkiG9w0BAQUFADBNMQswCQYDVQQGEwJQTDER
-MA8GA1UECBMITWFzb3ZpYW4xDTALBgNVBAoTBHByaXYxDTALBgNVBAsTBHByaXYx
-DTALBgNVBAMTBHByaXYwHhcNMTEwNzI5MTQzMjEyWhcNMTQwNzI4MTQzMjEyWjBN
-MQswCQYDVQQGEwJQTDERMA8GA1UECBMITWFzb3ZpYW4xDTALBgNVBAoTBHByaXYx
-DTALBgNVBAsTBHByaXYxDTALBgNVBAMTBHByaXYwgZ8wDQYJKoZIhvcNAQEBBQAD
-gY0AMIGJAoGBAKtozBpBeFAM9EM/no17kD3r1ovO2cG19NMudfPhsymXGzjGIHON
-ps1hP+EceA/9JeKglW2pMzD+JHY95J0jsjk8mKWyIC99yH3VAHwRLG5YohgDAkhK
-gcfre+njjbDrPe4hGXwEwq1PRbMaE9F2NcQ4fgxsfOeDQfB4G7QW1ZPZAgMBAAGj
-gacwgaQwHQYDVR0OBBYEFPZunjZtSQL8kRpandP6tJ8H7qmzMHUGA1UdIwRuMGyA
-FPZunjZtSQL8kRpandP6tJ8H7qmzoVGkTzBNMQswCQYDVQQGEwJQTDERMA8GA1UE
-CBMITWFzb3ZpYW4xDTALBgNVBAoTBHByaXYxDTALBgNVBAsTBHByaXYxDTALBgNV
-BAMTBHByaXaCAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQCWPPci
-PTLAZ/w6Cjy3Yjh9ptUthsLOaoRm1Fazk05MN9FJtmeRdleWlsxacdppt1Kdjxf3
-Zvps8ZgoRK9g360qi/XzjCfEaKUqNcFshDcg7sKcWJih/7r9ODZFw9c4XUetyA0m
-K6mdLjlzsqra5Rm4Vyhi3ZQqyVBbM1mwVs/rLw==
------END CERTIFICATE-----
+++ /dev/null
------BEGIN CERTIFICATE REQUEST-----
-MIIBnjCCAQcCAQAwXjELMAkGA1UEBhMCUEwxETAPBgNVBAgTCE1hc292aWFuMQ8w
-DQYDVQQHEwZXYXJzYXcxDTALBgNVBAoTBHByaXYxDTALBgNVBAsTBHByaXYxDTAL
-BgNVBAMTBHByaXYwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKtozBpBeFAM
-9EM/no17kD3r1ovO2cG19NMudfPhsymXGzjGIHONps1hP+EceA/9JeKglW2pMzD+
-JHY95J0jsjk8mKWyIC99yH3VAHwRLG5YohgDAkhKgcfre+njjbDrPe4hGXwEwq1P
-RbMaE9F2NcQ4fgxsfOeDQfB4G7QW1ZPZAgMBAAGgADANBgkqhkiG9w0BAQUFAAOB
-gQBfWbLoBMhFCjsTklaKNKIoF4WRNmGXPBQt+BWZhlVjnxh1ncL3QX2M4r/ys3ax
-bKGm24i5XvUvZ1uR8SxOHGbuTzjRALBOgfb9X5mma/8ZytammJmgjdYkVvvRNFXL
-O+WaOykOlw1zUEUVK0VAmdQ5STPQDypyYwGF5JYL24F84A==
------END CERTIFICATE REQUEST-----
+++ /dev/null
------BEGIN RSA PRIVATE KEY-----
-Proc-Type: 4,ENCRYPTED
-DEK-Info: DES-EDE3-CBC,E653123E49750191
-
-OgQe9fnwRSQjEqAuqts2/up+mCfMyiZLwi/ZfhZjBxsRD0n34J5NrLptcWMDNvPT
-TueYJ24eUhE61RE6u9VpcdYd0d/7sbR6i8jiBYa8R15frtTUaD1XCbhz3Sn6REbL
-qDrKW7hHuSKKRfb/6bHVGNGMCR6eCSw9isYcqFDlmRpGiYC5m2nxr/W1JFq4K/te
-KgvZ0kwE9DPeCdLVyHbZ7AcK0aDzUeZOFxxyHvQRLIbprx2DoFi+erPVvPfehJp1
-n2CVa2CXwkY4vIoCKn3KbtRqR+vHbc9UmlSvd2AINPEgCYAr11AGvDl9O6fdLXRJ
-PXq6TMv3se//4qPcyKEiXRhR64a0dxIutyPvESLrnz4BZGsQN695ym3s96x1IEtK
-yb7AGws3kr/zMVFilFFtHZgsMse9kzsMmoQZ31VfyIM1CpmieCVyN2gYV+iQN04f
-1HaT498quauFvxezDe9UC4d9yaFKAM8lqeuMwoisTCu18LR5jA4ODzEJDENnny4O
-ejLVKkdPViJOW5UwGpjl2MQYtmRyN6/FHjFIx9FEIClaxLiYMFXNxIGSWdq85JUb
-/VpkmCiJqjy2eIW137ThbmN2GblLg6l9Hkz1wTBqhqhBK/uznwE7Mh0VL3QNTnys
-4Ib2WoApWS3b9a6UAeybZvZ1vvK/9hryG19iwZsqpmuJoTTSlwZQbBYpVHRiSmrw
-S26rP4kBnId4ftf3oIGCwUgFXhj1cQ7V/PC4EAOzo0opAMQkI6TR1DP8gv1ESmIN
-mdrHvKbzmrRe5enDjrk3G2HVhd2+fPwC0Go8mORvxRtRfDDYeySEPQ==
------END RSA PRIVATE KEY-----
+++ /dev/null
-#
-# OpenSSL example configuration file.
-# This is mostly being used for generation of certificate requests.
-#
-
-# This definition stops the following lines choking if HOME isn't
-# defined.
-HOME = .
-RANDFILE = $ENV::HOME/.rnd
-
-# Extra OBJECT IDENTIFIER info:
-#oid_file = $ENV::HOME/.oid
-oid_section = new_oids
-
-# To use this configuration file with the "-extfile" option of the
-# "openssl x509" utility, name here the section containing the
-# X.509v3 extensions to use:
-# extensions =
-# (Alternatively, use a configuration file that has only
-# X.509v3 extensions in its main [= default] section.)
-
-[ new_oids ]
-
-# We can add new OIDs in here for use by 'ca' and 'req'.
-# Add a simple OID like this:
-# testoid1=1.2.3.4
-# Or use config file substitution like this:
-# testoid2=${testoid1}.5.6
-
-####################################################################
-[ ca ]
-default_ca = CA_default # The default ca section
-
-####################################################################
-[ CA_default ]
-
-dir = ./demoCA # Where everything is kept
-certs = $dir/certs # Where the issued certs are kept
-crl_dir = $dir/crl # Where the issued crl are kept
-database = $dir/index.txt # database index file.
-#unique_subject = no # Set to 'no' to allow creation of
- # several ctificates with same subject.
-new_certs_dir = $dir/newcerts # default place for new certs.
-
-certificate = $dir/cacert.pem # The CA certificate
-serial = $dir/serial # The current serial number
-crlnumber = $dir/crlnumber # the current crl number
- # must be commented out to leave a V1 CRL
-crl = $dir/crl.pem # The current CRL
-private_key = $dir/private/cakey.pem# The private key
-RANDFILE = $dir/private/.rand # private random number file
-
-x509_extensions = usr_cert # The extentions to add to the cert
-
-# Comment out the following two lines for the "traditional"
-# (and highly broken) format.
-name_opt = ca_default # Subject Name options
-cert_opt = ca_default # Certificate field options
-
-# Extension copying option: use with caution.
-# copy_extensions = copy
-
-# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
-# so this is commented out by default to leave a V1 CRL.
-# crlnumber must also be commented out to leave a V1 CRL.
-
-#crl_extensions = crl_ext
-
-default_days = 365 # how long to certify for
-default_crl_days= 30 # how long before next CRL
-default_md = sha1 # which md to use.
-preserve = no # keep passed DN ordering
-
-# A few difference way of specifying how similar the request should look
-# For type CA, the listed attributes must be the same, and the optional
-# and supplied fields are just that :-)
-policy = policy_match
-
-# For the CA policy
-[ policy_match ]
-countryName = match
-stateOrProvinceName = match
-organizationName = match
-organizationalUnitName = optional
-commonName = supplied
-emailAddress = optional
-
-# For the 'anything' policy
-# At this point in time, you must list all acceptable 'object'
-# types.
-[ policy_anything ]
-countryName = optional
-stateOrProvinceName = optional
-localityName = optional
-organizationName = optional
-organizationalUnitName = optional
-commonName = supplied
-emailAddress = optional
-
-####################################################################
-[ req ]
-default_bits = 1024
-default_keyfile = privkey.pem
-distinguished_name = req_distinguished_name
-attributes = req_attributes
-x509_extensions = v3_ca # The extentions to add to the self signed cert
-
-# Passwords for private keys if not present they will be prompted for
-# input_password = secret
-# output_password = secret
-
-# This sets a mask for permitted string types. There are several options.
-# default: PrintableString, T61String, BMPString.
-# pkix : PrintableString, BMPString.
-# utf8only: only UTF8Strings.
-# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings).
-# MASK:XXXX a literal mask value.
-# WARNING: current versions of Netscape crash on BMPStrings or UTF8Strings
-# so use this option with caution!
-string_mask = nombstr
-
-# req_extensions = v3_req # The extensions to add to a certificate request
-
-[ req_distinguished_name ]
-countryName = Country Name (2 letter code)
-countryName_default = AU
-countryName_min = 2
-countryName_max = 2
-
-stateOrProvinceName = State or Province Name (full name)
-stateOrProvinceName_default = Some-State
-
-localityName = Locality Name (eg, city)
-
-0.organizationName = Organization Name (eg, company)
-0.organizationName_default = Internet Widgits Pty Ltd
-
-# we can do this but it is not needed normally :-)
-#1.organizationName = Second Organization Name (eg, company)
-#1.organizationName_default = World Wide Web Pty Ltd
-
-organizationalUnitName = Organizational Unit Name (eg, section)
-#organizationalUnitName_default =
-
-commonName = Common Name (eg, YOUR name)
-commonName_max = 64
-
-emailAddress = Email Address
-emailAddress_max = 64
-
-# SET-ex3 = SET extension number 3
-
-[ req_attributes ]
-challengePassword = A challenge password
-challengePassword_min = 4
-challengePassword_max = 20
-
-unstructuredName = An optional company name
-
-[ usr_cert ]
-
-# These extensions are added when 'ca' signs a request.
-
-# This goes against PKIX guidelines but some CAs do it and some software
-# requires this to avoid interpreting an end user certificate as a CA.
-
-basicConstraints=CA:FALSE
-crlDistributionPoints = URI:http://localhost/my.crl
-
-# Here are some examples of the usage of nsCertType. If it is omitted
-# the certificate can be used for anything *except* object signing.
-
-# This is OK for an SSL server.
-# nsCertType = server
-
-# For an object signing certificate this would be used.
-# nsCertType = objsign
-
-# For normal client use this is typical
-# nsCertType = client, email
-
-# and for everything including object signing:
-# nsCertType = client, email, objsign
-
-# This is typical in keyUsage for a client certificate.
-# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
-
-# This will be displayed in Netscape's comment listbox.
-nsComment = "OpenSSL Generated Certificate"
-
-# PKIX recommendations harmless if included in all certificates.
-subjectKeyIdentifier=hash
-authorityKeyIdentifier=keyid,issuer
-
-# This stuff is for subjectAltName and issuerAltname.
-# Import the email address.
-# subjectAltName=email:copy
-# An alternative to produce certificates that aren't
-# deprecated according to PKIX.
-# subjectAltName=email:move
-
-# Copy subject details
-# issuerAltName=issuer:copy
-
-#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem
-#nsBaseUrl
-#nsRevocationUrl
-#nsRenewalUrl
-#nsCaPolicyUrl
-#nsSslServerName
-
-[ v3_req ]
-
-# Extensions to add to a certificate request
-
-basicConstraints = CA:FALSE
-keyUsage = nonRepudiation, digitalSignature, keyEncipherment
-
-[ v3_ca ]
-
-
-# Extensions for a typical CA
-
-
-# PKIX recommendation.
-
-subjectKeyIdentifier=hash
-
-authorityKeyIdentifier=keyid:always,issuer:always
-
-# OCSP and CRL local servers - for test certificates
-authorityInfoAccess=OCSP;URI:http://localhost:8881/
-crlDistributionPoints=URI:http://localhost/my.crl
-
-# This is what PKIX recommends but some broken software chokes on critical
-# extensions.
-#basicConstraints = critical,CA:true
-# So we do this instead.
-basicConstraints = CA:true
-
-# Key usage: this is typical for a CA certificate. However since it will
-# prevent it being used as an test self-signed certificate it is best
-# left out by default.
-# keyUsage = cRLSign, keyCertSign
-
-# Some might want this also
-# nsCertType = sslCA, emailCA
-
-# Include email address in subject alt name: another PKIX recommendation
-# subjectAltName=email:copy
-# Copy issuer details
-# issuerAltName=issuer:copy
-
-# DER hex encoding of an extension: beware experts only!
-# obj=DER:02:03
-# Where 'obj' is a standard or added object
-# You can even override a supported extension:
-# basicConstraints= critical, DER:30:03:01:01:FF
-
-[ crl_ext ]
-
-# CRL extensions.
-# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL.
-
-# issuerAltName=issuer:copy
-authorityKeyIdentifier=keyid:always,issuer:always
-crlDistributionPoints=crldp1_section
-URI=http://localhost/my.crl
-
-[ proxy_cert_ext ]
-# These extensions should be added when creating a proxy certificate
-
-# This goes against PKIX guidelines but some CAs do it and some software
-# requires this to avoid interpreting an end user certificate as a CA.
-
-basicConstraints=CA:FALSE
-
-# Here are some examples of the usage of nsCertType. If it is omitted
-# the certificate can be used for anything *except* object signing.
-
-# This is OK for an SSL server.
-# nsCertType = server
-
-# For an object signing certificate this would be used.
-# nsCertType = objsign
-
-# For normal client use this is typical
-# nsCertType = client, email
-
-# and for everything including object signing:
-# nsCertType = client, email, objsign
-
-# This is typical in keyUsage for a client certificate.
-# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
-
-# This will be displayed in Netscape's comment listbox.
-nsComment = "OpenSSL Generated Certificate"
-
-# PKIX recommendations harmless if included in all certificates.
-subjectKeyIdentifier=hash
-authorityKeyIdentifier=keyid,issuer:always
-
-# This stuff is for subjectAltName and issuerAltname.
-# Import the email address.
-# subjectAltName=email:copy
-# An alternative to produce certificates that aren't
-# deprecated according to PKIX.
-# subjectAltName=email:move
-
-# Copy subject details
-# issuerAltName=issuer:copy
-
-#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem
-#nsBaseUrl
-#nsRevocationUrl
-#nsRenewalUrl
-#nsCaPolicyUrl
-#nsSslServerName
-
-# This really needs to be in place for it to be a proxy certificate.
-proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo
-
-[ my_v3_ext ]
-basicConstraints = CA:true
-
-[ ocsp_cert ]
-extendedKeyUsage = OCSP Signing
\ No newline at end of file
+++ /dev/null
-<CertificateSet>
- <CertificateDomain name="wacpublisher">
- </CertificateDomain>
- <CertificateDomain name="wacroot">
- </CertificateDomain>
- <CertificateDomain name="developer">
- </CertificateDomain>
- <CertificateDomain name="wacmember">
- </CertificateDomain>
- <CertificateDomain name="tizenmember">
- <FingerprintSHA1>74:2C:31:92:E6:07:E4:24:EB:45:49:54:2B:E1:BB:C5:3E:61:74:E2</FingerprintSHA1>
- </CertificateDomain>
- <CertificateDomain name="orangelegacy">
- <FingerprintSHA1>74:2C:31:92:E6:07:E4:24:EB:45:49:54:2B:E1:BB:C5:3E:61:74:E2</FingerprintSHA1>
- </CertificateDomain>
- <CertificateDomain name="fake">
- <FingerprintSHA1>74:2C:31:92:E6:07:E4:24:EB:45:49:54:2B:E1:BB:C5:3E:61:74:E2</FingerprintSHA1>
- </CertificateDomain>
- <CertificateDomain name="tizen-public">
- <FingerprintSHA1>74:2C:31:92:E6:07:E4:24:EB:45:49:54:2B:E1:BB:C5:3E:61:74:E2</FingerprintSHA1>
- <FingerprintSHA1>04:C5:A6:1D:75:BB:F5:5C:0F:A2:66:F6:09:4D:9B:2B:5F:3B:44:AE</FingerprintSHA1>
- </CertificateDomain>
- <CertificateDomain name="tizen-partner">
- <FingerprintSHA1>74:2C:31:92:E6:07:E4:24:EB:45:49:54:2B:E1:BB:C5:3E:61:74:E0</FingerprintSHA1>
- <FingerprintSHA1>67:37:DE:B7:B9:9D:D2:DB:A5:2C:42:DE:CB:2F:2C:3E:33:97:E1:85</FingerprintSHA1>
- </CertificateDomain>
- <CertificateDomain name="tizen-partner-operator">
- <FingerprintSHA1>74:2C:31:92:E6:07:E4:24:EB:45:49:54:2B:E1:BB:C5:3E:61:74:E1</FingerprintSHA1>
- <FingerprintSHA1>B0:5F:40:43:71:1F:11:BC:9A:6A:62:FA:DA:92:54:79:92:16:11:DF</FingerprintSHA1>
- </CertificateDomain>
- <CertificateDomain name="tizen-partner-manufacturer">
- <FingerprintSHA1>74:2C:31:92:E6:07:E4:24:EB:45:49:54:2B:E1:BB:C5:3E:61:74:E3</FingerprintSHA1>
- <FingerprintSHA1>2A:74:E8:CF:9E:0F:C3:D9:80:48:8B:E7:86:F7:83:49:91:11:E1:E0</FingerprintSHA1>
- </CertificateDomain>
-</CertificateSet>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
-
-<xs:element name="CertificateSet" type="CertificateSetType" />
-<xs:complexType name="CertificateSetType">
- <xs:sequence>
- <xs:element ref="CertificateDomain" minOccurs="0" maxOccurs="unbounded" />
- </xs:sequence>
-</xs:complexType>
-
-<xs:element name="CertificateDomain" type="CertificateDomainType" />
-<xs:complexType name="CertificateDomainType">
- <xs:sequence>
- <xs:element ref="FingerprintSHA1" minOccurs="0" maxOccurs="unbounded" />
- </xs:sequence>
- <xs:attribute name="name" type="xs:string" use="required" />
-</xs:complexType>
-
-<xs:element name="FingerprintSHA1" type="xs:string"/>
-
-</xs:schema>
+++ /dev/null
------BEGIN CERTIFICATE-----
-MIIEuDCCA6CgAwIBAgIBBDANBgkqhkiG9w0BAQUFADCBtDELMAkGA1UEBhMCQlIx
-EzARBgNVBAoTCklDUC1CcmFzaWwxPTA7BgNVBAsTNEluc3RpdHV0byBOYWNpb25h
-bCBkZSBUZWNub2xvZ2lhIGRhIEluZm9ybWFjYW8gLSBJVEkxETAPBgNVBAcTCEJy
-YXNpbGlhMQswCQYDVQQIEwJERjExMC8GA1UEAxMoQXV0b3JpZGFkZSBDZXJ0aWZp
-Y2Fkb3JhIFJhaXogQnJhc2lsZWlyYTAeFw0wMTExMzAxMjU4MDBaFw0xMTExMzAy
-MzU5MDBaMIG0MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE9MDsG
-A1UECxM0SW5zdGl0dXRvIE5hY2lvbmFsIGRlIFRlY25vbG9naWEgZGEgSW5mb3Jt
-YWNhbyAtIElUSTERMA8GA1UEBxMIQnJhc2lsaWExCzAJBgNVBAgTAkRGMTEwLwYD
-VQQDEyhBdXRvcmlkYWRlIENlcnRpZmljYWRvcmEgUmFpeiBCcmFzaWxlaXJhMIIB
-IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwPMudwX/hvm+Uh2b/lQAcHVA
-isamaLkWdkwP9/S/tOKIgRrL6Oy+ZIGlOUdd6uYtk9Ma/3pUpgcfNAj0vYm5gsyj
-Qo9emsc+x6m4VWwk9iqMZSCK5EQkAq/Ut4n7KuLE1+gdftwdIgxfUsPt4CyNrY50
-QV57KM2UT8x5rrmzEjr7TICGpSUAl2gVqe6xaii+bmYR1QrmWaBSAG59LrkrjrYt
-bRhFboUDe1DK+6T8s5L6k8c8okpbHpa9veMztDVC9sPJ60MWXh6anVKo1UcLcbUR
-yEeNvZneVRKAAU6ouwdjDvwlsaKydFKwed0ToQ47bmUKgcm+wV3eTRk36UOnTwID
-AQABo4HSMIHPME4GA1UdIARHMEUwQwYFYEwBAQAwOjA4BggrBgEFBQcCARYsaHR0
-cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0RQQ2FjcmFpei5wZGYwPQYDVR0f
-BDYwNDAyoDCgLoYsaHR0cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0xDUmFj
-cmFpei5jcmwwHQYDVR0OBBYEFIr68VeEERM1kEL6V0lUaQ2kxPA3MA8GA1UdEwEB
-/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAZA5c1
-U/hgIh6OcgLAfiJgFWpvmDZWqlV30/bHFpj8iBobJSm5uDpt7TirYh1Uxe3fQaGl
-YjJe+9zd+izPRbBqXPVQA34EXcwk4qpWuf1hHriWfdrx8AcqSqr6CuQFwSr75Fos
-SzlwDADa70mT7wZjAmQhnZx2xJ6wfWlT9VQfS//JYeIc7Fue2JNLd00UOSMMaiK/
-t79enKNHEA2fupH3vEigf5Eh4bVAN5VohrTm6MY53x7XQZZr1ME7a55lFEnSeT0u
-mlOAjR2mAbvSM5X5oSZNrmetdzyTj2flCM8CC7MLab0kkdngRIlUBGHF1/S5nmPb
-K+9A46sd33oqK8n8
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290
-IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB
-IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA
-Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO
-BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi
-MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ
-ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
-CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ
-8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6
-zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y
-fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7
-w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc
-G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k
-epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q
-laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ
-QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU
-fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826
-YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w
-ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY
-gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe
-MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0
-IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy
-dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw
-czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0
-dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl
-aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC
-AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg
-b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB
-ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc
-nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg
-18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c
-gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl
-Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY
-sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T
-SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF
-CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum
-GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk
-zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW
-omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIGCDCCA/CgAwIBAgIBATANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290
-IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB
-IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA
-Y2FjZXJ0Lm9yZzAeFw0wNTEwMTQwNzM2NTVaFw0zMzAzMjgwNzM2NTVaMFQxFDAS
-BgNVBAoTC0NBY2VydCBJbmMuMR4wHAYDVQQLExVodHRwOi8vd3d3LkNBY2VydC5v
-cmcxHDAaBgNVBAMTE0NBY2VydCBDbGFzcyAzIFJvb3QwggIiMA0GCSqGSIb3DQEB
-AQUAA4ICDwAwggIKAoICAQCrSTURSHzSJn5TlM9Dqd0o10Iqi/OHeBlYfA+e2ol9
-4fvrcpANdKGWZKufoCSZc9riVXbHF3v1BKxGuMO+f2SNEGwk82GcwPKQ+lHm9WkB
-Y8MPVuJKQs/iRIwlKKjFeQl9RrmK8+nzNCkIReQcn8uUBByBqBSzmGXEQ+xOgo0J
-0b2qW42S0OzekMV/CsLj6+YxWl50PpczWejDAz1gM7/30W9HxM3uYoNSbi4ImqTZ
-FRiRpoWSR7CuSOtttyHshRpocjWr//AQXcD0lKdq1TuSfkyQBX6TwSyLpI5idBVx
-bgtxA+qvFTia1NIFcm+M+SvrWnIl+TlG43IbPgTDZCciECqKT1inA62+tC4T7V2q
-SNfVfdQqe1z6RgRQ5MwOQluM7dvyz/yWk+DbETZUYjQ4jwxgmzuXVjit89Jbi6Bb
-6k6WuHzX1aCGcEDTkSm3ojyt9Yy7zxqSiuQ0e8DYbF/pCsLDpyCaWt8sXVJcukfV
-m+8kKHA4IC/VfynAskEDaJLM4JzMl0tF7zoQCqtwOpiVcK01seqFK6QcgCExqa5g
-eoAmSAC4AcCTY1UikTxW56/bOiXzjzFU6iaLgVn5odFTEcV7nQP2dBHgbbEsPyyG
-kZlxmqZ3izRg0RS0LKydr4wQ05/EavhvE/xzWfdmQnQeiuP43NJvmJzLR5iVQAX7
-6QIDAQABo4G/MIG8MA8GA1UdEwEB/wQFMAMBAf8wXQYIKwYBBQUHAQEEUTBPMCMG
-CCsGAQUFBzABhhdodHRwOi8vb2NzcC5DQWNlcnQub3JnLzAoBggrBgEFBQcwAoYc
-aHR0cDovL3d3dy5DQWNlcnQub3JnL2NhLmNydDBKBgNVHSAEQzBBMD8GCCsGAQQB
-gZBKMDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuQ0FjZXJ0Lm9yZy9pbmRleC5w
-aHA/aWQ9MTAwDQYJKoZIhvcNAQEEBQADggIBAH8IiKHaGlBJ2on7oQhy84r3HsQ6
-tHlbIDCxRd7CXdNlafHCXVRUPIVfuXtCkcKZ/RtRm6tGpaEQU55tiKxzbiwzpvD0
-nuB1wT6IRanhZkP+VlrRekF490DaSjrxC1uluxYG5sLnk7mFTZdPsR44Q4Dvmw2M
-77inYACHV30eRBzLI++bPJmdr7UpHEV5FpZNJ23xHGzDwlVks7wU4vOkHx4y/CcV
-Bc/dLq4+gmF78CEQGPZE6lM5+dzQmiDgxrvgu1pPxJnIB721vaLbLmINQjRBvP+L
-ivVRIqqIMADisNS8vmW61QNXeZvo3MhN+FDtkaVSKKKs+zZYPumUK5FQhxvWXtaM
-zPcPEAxSTtAWYeXlCmy/F8dyRlecmPVsYGN6b165Ti/Iubm7aoW8mA3t+T6XhDSU
-rgCvoeXnkm5OvfPi2RSLXNLrAWygF6UtEOucekq9ve7O/e0iQKtwOIj1CodqwqsF
-YMlIBdpTwd5Ed2qz8zw87YC8pjhKKSRf/lk7myV6VmMAZLldpGJ9VzZPrYPvH5JT
-oI53V93lYRE9IwCQTDz6o2CTBKOvNfYOao9PSmCnhQVsRqGP9Md246FZV/dxssRu
-FFxtbUFm3xuTsdQAw+7Lzzw9IYCpX2Nl/N3gX6T0K/CFcUHUZyX7GrGXrtaZghNB
-0m6lG5kngOcLqagA
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIESzCCAzOgAwIBAgIJAJigUTEEXRQpMA0GCSqGSIb3DQEBBQUAMHYxCzAJBgNV
-BAYTAkRFMQ8wDQYDVQQIEwZIZXNzZW4xDjAMBgNVBAcTBUZ1bGRhMRAwDgYDVQQK
-EwdEZWJjb25mMRMwEQYDVQQDEwpEZWJjb25mIENBMR8wHQYJKoZIhvcNAQkBFhBq
-b2VyZ0BkZWJpYW4ub3JnMB4XDTA1MTEwNTE3NTUxNFoXDTE1MTEwMzE3NTUxNFow
-djELMAkGA1UEBhMCREUxDzANBgNVBAgTBkhlc3NlbjEOMAwGA1UEBxMFRnVsZGEx
-EDAOBgNVBAoTB0RlYmNvbmYxEzARBgNVBAMTCkRlYmNvbmYgQ0ExHzAdBgkqhkiG
-9w0BCQEWEGpvZXJnQGRlYmlhbi5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQCvbOo0SrIwI5IMlsshH8WF3dHB9r9JlSKhMPaybawa1EyvZspMQ3wa
-F5qxNf3Sj+NElEmjseEqvCZiIIzqwerHu0Qw62cDYCdCd2+Wb5m0bPYB5CGHiyU1
-eNP0je42O0YeXG2BvUujN8AviocVo39X2YwNQ0ryy4OaqYgm2pRlbtT2ESbF+SfV
-Y2iqQj/f8ymF+lHo/pz8tbAqxWcqaSiHFAVQJrdqtFhtoodoNiE3q76zJoUkZTXB
-k60Yc3MJSnatZCpnsSBr/D7zpntl0THrUjjtdRWCjQVhqfhM1yZJV+ApbLdheFh0
-ZWlSxdnp25p0q0XYw/7G92ELyFDfBUUNAgMBAAGjgdswgdgwHQYDVR0OBBYEFMuV
-dFNb4mCWUFbcP5LOtxFLrEVTMIGoBgNVHSMEgaAwgZ2AFMuVdFNb4mCWUFbcP5LO
-txFLrEVToXqkeDB2MQswCQYDVQQGEwJERTEPMA0GA1UECBMGSGVzc2VuMQ4wDAYD
-VQQHEwVGdWxkYTEQMA4GA1UEChMHRGViY29uZjETMBEGA1UEAxMKRGViY29uZiBD
-QTEfMB0GCSqGSIb3DQEJARYQam9lcmdAZGViaWFuLm9yZ4IJAJigUTEEXRQpMAwG
-A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAGZXxHg4mnkvilRIM1EQfGdY
-S5b/WcyF2MYSTeTvK4aIB6VHwpZoZCnDGj2m2D3CkHT0upAD9o0zM1tdsfncLzV+
-mDT/jNmBtYo4QXx5vEPwvEIcgrWjwk7SyaEUhZjtolTkHB7ACl0oD0r71St4iEPR
-qTUCEXk2E47bg1Fz58wNt/yo2+4iqiRjg1XCH4evkQuhpW+dTZnDyFNqwSYZapOE
-TBA+9zBb6xD1KM2DdY7r4GiyYItN0BKLfuWbh9LXGbl1C+f4P11g+m2MPiavIeCe
-1iazG5pcS3KoTLACsYlEX24TINtg4kcuS81XdllcnsV3Kdts0nIqPj6uhTTZD0k=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDvjCCA3ygAwIBAgIFJQaThoEwCwYHKoZIzjgEAwUAMIGFMQswCQYDVQQGEwJG
-UjEPMA0GA1UECBMGRnJhbmNlMQ4wDAYDVQQHEwVQYXJpczEQMA4GA1UEChMHUE0v
-U0dETjEOMAwGA1UECxMFRENTU0kxDjAMBgNVBAMTBUlHQy9BMSMwIQYJKoZIhvcN
-AQkBFhRpZ2NhQHNnZG4ucG0uZ291di5mcjAeFw0wMjEyMTMxNDM5MTVaFw0yMDEw
-MTcxNDM5MTRaMIGFMQswCQYDVQQGEwJGUjEPMA0GA1UECBMGRnJhbmNlMQ4wDAYD
-VQQHEwVQYXJpczEQMA4GA1UEChMHUE0vU0dETjEOMAwGA1UECxMFRENTU0kxDjAM
-BgNVBAMTBUlHQy9BMSMwIQYJKoZIhvcNAQkBFhRpZ2NhQHNnZG4ucG0uZ291di5m
-cjCCAbYwggErBgcqhkjOOAQBMIIBHgKBgQCFkMImdk9zDzJfTO4XPdAAmLbAdWws
-ZiEMZh19RyTo3CyhFqO77OIXrwY6vc1pcc3MgWJ0dgQpAgrDMtmFFxpUu4gmjVsx
-8GpxQC+4VOgLY8Cvmcd/UDzYg07EIRto8BwCpPJ/JfUxwzV2V3N713aAX+cEoKZ/
-s+kgxC6nZCA7oQIVALME/JYjkdW2uKIGngsEPbXAjdhDAoGADh/uqWJx94UBm31c
-9d8ZTBfRGRnmSSRVFDgPWgA69JD4BR5da8tKz+1HjfMhDXljbMH86ixpD5Ka1Z0V
-pRYUPbyAoB37tsmXMJY7kjyD19d5VdaZboUjVvhH6UJy5lpNNNGSvFl4fqkxyvw+
-pq1QV0N5RcvK120hlXdfHUX+YKYDgYQAAoGAQGr7IuKJcYIvJRMjxwl43KxXY2xC
-aoCiM/bv117MfI94aNf1UusGhp7CbYAY9CXuL60P0oPMAajbaTE5Z34AuITeHq3Y
-CNMHwxalip8BHqSSGmGiQsXeK7T+r1rPXsccZ1c5ikGDZ4xn5gUaCyy2rCmb+fOJ
-6VAfCbAbAjmNKwejdzB1MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgFGMBUG
-A1UdIAQOMAwwCgYIKoF6AXkBAQEwHQYDVR0OBBYEFPkeNRcUf8idzpKblYbLNxs0
-MQhSMB8GA1UdIwQYMBaAFPkeNRcUf8idzpKblYbLNxs0MQhSMAsGByqGSM44BAMF
-AAMvADAsAhRVh+CJA5eVyEYU5AO9Tm7GxX0rmQIUBCqsU5u1WxoZ5lEXicDX5/Ob
-sRQ=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT
-AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ
-TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG
-9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw
-MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM
-BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO
-MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2
-LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI
-s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2
-xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4
-u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b
-F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx
-Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd
-PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV
-HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx
-NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF
-AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ
-L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY
-YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
-Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a
-NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R
-0982gaEbeC9xs/FZTEYYKKuF0mBWWg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDtTCCAp2gAwIBAgIRANAeQJAAAEZSAAAAAQAAAAQwDQYJKoZIhvcNAQEFBQAw
-gYkxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJEQzETMBEGA1UEBxMKV2FzaGluZ3Rv
-bjEXMBUGA1UEChMOQUJBLkVDT00sIElOQy4xGTAXBgNVBAMTEEFCQS5FQ09NIFJv
-b3QgQ0ExJDAiBgkqhkiG9w0BCQEWFWFkbWluQGRpZ3NpZ3RydXN0LmNvbTAeFw05
-OTA3MTIxNzMzNTNaFw0wOTA3MDkxNzMzNTNaMIGJMQswCQYDVQQGEwJVUzELMAkG
-A1UECBMCREMxEzARBgNVBAcTCldhc2hpbmd0b24xFzAVBgNVBAoTDkFCQS5FQ09N
-LCBJTkMuMRkwFwYDVQQDExBBQkEuRUNPTSBSb290IENBMSQwIgYJKoZIhvcNAQkB
-FhVhZG1pbkBkaWdzaWd0cnVzdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQCx0xHgeVVDBwhMywVCAOINg0Y95JO6tgbTDVm9PsHOQ2cBiiGo77zM
-0KLMsFWWU4RmBQDaREmA2FQKpSWGlO1jVv9wbKOhGdJ4vmgqRF4vz8wYXke8OrFG
-PR7wuSw0X4x8TAgpnUBV6zx9g9618PeKgw6hTLQ6pbNfWiKX7BmbwQVo/ea3qZGU
-LOR4SCQaJRk665WcOQqKz0Ky8BzVX/tr7WhWezkscjiw7pOp03t3POtxA6k4ShZs
-iSrK2jMTecJVjO2cu/LLWxD4LmE1xilMKtAqY9FlWbT4zfn0AIS2V0KFnTKo+SpU
-+/94Qby9cSj0u5C8/5Y0BONFnqFGKECBAgMBAAGjFjAUMBIGA1UdEwEB/wQIMAYB
-Af8CAQgwDQYJKoZIhvcNAQEFBQADggEBAARvJYbk5pYntNlCwNDJALF/VD6Hsm0k
-qS8Kfv2kRLD4VAe9G52dyntQJHsRW0mjpr8SdNWJt7cvmGQlFLdh6X9ggGvTZOir
-vRrWUfrAtF13Gn9kCF55xgVM8XrdTX3O5kh7VNJhkoHWG9YA8A6eKHegTYjHInYZ
-w8eeG6Z3ePhfm1bR8PIXrI6dWeYf/le22V7hXZ9F7GFoGUHhsiAm/lowdiT/QHI8
-eZ98IkirRs3bs4Ysj78FQdPB4xTjQRcm0HyncUwZ6EoPclgxfexgeqMiKL0ZJGA/
-O4dzwGvky663qyVDslUte6sGDnVdNOVdc22esnVApVnJTzFxiNmIf1Q=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx
-HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh
-IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0
-aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAwMFoXDTM3MTEyMDE1
-MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg
-SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M
-IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw
-DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U
-0pPlLYnKhHw/EEMbjIt8hFj4JHxIzyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItI
-TuLCxFlpMGK2MKKMCxGZYTVtfu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAf
-RC+iYkGzuxgh28pxPIzstrkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqF
-zQ6axOAAsNUl6twr5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqh
-BC4aMqiaILGcLCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEA
-AaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jY
-PXy+XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/
-BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNMeUWn
-9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7CegCgTXT
-Ct8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77BfWgDrvq2g+EQF
-Z7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oTLW4jYYehY0KswsuX
-n2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCzvhGbRWeDhhmH05i9CBoW
-H1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmwX7A5KGgOc90lmt4S
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx
-HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh
-IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0
-aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAwMFoXDTM3MDkyODIz
-NDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg
-SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M
-IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw
-DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ
-7ouZzU9AhqS2TcnZsdw8TQ2FTBVsRotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilb
-m2BPJoPRYxJWSXakFsKlnUWsi4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOY
-xFSMFkpBd4aVdQxHAWZg/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZ
-YYCLqJV+FNwSbKTQ2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbq
-JS5Gr42whTg0ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fx
-I2rSAG2X+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETz
-kxmlJ85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh
-EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNoKk/S
-Btc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJKg71ZDIM
-gtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1ExMVCgyhwn2RAu
-rda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
-FE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaAFE9pbQN+nZ8HGEO8txBO
-1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAO/Ouyugu
-h4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0cnAxa8cZmIDJgt43d15Ui47y6mdP
-yXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRFASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q
-7C+qPBR7V8F+GBRn7iTGvboVsNIYvbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKT
-RuidDV29rs4prWPVVRaAMCf/drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/
-ClTluUI8JPu3B5wwn3la5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyB
-M5kYJRF3p+v9WAksmWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQ
-my8YJPamTQr5O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xO
-AU++CrYD062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT
-9Y41xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H
-hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOLZ8/5
-fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
-MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
-IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
-MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
-FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
-bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
-dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
-H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
-uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
-mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
-a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
-E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
-WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
-VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
-Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
-cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
-IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
-AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
-YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
-6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
-Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
-c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
-mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU
-MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
-b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw
-MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
-QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD
-VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA
-A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul
-CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n
-tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl
-dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch
-PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC
-+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O
-BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E
-BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl
-MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk
-ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB
-IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X
-7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz
-43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
-eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl
-pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA
-WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU
-MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
-b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx
-MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB
-ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV
-BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV
-6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX
-GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP
-dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH
-1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF
-62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW
-BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw
-AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL
-MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU
-cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv
-b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6
-IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/
-iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
-GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh
-4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm
-XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU
-MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
-b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1
-MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK
-EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh
-BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B
-AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq
-xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G
-87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i
-2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U
-WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1
-0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G
-A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T
-AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr
-pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL
-ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm
-aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv
-hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm
-hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
-dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3
-P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y
-iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no
-xqE=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc
-MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP
-bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2
-MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft
-ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg
-Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk
-hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym
-1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW
-OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb
-2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko
-O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw
-AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU
-AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
-BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF
-Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb
-LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir
-oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C
-MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
-sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc
-MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP
-bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2
-MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft
-ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg
-Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP
-ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC
-206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci
-KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2
-JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9
-BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e
-Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B
-PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67
-Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq
-Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ
-o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3
-+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj
-YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj
-FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE
-AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn
-xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2
-LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc
-obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8
-CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe
-IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA
-DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F
-AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX
-Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb
-AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl
-Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw
-RY8mkaKO/qk=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
-RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
-VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX
-DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y
-ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy
-VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr
-mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr
-IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK
-mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu
-XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy
-dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye
-jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1
-BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3
-DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92
-9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
-jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0
-Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz
-ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS
-R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB
-gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
-A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
-BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw
-MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl
-YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P
-RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3
-UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI
-2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8
-Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp
-+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+
-DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O
-nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW
-/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g
-PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u
-QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY
-SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv
-IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
-RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4
-zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd
-BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB
-ZQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL
-MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
-BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT
-IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw
-MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy
-ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N
-T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv
-biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR
-FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J
-cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW
-BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
-BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm
-fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv
-GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn
-MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL
-ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg
-b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa
-MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB
-ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw
-IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B
-AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb
-unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d
-BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq
-7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3
-0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX
-roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG
-A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j
-aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p
-26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA
-BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud
-EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN
-BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
-aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB
-AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd
-p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi
-1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc
-XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0
-eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu
-tGWaIZDgqtCYvDi1czyL+Nw=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn
-MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL
-ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo
-YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9
-MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy
-NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G
-A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA
-A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0
-Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s
-QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV
-eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795
-B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh
-z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T
-AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i
-ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w
-TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH
-MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD
-VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE
-VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
-bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B
-AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM
-bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi
-ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG
-VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c
-ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/
-AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw
-PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz
-cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9
-MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz
-IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ
-ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR
-VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL
-kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd
-EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas
-H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0
-HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud
-DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4
-QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu
-Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/
-AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8
-yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR
-FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA
-ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB
-kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
-l7+ijrRU
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM
-MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD
-QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM
-MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD
-QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E
-jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo
-ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI
-ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu
-Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg
-AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7
-HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA
-uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa
-TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg
-xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q
-CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x
-O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs
-6GAqm4VKQPNriiTsBhYscw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
-MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
-GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
-YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
-MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
-BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
-GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua
-BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe
-3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4
-YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR
-rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm
-ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU
-oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
-MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
-QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t
-b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF
-AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q
-GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
-Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2
-G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi
-l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
-smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb
-MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
-GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp
-ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow
-fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
-A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV
-BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB
-BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM
-cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S
-HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996
-CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk
-3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz
-6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV
-HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
-EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv
-Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw
-Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww
-DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0
-5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
-Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI
-gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ
-aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl
-izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb
-MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
-GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0
-aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla
-MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
-BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD
-VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B
-AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW
-fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt
-TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL
-fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW
-1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7
-kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G
-A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD
-VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v
-ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo
-dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu
-Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/
-HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
-pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS
-jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+
-xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn
-dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb
-MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx
-ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w
-MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD
-VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx
-FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu
-ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7
-gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH
-fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a
-ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT
-ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF
-MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk
-c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto
-dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt
-aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI
-hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk
-QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/
-h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
-nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR
-rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2
-9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
-MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
-DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow
-PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
-Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O
-rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq
-OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b
-xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw
-7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD
-aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
-HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG
-SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69
-ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr
-AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
-R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5
-JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
-Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
-b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG
-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
-cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi
-MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c
-JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP
-mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+
-wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4
-VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/
-AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB
-AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
-BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
-pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC
-dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf
-fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm
-NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx
-H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
-+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
-QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
-MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
-b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
-CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
-nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
-43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
-T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
-gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
-BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
-TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
-DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
-hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
-06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
-PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
-YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
-CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
-ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
-MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
-LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
-RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
-+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
-PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
-xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
-Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
-hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
-EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
-MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
-FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
-nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
-eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
-hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
-Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
-vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
-+OkuE6N36B9K
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFijCCA3KgAwIBAgIQDHbanJEMTiye/hXQWJM8TDANBgkqhkiG9w0BAQUFADBf
-MQswCQYDVQQGEwJOTDESMBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdp
-Tm90YXIgUm9vdCBDQTEgMB4GCSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmww
-HhcNMDcwNTE2MTcxOTM2WhcNMjUwMzMxMTgxOTIxWjBfMQswCQYDVQQGEwJOTDES
-MBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdpTm90YXIgUm9vdCBDQTEg
-MB4GCSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmwwggIiMA0GCSqGSIb3DQEB
-AQUAA4ICDwAwggIKAoICAQCssFjBAL3YIQgLK5r+blYwBZ8bd5AQQVzDDYcRd46B
-8cp86Yxq7Th0Nbva3/m7wAk3tJZzgX0zGpg595NvlX89ubF1h7pRSOiLcD6VBMXY
-tsMW2YiwsYcdcNqGtA8Ui3rPENF0NqISe3eGSnnme98CEWilToauNFibJBN4ViIl
-HgGLS1Fx+4LMWZZpiFpoU8W5DQI3y0u8ZkqQfioLBQftFl9VkHXYRskbg+IIvvEj
-zJkd1ioPgyAVWCeCLvriIsJJsbkBgWqdbZ1Ad2h2TiEqbYRAhU52mXyC8/O3AlnU
-JgEbjt+tUwbRrhjd4rI6y9eIOI6sWym5GdOY+RgDz0iChmYLG2kPyes4iHomGgVM
-ktck1JbyrFIto0fVUvY//s6EBnCmqj6i8rZWNBhXouSBbefK8GrTx5FrAoNBfBXv
-a5pkXuPQPOWx63tdhvvL5ndJzaNl3Pe5nLjkC1+Tz8wwGjIczhxjlaX56uF0i57p
-K6kwe6AYHw4YC+VbqdPRbB4HZ4+RS6mKvNJmqpMBiLKR+jFc1abBUggJzQpjotMi
-puih2TkGl/VujQKQjBR7P4DNG5y6xFhyI6+2Vp/GekIzKQc/gsnmHwUNzUwoNovT
-yD4cxojvXu6JZOkd69qJfjKmadHdzIif0dDJZiHcBmfFlHqabWJMfczgZICynkeO
-owIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV
-HQ4EFgQUiGi/4I41xDs4a2L3KDuEgcgM100wDQYJKoZIhvcNAQEFBQADggIBADsC
-jcs8MOhuoK3yc7NfniUTBAXT9uOLuwt5zlPe5JbF0a9zvNXD0EBVfEB/zRtfCdXy
-fJ9oHbtdzno5wozWmHvFg1Wo1X1AyuAe94leY12hE8JdiraKfADzI8PthV9xdvBo
-Y6pFITlIYXg23PFDk9Qlx/KAZeFTAnVR/Ho67zerhChXDNjU1JlWbOOi/lmEtDHo
-M/hklJRRl6s5xUvt2t2AC298KQ3EjopyDedTFLJgQT2EkTFoPSdE2+Xe9PpjRchM
-Ppj1P0G6Tss3DbpmmPHdy59c91Q2gmssvBNhl0L4eLvMyKKfyvBovWsdst+Nbwed
-2o5nx0ceyrm/KkKRt2NTZvFCo+H0Wk1Ya7XkpDOtXHAd3ODy63MUkZoDweoAZbwH
-/M8SESIsrqC9OuCiKthZ6SnTGDWkrBFfGbW1G/8iSlzGeuQX7yCpp/Q/rYqnmgQl
-nQ7KN+ZQ/YxCKQSa7LnPS3K94gg2ryMvYuXKAdNw23yCIywWMQzGNgeQerEfZ1jE
-O1hZibCMjFCz2IbLaKPECudpSyDOwR5WS5WpI2jYMNjD67BVUc3l/Su49bsRn1NU
-9jQZjHkJNsphFyUXC4KYcwx3dMPVDceoEkzHp1RxRy4sGn3J4ys7SN4nhKdjNrN9
-j6BkOSQNPXuHr2ZcdBtLc7LljPCGmbjlxd+Ewbfr
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV
-UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL
-EwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJ
-BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x
-ETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCg
-bIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJENySZ
-j9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlV
-Sn5JTe2io74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCG
-SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx
-JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI
-RFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEw
-MjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5
-fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i
-+DAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG
-SIb3DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN
-QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+
-gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6w4pl
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID2DCCAsACEQDQHkCLAAACfAAAAAIAAAABMA0GCSqGSIb3DQEBBQUAMIGpMQsw
-CQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp
-dHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UE
-CxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDExITAfBgkqhkiG9w0B
-CQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODEyMDExODE4NTVaFw0wODExMjgx
-ODE4NTVaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMO
-U2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0
-IENvLjERMA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDEx
-ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcN
-AQEBBQADggEPADCCAQoCggEBANLGJrbnpT3BxGjVUG9TxW9JEwm4ryxIjRRqoxdf
-WvnTLnUv2Chi0ZMv/E3Uq4flCMeZ55I/db3rJbQVwZsZPdJEjdd0IG03Ao9pk1uK
-xBmd9LIO/BZsubEFkoPRhSxglD5FVaDZqwgh5mDoO3TymVBRaNADLbGAvqPYUrBE
-zUNKcI5YhZXhTizWLUFv1oTnyJhEykfbLCSlaSbPa7gnYsP0yXqSI+0TZ4KuRS5F
-5X5yP4WdlGIQ5jyRoa13AOAV7POEgHJ6jm5gl8ckWRA0g1vhpaRptlc1HHhZxtMv
-OnNn7pTKBBMFYgZwI7P0fO5F2WQLW0mqpEPOJsREEmy43XkCAwEAATANBgkqhkiG
-9w0BAQUFAAOCAQEAojeyP2n714Z5VEkxlTMr89EJFEliYIalsBHiUMIdBlc+Legz
-ZL6bqq1fG03UmZWii5rJYnK1aerZWKs17RWiQ9a2vAd5ZWRzfdd5ynvVWlHG4VME
-lo04z6MXrDlxawHDi1M8Y+nuecDkvpIyZHqzH5eUYr3qsiAVlfuX8ngvYzZAOONG
-Dx3drJXK50uQe7FLqdTF65raqtWjlBRGjS0f8zrWkzr2Pnn86Oawde3uPclwx12q
-gUtGJRzHbBXjlU4PqjI3lAoXJJIThFjSY28r9+ZbYgsTF7ANUkz+/m9c4pFuHf2k
-Ytdo+o56T9II2pPc8JIRetDccpMMc5NihWjQ9A==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV
-UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL
-EwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJ
-BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x
-ETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC/
-k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGODVvso
-LeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3o
-TQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCG
-SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx
-JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI
-RFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3
-MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6C
-TShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5
-WzAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG
-SIb3DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR
-xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVL
-B3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlihw6ID
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID2DCCAsACEQDQHkCLAAB3bQAAAAEAAAAEMA0GCSqGSIb3DQEBBQUAMIGpMQsw
-CQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp
-dHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UE
-CxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIxITAfBgkqhkiG9w0B
-CQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODExMzAyMjQ2MTZaFw0wODExMjcy
-MjQ2MTZaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMO
-U2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0
-IENvLjERMA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIx
-ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcN
-AQEBBQADggEPADCCAQoCggEBANx18IzAdZaawGIfJvfE4Zrq4FZzW5nNAUSoCLbV
-p9oaBBg5kkp4o4HC9Xd6ULRw/5qrxsfKboNPQpj7Jgva3G3WqZlVUmfpKAOS3OWw
-BZoPFflrWXJW8vo5/Kpo7g8fEIMv/J36F5bdguPmRX3AS4BEH+0s4IT9kVySVGkl
-5WJp3OXuAFK9MwutdQKFp2RQLcUZGTDAJtvJ0/0uma1ZtQtN1EGuhUhDWdy3qOKi
-3sOP17ihYqZoUFLkzzGnlIXan0YyF1bl8utmPRL/Q9uY73fPy4GNNLHGUEom0eQ+
-QVCvbK4iNC7Va26Dunm4dmVI2gkpZGMiuftHdoWMhkTLCdsCAwEAATANBgkqhkiG
-9w0BAQUFAAOCAQEAtTYOXeFhKFoRZcA/gwN5Tb4opgsHAlKFzfiR0BBstWogWxyQ
-2TA8xkieil5k+aFxd+8EJx8H6+Qm93N0yUQYGmbT4EOvkTvRyyzYdFQ6HE3K1GjN
-I3wdEJ5F6fYAbqbNGf9PLCmPV03Ed5K+4EwJ+11EhmYhqLkyolbV6YyDfFk/xPEL
-553snr2cGA4+wjl5KLcDDQjLxufZATdQEOzMYRZA1K8xdHv8PzGn0EdzMzkbzE5q
-10mDEQb+64JYMzJM8FasHpwvVpp7wUocpf1VNs78lk30sPDst2yC7S8xmUJMqbIN
-uBVd8d+6ybVK1GSYsyapMMj9puyrliGtf8J4tg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UEChML
-RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NBX0NQUyBp
-bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw
-IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVu
-dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDcxNjE2NDBaFw0yMDAy
-MDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
-LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
-YWIuKTElMCMGA1UECxMcKGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
-A1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
-MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7Ny
-Spj10InJrWPNTTVRaoTUrcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0
-iJBeAZfv6lOm3fzB3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn
-5JVn1j+SgF7yNH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHd
-BgNVHR8EgdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0
-MUAwPgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy
-ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5l
-dCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAy
-MDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQDAgEGMB8GA1UdIwQY
-MBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQWBBSEi3T9xY3A/ydtIDdF
-fP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4w
-AwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWAO9GK9Q6nIMstZVXQkvTnhLUGJoMS
-hAusO7JE7r3PQNsgDrpuFOow4DtifH+La3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/
-GpsKkMWr2tGzhtQvJFJcem3G8v7lTRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKd
-zmVml64mXg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UEChML
-RW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xfQ1BTIGlu
-Y29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg
-RW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJl
-IFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDQxNzIwMDBa
-Fw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE/MD0GA1UE
-CxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
-dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVk
-MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
-b24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO
-8GCGD9JYf9Mzly0XonUwtZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaB
-bL3+qPZ1V1eMkGxKwz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2
-dWcTC5/oVzbIXQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4
-QgEBBAQDAgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoT
-C0VudHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp
-bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw
-IEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0IFNlY3Vy
-ZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEw
-KwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIwNDE3NTAwMFowCwYD
-VR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc/vuLkpyw8m4iMB0GA1Ud
-DgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2
-fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBi24GRzsia
-d0Iv7L0no1MPUBvqTpLwqa+poLpIYcvvyQbvH9X07t9WLebKahlzqlO+krNQAraF
-JnJj2HVQYnUUt7NQGj/KEQALhUVpbbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1U
-yrrJzOCE98g+EZfTYAkYvAX/bIkz8OwVDw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
-RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
-bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
-IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy
-MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
-LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
-YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
-A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
-K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
-sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
-MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
-XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
-HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
-4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA
-vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G
-CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA
-WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo
-oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ
-h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18
-f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN
-B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy
-vUxFnmG6v4SBkgPR0ml8xQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UEBhMC
-VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50cnVzdC5u
-ZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBsaW1pdHMgbGlh
-Yi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
-BAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
-Fw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBaMIHJMQswCQYDVQQGEwJVUzEU
-MBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9D
-bGllbnRfQ0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjEl
-MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMq
-RW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0G
-CSqGSIb3DQEBAQUAA4GLADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo
-6oT9n3V5z8GKUZSvx1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux
-5zDeg7K6PvHViTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zm
-AqTmT173iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSC
-ARkwggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50
-cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5m
-by9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMp
-IDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQg
-Q2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCyg
-KqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9DbGllbnQxLmNybDArBgNV
-HRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkxMDEyMTkyNDMwWjALBgNVHQ8E
-BAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW/O5bs8qZdIuV6kwwHQYDVR0OBBYE
-FMT7nCl7l81MlvzuW7PKmXSLlepMMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA
-BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7
-pFuPeJoSSJn59DXeDDYHAmsQOokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzz
-wy5E97BnRqqS5TvaHBkUODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/a
-EkP/TOYGJqibGapEPHayXOw=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
-VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
-ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
-KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
-ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1
-MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE
-ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j
-b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
-bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg
-U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA
-A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/
-I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3
-wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC
-AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb
-oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
-BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
-dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk
-MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
-b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
-dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0
-MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi
-E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa
-MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
-hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN
-95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd
-2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC
-VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
-Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
-KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl
-cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw
-NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw
-NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy
-ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV
-BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ
-KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo
-Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4
-4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9
-KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI
-rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi
-94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB
-sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi
-gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo
-kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE
-vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
-A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t
-O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua
-AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP
-9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/
-eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m
-0vdXcDazv/wor3ElhVsT/h5/WrQ8
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
-UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
-dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
-MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
-dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
-AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
-BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
-cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
-AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
-MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
-aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
-ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
-IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
-MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
-A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
-7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
-1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc
-MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT
-ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw
-MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj
-dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l
-c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC
-UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc
-58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/
-o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH
-MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr
-aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA
-A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA
-Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv
-8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc
-MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT
-ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw
-MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j
-LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ
-KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo
-RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu
-WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw
-Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD
-AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK
-eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM
-zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+
-WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN
-/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj
-dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0
-NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD
-VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B
-AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G
-vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/
-BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C
-AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX
-MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl
-IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw
-NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq
-y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF
-MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
-A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy
-0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1
-E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMx
-IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1
-dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
-MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w
-HhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTELMAkGA1UEBhMCRVMx
-IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1
-dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
-MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5u
-Cp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5Vj1H5WuretXDE7aTt/6MNbg9kUDGvASdY
-rv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJHlShbz++AbOCQl4oBPB3z
-hxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf3H5idPay
-BQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcL
-iam8NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcb
-AgMBAAGjgZ8wgZwwKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lv
-bmFsLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0
-MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E
-FgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQADggEBAEdz/o0n
-VPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq
-u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36m
-hoEyIwOdyPdfwUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzfl
-ZKG+TQyTmAyX9odtsz/ny4Cm7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBp
-QWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YGVM+h4k0460tQtcsm9MracEpqoeJ5
-quGnM/b9Sh/22WA=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD
-VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv
-bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv
-b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV
-UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
-cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
-b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH
-iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS
-r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4
-04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r
-GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9
-3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P
-lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIB+jCCAWMCAgGjMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNVBAYTAlVTMRgwFgYD
-VQQKEw9HVEUgQ29ycG9yYXRpb24xHDAaBgNVBAMTE0dURSBDeWJlclRydXN0IFJv
-b3QwHhcNOTYwMjIzMjMwMTAwWhcNMDYwMjIzMjM1OTAwWjBFMQswCQYDVQQGEwJV
-UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMRwwGgYDVQQDExNHVEUgQ3liZXJU
-cnVzdCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC45k+625h8cXyv
-RLfTD0bZZOWTwUKOx7pJjTUteueLveUFMVnGsS8KDPufpz+iCWaEVh43KRuH6X4M
-ypqfpX/1FZSj1aJGgthoTNE3FQZor734sLPwKfWVWgkWYXcKIiXUT0Wqx73llt/5
-1KiOQswkwB6RJ0q1bQaAYznEol44AwIDAQABMA0GCSqGSIb3DQEBBAUAA4GBABKz
-dcZfHeFhVYAA1IFLezEPI2PnPfMD+fQ2qLvZ46WXTeorKeDWanOB5sCJo9Px4KWl
-IjeaY8JIILTbcuPI9tl8vrGvU9oUtCG41tWW4/5ODFlitppK+ULdjG+BqXH/9Apy
-bW1EDp3zdHSo1TRJ6V6e6bR64eVaH4QwnNOfpSXY
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
-MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
-YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
-EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
-R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
-9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
-fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
-iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
-1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
-bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
-MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
-ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
-uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
-Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
-tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
-PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
-hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
-5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW
-MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs
-IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG
-EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg
-R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A
-PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8
-Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL
-TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL
-5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7
-S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe
-2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
-FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap
-EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td
-EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv
-/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN
-A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0
-abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF
-I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz
-4iIprn2DQKi6bA==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY
-MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo
-R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx
-MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
-Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9
-AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA
-ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0
-7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W
-kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI
-mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G
-A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ
-KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1
-6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl
-4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K
-oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj
-UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU
-AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW
-MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy
-c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE
-BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0
-IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV
-VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8
-cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT
-QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh
-F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v
-c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w
-mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd
-VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX
-teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ
-f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe
-Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+
-nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB
-/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY
-MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG
-9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
-aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX
-IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn
-ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z
-uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN
-Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja
-QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW
-koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9
-ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt
-DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm
-bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW
-MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy
-c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD
-VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1
-c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
-AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81
-WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG
-FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq
-XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL
-se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb
-KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd
-IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73
-y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt
-hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc
-QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4
-Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV
-HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ
-KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
-dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ
-L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr
-Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo
-ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY
-T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz
-GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m
-1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV
-OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH
-6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX
-QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
-A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
-b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
-MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
-YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
-aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
-jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
-xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
-1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
-snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
-U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
-9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
-BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
-AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
-yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
-38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
-AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
-DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
-HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G
-A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp
-Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1
-MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG
-A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL
-v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8
-eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq
-tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd
-C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa
-zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB
-mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH
-V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n
-bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG
-3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs
-J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO
-291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS
-ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd
-AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
-TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh
-MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE
-YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3
-MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo
-ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg
-MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN
-ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA
-PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w
-wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi
-EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY
-avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+
-YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE
-sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h
-/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5
-IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
-ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy
-OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P
-TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
-HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER
-dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf
-ReYNnyicsbkqWletNw+vHX/bvZ8=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT
-MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE
-ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE
-ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl
-SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl
-SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3
-DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAwNTkzOFoXDTI1MTIyNzAw
-NTkzOFowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD
-VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n
-IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g
-IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv
-biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv
-biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN
-BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA4FEnpwvdr9G5Q1uCN0VWcu+atsIS7ywS
-zHb5BlmvXSHU0lq4oNTzav3KaY1mSPd05u42veiWkXWmcSjK5yISMmmwPh5r9FBS
-YmL9Yzt9fuzuOOpi9GyocY3h6YvJP8a1zZRCb92CRTzo3wno7wpVqVZHYUxJZHMQ
-KD/Kvwn/xi8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBTrsxl588GlHKzcuh9morKb
-adB4CDCCAUQGA1UdIwSCATswggE3gBTrsxl588GlHKzcuh9morKbadB4CKGCARqk
-ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE
-BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT
-ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC
-LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g
-QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g
-QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD
-VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr
-BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB
-FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC
-AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB
-D2lwc0BtYWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UxIENBIENlcnRp
-ZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC
-BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQtFito
-dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMD8GCWCG
-SAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25D
-TEFTRTEuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lw
-czIwMDIvcmVuZXdhbENMQVNFMS5odG1sPzA6BglghkgBhvhCAQgELRYraHR0cDov
-L3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTEuaHRtbDBzBgNVHR8EbDBq
-MDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEu
-Y3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy
-Q0xBU0UxLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9v
-Y3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAK9Dr/drIyllq2tPMMi7JVBuK
-Yn4VLenZMdMu9Ccj/1urxUq2ckCuU3T0vAW0xtnIyXf7t/k0f3gA+Nak5FI/LEpj
-V4F1Wo7ojPsCwJTGKbqz3Bzosq/SLmJbGqmODszFV0VRFOlOHIilkfSj945RyKm+
-hjM+5i9Ibq9UkE6tsSU=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT
-MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE
-ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE
-ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl
-SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl
-SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3
-DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMDE0NFoXDTI1MTIyNzAx
-MDE0NFowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD
-VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n
-IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g
-IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv
-biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv
-biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN
-BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAqxf+DrDGaBtT8FK+n/ra+osTBLsBjzLZ
-H49NzjaY2uQARIwo2BNEKqRrThckQpzTiKRBgtYj+4vJhuW5qYIF3PHeH+AMmVWY
-8jjsbJ0gA8DvqqPGZARRLXgNo9KoOtYkTOmWehisEyMiG3zoMRGzXwmqMHBxRiVr
-SXGAK5UBsh8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBS4k/8uy9wsjqLnev42USGj
-mFsMNDCCAUQGA1UdIwSCATswggE3gBS4k/8uy9wsjqLnev42USGjmFsMNKGCARqk
-ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE
-BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT
-ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC
-LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g
-QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g
-QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD
-VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr
-BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB
-FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC
-AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB
-D2lwc0BtYWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UzIENBIENlcnRp
-ZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC
-BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQtFito
-dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMD8GCWCG
-SAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25D
-TEFTRTMuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lw
-czIwMDIvcmVuZXdhbENMQVNFMy5odG1sPzA6BglghkgBhvhCAQgELRYraHR0cDov
-L3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTMuaHRtbDBzBgNVHR8EbDBq
-MDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMu
-Y3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy
-Q0xBU0UzLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9v
-Y3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAF2VcmZVDAyevJuXr0LMXI/dD
-qsfwfewPxqmurpYPdikc4gYtfibFPPqhwYHOU7BC0ZdXGhd+pFFhxu7pXu8Fuuu9
-D6eSb9ijBmgpjnn1/7/5p6/ksc7C0YBCJwUENPjDfxZ4IwwHJPJGR607VNCv1TGy
-r33I6unUVtkOE7LFRVA=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT
-MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE
-ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE
-ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm
-SVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT
-JklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI
-hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNTMyWhcNMjUxMjI3
-MDEwNTMyWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ
-BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp
-bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G
-LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw
-gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALsw19zQVL01Tp/FTILq0VA8R5j8
-m2mdd81u4D/u6zJfX5/S0HnllXNEITLgCtud186Nq1KLK3jgm1t99P1tCeWu4Wwd
-ByOgF9H5fahGRpEiqLJpxq339fWUoTCUvQDMRH/uxJ7JweaPCjbB/SQ9AaD1e+J8
-eGZDi09Z8pvZ+kmzAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUZyaW56G/2LUDnf47
-3P7yiuYV3TAwggFGBgNVHSMEggE9MIIBOYAUZyaW56G/2LUDnf473P7yiuYV3TCh
-ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ
-BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp
-bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G
-LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC
-AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF
-BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB
-BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg
-hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud
-EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMSBD
-QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG
-SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgBhvhC
-AQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMS5j
-cmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2
-b2NhdGlvbkNMQVNFQTEuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cu
-aXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTEuaHRtbD8wOwYJYIZIAYb4QgEI
-BC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VBMS5odG1s
-MHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvaXBz
-MjAwMkNMQVNFQTEuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz
-MjAwMi9pcHMyMDAyQ0xBU0VBMS5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF
-BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAH66iqyA
-AIQVCtWYUQxkxZwCWINmyq0eB81+atqAB98DNEock8RLWCA1NnHtogo1EqWmZaeF
-aQoO42Hu6r4okzPV7Oi+xNtff6j5YzHIa5biKcJboOeXNp13XjFr/tOn2yrb25aL
-H2betgPAK7N41lUH5Y85UN4HI3LmvSAUS7SG
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT
-MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE
-ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE
-ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm
-SVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT
-JklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI
-hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNzUwWhcNMjUxMjI3
-MDEwNzUwWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ
-BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp
-bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G
-LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw
-gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAO6AAPYaZC6tasiDsYun7o/ZttvN
-G7uGBiJ2MwwSbUhWYdLcgiViL5/SaTBlA0IjWLxH3GvWdV0XPOH/8lhneaDBgbHU
-VqLyjRGZ/fZ98cfEXgIqmuJKtROKAP2Md4bm15T1IHUuDky/dMQ/gT6DtKM4Ninn
-6Cr1jIhBqoCm42zvAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUHp9XUEe2YZM50yz8
-2l09BXW3mQIwggFGBgNVHSMEggE9MIIBOYAUHp9XUEe2YZM50yz82l09BXW3mQKh
-ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ
-BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp
-bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G
-LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC
-AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF
-BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB
-BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg
-hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud
-EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMyBD
-QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG
-SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgBhvhC
-AQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMy5j
-cmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2
-b2NhdGlvbkNMQVNFQTMuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cu
-aXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTMuaHRtbD8wOwYJYIZIAYb4QgEI
-BC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VBMy5odG1s
-MHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvaXBz
-MjAwMkNMQVNFQTMuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz
-MjAwMi9pcHMyMDAyQ0xBU0VBMy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF
-BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAEo9IEca
-2on0eisxeewBwMwB9dbB/MjD81ACUZBYKp/nNQlbMAqBACVHr9QPDp5gJqiVp4MI
-3y2s6Q73nMify5NF8bpqxmdRSmlPa/59Cy9SKcJQrSRE7SOzSMtEQMEDlQwKeAYS
-AfWRMS1Jjbs/RU4s4OjNtckUFQzjB4ObJnXv
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARwxCzAJBgNVBAYTAkVT
-MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE
-ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE
-ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEzMDEGA1UECxMq
-SVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTMwMQYD
-VQQDEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx
-HjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczAeFw0wMTEyMjkwMDUzNTha
-Fw0yNTEyMjcwMDUzNThaMIIBHDELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl
-bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQg
-cHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMu
-ZXMgQy5JLkYuICBCLTYwOTI5NDUyMTMwMQYDVQQLEypJUFMgQ0EgQ2hhaW5lZCBD
-QXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxMzAxBgNVBAMTKklQUyBDQSBDaGFp
-bmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYP
-aXBzQG1haWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcVpJJ
-spQgvJhPUOtopKdJC7/SMejHT8KGC/po/UNaivNgkjWZOLtNA1IhW/A3mTXhQSCB
-hYEFcYGdtJUZqV92NC5jNzVXjrQfQj8VXOF6wV8TGDIxya2+o8eDZh65nAQTy2nB
-Bt4wBrszo7Uf8I9vzv+W6FS+ZoCua9tBhDaiPQIDAQABo4IEQzCCBD8wHQYDVR0O
-BBYEFKGtMbH5PuEXpsirNPxShwkeYlJBMIIBTgYDVR0jBIIBRTCCAUGAFKGtMbH5
-PuEXpsirNPxShwkeYlJBoYIBJKSCASAwggEcMQswCQYDVQQGEwJFUzESMBAGA1UE
-CBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJ
-bnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0Bt
-YWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxMzAxBgNVBAsTKklQUyBDQSBD
-aGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEzMDEGA1UEAxMqSVBT
-IENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI
-hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E
-BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMG
-CCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYB
-BAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMw
-EYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBC
-BglghkgBhvhCAQ0ENRYzQ2hhaW5lZCBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkg
-aHR0cDovL3d3dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlw
-cy5lcy9pcHMyMDAyLzA3BglghkgBhvhCAQQEKhYoaHR0cDovL3d3dy5pcHMuZXMv
-aXBzMjAwMi9pcHMyMDAyQ0FDLmNybDA8BglghkgBhvhCAQMELxYtaHR0cDovL3d3
-dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0aW9uQ0FDLmh0bWw/MDkGCWCGSAGG+EIB
-BwQsFipodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3JlbmV3YWxDQUMuaHRtbD8w
-NwYJYIZIAYb4QgEIBCoWKGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5
-Q0FDLmh0bWwwbQYDVR0fBGYwZDAuoCygKoYoaHR0cDovL3d3dy5pcHMuZXMvaXBz
-MjAwMi9pcHMyMDAyQ0FDLmNybDAyoDCgLoYsaHR0cDovL3d3d2JhY2suaXBzLmVz
-L2lwczIwMDIvaXBzMjAwMkNBQy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF
-BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAERyMJ1W
-WKJBGyi3leGmGpVfp3hAK+/blkr8THFj2XOVvQLiogbHvpcqk4A0hgP63Ng9HgfN
-HnNDJGD1HWHc3JagvPsd4+cSACczAsDAK1M92GsDgaPb1pOVIO/Tln4mkImcJpvN
-b2ar7QMiRDjMWb2f2/YHogF/JsRj9SVCXmK9
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICtzCCAiACAQAwDQYJKoZIhvcNAQEEBQAwgaMxCzAJBgNVBAYTAkVTMRIwEAYD
-VQQIEwlCQVJDRUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcGA1UEChMQSVBT
-IFNlZ3VyaWRhZCBDQTEYMBYGA1UECxMPQ2VydGlmaWNhY2lvbmVzMRcwFQYDVQQD
-Ew5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVz
-MB4XDTk4MDEwMTIzMjEwN1oXDTA5MTIyOTIzMjEwN1owgaMxCzAJBgNVBAYTAkVT
-MRIwEAYDVQQIEwlCQVJDRUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcGA1UE
-ChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYGA1UECxMPQ2VydGlmaWNhY2lvbmVzMRcw
-FQYDVQQDEw5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwu
-aXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCsT1J0nznqjtwlxLyY
-XZhkJAk8IbPMGbWOlI6H0fg3PqHILVikgDVboXVsHUUMH2Fjal5vmwpMwci4YSM1
-gf/+rHhwLWjhOgeYlQJU3c0jt4BT18g3RXIGJBK6E2Ehim51KODFDzT9NthFf+G4
-Nu+z4cYgjui0OLzhPvYR3oydAQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBACzzw3lY
-JN7GO9HgQmm47mSzPWIBubOE3yN93ZjPEKn+ANgilgUTB1RXxafey9m4iEL2mdsU
-dx+2/iU94aI+A6mB0i1sR/WWRowiq8jMDQ6XXotBtDvECgZAHd1G9AHduoIuPD14
-cJ58GNCr+Lh3B0Zx8coLY1xq+XKU1QFPoNtC
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIIODCCB6GgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCAR4xCzAJBgNVBAYTAkVT
-MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE
-ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE
-ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjE0MDIGA1UECxMr
-SVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTE0MDIG
-A1UEAxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
-eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMTAx
-OFoXDTI1MTIyNzAxMTAxOFowggEeMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFy
-Y2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5l
-dCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlw
-cy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxNDAyBgNVBAsTK0lQUyBDQSBUaW1lc3Rh
-bXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxNDAyBgNVBAMTK0lQUyBDQSBU
-aW1lc3RhbXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0B
-CQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
-vLjuVqWajOY2ycJioGaBjRrVetJznw6EZLqVtJCneK/K/lRhW86yIFcBrkSSQxA4
-Efdo/BdApWgnMjvEp+ZCccWZ73b/K5Uk9UmSGGjKALWkWi9uy9YbLA1UZ2t6KaFY
-q6JaANZbuxjC3/YeE1Z2m6Vo4pjOxgOKNNtMg0GmqaMCAwEAAaOCBIAwggR8MB0G
-A1UdDgQWBBSL0BBQCYHynQnVDmB4AyKiP8jKZjCCAVAGA1UdIwSCAUcwggFDgBSL
-0BBQCYHynQnVDmB4AyKiP8jKZqGCASakggEiMIIBHjELMAkGA1UEBhMCRVMxEjAQ
-BgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJ
-UFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJp
-cHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMTQwMgYDVQQLEytJUFMg
-Q0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTQwMgYDVQQD
-EytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4w
-HAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM
-BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYB
-BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB
-FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYD
-VR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlw
-cy5lczBHBglghkgBhvhCAQ0EOhY4VGltZXN0YW1waW5nIENBIENlcnRpZmljYXRl
-IGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgECBBwWGmh0
-dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMEAGCWCGSAGG+EIBBAQzFjFodHRwOi8v
-d3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMEUGCWCG
-SAGG+EIBAwQ4FjZodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25U
-aW1lc3RhbXBpbmcuaHRtbD8wQgYJYIZIAYb4QgEHBDUWM2h0dHA6Ly93d3cuaXBz
-LmVzL2lwczIwMDIvcmVuZXdhbFRpbWVzdGFtcGluZy5odG1sPzBABglghkgBhvhC
-AQgEMxYxaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lUaW1lc3RhbXBp
-bmcuaHRtbDB/BgNVHR8EeDB2MDegNaAzhjFodHRwOi8vd3d3Lmlwcy5lcy9pcHMy
-MDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMDugOaA3hjVodHRwOi8vd3d3YmFj
-ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyVGltZXN0YW1waW5nLmNybDAvBggrBgEF
-BQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZI
-hvcNAQEFBQADgYEAZbrBzAAalZHK6Ww6vzoeFAh8+4Pua2JR0zORtWB5fgTYXXk3
-6MNbsMRnLWhasl8OCvrNPzpFoeo2zyYepxEoxZSPhExTCMWTs/zif/WN87GphV+I
-3pGW7hdbrqXqcGV4LCFkAZXOzkw+UPS2Wctjjba9GNSHSl/c7+lW8AoM6HU=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx
-ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0
-b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD
-EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05
-OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G
-A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh
-Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l
-dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG
-SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK
-gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX
-iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc
-Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E
-BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G
-SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu
-b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh
-bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv
-Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln
-aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0
-IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh
-c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph
-biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo
-ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP
-UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj
-YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo
-dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA
-bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06
-sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa
-n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS
-NitjrFgBazMpUIaD8QFI
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx
-ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0
-b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD
-EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X
-DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw
-DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u
-c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr
-TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN
-BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA
-OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC
-2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW
-RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P
-AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW
-ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0
-YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz
-b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO
-ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB
-IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs
-b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs
-ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s
-YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg
-a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g
-SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0
-aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg
-YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg
-Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY
-ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g
-pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4
-Fp1hBWeAyNDYpQcCNJgEjTME1A==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV
-MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe
-TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0
-dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB
-KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0
-N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC
-dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu
-MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL
-b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD
-zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi
-3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8
-WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY
-Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi
-NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC
-ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4
-QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0
-YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz
-aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu
-IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm
-ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg
-ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs
-amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv
-IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3
-Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6
-ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1
-YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg
-dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs
-b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G
-CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO
-xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP
-0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ
-QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk
-f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK
-8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUx
-ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0
-b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQD
-EzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVneXpvaSAoQ2xhc3MgUUEpIFRhbnVz
-aXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0bG9jay5odTAeFw0w
-MzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTERMA8G
-A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh
-Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5l
-dExvY2sgTWlub3NpdGV0dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZh
-bnlraWFkbzEeMBwGCSqGSIb3DQEJARYPaW5mb0BuZXRsb2NrLmh1MIIBIjANBgkq
-hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRVCacbvWy5FPSKAtt2/Goq
-eKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e8ia6AFQe
-r7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO5
-3Lhbm+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWd
-vLrqOU+L73Sa58XQ0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0l
-mT+1fMptsK6ZmfoIYOcZwvK9UdPM0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4IC
-wDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAQYwggJ1Bglg
-hkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2YW55IGEgTmV0
-TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh
-biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQg
-ZWxla3Ryb25pa3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywg
-dmFsYW1pbnQgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6
-b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwgYXogQWx0YWxhbm9zIFN6ZXJ6b2Rl
-c2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kgZWxqYXJhcyBtZWd0
-ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczovL3d3
-dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0Bu
-ZXRsb2NrLm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBh
-bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRo
-ZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3
-Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0IGluZm9AbmV0bG9jay5u
-ZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3DQEBBQUA
-A4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQ
-MznNwNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+
-NFAwLvt/MpqNPfMgW/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCR
-VCHnpgu0mfVRQdzNo0ci2ccBgcTcR08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY
-83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR5qq5aKrN9p2QdRLqOBrKROi3
-macqaJVmlaut74nLYKkGEsaUR+ko
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi
-MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
-MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp
-dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV
-UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO
-ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz
-c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP
-OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl
-mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF
-BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4
-qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw
-gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB
-BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu
-bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp
-dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8
-6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/
-h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH
-/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
-wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN
-pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC
-TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0
-aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0
-aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz
-MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw
-IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR
-dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp
-li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D
-rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ
-WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug
-F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU
-xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC
-Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv
-dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw
-ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl
-IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh
-c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy
-ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
-Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI
-KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T
-KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq
-y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p
-dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD
-VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL
-MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk
-fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8
-7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R
-cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y
-mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW
-xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK
-SnQ2+Q==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
-GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
-b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV
-BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
-YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa
-GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg
-Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J
-WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB
-rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp
-+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1
-ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i
-Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz
-PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og
-/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH
-oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI
-yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud
-EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2
-A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL
-MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
-ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f
-BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn
-g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl
-fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K
-WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha
-B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc
-hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR
-TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD
-mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z
-ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y
-4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza
-8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
-GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
-b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV
-BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
-YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM
-V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB
-4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr
-H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd
-8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv
-vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT
-mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe
-btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc
-T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt
-WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ
-c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A
-4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD
-VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG
-CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0
-aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
-aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu
-dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw
-czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G
-A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC
-TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg
-Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0
-7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem
-d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd
-+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B
-4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN
-t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x
-DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57
-k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s
-zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j
-Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT
-mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK
-4SVhM7JZG+Ju1zdXtg2pEto=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
-IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
-BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
-aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
-9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy
-NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
-azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
-YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
-Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
-cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD
-cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs
-2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY
-JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE
-Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ
-n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A
-PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUFADA6
-MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp
-dHkgMTAyNCBWMzAeFw0wMTAyMjIyMTAxNDlaFw0yNjAyMjIyMDAxNDlaMDoxGTAX
-BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAx
-MDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDV3f5mCc8kPD6ugU5O
-isRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dYrIMKo1W1exeQFYRMiu4mmdxY
-78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYtbzZUaMjShFbuklNhCbM/OZuoyZu9
-zp9+1BlqFikYvtc6adwlWzMaUQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4G
-A1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAd
-BgNVHQ4EFgQUxMAcpAeU/c1NAdRU2qUMX96uBVowDQYJKoZIhvcNAQEFBQADgYEA
-Py1q4yZDlX2Jl2X7deRyHUZXxGFraZ8SmyzVWujAovBDleMf6XbN3Ou8k6BlCsdN
-T1+nr6JGFLkM88y9am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNumU4/iXgD
-mMrzVcydro7BqkWY+o8aoI2II/EVQQ2lRj6RP4vr93E=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6
-MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp
-dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX
-BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy
-MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp
-eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg
-/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl
-wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh
-AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2
-PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu
-AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
-BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR
-MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc
-HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/
-Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+
-f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO
-rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch
-6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3
-7CAFYd4=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI
-MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
-FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz
-MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv
-cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN
-AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz
-Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO
-0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao
-wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj
-7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS
-8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT
-BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
-/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg
-JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC
-NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3
-6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/
-3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm
-D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS
-CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
-3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK
-MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
-GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx
-MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg
-Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ
-iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa
-/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ
-jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI
-HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7
-sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w
-gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF
-MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw
-KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG
-AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L
-URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO
-H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm
-I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY
-iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
-f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY
-MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t
-dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5
-WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD
-VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3
-DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8
-9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ
-DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9
-Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N
-QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ
-xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G
-A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T
-AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG
-kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr
-Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5
-Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU
-JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot
-RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP
-MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAx
-MDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNV
-BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBDQTCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H887dF+2rDNbS82rDTG
-29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9EJUk
-oVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk
-3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBL
-qdReLjVQCfOAl/QMF6452F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIIN
-nvmLVz5MxxftLItyM19yejhW1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEw
-DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEG
-MA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuX
-ZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0H
-DjxVyhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VO
-TzF2nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv
-kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4w
-zMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP
-MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx
-MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV
-BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o
-Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt
-5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s
-3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej
-vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu
-8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw
-DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG
-MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil
-zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/
-3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD
-FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6
-Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2
-ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO
-TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh
-dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy
-MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk
-ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn
-ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71
-9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO
-hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U
-tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o
-BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh
-SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww
-OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv
-cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA
-7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k
-/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm
-eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6
-u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy
-7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
-iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl
-MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp
-U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw
-NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE
-ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp
-ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3
-DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf
-8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN
-+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0
-X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa
-K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA
-1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G
-A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR
-zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0
-YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD
-bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w
-DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3
-L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D
-eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
-xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp
-VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY
-WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW
-MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
-Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9
-MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
-U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
-cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
-A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
-pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf
-OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C
-Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT
-Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi
-HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
-Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w
-+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
-Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3
-Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B
-26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
-AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
-FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j
-ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js
-LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM
-BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0
-Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy
-dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh
-cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh
-YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg
-dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp
-bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ
-YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT
-TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ
-9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8
-jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW
-FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz
-ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1
-ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L
-EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu
-L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
-yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC
-O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V
-um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh
-NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFFjCCBH+gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBsDELMAkGA1UEBhMCSUwx
-DzANBgNVBAgTBklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0
-Q29tIEx0ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBG
-cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS
-YWRtaW5Ac3RhcnRjb20ub3JnMB4XDTA1MDMxNzE3Mzc0OFoXDTM1MDMxMDE3Mzc0
-OFowgbAxCzAJBgNVBAYTAklMMQ8wDQYDVQQIEwZJc3JhZWwxDjAMBgNVBAcTBUVp
-bGF0MRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMRowGAYDVQQLExFDQSBBdXRob3Jp
-dHkgRGVwLjEpMCcGA1UEAxMgRnJlZSBTU0wgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
-dHkxITAfBgkqhkiG9w0BCQEWEmFkbWluQHN0YXJ0Y29tLm9yZzCBnzANBgkqhkiG
-9w0BAQEFAAOBjQAwgYkCgYEA7YRgACOeyEpRKSfeOqE5tWmrCbIvNP1h3D3TsM+x
-18LEwrHkllbEvqoUDufMOlDIOmKdw6OsWXuO7lUaHEe+o5c5s7XvIywI6Nivcy+5
-yYPo7QAPyHWlLzRMGOh2iCNJitu27Wjaw7ViKUylS7eYtAkUEKD4/mJ2IhULpNYI
-LzUCAwEAAaOCAjwwggI4MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgHmMB0G
-A1UdDgQWBBQcicOWzL3+MtUNjIExtpidjShkjTCB3QYDVR0jBIHVMIHSgBQcicOW
-zL3+MtUNjIExtpidjShkjaGBtqSBszCBsDELMAkGA1UEBhMCSUwxDzANBgNVBAgT
-BklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4x
-GjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBGcmVlIFNTTCBD
-ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYSYWRtaW5Ac3Rh
-cnRjb20ub3JnggEAMB0GA1UdEQQWMBSBEmFkbWluQHN0YXJ0Y29tLm9yZzAdBgNV
-HRIEFjAUgRJhZG1pbkBzdGFydGNvbS5vcmcwEQYJYIZIAYb4QgEBBAQDAgAHMC8G
-CWCGSAGG+EIBDQQiFiBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAy
-BglghkgBhvhCAQQEJRYjaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL2NhLWNybC5j
-cmwwKAYJYIZIAYb4QgECBBsWGWh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy8wOQYJ
-YIZIAYb4QgEIBCwWKmh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9pbmRleC5waHA/
-YXBwPTExMTANBgkqhkiG9w0BAQQFAAOBgQBscSXhnjSRIe/bbL0BCFaPiNhBOlP1
-ct8nV0t2hPdopP7rPwl+KLhX6h/BquL/lp9JmeaylXOWxkjHXo0Hclb4g4+fd68p
-00UOpO6wNnQt8M2YI3s3S9r+UZjEHjQ8iP2ZO1CnwYszx8JSFhKVU2Ui77qLzmLb
-cCOxgN8aIDjnfg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
-BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln
-biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF
-MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT
-d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
-CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8
-76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+
-bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c
-6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE
-emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd
-MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt
-MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y
-MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y
-FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi
-aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM
-gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB
-qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7
-lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn
-8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
-L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6
-45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO
-UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5
-O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC
-bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv
-GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a
-77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC
-hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3
-92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp
-Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w
-ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt
-Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE
-BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWdu
-IFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAw
-WjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMSMwIQYDVQQD
-ExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQAD
-ggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu669y
-IIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2Htn
-IuJpX+UFeNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+
-6ixuEFGSzH7VozPY1kneWCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5ob
-jM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcw
-izSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl
-+zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrY
-zt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaP
-pZjydomyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtF
-KwH3HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW
-ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMB
-AAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
-BBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCvzAeHFUdvOMW0
-ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW
-IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUA
-A4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0
-uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+
-FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4U99REJNi54Av4tHgvI42Rncz7Lj7
-jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/
-u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8D
-YSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1
-puEa+S1BaYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXa
-icYwu+uPyyIIoK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbG
-DI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51x
-kcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z
-Wr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE
-BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu
-IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow
-RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY
-U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
-MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv
-Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br
-YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF
-nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH
-6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt
-eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/
-c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ
-MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH
-HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf
-jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6
-5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB
-rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU
-F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c
-wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
-cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB
-AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp
-WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9
-xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ
-2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ
-IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8
-aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X
-em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR
-dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/
-OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+
-hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy
-tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk
-MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0
-YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg
-Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT
-AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp
-Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN
-BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9
-m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih
-FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/
-TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F
-EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco
-kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu
-HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF
-vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo
-19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC
-L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW
-bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX
-JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw
-FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
-BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc
-K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf
-ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik
-Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB
-sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e
-3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR
-ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip
-mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH
-b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf
-rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms
-hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y
-zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6
-MBr1mmz0DlP5OlvRHA==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF
-MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU
-QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI
-MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAyIENBMSkwJwYJKoZIhvcN
-AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla
-Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy
-ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y
-IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1
-c3RDZW50ZXIgQ2xhc3MgMiBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA
-dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANo46O0y
-AClxgwENv4wB3NrGrTmkqYov1YtcaF9QxmL1Zr3KkSLsqh1R1z2zUbKDTl3LSbDw
-TFXlay3HhQswHJJOgtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5Nu6hLVxa8
-/vhYnvgpjbB7zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQF
-MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3
-LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G
-CSqGSIb3DQEBBAUAA4GBAIRS+yjf/x91AbwBvgRWl2p0QiQxg/lGsQaKic+WLDO/
-jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ29ELw+HkuCkhcq8xRT3h2oNms
-Gb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/AcASZ4smZHcFFk
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF
-MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU
-QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI
-MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAzIENBMSkwJwYJKoZIhvcN
-AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla
-Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy
-ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y
-IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1
-c3RDZW50ZXIgQ2xhc3MgMyBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA
-dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALa0wTUF
-Lg2N7KBAahwOJ6ZQkmtQGwfeLud2zODa/ISoXoxjaitN2U4CdhHBC/KNecoAtvGw
-Dtf7pBc9r6tpepYnv68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+77uMMfTDW
-w1Krj10nnGvAo+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQF
-MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3
-LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G
-CSqGSIb3DQEBBAUAA4GBABY9xs3Bu4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4iJIE
-Tb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm5gZOngylerpuw3yCGdHHsbHD
-2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQSCdS7kjXvD9s0
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE
-SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg
-Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV
-BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl
-cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA
-vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu
-Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a
-0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1
-4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN
-eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD
-R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG
-A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu
-dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME
-Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3
-WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw
-HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ
-KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO
-Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX
-wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+
-2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89
-9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0
-jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38
-aQNiuJkFBT1reBK9sG9l
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJE
-SzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEw
-ODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNU
-REMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuHnEz9pPPEXyG9VhDr
-2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0zY0s
-2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItU
-GBxIYXvViGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKj
-dGqPqcNiKXEx5TukYBdedObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+r
-TpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/
-BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkB
-AQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBv
-c2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRl
-ciBmcmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEu
-MS4xLiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg
-T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1Ud
-HwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERDMRQwEgYD
-VQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYmaHR0cDovL2Ny
-bC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy
-MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZ
-J2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqG
-SIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACrom
-JkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4A9G28kNBKWKnctj7fAXmMXAnVBhO
-inxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2Y
-caaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoB
-mbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQ
-YqbsFbS1AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9
-BKNDLdr8C2LqL19iUw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc
-UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx
-c8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg
-MjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8
-dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz
-MjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy
-dGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD
-VQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg
-xLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu
-xZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7
-XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k
-heiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J
-YbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C
-urKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1
-JuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51
-b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV
-9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7
-kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh
-fEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy
-B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA
-aLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS
-RGQDJereW26fyfJOrN3H
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc
-UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx
-c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS
-S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg
-SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3
-WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv
-bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU
-UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw
-bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe
-LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
-AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef
-J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh
-R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ
-Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX
-JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p
-zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S
-Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ
-KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq
-ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4
-Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz
-gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH
-uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS
-y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/
-MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow
-PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
-AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR
-IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q
-gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy
-yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts
-F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2
-jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx
-ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC
-VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK
-YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH
-EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN
-Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud
-DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE
-MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK
-UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
-TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf
-qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK
-ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE
-JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7
-hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1
-EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm
-nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX
-udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz
-ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe
-LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl
-pYYsfPQS
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkEx
-FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
-VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
-ZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBlcnNvbmFsIEJhc2lj
-IENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tMB4X
-DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpBMRUw
-EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE
-ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy
-dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBD
-QTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzAN
-BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53
-dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdK
-wPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7
-G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF
-AAOBgQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7
-c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P
-9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx
-FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
-VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
-ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt
-YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu
-Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT
-AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa
-MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp
-b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG
-cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh
-d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY
-DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E
-rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq
-uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN
-BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP
-MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa
-/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei
-gQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkEx
-FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
-VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
-ZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBlcnNvbmFsIFByZW1p
-dW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNv
-bTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQGEwJa
-QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAY
-BgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u
-IFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJl
-bWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUu
-Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0Vs
-Bd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWI
-Et12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYD
-ZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
-SIb3DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH
-b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBh
-KXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1KzGJ
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx
-FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
-VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
-biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy
-dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t
-MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB
-MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG
-A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp
-b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl
-cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv
-bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE
-VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ
-ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR
-uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
-9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI
-hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM
-pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx
-FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
-VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
-biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm
-MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx
-MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
-DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3
-dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl
-cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3
-DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD
-gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91
-yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX
-L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj
-EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG
-7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e
-QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ
-qdq5snUb9kLy78fyGPmJvKP/iiMucEc=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkEx
-FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN
-BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAd
-BgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcwMTAxMDAwMDAwWhcN
-MjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4g
-Q2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG
-A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1l
-c3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT
-6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQa
-Wt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL
-8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMB
-Af8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC
-9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQ
-pgCed/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZ
-CayJSdM=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCB
-ozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
-Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
-dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3Qt
-TmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5WhcNMTkwNzA5MTg1
-NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0
-IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYD
-VQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VS
-Rmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IB
-DwAwggEKAoIBAQCz+5Gh5DZVhawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2
-N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCH
-iZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hARe
-YFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1
-axwiP8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6g
-yN7igEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD
-AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPh
-ahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9V
-VE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0GCSqGSIb3DQEB
-BQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y
-IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6Lzs
-QCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4
-ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qM
-YEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUb
-QErNaLly7HF27FSOH4UMAWr6pjisH8SE
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB
-kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
-Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
-dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw
-IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG
-EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD
-VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu
-dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6
-E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ
-D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK
-4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq
-lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW
-bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB
-o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT
-MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js
-LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr
-BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB
-AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
-Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj
-j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH
-KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv
-2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3
-mfnGV/TJVTl4uix5yaaIK/QI
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCB
-rjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
-Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
-dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1VU0VSRmlyc3Qt
-Q2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05OTA3MDkxNzI4NTBa
-Fw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAV
-BgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5l
-dHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UE
-AxMtVVROLVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWls
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3B
-YHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9
-hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6l
-L8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLm
-SGHGTPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM
-1tZUOt4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws
-6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud
-DgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJhkdodHRw
-Oi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGllbnRBdXRoZW50
-aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH
-AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u
-7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0
-xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQ
-rfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarVNZ1yQAOJujEdxRBoUp7fooXFXAim
-eOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gk
-USeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB
-lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
-Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
-dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt
-SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG
-A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe
-MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v
-d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh
-cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn
-0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ
-M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a
-MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd
-oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI
-DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy
-oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD
-VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0
-dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy
-bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF
-BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
-//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli
-CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE
-CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t
-3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS
-KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
-IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
-BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
-aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
-9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy
-NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
-azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
-YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
-Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
-cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y
-LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+
-TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y
-TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0
-LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW
-I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw
-nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
-IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
-BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
-aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
-9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy
-NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
-azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
-YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
-Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
-cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY
-dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9
-WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS
-v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v
-UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu
-IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC
-W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
-yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
-ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
-U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
-ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
-MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
-ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
-U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
-aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
-nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
-t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
-SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
-BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
-rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
-NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
-BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
-BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
-aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
-MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
-p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
-5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
-WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
-4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
-hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJ
-BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh
-c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05
-NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD
-VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJp
-bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB
-jQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0N
-H8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR
-4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATAN
-BgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZo
-EWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5
-FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89Fx
-lA==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
-BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
-c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
-MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
-emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
-DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
-FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg
-UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
-YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
-MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
-AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK
-VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm
-Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID
-AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J
-h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul
-uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68
-DzFc6PLZ
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw
-CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
-cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
-LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
-aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
-dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
-VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
-aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
-bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
-IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
-LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4
-nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO
-8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV
-ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb
-PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2
-6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr
-n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a
-qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4
-wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3
-ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs
-pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4
-E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG
-A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
-cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
-MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
-BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt
-YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
-ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh
-YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7
-FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G
-CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg
-J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc
-r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw
-CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns
-YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
-MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y
-aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe
-Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX
-MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj
-IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx
-KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
-eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B
-AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM
-HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw
-DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC
-AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji
-nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX
-rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn
-jBJ7xUS0rg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ
-BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy
-aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s
-IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp
-Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
-eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV
-BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp
-Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu
-Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g
-Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
-IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU
-J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO
-JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY
-wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o
-koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN
-qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E
-Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe
-xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u
-7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU
-sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI
-sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP
-cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
-A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
-cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
-MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
-BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
-YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
-ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
-BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
-I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
-CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do
-lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
-AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
-BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
-c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
-MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
-emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
-DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
-FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg
-UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
-YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
-MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
-AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4
-pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0
-13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID
-AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk
-U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i
-F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY
-oJ2daZH9
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
-CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
-cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
-LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
-aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
-dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
-VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
-aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
-bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
-IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
-LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b
-N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t
-KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu
-kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm
-CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ
-Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu
-imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te
-2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe
-DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
-/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p
-F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt
-TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
-BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
-c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
-MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
-emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
-DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
-FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg
-UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
-YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
-MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
-AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM
-HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK
-qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID
-AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj
-cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y
-cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP
-T8qAkbYp
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
-CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
-cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
-LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
-aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
-dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
-VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
-aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
-bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
-IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
-LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1
-GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ
-+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd
-U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm
-NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY
-ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/
-ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1
-CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq
-g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
-fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c
-2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/
-bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkG
-A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD
-VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0
-MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxIDAeBgNV
-BAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2Vy
-dmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUAA4GJ
-ADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII
-0haGN1XpsSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphI
-uR2nKRoTLkoRWZweFdVJVCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZI
-hvcNAQECBQADfgBl3X7hsuyw4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3
-YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc
-1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDzTCCAzagAwIBAgIQU2GyYK7bcY6nlLMTM/QHCTANBgkqhkiG9w0BAQUFADCB
-wTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTwwOgYDVQQL
-EzNDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
-IC0gRzIxOjA4BgNVBAsTMShjKSAxOTk4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1
-dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
-cmswHhcNMDAwOTI2MDAwMDAwWhcNMTAwOTI1MjM1OTU5WjCBpTEXMBUGA1UEChMO
-VmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsx
-OzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2lnbi5j
-b20vcnBhIChjKTAwMSwwKgYDVQQDEyNWZXJpU2lnbiBUaW1lIFN0YW1waW5nIEF1
-dGhvcml0eSBDQTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0hmdZ8IAIVli
-zrQJIkRpivglWtvtDbc2fk7gu5Q+kCWHwmFHKdm9VLhjzCx9abQzNvQ3B5rB3UBU
-/OB4naCTuQk9I1F/RMIUdNsKvsvJMDRAmD7Q1yUQgZS9B0+c1lQn3y6ov8uQjI11
-S7zi6ESHzeZBCiVu6PQkAsVSD27smHUCAwEAAaOB3zCB3DAPBgNVHRMECDAGAQH/
-AgEAMEUGA1UdIAQ+MDwwOgYMYIZIAYb4RQEHFwEDMCowKAYIKwYBBQUHAgEWHGh0
-dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9ycGEwMQYDVR0fBCowKDAmoCSgIoYgaHR0
-cDovL2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwCwYDVR0PBAQDAgEGMEIGCCsG
-AQUFBwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJpc2lnbi5j
-b20vb2NzcC9zdGF0dXMwDQYJKoZIhvcNAQEFBQADgYEAgnBold+2DcIBcBlK0lRW
-HqzyRUyHuPU163hLBanInTsZIS5wNEqi9YngFXVF5yg3ADQnKeg3S/LvRJdrF1Ea
-w1adPBqK9kpGRjeM+sv1ZFo4aC4cw+9wzrhGBha/937ntag+RaypJXUie28/sJyU
-58dzq6wf7iWbwBbtt8pb8BQ=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMCVVMx
-DTALBgNVBAoTBFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25hbCBTZXJ2
-aWNlIEFzc29jaWF0aW9uMRIwEAYDVQQDEwlHUCBSb290IDIwHhcNMDAwODE2MjI1
-MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklT
-QTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRp
-b24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZDK9vZBv42pWUJGkzEXDK41Z0ohdX
-ZFwgBuHW73G3O/erwWnQSaSxBNf0V2KJXLB1LRckaeNCYOTudNargFbYiCjh+20i
-/SN8RnNPflRzHqgsVVh1t0zzWkWlAhr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU
-58fy+pmjIlC++QU3o63tmsPm7IgbthknGziLgE3sucfFicv8GjLtI/C1AVj59o/g
-halMCXI5Etuz9c9OYmTaxhkVOmMd6RdVoUwiPDQyRvhlV7or7zaMavrZ2UT0qt2E
-1w0cslSsMoW0ZA3eQbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYEFJ59SzS/
-ca3CBfYDdYDOqU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
-MA0GCSqGSIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHb
-mQdpNSYx/scuhMKZYdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQ
-kIqUs38oW26sTTMs7WXcFsziza6kPWKSBpUmv9+55CCmc2rBvveURNZNbyoLaxhN
-dBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOeyti12HvOdUVmB/RtLdh6yumJ
-ivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8ofyrEK9ca3Cn
-B+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr
-MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl
-cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
-bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw
-CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h
-dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l
-cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h
-2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E
-lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV
-ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq
-299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t
-vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL
-dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
-AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF
-AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR
-zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3
-LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd
-7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw
-++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
-398znM/jra6O1I7mT1GvFpLgXPYHDw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx
-IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs
-cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v
-dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0
-MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl
-bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD
-DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r
-WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU
-Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs
-HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj
-z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf
-SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl
-AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG
-KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P
-AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j
-BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC
-VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX
-ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
-Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB
-ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd
-/ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB
-A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn
-k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9
-iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv
-2G0xffX8oRAHh84vWdw+WNs=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMC
-VVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBD
-ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9v
-dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDAxMDExMTY0MTI4WhcNMjEwMTE0
-MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSww
-KgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0G
-A1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEi
-MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n13
-5zHCLielTWi5MbqNQ1mXx3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHE
-SxP9cMIlrCL1dQu3U+SlK93OvRw6esP3E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4O
-JgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5OEL8pahbSCOz6+MlsoCu
-ltQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4jsNtlAHCE
-AQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMB
-AAGjYTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcB
-CzAyMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRw
-b2xpY3kwDQYJKoZIhvcNAQEFBQADggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo
-7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrvm+0fazbuSCUlFLZWohDo7qd/
-0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0ROhPs7fpvcmR7
-nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx
-x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ
-33ZwmVxwQ023tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB
-gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk
-MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY
-UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx
-NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3
-dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy
-dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
-dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6
-38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP
-KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q
-DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4
-qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa
-JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi
-PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P
-BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs
-jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0
-eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD
-ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR
-vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
-qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa
-IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy
-i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ
-O+7ETPTsJ3xCwnR8gooJybQDJbw=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli
-ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMq
-YmVUUlVTVGVkIFJvb3QgQ0EtQmFsdGltb3JlIEltcGxlbWVudGF0aW9uMB4XDTAy
-MDQxMTA3Mzg1MVoXDTIyMDQxMTA3Mzg1MVowZjESMBAGA1UEChMJYmVUUlVTVGVk
-MRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNVBAMTKmJlVFJVU1Rl
-ZCBSb290IENBLUJhbHRpbW9yZSBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZIhvcN
-AQEBBQADggEPADCCAQoCggEBALx+xDmcjOPWHIb/ymKt4H8wRXqOGrO4x/nRNv8i
-805qX4QQ+2aBw5R5MdKR4XeOGCrDFN5R9U+jK7wYFuK13XneIviCfsuBH/0nLI/6
-l2Qijvj/YaOcGx6Sj8CoCd8JEey3fTGaGuqDIQY8n7pc/5TqarjDa1U0Tz0yH92B
-FODEPM2dMPgwqZfT7syj0B9fHBOB1BirlNFjw55/NZKeX0Tq7PQiXLfoPX2k+Ymp
-kbIq2eszh+6l/ePazIjmiSZuxyuC0F6dWdsU7JGDBcNeDsYq0ATdcT0gTlgn/FP7
-eHgZFLL8kFKJOGJgB7Sg7KxrUNb9uShr71ItOrL/8QFArDcCAwEAAaOCAh4wggIa
-MA8GA1UdEwEB/wQFMAMBAf8wggG1BgNVHSAEggGsMIIBqDCCAaQGDysGAQQBsT4A
-AAEJKIORMTCCAY8wggFIBggrBgEFBQcCAjCCAToaggE2UmVsaWFuY2Ugb24gb3Ig
-dXNlIG9mIHRoaXMgQ2VydGlmaWNhdGUgY3JlYXRlcyBhbiBhY2tub3dsZWRnbWVu
-dCBhbmQgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJk
-IHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgdGhlIENlcnRpZmljYXRpb24g
-UHJhY3RpY2UgU3RhdGVtZW50IGFuZCB0aGUgUmVseWluZyBQYXJ0eSBBZ3JlZW1l
-bnQsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgYmVUUlVTVGVkIHdlYiBzaXRl
-LCBodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVjdHNfc2VydmljZXMvaW5k
-ZXguaHRtbDBBBggrBgEFBQcCARY1aHR0cDovL3d3dy5iZXRydXN0ZWQuY29tL3By
-b2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWwwHQYDVR0OBBYEFEU9w6nR3D8kVpgc
-cxiIav+DR+22MB8GA1UdIwQYMBaAFEU9w6nR3D8kVpgccxiIav+DR+22MA4GA1Ud
-DwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEASZK8o+6svfoNyYt5hhwjdrCA
-WXf82n+0S9/DZEtqTg6t8n1ZdwWtColzsPq8y9yNAIiPpqCy6qxSJ7+hSHyXEHu6
-7RMdmgduyzFiEuhjA6p9beP4G3YheBufS0OM00mG9htc9i5gFdPp43t1P9ACg9AY
-gkHNZTfqjjJ+vWuZXTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb
-4cV97yHgjQ5dUX2xZ/2jvTg2xvI4hocalmhgRvsoFEdV4aeADGvi6t9NfJBIoDa9
-CReJf8Py05yc493EG931t3GzUwWJBtDLSoDByFOQtTwxiBdQn8nEDovYqAJjDQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFLDCCBBSgAwIBAgIEOU99hzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJX
-VzESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQDExJiZVRSVVNUZWQgUm9vdCBD
-QXMxGjAYBgNVBAMTEWJlVFJVU1RlZCBSb290IENBMB4XDTAwMDYyMDE0MjEwNFoX
-DTEwMDYyMDEzMjEwNFowWjELMAkGA1UEBhMCV1cxEjAQBgNVBAoTCWJlVFJVU1Rl
-ZDEbMBkGA1UEAxMSYmVUUlVTVGVkIFJvb3QgQ0FzMRowGAYDVQQDExFiZVRSVVNU
-ZWQgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANS0c3oT
-CjhVAb6JVuGUntS+WutKNHUbYSnE4a0IYCF4SP+00PpeQY1hRIfo7clY+vyTmt9P
-6j41ffgzeubx181vSUs9Ty1uDoM6GHh3o8/n9E1z2Jo7Gh2+lVPPIJfCzz4kUmwM
-jmVZxXH/YgmPqsWPzGCgc0rXOD8Vcr+il7dw6K/ifhYGTPWqZCZyByWtNfwYsSbX
-2P8ZDoMbjNx4RWc0PfSvHI3kbWvtILNnmrRhyxdviTX/507AMhLn7uzf/5cwdO2N
-R47rtMNE5qdMf1ZD6Li8tr76g5fmu/vEtpO+GRg+jIG5c4gW9JZDnGdzF5DYCW5j
-rEq2I8QBoa2k5MUCAwEAAaOCAfgwggH0MA8GA1UdEwEB/wQFMAMBAf8wggFZBgNV
-HSAEggFQMIIBTDCCAUgGCisGAQQBsT4BAAAwggE4MIIBAQYIKwYBBQUHAgIwgfQa
-gfFSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1
-bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0
-ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGFuZCBjZXJ0aWZpY2F0aW9uIHBy
-YWN0aWNlIHN0YXRlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IGJlVFJVU1Rl
-ZCdzIHdlYiBzaXRlLCBodHRwczovL3d3dy5iZVRSVVNUZWQuY29tL3ZhdWx0L3Rl
-cm1zMDEGCCsGAQUFBwIBFiVodHRwczovL3d3dy5iZVRSVVNUZWQuY29tL3ZhdWx0
-L3Rlcm1zMDQGA1UdHwQtMCswKaAnoCWkIzAhMRIwEAYDVQQKEwliZVRSVVNUZWQx
-CzAJBgNVBAYTAldXMB0GA1UdDgQWBBQquZtpLjub2M3eKjEENGvKBxirZzAfBgNV
-HSMEGDAWgBQquZtpLjub2M3eKjEENGvKBxirZzAOBgNVHQ8BAf8EBAMCAf4wDQYJ
-KoZIhvcNAQEFBQADggEBAHlh26Nebhax6nZR+csVm8tpvuaBa58oH2U+3RGFktTo
-Qb9+M70j5/Egv6S0phkBxoyNNXxlpE8JpNbYIxUFE6dDea/bow6be3ga8wSGWsb2
-jCBHOElQBp1yZzrwmAOtlmdE/D8QDYZN5AA7KXvOOzuZhmElQITcE2K3+spZ1gMe
-1lMBzW1MaFVA4e5rxyoAAEiCswoBw2AqDPeCNe5IhpbkdNQ96gFxugR1QKepfzk5
-mlWXKWWuGVUlBXJH0+gY3Ljpr0NzARJ0o+FcXxVdJPP55PS2Z2cS52QiivalQaYc
-tmBjRYoQtLpGEK5BV2VsPyMQPyEQWbfkQN0mDCP2qq4=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli
-ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMq
-YmVUUlVTVGVkIFJvb3QgQ0EgLSBFbnRydXN0IEltcGxlbWVudGF0aW9uMB4XDTAy
-MDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1owZjESMBAGA1UEChMJYmVUUlVTVGVk
-MRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNVBAMTKmJlVFJVU1Rl
-ZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZIhvcN
-AQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1Q+xVkrYwfTVXDNvzDSduTPdQqJtO
-K2/b9a0cS12zqcH+e0TrW6MFDR/FNCswACnxeECypP869AGIF37m1CbTukzqMvtD
-d5eHI8XbQ6P1KqNRXuE70mVpflUVm3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdj
-DheT389Lrm5zdeDzqrmkwAkbhepxKYhBMvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCe
-yv78IZTuEyhL11xeDGbu6bsPwTSxfwh28z0mcMmLJR1iJAzqHHVOwBLkuhMdMCkt
-VjMFu5dZfsZJT4nXLySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOCAwUwggMB
-MIIBtwYDVR0gBIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYI
-KwYBBQUHAgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRp
-ZmljYXRlIGNyZWF0ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ug
-b2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0
-aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu
-dCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGljaCBjYW4gYmUg
-Zm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0cHM6Ly93d3cuYmV0
-cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMEIGCCsGAQUF
-BwIBFjZodHRwczovL3d3dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2Vz
-L2luZGV4Lmh0bWwwEQYJYIZIAYb4QgEBBAQDAgAHMIGJBgNVHR8EgYEwfzB9oHug
-eaR3MHUxEjAQBgNVBAoTCWJlVFJVU1RlZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJv
-b3QgQ0FzMTMwMQYDVQQDEypiZVRSVVNUZWQgUm9vdCBDQSAtIEVudHJ1c3QgSW1w
-bGVtZW50YXRpb24xDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0MTEw
-ODI0MjdagQ8yMDIyMDQxMTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaA
-FH1w5a44iwY/qhwaj/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQw
-qoSEFjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIE
-kDANBgkqhkiG9w0BAQUFAAOCAQEAKrgXzh8QlOu4mre5X+za95IkrNySO8cgjfKZ
-5V04ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevdkObRVlTa4y0MnxEylCIB
-evZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/T220Y/oz
-ADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2KjiS2d2k
-XgClzMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFiaDrmLzfzgYYh
-xKlkqu9FNtEaZnz46TfW1mG+oq1I59/mdP7TbX3SJdysYlep9w==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUFADBi
-MRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENB
-czEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRp
-b24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEyMTEwNzI1WjBiMRIwEAYDVQQKEwli
-ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEvMC0GA1UEAxMm
-YmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRpb24wggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQwCY5X0LkGLG9uJIAiv11DpvpPrILn
-HGhwhRujbrWqeNluB0s/6d/16uhUoWGKDi9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I
-1DpAa5LxmZZk3tv/ePTulh1HiXzUvrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPk
-tPDgaTuID0GQ+NRxQyTBjyZLO1bp/4xsN+lFrYWMU8NghpBKlsmzVLC7F/AcRdnU
-GxlkVgoZ98zh/4avflherHqQH8koOUV7orbHnB/ahdQhhlkwk75TMzf270HPM8er
-cmsl9fNTGwxMLvF1S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMBAAGjggIY
-MIICFDAMBgNVHRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+
-AAADCSiDkTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5j
-b20vcHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIB
-OhqCATZSZWxpYW5jZSBvbiBvciB1c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBjcmVh
-dGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2NlcHRhbmNlIG9mIHRoZSB0aGVu
-IGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNl
-LCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1lbnQgYW5kIHRoZSBS
-ZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IHRo
-ZSBiZVRSVVNUZWQgd2ViIHNpdGUsIGh0dHA6Ly93d3cuYmV0cnVzdGVkLmNvbS9w
-cm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMAsGA1UdDwQEAwIBBjAfBgNVHSME
-GDAWgBSp7BR++dlDzFMrFK3P9/BZiUHNGTAdBgNVHQ4EFgQUqewUfvnZQ8xTKxSt
-z/fwWYlBzRkwDQYJKoZIhvcNAQEFBQADggEBANuXsHXqDMTBmMpWBcCorSZIry0g
-6IHHtt9DwSwddUvUQo3neqh03GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05pmuK
-mET7m9cqg5c0Lcd9NUwtNLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbd
-LrML3kqNWz2rDcI1UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28Bb
-J1zTcwfBwvNMm2+fG8oeqqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3
-SK41ty8ymmFei74pnykkiFY5LKjSq5YDWtRIn7lAhAuYaPsBQ9Yb4gmxlxw=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
-qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
-Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
-MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
-BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
-NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
-LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
-A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
-IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
-W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
-3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
-6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
-Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
-NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
-MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
-r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
-DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
-YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
-xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
-/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
-LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
-jVaMaA==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIETzCCAzegAwIBAgIEO63vKTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE
-ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg
-U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIzMTQxODE3WhcNMTEw
-OTIzMTMxODE3WjB1MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v
-LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWdu
-ZXQgLSBDQSBLbGFzYSAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4SRW9Q58g5DY1Hw7h
-gCRKBEdPdGn0MFHsfw7rlu/oQm7IChI/uWd9q5wwo77YojtTDjRnpgZsjqBeynX8T90vFILqsY2K
-5CF1OESalwvVr3sZiQX79lisuFKat92u6hBFikFIVxfHHB67Af+g7u0dEHdDW7lwy81MwFYxBTRy
-9wIDAQABo4IBbTCCAWkwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwggEEBgNVHSAE
-gfwwgfkwgfYGDSsGAQQBvj8CAQoBAQAwgeQwgZoGCCsGAQUFBwICMIGNGoGKQ2VydHlmaWthdCB3
-eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtOiAiUG9saXR5a2EgQ2VydHlmaWthY2ppIGRs
-YSBSb290Q0EiLiBDZXJ0eWZpa2F0IHd5c3Rhd2lvbnkgcHJ6ZXogUm9vdENBIHcgaGllcmFyY2hp
-aSBDQyBTaWduZXQuMEUGCCsGAQUFBwIBFjlodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0b3Jp
-dW0vZG9rdW1lbnR5L3BjX3Jvb3RjYS50eHQwHwYDVR0jBBgwFoAUwJvFIw0C4aZOSGsfAOnjmhQb
-sa8wHQYDVR0OBBYEFMODHtVZd1T7TftXR/nEI1zR54njMA0GCSqGSIb3DQEBBQUAA4IBAQBRIHQB
-FIGh8Jpxt87AgSLwIEEk4+oGy769u3NtoaR0R3WNMdmt7fXTi0tyTQ9V4AIszxVjhnUPaKnF1KYy
-f8Tl+YTzk9ZfFkZ3kCdSaILZAOIrmqWNLPmjUQ5/JiMGho0e1YmWUcMci84+pIisTsytFzVP32/W
-+sz2H4FQAvOIMmxB7EJX9AdbnXn9EXZ+4nCqi0ft5z96ZqOJJiCB3vSaoYg+wdkcvb6souMJzuc2
-uptXtR1Xf3ihlHaGW+hmnpcwFA6AoNrom6Vgzk6U1ienx0Cw28BhRSKqzKkyXkuK8gRflZUx84uf
-tXncwKJrMiE3lvgOOBITRzcahirLer4c
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIE9zCCA9+gAwIBAgIEPL/xoTANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJQTDEfMB0GA1UE
-ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg
-U2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQgLSBQQ0EgS2xhc2EgMjAeFw0wMjA0MTkxMDI5NTNa
-Fw0xNzA0MTgxMjUzMDdaMHUxCzAJBgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4g
-eiBvLm8uMSQwIgYDVQQLExtDZW50cnVtIENlcnR5ZmlrYWNqaSBTaWduZXQxHzAdBgNVBAMTFkND
-IFNpZ25ldCAtIENBIEtsYXNhIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqgLJu
-QqY4yavbSgHg8CyfKTx4BokNSDOVz4eD9vptUr11Kqd06ED1hlH7Sg0goBFAfntNU/QTKwSBaNui
-me7C4sSEdgsKrPoAhGb4Mq8y7Ty7RqZz7mkzNMqzL2L2U4yQ2QjvpH8MH0IBqOWEcpSkpwnrCDIm
-RoTfd+YlZWKi2JceQixUUYIQ45Ox8+x8hHbvvZdgqtcvo8PW27qoHkp/7hMuJ44kDAGrmxffBXl/
-OBRZp0uO1CSLcMcVJzyr2phKhy406MYdWrtNPEluGs0GFDzd0nrIctiWAO4cmct4S72S9Q6e//0G
-O9f3/Ca5Kb2I1xYLj/xE+HgjHX9aD2MhAgMBAAGjggGMMIIBiDAPBgNVHRMBAf8EBTADAQH/MA4G
-A1UdDwEB/wQEAwIBBjCB4wYDVR0gBIHbMIHYMIHVBg0rBgEEAb4/AhQKAQEAMIHDMHUGCCsGAQUF
-BwICMGkaZ0NlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0
-eWthIENlcnR5ZmlrYWNqaSBQQ0EyIC0gQ2VydHlmaWthdHkgVXJ6ZWRvdyBLbGFzeSAyIi4wSgYI
-KwYBBQUHAgEWPmh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9kb2t1bWVudHkva2xh
-c2EyL3BjX3BjYTIudHh0MD8GA1UdHwQ4MDYwNKAyoDCGLmh0dHA6Ly93d3cuc2lnbmV0LnBsL3Jl
-cG96eXRvcml1bS9jcmwvcGNhMi5jcmwwHwYDVR0jBBgwFoAUwGxGyl2CfpYHRonE82AVXO08kMIw
-HQYDVR0OBBYEFLtFBlILy4HNKVSzvHxBTM0HDowlMA0GCSqGSIb3DQEBBQUAA4IBAQBWTsCbqXrX
-hBBev5v5cIuc6gJM8ww7oR0uMQRZoFSqvQUPWBYM2/TLI/f8UM9hSShUVj3zEsSj/vFHagUVmzuV
-Xo5u0WK8iaqATSyEVBhADHrPG6wYcLKJlagge/ILA0m+SieyP2sjYD9MUB9KZIEyBKv0429UuDTw
-6P7pslxMWJBSNyQxaLIs0SRKsqZZWkc7ZYAj2apSkBMX2Is1oHA+PwkF6jQMwCao/+CndXPUzfCF
-6caa9WwW31W26MlXCvSmJgfiTPwGvm4PkPmOnmWZ3CczzhHl4q7ztHFzshJH3sZWDnrWwBFjzz5e
-Pr3WHV1wA7EY6oT4zBx+2gT9XBTB
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEUzCCAzugAwIBAgIEPq+qjzANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJQTDE3MDUGA1UE
-ChMuQ1ppQyBDZW50cmFzdCBTQSB3IGltaWVuaXUgTWluaXN0cmEgR29zcG9kYXJraTEZMBcGA1UE
-AxMQQ1ppQyBDZW50cmFzdCBTQTAeFw0wMzA0MzAxMDUwNTVaFw0wODA0MjgxMDUwNTVaMGgxCzAJ
-BgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4geiBvLm8uMR8wHQYDVQQDExZDQyBT
-aWduZXQgLSBDQSBLbGFzYSAzMRcwFQYDVQQFEw5OdW1lciB3cGlzdTogNDCCASIwDQYJKoZIhvcN
-AQEBBQADggEPADCCAQoCggEBALVdeOM62cPH2NERFxbS5FIp/HSv3fgesdVsTUFxZbGtE+/E0RMl
-KZQJHH9emx7vRYubsi4EOLCjYsCOTFvgGRIpZzx7R7T5c0Di5XFkRU4gjBl7aHJoKb5SLzGlWdoX
-GsekVtl6keEACrizV2EafqjI8cnBWY7OxQ1ooLQp5AeFjXg+5PT0lO6TUZAubqjFbhVbxSWjqvdj
-93RGfyYE76MnNn4c2xWySD07n7uno06TC0IJe6+3WSX1h+76VsIFouWBXOoM7cxxiLjoqdBVu24+
-P8e81SukE7qEvOwDPmk9ZJFtt1nBNg8a1kaixcljrA/43XwOPz6qnJ+cIj/xywECAwEAAaOCAQow
-ggEGMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMDMGA1UdIAEB/wQpMCcwJQYEVR0g
-ADAdMBsGCCsGAQUFBwIBFg93d3cuY2VudHJhc3QucGwwgY4GA1UdIwSBhjCBg4AU2a7r85Cp1iJN
-W0Ca1LR6VG3996ShZaRjMGExCzAJBgNVBAYTAlBMMTcwNQYDVQQKEy5DWmlDIENlbnRyYXN0IFNB
-IHcgaW1pZW5pdSBNaW5pc3RyYSBHb3Nwb2RhcmtpMRkwFwYDVQQDExBDWmlDIENlbnRyYXN0IFNB
-ggQ9/0sQMB0GA1UdDgQWBBR7Y8wZkHq0zrY7nn1tFSdQ0PlJuTANBgkqhkiG9w0BAQUFAAOCAQEA
-ldt/svO5c1MU08FKgrOXCGEbEPbQxhpM0xcd6Iv3dCo6qugEgjEs9Qm5CwUNKMnFsvR27cJWUvZb
-MVcvwlwCwclOdwF6u/QRS8bC2HYErhYo9bp9yuxxzuow2A94c5fPqfVrjXy+vDouchAm6+A5Wjzv
-J8wxVFDCs+9iGACmyUWr/JGXCYiQIbQkwlkRKHHlan9ymKf1NvIej/3EpeT8fKr6ywxGuhAfqofW
-pg3WJY/RCB4lTzD8vZGNwfMFGkWhJkypad3i9w3lGmDVpsHaWtCgGfd0H7tUtWPkP+t7EjIRCD9J
-HYnTR+wbbewc5vOI+UobR15ynGfFIaSIiMTVtQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEejCCA2KgAwIBAgIEP4vk6TANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ
-TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu
-dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBD
-QSBLbGFzYSAyMB4XDTAzMTAxNDExNTgyMloXDTE3MDQxODEyNTMwN1owdzELMAkG
-A1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6IG8uby4xJDAiBgNV
-BAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEhMB8GA1UEAxMYQ0MgU2ln
-bmV0IC0gT0NTUCBLbGFzYSAyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCo
-VCsaBStblXQYVNthe3dvaCrfvKpPXngh4almm988iIlEv9CVTaAdCfaJNihvA+Vs
-Qw8++ix1VqteMQE474/MV/YaXigP0Zr0QB+g+/7PWVlv+5U9Gzp9+Xx4DJay8AoI
-iB7Iy5Qf9iZiHm5BiPRIuUXT4ZRbZRYPh0/76vgRsQIDAQABo4IBkjCCAY4wDgYD
-VR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEEGA1UdHwQ6MDgwNqA0
-oDKGMGh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9jcmwva2xhc2Ey
-LmNybDCB2AYDVR0gBIHQMIHNMIHKBg4rBgEEAb4/AoFICgwBADCBtzBsBggrBgEF
-BQcCAjBgGl5DZXJ0eWZpa2F0IHd5ZGFueSB6Z29kbmllIHogZG9rdW1lbnRlbSAi
-UG9saXR5a2EgQ2VydHlmaWthY2ppIC0gQ2VydHlmaWthdHkgcmVzcG9uZGVyb3cg
-T0NTUCIuMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0
-b3JpdW0vZG9rdW1lbnR5L3BjX29jc3BfMV8wLnBkZjAfBgNVHSMEGDAWgBS7RQZS
-C8uBzSlUs7x8QUzNBw6MJTAdBgNVHQ4EFgQUKEVrOY7cEHvsVgvoyZdytlbtgwEw
-CQYDVR0TBAIwADANBgkqhkiG9w0BAQUFAAOCAQEAQrRg5MV6dxr0HU2IsLInxhvt
-iUVmSFkIUsBCjzLoewOXA16d2oDyHhI/eE+VgAsp+2ANjZu4xRteHIHoYMsN218M
-eD2MLRsYS0U9xxAFK9gDj/KscPbrrdoqLvtPSMhUb4adJS9HLhvUe6BicvBf3A71
-iCNe431axGNDWKnpuj2KUpj4CFHYsWCXky847YtTXDjri9NIwJJauazsrSjK+oXp
-ngRS506mdQ7vWrtApkh8zhhWp7duCkjcCo1O8JxqYr2qEW1fXmgOISe010v2mmuv
-hHxPyVwoAU4KkOw0nbXZn53yak0is5+XmAjh0wWue44AssHrjC9nUh3mkLt6eQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEezCCA2OgAwIBAgIEP4vnLzANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJQ
-TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEfMB0GA1UEAxMWQ0Mg
-U2lnbmV0IC0gQ0EgS2xhc2EgMzEXMBUGA1UEBRMOTnVtZXIgd3Bpc3U6IDQwHhcN
-MDMxMDE0MTIwODAwWhcNMDgwNDI4MTA1MDU1WjB3MQswCQYDVQQGEwJQTDEfMB0G
-A1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBD
-ZXJ0eWZpa2FjamkgU2lnbmV0MSEwHwYDVQQDExhDQyBTaWduZXQgLSBPQ1NQIEts
-YXNhIDMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM/9GwvARNuCVN+PqZmO
-4FqH8vTqhenUyqRkmAVT4YhLu0a9AXeLAYVDu+NTkYzsAUMAfu55rIKHNLlm6WbF
-KvLiKKz4p4pbUr+ToPcwl/TDotidloUdBAxDg0SL+PmQqACZDe3seJho2IYf2vDL
-/G4TLMbKmNB0mlWFuN0f4fJNAgMBAAGjggGgMIIBnDAOBgNVHQ8BAf8EBAMCB4Aw
-EwYDVR0lBAwwCgYIKwYBBQUHAwkwTwYDVR0fBEgwRjBEoEKgQIY+aHR0cDovL3d3
-dy5zaWduZXQucGwva3dhbGlmaWtvd2FuZS9yZXBvenl0b3JpdW0vY3JsL2tsYXNh
-My5jcmwwgdgGA1UdIASB0DCBzTCBygYOKwYBBAG+PwKCLAoCAQAwgbcwbAYIKwYB
-BQUHAgIwYBpeQ2VydHlmaWthdCB3eWRhbnkgemdvZG5pZSB6IGRva3VtZW50ZW0g
-IlBvbGl0eWthIENlcnR5ZmlrYWNqaSAtIENlcnR5ZmlrYXR5IHJlc3BvbmRlcm93
-IE9DU1AiLjBHBggrBgEFBQcCARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5
-dG9yaXVtL2Rva3VtZW50eS9wY19vY3NwXzFfMC5wZGYwHwYDVR0jBBgwFoAUe2PM
-GZB6tM62O559bRUnUND5SbkwHQYDVR0OBBYEFG4jnCMvBALRQXtmDn9TyXQ/EKP+
-MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADggEBACXrKG5Def5lpRwmZom3UEDq
-bl7y4U3qomG4B+ok2FVZGgPZti+ZgvrenPj7PtbYCUBPsCSTNrznKinoT3gD9lQQ
-xkEHwdc6VD1GlFp+qI64u0+wS9Epatrdf7aBnizrOIB4LJd4E2TWQ6trspetjMIU
-upyWls1BmYUxB91R7QkTiAUSNZ87s3auhZuG4f0V0JLVCcg2rn7AN1rfMkgxCbHk
-GxiQbYWFljl6aatxR3odnnzVUe1I8uoY2JXpmmUcOG4dNGuQYziyKG3mtXCQWvug
-5qi9Mf3KUh1oSTKx6HfLjjNl1+wMB5Mdb8LF0XyZLdJM9yIZh7SBRsYm9QiXevY=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFGjCCBAKgAwIBAgIEPL7eEDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE
-ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg
-U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwNDE4MTQ1NDA4WhcNMjYw
-OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v
-LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu
-ZXQgLSBQQ0EgS2xhc2EgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7BrBlbN5ma
-M5eg0BOTqoZ+9NBDvU8Lm5rTdrMswFTCathzpVVLK/JD4K3+4oCZ9SRAspEXE4gvwb08ASY6w5s+
-HpRkeJw8YzMFR5kDZD5adgnCAy4vDfIXYZgppXPaTQ8wnfUZ7BZ7Zfa7QBemUIcJIzJBB0UqgtxW
-Ceol9IekpBRVmuuSA6QG0Jkm+pGDJ05yj2eQG8jTcBENM7sVA8rGRMyFA4skSZ+D0OG6FS2xC1i9
-JyN0ag1yII/LPx8HK5J4W9MaPRNjAEeaa2qI9EpchwrOxnyVbQfSedCG1VRJfAsE/9tT9CMUPZ3x
-W20QjQcSZJqVcmGW9gVsXKQOVLsCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
-AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEBMIHkMIGaBggrBgEFBQcC
-AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0
-eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6
-IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z
-aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw
-OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy
-bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUwGxGyl2CfpYHRonE
-82AVXO08kMIwDQYJKoZIhvcNAQEFBQADggEBABp1TAUsa+BeVWg4cjowc8yTJ5XN3GvN96GObMkx
-UGY7U9kVrLI71xBgoNVyzXTiMNDBvjh7vdPWjpl5SDiRpnnKiOFXA43HvNWzUaOkTu1mxjJsZsan
-ot1Xt6j0ZDC+03FjLHdYMyM9kSWp6afb4980EPYZCcSzgM5TOGfJmNii5Tq468VFKrX+52Aou1G2
-2Ohu+EEOlOrG7ylKv1hHUJJCjwN0ZVEIn1nDbrU9FeGCz8J9ihVUvnENEBbBkU37PWqWuHitKQDV
-tcwTwJJdR8cmKq3NmkwAm9fPacidQLpaw0WkuGrS+fEDhu1Nhy9xELP6NA9GRTCNxm/dXlcwnmY=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFGjCCBAKgAwIBAgIEPV0tNDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE
-ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg
-U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwODE2MTY0OTU2WhcNMjYw
-OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v
-LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu
-ZXQgLSBQQ0EgS2xhc2EgMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALN3LanJtdue
-Ne6geWUTFENa+lEuzqELcoqhYB+a/tJcPEkc6TX/bYPzalRRjqs+quMP6KZTU0DixOrV+K7iWaqA
-iQ913HX5IBLmKDCrTVW/ZvSDpiBKbxlHfSNuJxAuVT6HdbzK7yAW38ssX+yS2tZYHZ5FhZcfqzPE
-OpO94mAKcBUhk6T/ki0evXX/ZvvktwmF3hKattzwtM4JMLurAEl8SInyEYULw5JdlfcBez2Tg6Db
-w34hA1A+ckTwhxzecrB8TUe2BnQKOs9vr2cCACpFFcOmPkM0Drtjctr1QHm1tYSqRFRf9VcV5tfC
-3P8QqoK4ONjtLPHc9x5NE1uK/FMCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
-AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQECMIHkMIGaBggrBgEFBQcC
-AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0
-eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6
-IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z
-aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw
-OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy
-bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUXvthcPHlH5BgGhlM
-ErJNXWlhlgAwDQYJKoZIhvcNAQEFBQADggEBACIce95Mvn710KCAISA0CuHD4aznTU6pLoCDShW4
-7OR+GTpJUm1coTcUqlBHV9mra4VFrBcBuOkHZoBLq/jmE0QJWnpSEULDcH9J3mF0nqO9SM+mWyJG
-dsJF/XU/7smummgjMNQXwzQTtWORF+6v5KUbWX85anO2wR+M6YTBWC55zWpWi4RG3vkHFs5Ze2oF
-JTlpuxw9ZgxTnWlwI9QR2MvEhYIUMKMOWxw1nt0kKj+5TCNQQGh/VJJ1dsiroGh/io1DOcePEhKz
-1Ag52y6Wf0nJJB9yk0sFakqZH18F7eQecQImgZyyeRtsG95leNugB3BXWCW+KxwiBrtQTXv4dTE=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEzzCCA7egAwIBAgIEO6ocGTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE
-ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg
-U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIwMTY0MjE5WhcNMjYw
-OTIxMTU0MjE5WjBxMQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v
-LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWdu
-ZXQgLSBSb290Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrr2vydnNpELfGW3Ks
-ARiDhJvwDtUe4AbWev+OfMc3+vA29nX8ZmIwno3gmItjo5DbUCCRiCMq5c9epcGu+kg4a3BJChVX
-REl8gVh0ST15rr3RKrSc4VgsvQzl0ZUraeQLl8JoRT5PLsUj3qwF78jUCQVckiiLVcnGfZtFCm+D
-CJXliQBDMB9XFAUEiO/DtEBs0B7wJGx7lgJeJpQUcGiaOPjcJDYOk7rNAYmmD2gWeSlepufO8luU
-YG/YDxTC4mqhRqfa4MnVO5dqy+ICj2UvUpHbZDB0KfGRibgBYeQP1kuqgIzJN4UqknVAJb0aMBSP
-l+9k2fAUdchx1njlbdcbAgMBAAGjggFtMIIBaTAPBgNVHRMBAf8EBTADAQH/MIIBBAYDVR0gBIH8
-MIH5MIH2Bg0rBgEEAb4/AgEKAQEAMIHkMIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lz
-dGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEg
-Um9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNoaWkg
-Q0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVt
-L2Rva3VtZW50eS9wY19yb290Y2EudHh0MB0GA1UdDgQWBBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAf
-BgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcN
-AQEFBQADggEBAGnY5QmYqnnO9OqFOWZxxb25UHRnaRF6IV9aaGit5BZufZj2Tq3v8L3SgE34GOoI
-cdRMMG5JEpEU4mN/Ef3oY6Eo+7HfqaPHI4KFmbDSPiK5s+wmf+bQSm0Yq5/h4ZOdcAESlLQeLSt1
-CQk2JoKQJ6pyAf6xJBgWEIlm4RXE4J3324PUiOp83kW6MDvaa1xY976WyInr4rwoLgxVl11LZeKW
-ha0RJJxJgw/NyWpKG7LWCm1fglF8JH51vZNndGYq1iKtfnrIOvLZq6bzaCiZm1EurD8HE6P7pmAB
-KK6o3C2OXlNfNIgwkDN/cDqk5TYsTkrpfriJPdxXBH8hQOkW89g=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID/TCCA2agAwIBAgIEP4/gkTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQTDEfMB0GA1UE
-ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg
-U2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBDQSBLbGFzYSAxMB4XDTAzMTAxNzEyMjkwMloX
-DTExMDkyMzExMTgxN1owdjELMAkGA1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6
-IG8uby4xJDAiBgNVBAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEgMB4GA1UEAxMXQ0Mg
-U2lnbmV0IC0gVFNBIEtsYXNhIDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOJYrISEtSsd
-uHajROh5/n7NGrkpYTT9NEaPe9+ucuQ37KxIbfJwXJjgUc1dw4wCkcQ12FJarD1X6mSQ4cfN/60v
-LfKI5ZD4nhJTMKlAj1pX9ScQ/MuyvKStCbn5WTkjPhjRAM0tdwXSnzuTEunfw0Oup559y3Iqxg1c
-ExflB6cfAgMBAAGjggGXMIIBkzBBBgNVHR8EOjA4MDagNKAyhjBodHRwOi8vd3d3LnNpZ25ldC5w
-bC9yZXBvenl0b3JpdW0vY3JsL2tsYXNhMS5jcmwwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQM
-MAoGCCsGAQUFBwMIMIHaBgNVHSAEgdIwgc8wgcwGDSsGAQQBvj8CZAoRAgEwgbowbwYIKwYBBQUH
-AgIwYxphQ2VydHlmaWthdCB3eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtICJQb2xpdHlr
-YSBDZXJ0eWZpa2FjamkgQ0MgU2lnbmV0IC0gWm5ha293YW5pZSBjemFzZW0iLjBHBggrBgEFBQcC
-ARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY190c2ExXzJf
-MS5wZGYwHwYDVR0jBBgwFoAUw4Me1Vl3VPtN+1dH+cQjXNHnieMwHQYDVR0OBBYEFJdDwEqtcavO
-Yd9u9tej53vWXwNBMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADgYEAnpiQkqLCJQYXUrqMHUEz
-+z3rOqS0XzSFnVVLhkVssvXc8S3FkJIiQTUrkScjI4CToCzujj3EyfNxH6yiLlMbskF8I31JxIeB
-vueqV+s+o76CZm3ycu9hb0I4lswuxoT+q5ZzPR8Irrb51rZXlolR+7KtwMg4sFDJZ8RNgOf7tbA=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEFTCCA36gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBvjELMAkGA1UEBhMCVVMx
-EDAOBgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UE
-ChMfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9z
-dG1hc3RlcjEgMB4GA1UEAxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkq
-hkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDMwMTE1MTYyOTE3
-WhcNMDcwMTE0MTYyOTE3WjCBvjELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0luZGlh
-bmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdhcmUgaW4g
-dGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEgMB4GA1UE
-AxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkqhkiG9w0BCQEWFmhvc3Rt
-YXN0ZXJAc3BpLWluYy5vcmcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAPB6
-rdoiLR3RodtM22LMcfwfqb5OrJNl7fwmvskgF7yP6sdD2bOfDIXhg9852jhY8/kL
-VOFe1ELAL2OyN4RAxk0rliZQVgeTgqvgkOVIBbNwgnjN6mqtuWzFiPL+NXQExq40
-I3whM+4lEiwSHaV+MYxWanMdhc+kImT50LKfkxcdAgMBAAGjggEfMIIBGzAdBgNV
-HQ4EFgQUB63oQR1/vda/G4F6P4xLiN4E0vowgesGA1UdIwSB4zCB4IAUB63oQR1/
-vda/G4F6P4xLiN4E0vqhgcSkgcEwgb4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdJ
-bmRpYW5hMRUwEwYDVQQHEwxJbmRpYW5hcG9saXMxKDAmBgNVBAoTH1NvZnR3YXJl
-IGluIHRoZSBQdWJsaWMgSW50ZXJlc3QxEzARBgNVBAsTCmhvc3RtYXN0ZXIxIDAe
-BgNVBAMTF0NlcnRpZmljYXRpb24gQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZo
-b3N0bWFzdGVyQHNwaS1pbmMub3JnggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcN
-AQEEBQADgYEAm/Abn8c2y1nO3fgpAIslxvi9iNBZDhQtJ0VQZY6wgSfANyDOR4DW
-iexO/AlorB49KnkFS7TjCAoLOZhcg5FaNiKnlstMI5krQmau1Qnb/vGSNsE/UGms
-1ts+QYPUs0KmGEAFUri2XzLy+aQo9Kw74VBvqnxvaaMeY5yMcKNOieY=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIIDjCCBfagAwIBAgIJAOiOtsn4KhQoMA0GCSqGSIb3DQEBBQUAMIG8MQswCQYD
-VQQGEwJVUzEQMA4GA1UECBMHSW5kaWFuYTEVMBMGA1UEBxMMSW5kaWFuYXBvbGlz
-MSgwJgYDVQQKEx9Tb2Z0d2FyZSBpbiB0aGUgUHVibGljIEludGVyZXN0MRMwEQYD
-VQQLEwpob3N0bWFzdGVyMR4wHAYDVQQDExVDZXJ0aWZpY2F0ZSBBdXRob3JpdHkx
-JTAjBgkqhkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDgwNTEz
-MDgwNzU2WhcNMTgwNTExMDgwNzU2WjCBvDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
-B0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdh
-cmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEe
-MBwGA1UEAxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZo
-b3N0bWFzdGVyQHNwaS1pbmMub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
-CgKCAgEA3DbmR0LCxFF1KYdAw9iOIQbSGE7r7yC9kDyFEBOMKVuUY/b0LfEGQpG5
-GcRCaQi/izZF6igFM0lIoCdDkzWKQdh4s/Dvs24t3dHLfer0dSbTPpA67tfnLAS1
-fOH1fMVO73e9XKKTM5LOfYFIz2u1IiwIg/3T1c87Lf21SZBb9q1NE8re06adU1Fx
-Y0b4ShZcmO4tbZoWoXaQ4mBDmdaJ1mwuepiyCwMs43pPx93jzONKao15Uvr0wa8u
-jyoIyxspgpJyQ7zOiKmqp4pRQ1WFmjcDeJPI8L20QcgHQprLNZd6ioFl3h1UCAHx
-ZFy3FxpRvB7DWYd2GBaY7r/2Z4GLBjXFS21ZGcfSxki+bhQog0oQnBv1b7ypjvVp
-/rLBVcznFMn5WxRTUQfqzj3kTygfPGEJ1zPSbqdu1McTCW9rXRTunYkbpWry9vjQ
-co7qch8vNGopCsUK7BxAhRL3pqXTT63AhYxMfHMgzFMY8bJYTAH1v+pk1Vw5xc5s
-zFNaVrpBDyXfa1C2x4qgvQLCxTtVpbJkIoRRKFauMe5e+wsWTUYFkYBE7axt8Feo
-+uthSKDLG7Mfjs3FIXcDhB78rKNDCGOM7fkn77SwXWfWT+3Qiz5dW8mRvZYChD3F
-TbxCP3T9PF2sXEg2XocxLxhsxGjuoYvJWdAY4wCAs1QnLpnwFVMCAwEAAaOCAg8w
-ggILMB0GA1UdDgQWBBQ0cdE41xU2g0dr1zdkQjuOjVKdqzCB8QYDVR0jBIHpMIHm
-gBQ0cdE41xU2g0dr1zdkQjuOjVKdq6GBwqSBvzCBvDELMAkGA1UEBhMCVVMxEDAO
-BgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMf
-U29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1h
-c3RlcjEeMBwGA1UEAxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcN
-AQkBFhZob3N0bWFzdGVyQHNwaS1pbmMub3JnggkA6I62yfgqFCgwDwYDVR0TAQH/
-BAUwAwEB/zARBglghkgBhvhCAQEEBAMCAAcwCQYDVR0SBAIwADAuBglghkgBhvhC
-AQ0EIRYfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDAwBglghkgBhvhC
-AQQEIxYhaHR0cHM6Ly9jYS5zcGktaW5jLm9yZy9jYS1jcmwucGVtMDIGCWCGSAGG
-+EIBAwQlFiNodHRwczovL2NhLnNwaS1pbmMub3JnL2NlcnQtY3JsLnBlbTAhBgNV
-HREEGjAYgRZob3N0bWFzdGVyQHNwaS1pbmMub3JnMA4GA1UdDwEB/wQEAwIBBjAN
-BgkqhkiG9w0BAQUFAAOCAgEAtM294LnqsgMrfjLp3nI/yUuCXp3ir1UJogxU6M8Y
-PCggHam7AwIvUjki+RfPrWeQswN/2BXja367m1YBrzXU2rnHZxeb1NUON7MgQS4M
-AcRb+WU+wmHo0vBqlXDDxm/VNaSsWXLhid+hoJ0kvSl56WEq2dMeyUakCHhBknIP
-qxR17QnwovBc78MKYiC3wihmrkwvLo9FYyaW8O4x5otVm6o6+YI5HYg84gd1GuEP
-sTC8cTLSOv76oYnzQyzWcsR5pxVIBcDYLXIC48s9Fmq6ybgREOJJhcyWR2AFJS7v
-dVkz9UcZFu/abF8HyKZQth3LZjQl/GaD68W2MEH4RkRiqMEMVObqTFoo5q7Gt/5/
-O5aoLu7HaD7dAD0prypjq1/uSSotxdz70cbT0ZdWUoa2lOvUYFG3/B6bzAKb1B+P
-+UqPti4oOxfMxaYF49LTtcYDyeFIQpvLP+QX4P4NAZUJurgNceQJcHdC2E3hQqlg
-g9cXiUPS1N2nGLar1CQlh7XU4vwuImm9rWgs/3K1mKoGnOcqarihk3bOsPN/nOHg
-T7jYhkalMwIsJWE3KpLIrIF0aGOHM3a9BX9e1dUCbb2v/ypaqknsmHlHU5H2DjRa
-yaXG67Ljxay2oHA1u8hRadDytaIybrw/oDc5fHE2pgXfDBLkFqfF1stjo5VwP+YE
-o2A=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc
-MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj
-IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB
-IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE
-RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl
-U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290
-IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU
-ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC
-QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr
-rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S
-NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc
-QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH
-txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP
-BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC
-AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp
-tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa
-IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl
-6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+
-xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
-Cm26OWMohpLzGITY+9HPBVZkVw==
------END CERTIFICATE-----
-
------BEGIN CERTIFICATE-----
-MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx
-ITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
-RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMTYw
-MTU0MzdaFw0yNjExMTYwMTU0MzdaMIHKMQswCQYDVQQGEwJVUzEQMA4GA1UECBMH
-QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5j
-b20sIEluYy4xMzAxBgNVBAsTKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5j
-b20vcmVwb3NpdG9yeTEwMC4GA1UEAxMnR28gRGFkZHkgU2VjdXJlIENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5MREwDwYDVQQFEwgwNzk2OTI4NzCCASIwDQYJKoZIhvcN
-AQEBBQADggEPADCCAQoCggEBAMQt1RWMnCZM7DI161+4WQFapmGBWTtwY6vj3D3H
-KrjJM9N55DrtPDAjhI6zMBS2sofDPZVUBJ7fmd0LJR4h3mUpfjWoqVTr9vcyOdQm
-VZWt7/v+WIbXnvQAjYwqDL1CBM6nPwT27oDyqu9SoWlm2r4arV3aLGbqGmu75RpR
-SgAvSMeYddi5Kcju+GZtCpyz8/x4fKL4o/K1w/O5epHBp+YlLpyo7RJlbmr2EkRT
-cDCVw5wrWCs9CHRK8r5RsL+H0EwnWGu1NcWdrxcx+AuP7q2BNgWJCJjPOq8lh8BJ
-6qf9Z/dFjpfMFDniNoW1fho3/Rb2cRGadDAW/hOUoz+EDU8CAwEAAaOCATIwggEu
-MB0GA1UdDgQWBBT9rGEyk2xF1uLuhV+auud2mWjM5zAfBgNVHSMEGDAWgBTSxLDS
-kdRMEXGzYcs9of7dqGrU4zASBgNVHRMBAf8ECDAGAQH/AgEAMDMGCCsGAQUFBwEB
-BCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZ29kYWRkeS5jb20wRgYDVR0f
-BD8wPTA7oDmgN4Y1aHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBv
-c2l0b3J5L2dkcm9vdC5jcmwwSwYDVR0gBEQwQjBABgRVHSAAMDgwNgYIKwYBBQUH
-AgEWKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeTAO
-BgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBANKGwOy9+aG2Z+5mC6IG
-OgRQjhVyrEp0lVPLN8tESe8HkGsz2ZbwlFalEzAFPIUyIXvJxwqoJKSQ3kbTJSMU
-A2fCENZvD117esyfxVgqwcSeIaha86ykRvOe5GPLL5CkKSkB2XIsKd83ASe8T+5o
-0yGPwLPk9Qnt0hCqU7S+8MxZC9Y7lhyVJEnfzuz9p0iRFEUOOjZv2kWzRaJBydTX
-RE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsxuxN89txJx9OjxUUAiKEngHUuH
-qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV
-U+4=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIE+zCCBGSgAwIBAgICAQ0wDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Zh
-bGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu
-Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g
-QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAe
-BgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTA0MDYyOTE3MDYyMFoX
-DTI0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBE
-YWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3MgMiBDZXJ0
-aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgC
-ggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
-2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+q
-N1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiO
-r18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lN
-f4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+YihfukEH
-U1jPEX44dMX4/7VpkI+EdOqXG68CAQOjggHhMIIB3TAdBgNVHQ4EFgQU0sSw0pHU
-TBFxs2HLPaH+3ahq1OMwgdIGA1UdIwSByjCBx6GBwaSBvjCBuzEkMCIGA1UEBxMb
-VmFsaUNlcnQgVmFsaWRhdGlvbiBOZXR3b3JrMRcwFQYDVQQKEw5WYWxpQ2VydCwg
-SW5jLjE1MDMGA1UECxMsVmFsaUNlcnQgQ2xhc3MgMiBQb2xpY3kgVmFsaWRhdGlv
-biBBdXRob3JpdHkxITAfBgNVBAMTGGh0dHA6Ly93d3cudmFsaWNlcnQuY29tLzEg
-MB4GCSqGSIb3DQEJARYRaW5mb0B2YWxpY2VydC5jb22CAQEwDwYDVR0TAQH/BAUw
-AwEB/zAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmdv
-ZGFkZHkuY29tMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jZXJ0aWZpY2F0ZXMu
-Z29kYWRkeS5jb20vcmVwb3NpdG9yeS9yb290LmNybDBLBgNVHSAERDBCMEAGBFUd
-IAAwODA2BggrBgEFBQcCARYqaHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNv
-bS9yZXBvc2l0b3J5MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOBgQC1
-QPmnHfbq/qQaQlpE9xXUhUaJwL6e4+PrxeNYiY+Sn1eocSxI0YGyeR+sBjUZsE4O
-WBsUs5iB0QQeyAfJg594RAoYC5jcdnplDQ1tgMQLARzLrUc+cb53S8wGd9D0Vmsf
-SxOaFIqII6hR8INMqzW/Rn453HWkrugp++85j09VZw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----\r
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0\r
-IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz\r
-BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y\r
-aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG\r
-9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy\r
-NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y\r
-azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs\r
-YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw\r
-Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl\r
-cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY\r
-dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9\r
-WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS\r
-v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v\r
-UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu\r
-IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC\r
-W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd\r
------END CERTIFICATE-----\r
+++ /dev/null
-This directory contains certificate/public keys/private keys used to create unittests.
-Passwort to private keys is "1234" or "secret".
\ No newline at end of file
+++ /dev/null
-Certificate:
- Data:
- Version: 3 (0x2)
- Serial Number:
- c7:4a:82:f6:9d:1b:f6:7e
- Signature Algorithm: sha1WithRSAEncryption
- Issuer: C=PL, ST=Maz, O=Samsung, OU=SPRC, CN=Samsung/emailAddress=samsung@samsung.com
- Validity
- Not Before: Oct 5 12:00:51 2011 GMT
- Not After : Oct 2 12:00:51 2021 GMT
- Subject: C=PL, ST=MAZ, L=Leg, O=Sam, OU=SPRC, CN=Filip/emailAddress=filip@samsung.com
- Subject Public Key Info:
- Public Key Algorithm: rsaEncryption
- RSA Public Key: (1024 bit)
- Modulus (1024 bit):
- 00:d2:fe:c4:b4:c1:74:82:6f:7e:28:8c:df:1b:58:
- 57:78:3e:5f:5e:4c:b1:e1:d7:c5:0d:1a:c3:e9:2e:
- 9a:78:8a:d7:5f:b9:cf:ce:83:2a:9a:4a:80:f0:07:
- 35:61:11:60:15:2c:24:f1:7b:15:1a:e0:d7:2f:6b:
- ee:35:35:b9:16:e1:10:ac:17:37:86:b3:49:2d:a6:
- ed:7e:f1:0f:af:d1:01:0e:1a:a5:45:da:b4:24:82:
- 29:73:0c:5f:e8:3b:9e:85:c7:0f:6f:1b:53:80:fa:
- a7:50:77:7c:8e:01:5d:84:a8:b3:41:3e:b1:18:07:
- d2:b9:18:5c:9f:7e:b6:a4:49
- Exponent: 65537 (0x10001)
- X509v3 extensions:
- X509v3 Basic Constraints:
- CA:FALSE
- Netscape Comment:
- OpenSSL Generated Certificate
- X509v3 Subject Key Identifier:
- 7B:2C:B7:89:5E:F9:2A:D3:A4:A4:F1:5D:EA:69:D1:F5:D1:46:64:CC
- X509v3 Authority Key Identifier:
- keyid:82:08:7F:DB:00:02:86:E8:53:2A:A5:FA:58:AE:67:7F:14:38:C8:60
-
- Signature Algorithm: sha1WithRSAEncryption
- 0e:db:f4:08:1a:d0:d5:00:8c:1f:d8:ca:16:3a:52:a6:ae:f3:
- 14:a3:17:41:e5:6d:6f:f6:62:7b:cd:b7:ff:fc:28:89:c8:3c:
- 93:19:cf:e6:c4:b8:74:95:8d:5c:d6:f5:88:c2:dd:86:05:7c:
- d2:0d:72:b7:78:13:58:fc:53:b4:5c:e9:ad:0c:8d:88:91:d3:
- 9a:b6:cd:59:72:d7:d6:ba:11:54:65:04:fc:8f:10:e3:17:b1:
- aa:96:cd:94:92:16:d8:98:e6:fe:4a:a8:29:f9:ca:c4:e4:46:
- e8:73:4f:5d:95:76:f4:d6:36:7c:34:4f:3c:e2:18:a0:54:33:
- ad:72
------BEGIN CERTIFICATE-----
-MIIC4zCCAkygAwIBAgIJAMdKgvadG/Z+MA0GCSqGSIb3DQEBBQUAMHIxCzAJBgNV
-BAYTAlBMMQwwCgYDVQQIEwNNYXoxEDAOBgNVBAoTB1NhbXN1bmcxDTALBgNVBAsT
-BFNQUkMxEDAOBgNVBAMTB1NhbXN1bmcxIjAgBgkqhkiG9w0BCQEWE3NhbXN1bmdA
-c2Ftc3VuZy5jb20wHhcNMTExMDA1MTIwMDUxWhcNMjExMDAyMTIwMDUxWjB4MQsw
-CQYDVQQGEwJQTDEMMAoGA1UECBMDTUFaMQwwCgYDVQQHEwNMZWcxDDAKBgNVBAoT
-A1NhbTENMAsGA1UECxMEU1BSQzEOMAwGA1UEAxMFRmlsaXAxIDAeBgkqhkiG9w0B
-CQEWEWZpbGlwQHNhbXN1bmcuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
-gQDS/sS0wXSCb34ojN8bWFd4Pl9eTLHh18UNGsPpLpp4itdfuc/OgyqaSoDwBzVh
-EWAVLCTxexUa4Ncva+41NbkW4RCsFzeGs0ktpu1+8Q+v0QEOGqVF2rQkgilzDF/o
-O56Fxw9vG1OA+qdQd3yOAV2EqLNBPrEYB9K5GFyffrakSQIDAQABo3sweTAJBgNV
-HRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZp
-Y2F0ZTAdBgNVHQ4EFgQUeyy3iV75KtOkpPFd6mnR9dFGZMwwHwYDVR0jBBgwFoAU
-ggh/2wAChuhTKqX6WK5nfxQ4yGAwDQYJKoZIhvcNAQEFBQADgYEADtv0CBrQ1QCM
-H9jKFjpSpq7zFKMXQeVtb/Zie823//woicg8kxnP5sS4dJWNXNb1iMLdhgV80g1y
-t3gTWPxTtFzprQyNiJHTmrbNWXLX1roRVGUE/I8Q4xexqpbNlJIW2Jjm/kqoKfnK
-xORG6HNPXZV29NY2fDRPPOIYoFQzrXI=
------END CERTIFICATE-----
+++ /dev/null
------BEGIN RSA PRIVATE KEY-----
-Proc-Type: 4,ENCRYPTED
-DEK-Info: DES-EDE3-CBC,FDE9F633EA955697
-
-ASWLPmOFfKlo46nJXTJLCkhvD/q1MsHXPaaSByVzaavXxwMxOc2g7VkIR2D0yViQ
-mxQFhJLVeq/1UI9pXL2+zk0awptHogwjTw81r2I+R6qkHsSjGjl4Ds6hOX3J211K
-UqO4+3kf6JJOizXbH/y6WWbj9jEJeE7zzmhuyq8k6Kp47leZsle5y13usii323tz
-OgAzZGsQBSkrlBNKKM58O7TkCO6UbZLjVEoBqcJU+p+UiKoGKdUV/MxkbGEKTEPN
-wrFiqIxSk9KuV5iDAjnYCPz6iQIE+Q3NOW+MTw0yjWoMb7uXJexGM6VYkYFZUffe
-16nAzJpYbG+CsJ5XTiGoiodazloVYdnDFnbDLDGS2kLgiuuHzF/DL1lFlbXwgpGj
-sXFp6CemJ+KnMz4aIfC63Wuav+jvAVw26pl/cYxbhboSkl+H9ZKbk+KcIeMN1Rb7
-LD35tsjO5rnQ1QlG0WP6qT6O1SPG/4GgJTyzTwuw6i8jQw62ahKB5hTri/Z8Fmrn
-kFh8F7gTJ+YnxrQuTK8r9QrZrXsE/YqUbHtVEI/m/6uydWdFHNWzJxe6oavuwks2
-3mumh1101mBEuEClzOzHP925oeXW+N8R+jFnA/7NkIjeOo+J9Z+QzBiq6DVJcuEY
-5aqXcCIS9AciUoh3/ovtT637r25nhYwCruZLZ+4+Vkpv9n/gPSipHXgHt2cynaID
-6O7xyoADa+zY1zTRd+A4aA+SWd/bxvKe+6sc/6iBlKA8bKwfPJcwg7il4bX4g5dk
-dI8gTyM9puDoHrdTaLwY8+JL0MCguEvkk7LDttNfN0gxYvxXTpZ+Tg==
------END RSA PRIVATE KEY-----
+++ /dev/null
-Certificate:
- Data:
- Version: 3 (0x2)
- Serial Number:
- c7:4a:82:f6:9d:1b:f6:7f
- Signature Algorithm: sha1WithRSAEncryption
- Issuer: C=PL, ST=Maz, O=Samsung, OU=SPRC, CN=Samsung/emailAddress=samsung@samsung.com
- Validity
- Not Before: Oct 5 12:11:33 2011 GMT
- Not After : Oct 2 12:11:33 2021 GMT
- Subject: C=PL, ST=Mazowieckie, L=legionowo, O=samsung, OU=sprc, CN=magda/emailAddress=magda@samsung.com
- Subject Public Key Info:
- Public Key Algorithm: dsaEncryption
- DSA Public Key:
- pub:
- 00:ac:40:42:0e:cc:a8:28:24:0b:43:09:7e:d6:23:
- 35:a2:8c:e6:7d:62:66:fe:23:d6:58:b8:f7:32:9f:
- 63:99:d3:2c:ff:af:60:0b:e0:d2:8c:0b:35:8b:c9:
- e6:77:0a:7d:8d:43:00:23:d4:e3:ff:ad:0b:b4:d3:
- b9:af:79:c2:08:f9:af:0b:c0:5e:7c:e0:4b:23:86:
- b9:2a:f4:7c:af:43:ca:b1:fa:13:42:df:5d:3f:96:
- b8:84:07:6a:19:b6:89:26:f1:a8:fa:c2:86:59:e9:
- e7:f1:17:0d:30:5a:3b:a4:1f:76:9a:b4:04:fe:3c:
- 0a:56:5e:6f:17:00:f9:36:05
- P:
- 00:b5:3c:23:9a:b0:58:65:7c:c7:35:ca:37:5c:a7:
- bc:e4:cd:71:a2:5b:e3:29:56:e1:65:b1:d6:30:90:
- 06:bd:b0:8b:cd:ad:02:e2:da:e9:71:72:73:41:78:
- 21:ca:0d:b9:3b:53:e2:77:fd:0c:0e:d9:76:a7:6a:
- 94:0c:52:ab:df:8d:f8:cb:d5:04:39:55:fe:c4:35:
- 45:8f:34:fe:dc:12:fc:7c:d8:d6:f9:8d:67:47:c9:
- 17:d5:ff:f4:dc:88:16:4d:f0:62:cd:11:b7:e1:b5:
- 69:61:23:a0:9b:0d:6d:40:69:8d:27:3d:9f:3b:f6:
- b4:88:93:bf:da:34:a6:77:15
- Q:
- 00:b7:2b:f2:e4:00:9a:75:7e:dc:32:c8:03:99:d3:
- a3:40:60:d1:b8:cb
- G:
- 24:6e:e6:79:4b:50:6c:cb:a5:44:c7:63:cd:e0:a8:
- c9:ad:85:5d:d9:be:e1:a7:2f:22:71:3d:ff:e3:32:
- 6d:74:c1:dd:b1:40:34:cc:b0:e9:64:ef:93:82:bd:
- 44:af:2d:9b:9d:8d:f7:97:32:91:38:e9:01:bc:6a:
- 4c:c6:97:c2:47:56:6c:e1:5d:54:a0:0a:9f:2c:62:
- fd:42:ad:63:d4:3a:36:6c:09:07:68:5b:03:51:94:
- ce:13:e4:a3:ca:c4:75:ae:ba:08:69:74:55:bc:8c:
- d6:52:8c:26:30:3e:c2:9f:69:1b:5d:74:2f:4a:2f:
- d7:d4:3d:7e:fa:8a:a7:95
- X509v3 extensions:
- X509v3 Basic Constraints:
- CA:FALSE
- Netscape Comment:
- OpenSSL Generated Certificate
- X509v3 Subject Key Identifier:
- 99:2A:52:86:CC:2F:5A:D1:00:05:DF:A5:DD:6C:5C:71:17:02:C9:D5
- X509v3 Authority Key Identifier:
- keyid:82:08:7F:DB:00:02:86:E8:53:2A:A5:FA:58:AE:67:7F:14:38:C8:60
-
- Signature Algorithm: sha1WithRSAEncryption
- 81:f9:c0:bb:f8:0c:25:10:bf:04:5c:24:82:fa:c7:2f:44:d5:
- e1:f7:cf:54:07:fb:45:29:d9:4b:a8:9b:e0:81:c6:82:bb:d7:
- 26:f2:fe:42:1e:ef:1f:29:2f:64:8a:83:d8:bf:7a:9d:8d:84:
- 69:23:6b:d3:25:eb:4f:cd:58:44:e9:dd:39:05:09:37:1e:18:
- fd:6f:26:e9:ab:2e:e2:1c:c0:34:d6:6a:58:26:c0:a4:f0:c8:
- 30:ae:95:70:f0:35:c2:b2:a0:66:a6:d6:a7:6d:7c:58:1a:88:
- da:ff:69:5d:5d:0e:fa:3a:73:c6:ad:7e:19:e4:15:d9:4b:1b:
- 47:07
------BEGIN CERTIFICATE-----
-MIIEDzCCA3igAwIBAgIJAMdKgvadG/Z/MA0GCSqGSIb3DQEBBQUAMHIxCzAJBgNV
-BAYTAlBMMQwwCgYDVQQIEwNNYXoxEDAOBgNVBAoTB1NhbXN1bmcxDTALBgNVBAsT
-BFNQUkMxEDAOBgNVBAMTB1NhbXN1bmcxIjAgBgkqhkiG9w0BCQEWE3NhbXN1bmdA
-c2Ftc3VuZy5jb20wHhcNMTExMDA1MTIxMTMzWhcNMjExMDAyMTIxMTMzWjCBijEL
-MAkGA1UEBhMCUEwxFDASBgNVBAgTC01hem93aWVja2llMRIwEAYDVQQHEwlsZWdp
-b25vd28xEDAOBgNVBAoTB3NhbXN1bmcxDTALBgNVBAsTBHNwcmMxDjAMBgNVBAMT
-BW1hZ2RhMSAwHgYJKoZIhvcNAQkBFhFtYWdkYUBzYW1zdW5nLmNvbTCCAbcwggEr
-BgcqhkjOOAQBMIIBHgKBgQC1PCOasFhlfMc1yjdcp7zkzXGiW+MpVuFlsdYwkAa9
-sIvNrQLi2ulxcnNBeCHKDbk7U+J3/QwO2XanapQMUqvfjfjL1QQ5Vf7ENUWPNP7c
-Evx82Nb5jWdHyRfV//TciBZN8GLNEbfhtWlhI6CbDW1AaY0nPZ879rSIk7/aNKZ3
-FQIVALcr8uQAmnV+3DLIA5nTo0Bg0bjLAoGAJG7meUtQbMulRMdjzeCoya2FXdm+
-4acvInE9/+MybXTB3bFANMyw6WTvk4K9RK8tm52N95cykTjpAbxqTMaXwkdWbOFd
-VKAKnyxi/UKtY9Q6NmwJB2hbA1GUzhPko8rEda66CGl0VbyM1lKMJjA+wp9pG110
-L0ov19Q9fvqKp5UDgYUAAoGBAKxAQg7MqCgkC0MJftYjNaKM5n1iZv4j1li49zKf
-Y5nTLP+vYAvg0owLNYvJ5ncKfY1DACPU4/+tC7TTua95wgj5rwvAXnzgSyOGuSr0
-fK9DyrH6E0LfXT+WuIQHahm2iSbxqPrChlnp5/EXDTBaO6Qfdpq0BP48ClZebxcA
-+TYFo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVy
-YXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUmSpShswvWtEABd+l3WxccRcCydUw
-HwYDVR0jBBgwFoAUggh/2wAChuhTKqX6WK5nfxQ4yGAwDQYJKoZIhvcNAQEFBQAD
-gYEAgfnAu/gMJRC/BFwkgvrHL0TV4ffPVAf7RSnZS6ib4IHGgrvXJvL+Qh7vHykv
-ZIqD2L96nY2EaSNr0yXrT81YROndOQUJNx4Y/W8m6asu4hzANNZqWCbApPDIMK6V
-cPA1wrKgZqbWp218WBqI2v9pXV0O+jpzxq1+GeQV2UsbRwc=
------END CERTIFICATE-----
+++ /dev/null
------BEGIN DSA PRIVATE KEY-----
-MIIBuwIBAAKBgQC1PCOasFhlfMc1yjdcp7zkzXGiW+MpVuFlsdYwkAa9sIvNrQLi
-2ulxcnNBeCHKDbk7U+J3/QwO2XanapQMUqvfjfjL1QQ5Vf7ENUWPNP7cEvx82Nb5
-jWdHyRfV//TciBZN8GLNEbfhtWlhI6CbDW1AaY0nPZ879rSIk7/aNKZ3FQIVALcr
-8uQAmnV+3DLIA5nTo0Bg0bjLAoGAJG7meUtQbMulRMdjzeCoya2FXdm+4acvInE9
-/+MybXTB3bFANMyw6WTvk4K9RK8tm52N95cykTjpAbxqTMaXwkdWbOFdVKAKnyxi
-/UKtY9Q6NmwJB2hbA1GUzhPko8rEda66CGl0VbyM1lKMJjA+wp9pG110L0ov19Q9
-fvqKp5UCgYEArEBCDsyoKCQLQwl+1iM1oozmfWJm/iPWWLj3Mp9jmdMs/69gC+DS
-jAs1i8nmdwp9jUMAI9Tj/60LtNO5r3nCCPmvC8BefOBLI4a5KvR8r0PKsfoTQt9d
-P5a4hAdqGbaJJvGo+sKGWenn8RcNMFo7pB92mrQE/jwKVl5vFwD5NgUCFC0583uX
-PgTY5e9pOTVpCwebt50S
------END DSA PRIVATE KEY-----
+++ /dev/null
------BEGIN CERTIFICATE-----
-MIIFVTCCBD2gAwIBAgIHBBrt1FojCzANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
-BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY
-BgNVBAoTEUdvRGFkZHkuY29tLCBJbmMuMTMwMQYDVQQLEypodHRwOi8vY2VydGlm
-aWNhdGVzLmdvZGFkZHkuY29tL3JlcG9zaXRvcnkxMDAuBgNVBAMTJ0dvIERhZGR5
-IFNlY3VyZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTERMA8GA1UEBRMIMDc5Njky
-ODcwHhcNMTAwNjA5MDIwNzU3WhcNMTEwNjE5MTEwNDM2WjBRMRUwEwYDVQQKEwwq
-LnVidW50dS5jb20xITAfBgNVBAsTGERvbWFpbiBDb250cm9sIFZhbGlkYXRlZDEV
-MBMGA1UEAxMMKi51YnVudHUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEAu8VcCeGdREV3PYYQukyrfUAay8Ic3fMhA+YUKzqbH8UuPhcjjS3izxaT
-vHLh7v80HS4DXYu6CqoQugZndV4R9KqJN1HVK5acar91VOeQgTSoowTSFtyg6aXJ
-JVdEETyftGHSpS4WjyQZ9FazTfC47c5lJr+3wCZ90UaxaWpNERpMc2L4ZxG1wGCw
-XYWVONtV817NecZVAiytvNPSmcnFm/OC/5GtzxNhfYmsNt1+MiC3IUFe2XnQwFhG
-rvn9IcG2RhEKOOu55pHM08FcnDbfyegBkEDAmQbFIUM+tFUI7nkDNQWy/Mgzuqtg
-DjydGu8h7BObEFrqXtUpm9CbTFZgzwIDAQABo4IBtjCCAbIwDwYDVR0TAQH/BAUw
-AwEBADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDgYDVR0PAQH/BAQD
-AgWgMDMGA1UdHwQsMCowKKAmoCSGImh0dHA6Ly9jcmwuZ29kYWRkeS5jb20vZ2Rz
-MS0xOS5jcmwwUwYDVR0gBEwwSjBIBgtghkgBhv1tAQcXATA5MDcGCCsGAQUFBwIB
-FitodHRwOi8vY2VydGlmaWNhdGVzLmdvZGFkZHkuY29tL3JlcG9zaXRvcnkvMIGA
-BggrBgEFBQcBAQR0MHIwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmdvZGFkZHku
-Y29tLzBKBggrBgEFBQcwAoY+aHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNv
-bS9yZXBvc2l0b3J5L2dkX2ludGVybWVkaWF0ZS5jcnQwHwYDVR0jBBgwFoAU/axh
-MpNsRdbi7oVfmrrndplozOcwIwYDVR0RBBwwGoIMKi51YnVudHUuY29tggp1YnVu
-dHUuY29tMB0GA1UdDgQWBBTUVPFNlBiCNfPjhD8O8mDUv7MLUjANBgkqhkiG9w0B
-AQUFAAOCAQEAUjuOqqu+vS0StsxVXj44hvPye1MC/MkanIrdce5BgYMc5a+8UJba
-ay8h34vtsvfDsTifNY8ijDx79Hprh9V2LwfWWAiWK2SdrceIdGrxDvzmDHllO5YT
-ig2XhAA7ll4toSnrUfsZmi/bgb1V6VNoq36xvK+riDGnPhc7tNDZZb1fBKE+nA1p
-CZq80Liv1xri4Nj1YQ0kMQQnSHkUgEGg7bvtf+cNkIp3OXTNW8f7VFoaWVZNKW8c
-cxNljypjJM+h7xXCG/YRKws8eCi+xpO1Oc41tnSvbCbc0B6+xwFjRx5tfja309QI
-R2+uBFsmWtBCtn31o4CFNytEnwBOPVbZBA==
------END CERTIFICATE-----
+++ /dev/null
------BEGIN CERTIFICATE-----
-MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx
-ITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
-RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMTYw
-MTU0MzdaFw0yNjExMTYwMTU0MzdaMIHKMQswCQYDVQQGEwJVUzEQMA4GA1UECBMH
-QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5j
-b20sIEluYy4xMzAxBgNVBAsTKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5j
-b20vcmVwb3NpdG9yeTEwMC4GA1UEAxMnR28gRGFkZHkgU2VjdXJlIENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5MREwDwYDVQQFEwgwNzk2OTI4NzCCASIwDQYJKoZIhvcN
-AQEBBQADggEPADCCAQoCggEBAMQt1RWMnCZM7DI161+4WQFapmGBWTtwY6vj3D3H
-KrjJM9N55DrtPDAjhI6zMBS2sofDPZVUBJ7fmd0LJR4h3mUpfjWoqVTr9vcyOdQm
-VZWt7/v+WIbXnvQAjYwqDL1CBM6nPwT27oDyqu9SoWlm2r4arV3aLGbqGmu75RpR
-SgAvSMeYddi5Kcju+GZtCpyz8/x4fKL4o/K1w/O5epHBp+YlLpyo7RJlbmr2EkRT
-cDCVw5wrWCs9CHRK8r5RsL+H0EwnWGu1NcWdrxcx+AuP7q2BNgWJCJjPOq8lh8BJ
-6qf9Z/dFjpfMFDniNoW1fho3/Rb2cRGadDAW/hOUoz+EDU8CAwEAAaOCATIwggEu
-MB0GA1UdDgQWBBT9rGEyk2xF1uLuhV+auud2mWjM5zAfBgNVHSMEGDAWgBTSxLDS
-kdRMEXGzYcs9of7dqGrU4zASBgNVHRMBAf8ECDAGAQH/AgEAMDMGCCsGAQUFBwEB
-BCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZ29kYWRkeS5jb20wRgYDVR0f
-BD8wPTA7oDmgN4Y1aHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBv
-c2l0b3J5L2dkcm9vdC5jcmwwSwYDVR0gBEQwQjBABgRVHSAAMDgwNgYIKwYBBQUH
-AgEWKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeTAO
-BgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBANKGwOy9+aG2Z+5mC6IG
-OgRQjhVyrEp0lVPLN8tESe8HkGsz2ZbwlFalEzAFPIUyIXvJxwqoJKSQ3kbTJSMU
-A2fCENZvD117esyfxVgqwcSeIaha86ykRvOe5GPLL5CkKSkB2XIsKd83ASe8T+5o
-0yGPwLPk9Qnt0hCqU7S+8MxZC9Y7lhyVJEnfzuz9p0iRFEUOOjZv2kWzRaJBydTX
-RE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsxuxN89txJx9OjxUUAiKEngHUuH
-qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV
-U+4=
------END CERTIFICATE-----
+++ /dev/null
------BEGIN CERTIFICATE-----
-MIIE+zCCBGSgAwIBAgICAQ0wDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Zh
-bGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu
-Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g
-QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAe
-BgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTA0MDYyOTE3MDYyMFoX
-DTI0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBE
-YWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3MgMiBDZXJ0
-aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgC
-ggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
-2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+q
-N1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiO
-r18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lN
-f4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+YihfukEH
-U1jPEX44dMX4/7VpkI+EdOqXG68CAQOjggHhMIIB3TAdBgNVHQ4EFgQU0sSw0pHU
-TBFxs2HLPaH+3ahq1OMwgdIGA1UdIwSByjCBx6GBwaSBvjCBuzEkMCIGA1UEBxMb
-VmFsaUNlcnQgVmFsaWRhdGlvbiBOZXR3b3JrMRcwFQYDVQQKEw5WYWxpQ2VydCwg
-SW5jLjE1MDMGA1UECxMsVmFsaUNlcnQgQ2xhc3MgMiBQb2xpY3kgVmFsaWRhdGlv
-biBBdXRob3JpdHkxITAfBgNVBAMTGGh0dHA6Ly93d3cudmFsaWNlcnQuY29tLzEg
-MB4GCSqGSIb3DQEJARYRaW5mb0B2YWxpY2VydC5jb22CAQEwDwYDVR0TAQH/BAUw
-AwEB/zAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmdv
-ZGFkZHkuY29tMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jZXJ0aWZpY2F0ZXMu
-Z29kYWRkeS5jb20vcmVwb3NpdG9yeS9yb290LmNybDBLBgNVHSAERDBCMEAGBFUd
-IAAwODA2BggrBgEFBQcCARYqaHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNv
-bS9yZXBvc2l0b3J5MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOBgQC1
-QPmnHfbq/qQaQlpE9xXUhUaJwL6e4+PrxeNYiY+Sn1eocSxI0YGyeR+sBjUZsE4O
-WBsUs5iB0QQeyAfJg594RAoYC5jcdnplDQ1tgMQLARzLrUc+cb53S8wGd9D0Vmsf
-SxOaFIqII6hR8INMqzW/Rn453HWkrugp++85j09VZw==
------END CERTIFICATE-----
+++ /dev/null
------BEGIN CERTIFICATE-----\r
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0\r
-IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz\r
-BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y\r
-aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG\r
-9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy\r
-NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y\r
-azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs\r
-YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw\r
-Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl\r
-cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY\r
-dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9\r
-WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS\r
-v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v\r
-UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu\r
-IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC\r
-W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd\r
------END CERTIFICATE-----\r
+++ /dev/null
-Certificate:
- Data:
- Version: 3 (0x2)
- Serial Number:
- 85:7d:e1:c5:d9:de:7a:1f
- Signature Algorithm: sha1WithRSAEncryption
- Issuer: C=PL, ST=Mazowieckie, O=Samsung, OU=SPRC, CN=Operator Test Root Certificate/emailAddress=operator@samsung.com
- Validity
- Not Before: Jan 4 17:27:08 2011 GMT
- Not After : Jan 3 17:27:08 2014 GMT
- Subject: C=PL, ST=Mazowieckie, O=Samsung, OU=SPRC, CN=Operator Test Root Certificate/emailAddress=operator@samsung.com
- Subject Public Key Info:
- Public Key Algorithm: rsaEncryption
- RSA Public Key: (1024 bit)
- Modulus (1024 bit):
- 00:c3:39:17:a8:f9:d0:69:37:9a:56:44:39:67:10:
- 14:a9:4b:a2:0b:c7:fc:a1:e8:e8:f7:1c:06:f4:9c:
- 83:f7:37:07:9d:9c:2c:1b:46:43:5f:f1:7b:91:a8:
- cd:c0:76:00:d5:9c:c9:28:f7:91:28:b6:97:ec:85:
- b1:10:0f:58:2e:f6:6f:98:b6:ab:7b:ca:08:10:7f:
- 55:32:bf:32:db:a7:c2:86:83:03:ee:41:0a:24:de:
- 17:e3:9d:8f:5b:fa:46:70:78:98:b4:c1:14:77:44:
- ab:59:7c:4c:d3:4a:f7:54:f2:30:0d:38:73:95:9f:
- 21:0e:a9:86:3e:fc:82:4e:0b
- Exponent: 65537 (0x10001)
- X509v3 extensions:
- X509v3 Subject Key Identifier:
- 25:A5:90:9F:4D:3A:A4:19:0A:80:46:5E:F3:FB:20:CE:56:30:33:DA
- X509v3 Authority Key Identifier:
- keyid:25:A5:90:9F:4D:3A:A4:19:0A:80:46:5E:F3:FB:20:CE:56:30:33:DA
- DirName:/C=PL/ST=Mazowieckie/O=Samsung/OU=SPRC/CN=Operator Test Root Certificate/emailAddress=operator@samsung.com
- serial:85:7D:E1:C5:D9:DE:7A:1F
-
- X509v3 Basic Constraints:
- CA:TRUE
- Signature Algorithm: sha1WithRSAEncryption
- b9:d7:72:49:09:d8:6f:61:94:51:40:9d:c3:d3:23:53:97:b8:
- 12:ee:cb:dd:57:e6:1f:a2:76:38:5d:42:51:bd:a9:30:19:f7:
- 67:5b:a8:67:4a:9e:a1:f0:a9:22:14:94:77:32:27:79:37:9c:
- 0a:0f:52:80:14:62:00:94:45:85:3b:fd:ad:b4:c3:20:45:ba:
- b7:91:1a:9e:38:51:0f:9b:d5:ce:74:c7:bd:4a:21:9a:2d:b5:
- 71:0b:42:d2:95:72:66:fe:eb:11:ad:62:44:6c:32:4e:b4:00:
- 37:d7:b8:d5:4b:f6:74:36:78:d6:ae:66:b3:ca:6e:42:ff:cb:
- c2:e6
------BEGIN CERTIFICATE-----
-MIIDnzCCAwigAwIBAgIJAIV94cXZ3nofMA0GCSqGSIb3DQEBBQUAMIGSMQswCQYD
-VQQGEwJQTDEUMBIGA1UECBMLTWF6b3dpZWNraWUxEDAOBgNVBAoTB1NhbXN1bmcx
-DTALBgNVBAsTBFNQUkMxJzAlBgNVBAMTHk9wZXJhdG9yIFRlc3QgUm9vdCBDZXJ0
-aWZpY2F0ZTEjMCEGCSqGSIb3DQEJARYUb3BlcmF0b3JAc2Ftc3VuZy5jb20wHhcN
-MTEwMTA0MTcyNzA4WhcNMTQwMTAzMTcyNzA4WjCBkjELMAkGA1UEBhMCUEwxFDAS
-BgNVBAgTC01hem93aWVja2llMRAwDgYDVQQKEwdTYW1zdW5nMQ0wCwYDVQQLEwRT
-UFJDMScwJQYDVQQDEx5PcGVyYXRvciBUZXN0IFJvb3QgQ2VydGlmaWNhdGUxIzAh
-BgkqhkiG9w0BCQEWFG9wZXJhdG9yQHNhbXN1bmcuY29tMIGfMA0GCSqGSIb3DQEB
-AQUAA4GNADCBiQKBgQDDOReo+dBpN5pWRDlnEBSpS6ILx/yh6Oj3HAb0nIP3Nwed
-nCwbRkNf8XuRqM3AdgDVnMko95EotpfshbEQD1gu9m+Ytqt7yggQf1UyvzLbp8KG
-gwPuQQok3hfjnY9b+kZweJi0wRR3RKtZfEzTSvdU8jANOHOVnyEOqYY+/IJOCwID
-AQABo4H6MIH3MB0GA1UdDgQWBBQlpZCfTTqkGQqARl7z+yDOVjAz2jCBxwYDVR0j
-BIG/MIG8gBQlpZCfTTqkGQqARl7z+yDOVjAz2qGBmKSBlTCBkjELMAkGA1UEBhMC
-UEwxFDASBgNVBAgTC01hem93aWVja2llMRAwDgYDVQQKEwdTYW1zdW5nMQ0wCwYD
-VQQLEwRTUFJDMScwJQYDVQQDEx5PcGVyYXRvciBUZXN0IFJvb3QgQ2VydGlmaWNh
-dGUxIzAhBgkqhkiG9w0BCQEWFG9wZXJhdG9yQHNhbXN1bmcuY29tggkAhX3hxdne
-eh8wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQC513JJCdhvYZRRQJ3D
-0yNTl7gS7svdV+YfonY4XUJRvakwGfdnW6hnSp6h8KkiFJR3Mid5N5wKD1KAFGIA
-lEWFO/2ttMMgRbq3kRqeOFEPm9XOdMe9SiGaLbVxC0LSlXJm/usRrWJEbDJOtAA3
-17jVS/Z0NnjWrmazym5C/8vC5g==
------END CERTIFICATE-----
+++ /dev/null
-Certificate:
- Data:
- Version: 3 (0x2)
- Serial Number:
- 85:7d:e1:c5:d9:de:7a:20
- Signature Algorithm: sha1WithRSAEncryption
- Issuer: C=PL, ST=Mazowieckie, O=Samsung, OU=SPRC, CN=Operator Test Root Certificate/emailAddress=operator@samsung.com
- Validity
- Not Before: Jan 4 17:34:31 2011 GMT
- Not After : Jan 4 17:34:31 2012 GMT
- Subject: C=PL, ST=Malopolskie, L=Krakow, O=Samsung, OU=N/A, CN=Operator Test Second Level Certificate/emailAddress=second.operator@samsung.com
- Subject Public Key Info:
- Public Key Algorithm: rsaEncryption
- RSA Public Key: (1024 bit)
- Modulus (1024 bit):
- 00:ba:3c:58:ca:87:1e:59:68:54:8a:54:34:43:61:
- f1:81:e6:35:c1:46:74:16:c7:ff:f9:15:9e:0c:5a:
- 6a:89:c1:13:0c:61:2e:ba:00:e0:71:ea:7e:31:ae:
- 4e:ef:93:58:51:98:97:f3:bf:8a:9b:b2:c1:b7:0c:
- 5f:3f:56:b3:13:3b:d0:80:be:04:66:89:84:50:ca:
- fe:f6:f7:6b:05:3b:30:4e:96:9c:5b:c5:80:bc:d6:
- be:6e:69:f4:b9:9b:4c:06:7a:ed:37:67:b2:fe:45:
- 69:57:62:54:cb:69:69:48:b9:7d:a0:42:f1:b6:dc:
- f2:7f:eb:75:2a:d4:83:69:b9
- Exponent: 65537 (0x10001)
- X509v3 extensions:
- X509v3 Basic Constraints:
- CA:FALSE
- Netscape Comment:
- OpenSSL Generated Certificate
- X509v3 Subject Key Identifier:
- D9:F3:11:BF:98:5A:60:12:7A:85:B5:E7:A7:38:4F:CF:51:1D:C6:B2
- X509v3 Authority Key Identifier:
- keyid:25:A5:90:9F:4D:3A:A4:19:0A:80:46:5E:F3:FB:20:CE:56:30:33:DA
-
- Signature Algorithm: sha1WithRSAEncryption
- 69:6c:26:81:51:91:a6:e6:11:dc:81:35:03:73:85:4f:2f:29:
- 1f:20:f2:23:54:82:ca:8f:b8:a6:e3:3f:cd:72:5e:d7:e7:f5:
- 84:8a:33:e2:51:9f:36:4b:30:85:f4:4f:87:c7:9a:69:0b:15:
- 6e:92:c7:1f:2f:58:a4:57:f8:c2:cd:59:6c:d2:11:63:ae:bb:
- b0:32:3f:09:e7:2e:ad:db:1b:fe:e7:a4:21:43:47:76:e1:de:
- 36:bb:26:3f:16:76:20:ed:a4:68:c1:48:ae:2b:95:fb:f6:d2:
- f2:7f:74:f6:83:e2:89:06:b5:89:54:6e:7f:cf:88:94:66:e8:
- da:32
------BEGIN CERTIFICATE-----
-MIIDPjCCAqegAwIBAgIJAIV94cXZ3nogMA0GCSqGSIb3DQEBBQUAMIGSMQswCQYD
-VQQGEwJQTDEUMBIGA1UECBMLTWF6b3dpZWNraWUxEDAOBgNVBAoTB1NhbXN1bmcx
-DTALBgNVBAsTBFNQUkMxJzAlBgNVBAMTHk9wZXJhdG9yIFRlc3QgUm9vdCBDZXJ0
-aWZpY2F0ZTEjMCEGCSqGSIb3DQEJARYUb3BlcmF0b3JAc2Ftc3VuZy5jb20wHhcN
-MTEwMTA0MTczNDMxWhcNMTIwMTA0MTczNDMxWjCBsTELMAkGA1UEBhMCUEwxFDAS
-BgNVBAgTC01hbG9wb2xza2llMQ8wDQYDVQQHEwZLcmFrb3cxEDAOBgNVBAoTB1Nh
-bXN1bmcxDDAKBgNVBAsTA04vQTEvMC0GA1UEAxMmT3BlcmF0b3IgVGVzdCBTZWNv
-bmQgTGV2ZWwgQ2VydGlmaWNhdGUxKjAoBgkqhkiG9w0BCQEWG3NlY29uZC5vcGVy
-YXRvckBzYW1zdW5nLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAujxY
-yoceWWhUilQ0Q2HxgeY1wUZ0Fsf/+RWeDFpqicETDGEuugDgcep+Ma5O75NYUZiX
-87+Km7LBtwxfP1azEzvQgL4EZomEUMr+9vdrBTswTpacW8WAvNa+bmn0uZtMBnrt
-N2ey/kVpV2JUy2lpSLl9oELxttzyf+t1KtSDabkCAwEAAaN7MHkwCQYDVR0TBAIw
-ADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUw
-HQYDVR0OBBYEFNnzEb+YWmASeoW156c4T89RHcayMB8GA1UdIwQYMBaAFCWlkJ9N
-OqQZCoBGXvP7IM5WMDPaMA0GCSqGSIb3DQEBBQUAA4GBAGlsJoFRkabmEdyBNQNz
-hU8vKR8g8iNUgsqPuKbjP81yXtfn9YSKM+JRnzZLMIX0T4fHmmkLFW6Sxx8vWKRX
-+MLNWWzSEWOuu7AyPwnnLq3bG/7npCFDR3bh3ja7Jj8WdiDtpGjBSK4rlfv20vJ/
-dPaD4okGtYlUbn/PiJRm6Noy
------END CERTIFICATE-----
+++ /dev/null
------BEGIN RSA PRIVATE KEY-----
-Proc-Type: 4,ENCRYPTED
-DEK-Info: DES-EDE3-CBC,44C051D8935528BB
-
-iISuf9ELdyP5M0vlWOK4msH09HRAhN+43qRu/RDznpsTs2lX2sJITXXEmJC4EJzS
-Zk4jf3ScTj1JsMGlg5k0mZWLmDb4kUxTRVUqJX2W4uUYEmWav7LQHRAsPwNUSMs3
-DzZabSf1vplnKKoL9mMtX4E0mj79AkJp7tARQu4Zn2FDMg/UnCErzhGeoFysztmM
-v0Biyrf8yTbatMMr7Ea6rIsKS8KbkEeYDk4LpxBXkMeOutnnUUdhUEXZ/mwgJq2e
-+8LLPiWdFsrGxPdub7iuLXidXSpOd9VaC9LN/ORKF+EiJtF+twWSBotxYOtwmtgj
-xUHfXBcbaFoPnLKNS0nxwsOHF07LUfsCHzfVm1uGyWFkkLrPfcSjb6PahFlfO6w5
-fv8HnUOgeAjlhK6X+xhmw1tpwMUlmcYmq31eC8rwxP59jNQbhH6GVr5+rEMRHNgp
-loC1WqthoRtBEC0bi99VpIHVIepe9G+p40sIropoUWftfDSLl3RtONg5GyyZWQ4a
-ROxsiLHDZ7+q8eKkJuYPkiZ61/5MHuOsH5k57PG7ppG6/0p+ED4bTwxxDb6PU4pA
-08xUTZQ0CUn1x80o/lKw+1E9TJOTbCvrEJAnMksfOkNkNyedgDJaxfV63wYvnL4+
-BLzCqa6djpe0Mg2olQieV/piRUt7JaGA7bnaMAn+bJ56PzUnMl0/WlxzGTMtHjkf
-zUqgLLdxZpJP7zl4XleSfRWlPgL1iN1s84x48ej+MGgOGi7xTgX/sfCLkN4No/8k
-c5Po+lQU261XAYNuAjtjUFQP/FgIMM9CnJrDWp8xHZXUJBo0c5lOKg==
------END RSA PRIVATE KEY-----
+++ /dev/null
------BEGIN RSA PRIVATE KEY-----
-Proc-Type: 4,ENCRYPTED
-DEK-Info: DES-EDE3-CBC,D2942E015452A445
-
-0M/tC+qVDqyhNsxZZB/dGLuNxsStSUA7TRDRiSBee9JsvcFZjq03D/VjBakNIeET
-6efmKfAngomfvrWtxhped3RI4vasX05swfnr4qiUKjLPyftmNEepbNGeI8MaiD7a
-fEOZuAacstyS5RMHRBXrktq+jtXW2meQTuvEMBJf1AeAIuaFNvr3OvvpCtDwRffi
-1ijUVuG0ZQ6MpP7cGeqLYUZ9StTMxeiEesAPM4YrG7HIY13KaHwMr1ZRtENe7qZ8
-R8vwgW188FYkSSrcQjCVEuj/ztTg9eVuSKdTNgjfKzTWnlrjAzi8CKBsrkYoarwS
-6Rv3TqVVnx4HHdo9RIUKZPeLOdcMD1OPK7aOUedPTAcht3Y7SQQphBQypLf6PLKB
-DCo79B4TUA1W9MijT2d2GN7oJHqHax8zO2j+yCLkEcHF32JZsEFE63Bwss72FXMg
-mTmpCwyzR+oN93687JDUBAP9zNVd76ZnpzwlMZirB6QTY/lrH+iXLH3R3PO6cl2R
-0Jei4IQ1oB+SX6GOPt4tKGTqktUFhsJYbXyifj4O1ZyDVYTp0JafOLxJfU33oYTm
-278yshFdyHRgfKIHvqctZ1xJN2ioVcWf+9DprHc5kGb6wUKRVfQpipTS2hgbMBz+
-UWRZWq+CUD5QkTz4cSQfhPWQF6TNWpTQc0dvAlo3Cmxrro1PriDItsCOeydeNWvn
-Dyynx7ODp/F1rX5ekaXkVxsdGgD/HuNF+c7tEytD7U4/CmevytuXRIrFM0alj2OE
-aBFTqKicBoKgDV9VUOTKwuFeNV7MSuVDUnngEBeYrinwGa7wuV7tzA==
------END RSA PRIVATE KEY-----
int main (int argc, char *argv[])
{
- DPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv);
+ VcoreDPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv);
return 0;
}
-ADD_SUBDIRECTORY(src)
+# compiler warning flags
+ADD_DEFINITIONS("-Wall")
+ADD_DEFINITIONS("-Wextra")
+ADD_DEFINITIONS("-Werror")
+
+PKG_CHECK_MODULES(VCORE_DEPS
+ REQUIRED
+ libxml-2.0
+ libpcrecpp
+ openssl
+ xmlsec1
+ dlog
+ libsystemd-journal
+ )
+
+ADD_DEFINITIONS(${VCORE_DEPS_CFLAGS})
+ADD_DEFINITIONS(${VCORE_DEPS_CFLAGS_OTHER})
+
+SET(VCORE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
+
+SET(VCORE_SOURCES
+ ${VCORE_DIR}/dpl/core/src/assert.cpp
+ ${VCORE_DIR}/dpl/core/src/exception.cpp
+ ${VCORE_DIR}/dpl/core/src/noncopyable.cpp
+ ${VCORE_DIR}/dpl/core/src/singleton.cpp
+ ${VCORE_DIR}/dpl/core/src/colors.cpp
+
+ ${VCORE_DIR}/dpl/log/src/abstract_log_provider.cpp
+ ${VCORE_DIR}/dpl/log/src/old_style_log_provider.cpp
+ ${VCORE_DIR}/dpl/log/src/dlog_log_provider.cpp
+ ${VCORE_DIR}/dpl/log/src/journal_log_provider.cpp
+ ${VCORE_DIR}/dpl/log/src/log.cpp
+
+ ${VCORE_DIR}/vcore/api.cpp
+ ${VCORE_DIR}/vcore/Base64.cpp
+ ${VCORE_DIR}/vcore/Certificate.cpp
+ ${VCORE_DIR}/vcore/CertificateCollection.cpp
+ ${VCORE_DIR}/vcore/CertificateConfigReader.cpp
+ ${VCORE_DIR}/vcore/CertificateLoader.cpp
+ ${VCORE_DIR}/vcore/CertStoreType.cpp
+ ${VCORE_DIR}/vcore/ReferenceValidator.cpp
+ ${VCORE_DIR}/vcore/SaxReader.cpp
+ ${VCORE_DIR}/vcore/SignatureData.cpp
+ ${VCORE_DIR}/vcore/SignatureFinder.cpp
+ ${VCORE_DIR}/vcore/SignatureReader.cpp
+ ${VCORE_DIR}/vcore/TimeConversion.cpp
+ ${VCORE_DIR}/vcore/ValidatorFactories.cpp
+ ${VCORE_DIR}/vcore/SignatureValidator.cpp
+ ${VCORE_DIR}/vcore/XmlsecAdapter.cpp
+ ${VCORE_DIR}/vcore/pkcs12.cpp
+ ${VCORE_DIR}/vcore/exception.cpp
+ ${VCORE_DIR}/vcore/utils.c
+ ${VCORE_DIR}/vcore/cert-svc-client.c
+ )
+
+SET(VCORE_INCLUDES
+ ${VCORE_DIR}/dpl/core/include
+ ${VCORE_DIR}/dpl/log/include
+ ${VCORE_DIR}
+ )
+
+########### VCORE SOURCES ########
+
+INCLUDE_DIRECTORIES(
+ SYSTEM
+ ${VCORE_DEPS_INCLUDE_DIRS}
+ ${PROJECT_SOURCE_DIR}/include
+ ${VCORE_INCLUDES}
+ )
+
+ADD_LIBRARY(${TARGET_VCORE_LIB} SHARED ${VCORE_SOURCES})
+
+# TODO: visibility needed to be hidden
+SET_TARGET_PROPERTIES(${TARGET_VCORE_LIB}
+ PROPERTIES
+ COMPILE_FLAGS "-D_GNU_SOURCE -fPIC -fvisibility=default"
+ SOVERSION ${SO_VERSION}
+ VERSION ${VERSION})
+
+TARGET_LINK_LIBRARIES(${TARGET_VCORE_LIB}
+ ${VCORE_DEPS_LIBRARIES}
+ ${TARGET_CERT_SVC_LIB}
+ )
+
+########## cert-server #############
+PKG_CHECK_MODULES(CERT_SERVER_DEP
+ REQUIRED
+ dlog
+ sqlite3
+ db-util
+ libsystemd-daemon
+ key-manager
+ )
+
+SET(CERT_SERVER_DIR ${CMAKE_CURRENT_SOURCE_DIR}/server)
+
+SET(CERT_SERVER_SRC
+ ${CERT_SERVER_DIR}/src/cert-server-main.c
+ ${CERT_SERVER_DIR}/src/cert-server-logic.c
+ )
+
+INCLUDE_DIRECTORIES(
+ SYSTEM
+ ${CERT_SERVER_DEP_INCLUDE_DIRS}
+ ${PROJECT_SOURCE_DIR}/include
+ ${VCORE_DIR}
+ ${CERT_SERVER_DIR}/include
+ )
+
+SET_SOURCE_FILES_PROPERTIES(
+ ${CERT_SERVER_SRC}
+ PROPERTIES
+ COMPILE_FLAGS "-D_GNU_SOURCE -fvisibility=hidden -fPIE"
+ )
+
+ADD_EXECUTABLE(${TARGET_CERT_SERVER} ${CERT_SERVER_SRC})
+
+TARGET_LINK_LIBRARIES(${TARGET_CERT_SERVER}
+ ${CERT_SERVER_DEP_LIBRARIES}
+ -pie
+ )
+
+INSTALL(TARGETS ${TARGET_CERT_SERVER} DESTINATION ${TZ_SYS_BIN})
+
+########################################################
+INSTALL(TARGETS ${TARGET_VCORE_LIB}
+ DESTINATION ${LIBDIR}
+ )
+
+INSTALL(FILES
+ ${VCORE_DIR}/vcore/SignatureValidator.h
+ ${VCORE_DIR}/vcore/SignatureFinder.h
+ ${VCORE_DIR}/vcore/Certificate.h
+ ${VCORE_DIR}/vcore/SignatureData.h
+ ${VCORE_DIR}/vcore/CertStoreType.h
+ ${VCORE_DIR}/vcore/exception.h
+ DESTINATION ${INCLUDEDIR}/cert-svc/vcore
+ )
+
+INSTALL(FILES
+ ${VCORE_DIR}/cert-svc/ccert.h
+ ${VCORE_DIR}/cert-svc/cinstance.h
+ ${VCORE_DIR}/cert-svc/cerror.h
+ ${VCORE_DIR}/cert-svc/cpkcs12.h
+ ${VCORE_DIR}/cert-svc/cprimitives.h
+ ${VCORE_DIR}/cert-svc/cstring.h
+ DESTINATION ${INCLUDEDIR}/cert-svc/cert-svc
+ )
typedef enum certStatus_t {
DISABLED = 0,
- ENABLED = 1,
+ ENABLED = 1
} CertStatus;
typedef struct CertSvcStoreCertList_t{
CertStatus status;
CertStoreType storeType;
struct CertSvcStoreCertList_t *next;
-}CertSvcStoreCertList;
+} CertSvcStoreCertList;
typedef enum certType_t {
PEM_CRT = 1 << 0,
P12_INTERMEDIATE = 1 << 2,
P12_TRUSTED = 1 << 3,
P12_PKEY = 1 << 4,
- INVALID_DATA = 1 << 5,
+ INVALID_DATA = 1 << 5
} CertType;
typedef enum CertSvcCertificateForm_t {
--- /dev/null
+/*
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * @file assert.h
+ * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
+ * @version 1.0
+ * @brief This file is the implementation file of assert
+ */
+#ifndef DPL_ASSERT_H
+#define DPL_ASSERT_H
+
+namespace VcoreDPL {
+// Assertion handler procedure
+// Do not call directly
+// Always use Assert macro
+void AssertProc(const char *condition,
+ const char *file,
+ int line,
+ const char *function) __attribute__ ((__noreturn__));
+} // namespace VcoreDPL
+
+#define Assert(Condition) \
+do { \
+ if (!(Condition)) { \
+ VcoreDPL::AssertProc(#Condition, __FILE__, __LINE__, __FUNCTION__); \
+ } \
+} while (0)
+
+#define AssertMsg(Condition, Msg) \
+ do { \
+ if (!(Condition)) { \
+ VcoreDPL::AssertProc( \
+ (std::string(std::string(#Condition)+" ") + Msg).c_str(), \
+ __FILE__, __LINE__, __FUNCTION__); \
+ } \
+ } while (0)
+
+#endif // DPL_ASSERT_H
--- /dev/null
+/*
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * @file colors.h
+ * @author Lukasz Wrzosek (l.wrzosek@samsung.com)
+ * @version 1.0
+ * @brief Some constants with definition of colors for Console
+ * and html output
+ */
+
+#ifndef DPL_COLORS_H
+#define DPL_COLORS_H
+
+namespace VcoreDPL {
+namespace Colors {
+namespace Text {
+extern const char* BOLD_GREEN_BEGIN;
+extern const char* BOLD_GREEN_END;
+extern const char* PURPLE_BEGIN;
+extern const char* PURPLE_END;
+extern const char* RED_BEGIN;
+extern const char* RED_END;
+extern const char* GREEN_BEGIN;
+extern const char* GREEN_END;
+extern const char* CYAN_BEGIN;
+extern const char* CYAN_END;
+extern const char* BOLD_RED_BEGIN;
+extern const char* BOLD_RED_END;
+extern const char* BOLD_YELLOW_BEGIN;
+extern const char* BOLD_YELLOW_END;
+extern const char* BOLD_GOLD_BEGIN;
+extern const char* BOLD_GOLD_END;
+extern const char* BOLD_WHITE_BEGIN;
+extern const char* BOLD_WHITE_END;
+} //namespace Text
+
+namespace Html {
+extern const char* BOLD_GREEN_BEGIN;
+extern const char* BOLD_GREEN_END;
+extern const char* PURPLE_BEGIN;
+extern const char* PURPLE_END;
+extern const char* RED_BEGIN;
+extern const char* RED_END;
+extern const char* GREEN_BEGIN;
+extern const char* GREEN_END;
+extern const char* CYAN_BEGIN;
+extern const char* CYAN_END;
+extern const char* BOLD_RED_BEGIN;
+extern const char* BOLD_RED_END;
+extern const char* BOLD_YELLOW_BEGIN;
+extern const char* BOLD_YELLOW_END;
+extern const char* BOLD_GOLD_BEGIN;
+extern const char* BOLD_GOLD_END;
+extern const char* BOLD_WHITE_BEGIN;
+extern const char* BOLD_WHITE_END;
+} //namespace Html
+} //namespace Colors
+} //namespace VcoreDPL
+
+#endif /* DPL_COLORS_H */
--- /dev/null
+/*
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * @file exception.h
+ * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
+ * @version 1.0
+ * @brief Header file for base exception
+ */
+#ifndef VcoreDPL_EXCEPTION_H
+#define VcoreDPL_EXCEPTION_H
+
+#include <string>
+#include <cstring>
+#include <cstdio>
+#include <exception>
+#include <cstdlib>
+#include <sstream>
+
+namespace VcoreDPL {
+void LogUnhandledException(const std::string &str);
+void LogUnhandledException(const std::string &str,
+ const char *filename,
+ int line,
+ const char *function);
+}
+
+namespace VcoreDPL {
+class Exception {
+private:
+ static unsigned int m_exceptionCount;
+ static Exception* m_lastException;
+ static void (*m_terminateHandler)();
+
+ static void AddRef(Exception* exception)
+ {
+ if (!m_exceptionCount) {
+ m_terminateHandler = std::set_terminate(&TerminateHandler);
+ }
+
+ ++m_exceptionCount;
+ m_lastException = exception;
+ }
+
+ static void UnRef(Exception* e)
+ {
+ if (m_lastException == e) {
+ m_lastException = NULL;
+ }
+
+ --m_exceptionCount;
+
+ if (!m_exceptionCount) {
+ std::set_terminate(m_terminateHandler);
+ m_terminateHandler = NULL;
+ }
+ }
+
+ static void TerminateHandler()
+ {
+ if (m_lastException != NULL) {
+ DisplayKnownException(*m_lastException);
+ abort();
+ } else {
+ DisplayUnknownException();
+ abort();
+ }
+ }
+
+ Exception *m_reason;
+ std::string m_path;
+ std::string m_function;
+ int m_line;
+
+protected:
+ std::string m_message;
+ std::string m_className;
+
+public:
+ static std::string KnownExceptionToString(const Exception &e)
+ {
+ std::ostringstream message;
+ message <<
+ "\033[1;5;31m\n=== Unhandled DPL exception occurred ===\033[m\n\n";
+ message << "\033[1;33mException trace:\033[m\n\n";
+ message << e.DumpToString();
+ message << "\033[1;31m\n=== Will now abort ===\033[m\n";
+
+ return message.str();
+ }
+
+ static std::string UnknownExceptionToString()
+ {
+ std::ostringstream message;
+ message <<
+ "\033[1;5;31m\n=== Unhandled non-DPL exception occurred ===\033[m\n\n";
+ message << "\033[1;31m\n=== Will now abort ===\033[m\n";
+
+ return message.str();
+ }
+
+ static void DisplayKnownException(const Exception& e)
+ {
+ LogUnhandledException(KnownExceptionToString(e).c_str());
+ }
+
+ static void DisplayUnknownException()
+ {
+ LogUnhandledException(UnknownExceptionToString().c_str());
+ }
+
+ Exception(const Exception &other)
+ {
+ // Deep copy
+ if (other.m_reason != NULL) {
+ m_reason = new Exception(*other.m_reason);
+ } else {
+ m_reason = NULL;
+ }
+
+ m_message = other.m_message;
+ m_path = other.m_path;
+ m_function = other.m_function;
+ m_line = other.m_line;
+
+ m_className = other.m_className;
+
+ AddRef(this);
+ }
+
+ const Exception &operator =(const Exception &other)
+ {
+ if (this == &other) {
+ return *this;
+ }
+
+ // Deep copy
+ if (other.m_reason != NULL) {
+ m_reason = new Exception(*other.m_reason);
+ } else {
+ m_reason = NULL;
+ }
+
+ m_message = other.m_message;
+ m_path = other.m_path;
+ m_function = other.m_function;
+ m_line = other.m_line;
+
+ m_className = other.m_className;
+
+ AddRef(this);
+
+ return *this;
+ }
+
+ Exception(const char *path,
+ const char *function,
+ int line,
+ const std::string &message) :
+ m_reason(NULL),
+ m_path(path),
+ m_function(function),
+ m_line(line),
+ m_message(message)
+ {
+ AddRef(this);
+ }
+
+ Exception(const char *path,
+ const char *function,
+ int line,
+ const Exception &reason,
+ const std::string &message) :
+ m_reason(new Exception(reason)),
+ m_path(path),
+ m_function(function),
+ m_line(line),
+ m_message(message)
+ {
+ AddRef(this);
+ }
+
+ virtual ~Exception() throw()
+ {
+ if (m_reason != NULL) {
+ delete m_reason;
+ m_reason = NULL;
+ }
+
+ UnRef(this);
+ }
+
+ void Dump() const
+ {
+ // Show reason first
+ if (m_reason != NULL) {
+ m_reason->Dump();
+ }
+
+ // Afterward, dump exception
+ const char *file = strchr(m_path.c_str(), '/');
+
+ if (file == NULL) {
+ file = m_path.c_str();
+ } else {
+ ++file;
+ }
+
+ printf("\033[0;36m[%s:%i]\033[m %s() \033[4;35m%s\033[m: %s\033[m\n",
+ file, m_line,
+ m_function.c_str(),
+ m_className.c_str(),
+ m_message.empty() ? "<EMPTY>" : m_message.c_str());
+ }
+
+ std::string DumpToString() const
+ {
+ std::string ret;
+ if (m_reason != NULL) {
+ ret = m_reason->DumpToString();
+ }
+
+ const char *file = strchr(m_path.c_str(), '/');
+
+ if (file == NULL) {
+ file = m_path.c_str();
+ } else {
+ ++file;
+ }
+
+ char buf[1024];
+ snprintf(buf,
+ sizeof(buf),
+ "\033[0;36m[%s:%i]\033[m %s() \033[4;35m%s\033[m: %s\033[m\n",
+ file,
+ m_line,
+ m_function.c_str(),
+ m_className.c_str(),
+ m_message.empty() ? "<EMPTY>" : m_message.c_str());
+
+ buf[sizeof(buf) - 1] = '\n';
+ ret += buf;
+
+ return ret;
+ }
+
+ Exception *GetReason() const
+ {
+ return m_reason;
+ }
+
+ std::string GetPath() const
+ {
+ return m_path;
+ }
+
+ std::string GetFunction() const
+ {
+ return m_function;
+ }
+
+ int GetLine() const
+ {
+ return m_line;
+ }
+
+ std::string GetMessage() const
+ {
+ return m_message;
+ }
+
+ std::string GetClassName() const
+ {
+ return m_className;
+ }
+};
+} // namespace VcoreDPL
+
+#define Try try
+
+#define Throw(ClassName) \
+ throw ClassName(__FILE__, __FUNCTION__, __LINE__)
+
+#define ThrowMsg(ClassName, Message) \
+ do \
+ { \
+ std::ostringstream dplLoggingStream; \
+ dplLoggingStream << Message; \
+ throw ClassName(__FILE__, __FUNCTION__, __LINE__, dplLoggingStream.str()); \
+ } while (0)
+
+#define ReThrow(ClassName) \
+ throw ClassName(__FILE__, __FUNCTION__, __LINE__, _rethrown_exception)
+
+#define ReThrowMsg(ClassName, Message) \
+ throw ClassName(__FILE__, \
+ __FUNCTION__, \
+ __LINE__, \
+ _rethrown_exception, \
+ Message)
+
+#define Catch(ClassName) \
+ catch (const ClassName &_rethrown_exception)
+
+#define DECLARE_EXCEPTION_TYPE(BaseClass, Class) \
+ class Class : public BaseClass { \
+ public: \
+ Class(const char *path, \
+ const char *function, \
+ int line, \
+ const std::string & message = std::string()) \
+ : BaseClass(path, function, line, message) { \
+ \
+ BaseClass::m_className = #Class; \
+ } \
+ \
+ Class(const char *path, \
+ const char *function, \
+ int line, \
+ const VcoreDPL::Exception & reason, \
+ const std::string & message = std::string()) \
+ : BaseClass(path, function, line, reason, message) { \
+ BaseClass::m_className = #Class; \
+ } \
+ };
+
+#define UNHANDLED_EXCEPTION_HANDLER_BEGIN try
+
+#define UNHANDLED_EXCEPTION_HANDLER_END \
+ catch (const VcoreDPL::Exception &exception) \
+ { \
+ std::ostringstream msg; \
+ msg << VcoreDPL::Exception::KnownExceptionToString(exception); \
+ VcoreDPL::LogUnhandledException(msg.str(), \
+ __FILE__, \
+ __LINE__, \
+ __FUNCTION__); \
+ abort(); \
+ } \
+ catch (std::exception& e) \
+ { \
+ std::ostringstream msg; \
+ msg << e.what(); \
+ msg << "\n"; \
+ msg << VcoreDPL::Exception::UnknownExceptionToString(); \
+ VcoreDPL::LogUnhandledException(msg.str(), \
+ __FILE__, \
+ __LINE__, \
+ __FUNCTION__); \
+ abort(); \
+ } \
+ catch (...) \
+ { \
+ std::ostringstream msg; \
+ msg << VcoreDPL::Exception::UnknownExceptionToString(); \
+ VcoreDPL::LogUnhandledException(msg.str(), \
+ __FILE__, \
+ __LINE__, \
+ __FUNCTION__); \
+ abort(); \
+ }
+
+namespace VcoreDPL {
+namespace CommonException {
+/**
+ * Internal exception definitions
+ *
+ * These should normally not happen.
+ * Usually, exception trace with internal error includes
+ * important messages.
+ */
+DECLARE_EXCEPTION_TYPE(Exception, InternalError) ///< Unexpected error from
+ // underlying libraries or
+ // kernel
+}
+}
+
+#endif // VcoreDPL_EXCEPTION_H
--- /dev/null
+/*
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * @file noncopyable
+ * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
+ * @version 1.0
+ * @brief This file is the implementation file of noncopyable
+ */
+#ifndef DPL_NONCOPYABLE_H
+#define DPL_NONCOPYABLE_H
+
+namespace VcoreDPL {
+class Noncopyable
+{
+ private:
+ Noncopyable(const Noncopyable &);
+ const Noncopyable &operator=(const Noncopyable &);
+
+ public:
+ Noncopyable();
+ virtual ~Noncopyable();
+};
+} // namespace VcoreDPL
+
+#endif // DPL_NONCOPYABLE_H
* limitations under the License.
*/
/*
- * @file abstract_waitable_input.h
+ * @file singleton.h
* @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
* @version 1.0
- * @brief This file is the header file of abstract waitable input
+ * @brief This file is the implementation file of singleton
*/
-#ifndef DPL_ABSTRACT_WAITABLE_INPUT_H
-#define DPL_ABSTRACT_WAITABLE_INPUT_H
-
-#include <dpl/waitable_handle.h>
-#include <dpl/abstract_input.h>
+#ifndef DPL_SINGLETON_H
+#define DPL_SINGLETON_H
namespace VcoreDPL {
-class AbstractWaitableInput :
- public AbstractInput
+template<typename Class>
+class Singleton :
+ private Class
{
+ //
+ // Note:
+ //
+ // To remove posibility of instantiating directly Class,
+ // make Class' default constructor protected
+ //
+
+ private:
+ Singleton()
+ {}
+
+ static Singleton &InternalInstance();
+
public:
- virtual ~AbstractWaitableInput() {}
+ virtual ~Singleton()
+ {}
- virtual WaitableHandle WaitableReadHandle() const = 0;
+ static Class &Instance();
};
} // namespace VcoreDPL
-#endif // DPL_ABSTRACT_WAITABLE_INPUT_H
+#endif // DPL_SINGLETON_H
--- /dev/null
+/*
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * @file singleton_impl.h
+ * @author Lukasz Wrzosek (l.wrzosek@samsung.com)
+ * @version 1.0
+ * @brief This file is the implementation file of singleton
+ */
+#ifndef DPL_SINGLETON_IMPL_H
+#define DPL_SINGLETON_IMPL_H
+
+#include <dpl/singleton.h>
+
+/*
+ * WARNING!
+ *
+ * If some singleton's implementation uses another singletons implementation,
+ * those templates make the second singleton a dubleton. Be warned. Try to use
+ * singleton_safe_impl.h if possible.
+ */
+
+namespace VcoreDPL {
+template<typename Class>
+Singleton<Class>& Singleton<Class>::InternalInstance()
+{
+ static Singleton<Class> instance;
+ return instance;
+}
+
+template<typename Class>
+Class &Singleton<Class>::Instance()
+{
+ Singleton<Class>& instance = Singleton<Class>::InternalInstance();
+ return instance;
+}
+} // namespace VcoreDPL
+
+#define IMPLEMENT_SINGLETON(Type) \
+ template VcoreDPL::Singleton<Type>&VcoreDPL::Singleton<Type>::InternalInstance(); \
+ template Type & VcoreDPL::Singleton<Type>::Instance(); \
+
+#endif // DPL_SINGLETON_IMPL_H
#include <sstream>
#include <stddef.h>
#include <dpl/assert.h>
-#include <dpl/colors.h>
#include <dpl/exception.h>
#include <dpl/log/log.h>
--- /dev/null
+/*
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * @file colors.cpp
+ * @author Lukasz Wrzosek (l.wrzosek@samsung.com)
+ * @version 1.0
+ * @brief Some constants with definition of colors for Console
+ * and html output
+ */
+#include <stddef.h>
+#include <dpl/colors.h>
+
+namespace VcoreDPL {
+namespace Colors {
+namespace Text {
+const char* BOLD_GREEN_BEGIN = "\033[1;32m";
+const char* BOLD_GREEN_END = "\033[m";
+const char* RED_BEGIN = "\033[0;31m";
+const char* RED_END = "\033[m";
+const char* PURPLE_BEGIN = "\033[0;35m";
+const char* PURPLE_END = "\033[m";
+const char* GREEN_BEGIN = "\033[0;32m";
+const char* GREEN_END = "\033[m";
+const char* CYAN_BEGIN = "\033[0;36m";
+const char* CYAN_END = "\033[m";
+const char* BOLD_RED_BEGIN = "\033[1;31m";
+const char* BOLD_RED_END = "\033[m";
+const char* BOLD_YELLOW_BEGIN = "\033[1;33m";
+const char* BOLD_YELLOW_END = "\033[m";
+const char* BOLD_GOLD_BEGIN = "\033[0;33m";
+const char* BOLD_GOLD_END = "\033[m";
+const char* BOLD_WHITE_BEGIN = "\033[1;37m";
+const char* BOLD_WHITE_END = "\033[m";
+} //namespace Text
+
+namespace Html {
+const char* BOLD_GREEN_BEGIN = "<font color=\"green\"><b>";
+const char* BOLD_GREEN_END = "</b></font>";
+const char* PURPLE_BEGIN = "<font color=\"purple\"><b>";
+const char* PURPLE_END = "</b></font>";
+const char* RED_BEGIN = "<font color=\"red\"><b>";
+const char* RED_END = "</b></font>";
+const char* GREEN_BEGIN = "<font color=\"green\">";
+const char* GREEN_END = "</font>";
+const char* CYAN_BEGIN = "<font color=\"cyan\">";
+const char* CYAN_END = "</font>";
+const char* BOLD_RED_BEGIN = "<font color=\"red\"><b>";
+const char* BOLD_RED_END = "</b></font>";
+const char* BOLD_YELLOW_BEGIN = "<font color=\"yellow\"><b>";
+const char* BOLD_YELLOW_END = "</b></font>";
+const char* BOLD_GOLD_BEGIN = "<font color=\"gold\"><b>";
+const char* BOLD_GOLD_END = "</b></font>";
+const char* BOLD_WHITE_BEGIN = "<font color=\"white\"><b>";
+const char* BOLD_WHITE_END = "</b></font>";
+} //namespace Html
+} //namespace Colors
+} //namespace VcoreDPL
--- /dev/null
+/*
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * @file noncopyable.cpp
+ * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
+ * @version 1.0
+ * @brief This file is the implementation file of noncopyable
+ */
+#include <stddef.h>
+#include <dpl/noncopyable.h>
+
+namespace VcoreDPL {
+Noncopyable::Noncopyable()
+{}
+
+Noncopyable::~Noncopyable()
+{}
+} // namespace VcoreDPL
* limitations under the License.
*/
/*
- * @file type_list.cpp
- * @author Bartosz Janiak (b.janiak@samsung.com)
+ * @file singleton.cpp
+ * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
* @version 1.0
- * @brief Generic type list template
+ * @brief This file is the implementation file of singleton
*/
#include <stddef.h>
-#include <dpl/type_list.h>
+#include <dpl/singleton.h>
//
// Note:
#include <cert-service-debug.h>
#include <cert-svc/cerror.h>
#include <cert-svc/ccert.h>
-#include <cert-svc-client.h>
+#include <vcore/cert-svc-client.h>
#include <cert-server-logic.h>
#include <cert-service-debug.h>
#include <cert-svc/cerror.h>
#include <cert-svc/ccert.h>
-#include <cert-svc-client.h>
+#include <vcore/cert-svc-client.h>
#include <cert-server-logic.h>
+++ /dev/null
-# compiler warning flags
-ADD_DEFINITIONS("-Wall")
-ADD_DEFINITIONS("-Wextra")
-ADD_DEFINITIONS("-Werror")
-
-PKG_CHECK_MODULES(VCORE_DEPS
- REQUIRED
- libxml-2.0
- libpcrecpp
- openssl
- xmlsec1
- dlog
- libsystemd-journal
- )
-
-ADD_DEFINITIONS(${VCORE_DEPS_CFLAGS})
-ADD_DEFINITIONS(${VCORE_DEPS_CFLAGS_OTHER})
-
-SET(VCORE_DIR
- ${PROJECT_SOURCE_DIR}/vcore
- )
-
-SET(VCORE_SRC_DIR
- ${VCORE_DIR}/src/vcore
- )
-
-########### DPL SOURCES ##########
-SET(VCORE_DPL_DIR
- ${VCORE_DIR}/src/dpl
- )
-SET(VCORE_DPL_CORE_SRC_DIR
- ${VCORE_DPL_DIR}/core/src
- )
-SET(VCORE_DPL_CORE_SOURCES
- ${VCORE_DPL_CORE_SRC_DIR}/assert.cpp
- ${VCORE_DPL_CORE_SRC_DIR}/binary_queue.cpp
- ${VCORE_DPL_CORE_SRC_DIR}/char_traits.cpp
- ${VCORE_DPL_CORE_SRC_DIR}/colors.cpp
- ${VCORE_DPL_CORE_SRC_DIR}/errno_string.cpp
- ${VCORE_DPL_CORE_SRC_DIR}/exception.cpp
- ${VCORE_DPL_CORE_SRC_DIR}/file_input.cpp
- ${VCORE_DPL_CORE_SRC_DIR}/noncopyable.cpp
- ${VCORE_DPL_CORE_SRC_DIR}/singleton.cpp
- ${VCORE_DPL_CORE_SRC_DIR}/string.cpp
- ${VCORE_DPL_CORE_SRC_DIR}/type_list.cpp
- ${VCORE_DPL_CORE_SRC_DIR}/thread.cpp
- ${VCORE_DPL_CORE_SRC_DIR}/waitable_event.cpp
- ${VCORE_DPL_CORE_SRC_DIR}/waitable_handle.cpp
- ${VCORE_DPL_CORE_SRC_DIR}/waitable_handle_watch_support.cpp
- )
-
-SET(VCORE_DPL_LOG_SRC_DIR
- ${VCORE_DPL_DIR}/log/src
- )
-SET(VCORE_DPL_LOG_SOURCES
- ${VCORE_DPL_LOG_SRC_DIR}/abstract_log_provider.cpp
- ${VCORE_DPL_LOG_SRC_DIR}/old_style_log_provider.cpp
- ${VCORE_DPL_LOG_SRC_DIR}/dlog_log_provider.cpp
- ${VCORE_DPL_LOG_SRC_DIR}/journal_log_provider.cpp
- ${VCORE_DPL_LOG_SRC_DIR}/log.cpp
- )
-########### DPL SOURCES ##########
-
-
-########### VCORE SOURCES ########
-SET(VCORE_SOURCES
- ${VCORE_SRC_DIR}/api.cpp
- ${VCORE_SRC_DIR}/Base64.cpp
- ${VCORE_SRC_DIR}/Certificate.cpp
- ${VCORE_SRC_DIR}/CertificateCollection.cpp
- ${VCORE_SRC_DIR}/CertificateConfigReader.cpp
- ${VCORE_SRC_DIR}/CertificateLoader.cpp
- ${VCORE_SRC_DIR}/CertStoreType.cpp
- ${VCORE_SRC_DIR}/ReferenceValidator.cpp
- ${VCORE_SRC_DIR}/RevocationCheckerBase.cpp
- ${VCORE_SRC_DIR}/SaxReader.cpp
- ${VCORE_SRC_DIR}/SignatureData.cpp
- ${VCORE_SRC_DIR}/SignatureFinder.cpp
- ${VCORE_SRC_DIR}/SignatureReader.cpp
- ${VCORE_SRC_DIR}/TimeConversion.cpp
- ${VCORE_SRC_DIR}/VerificationStatus.cpp
- ${VCORE_SRC_DIR}/ValidatorFactories.cpp
- ${VCORE_SRC_DIR}/SignatureValidator.cpp
- ${VCORE_SRC_DIR}/XmlsecAdapter.cpp
- ${VCORE_SRC_DIR}/pkcs12.cpp
- ${VCORE_SRC_DIR}/exception.cpp
-
- ${VCORE_SRC_DIR}/utils.c
- ${VCORE_SRC_DIR}/cert-svc-client.c
- )
-
-SET(VCORE_INCLUDES
- ${VCORE_DEPS_INCLUDE_DIRS}
- ${VCORE_SRC_DIR}
- ${VCORE_DIR}/src
- ${VCORE_DIR}/src/legacy
- )
-
-########### VCORE SOURCES ########
-
-SET(VCORE_ALL_SOURCES
- ${VCORE_SOURCES}
- ${VCORE_DPL_CORE_SOURCES}
- ${VCORE_DPL_LOG_SOURCES}
- )
-SET(VCORE_ALL_INCLUDES
- ${PROJECT_SOURCE_DIR}/include
- ${VCORE_INCLUDES}
- ${VCORE_DPL_DIR}/core/include
- ${VCORE_DPL_DIR}/log/include
- )
-
-INCLUDE_DIRECTORIES(SYSTEM ${VCORE_ALL_INCLUDES})
-
-ADD_LIBRARY(${TARGET_VCORE_LIB} SHARED ${VCORE_ALL_SOURCES})
-
-# TODO: visibility needed to be hidden
-SET_TARGET_PROPERTIES(${TARGET_VCORE_LIB}
- PROPERTIES
- COMPILE_FLAGS "-D_GNU_SOURCE -fPIC -fvisibility=default"
- SOVERSION ${SO_VERSION}
- VERSION ${VERSION})
-
-TARGET_LINK_LIBRARIES(${TARGET_VCORE_LIB}
- ${VCORE_DEPS_LIBRARIES}
- ${TARGET_CERT_SVC_LIB}
- )
-
-########## cert-server #############
-PKG_CHECK_MODULES(CERT_SERVER_DEP
- REQUIRED
- dlog
- sqlite3
- db-util
- libsystemd-daemon
- key-manager
- )
-
-SET(CERT_SERVER_DIR
- ${PROJECT_SOURCE_DIR}/vcore/src/server
- )
-
-SET(CERT_SERVER_SRCS
- ${CERT_SERVER_DIR}/src/cert-server-main.c
- ${CERT_SERVER_DIR}/src/cert-server-logic.c
- )
-
-INCLUDE_DIRECTORIES(
- SYSTEM
- ${CERT_SERVER_DEP_INCLUDE_DIRS}
- ${PROJECT_SOURCE_DIR}/include
- ${VCORE_DIR}/src
- ${CERT_SERVER_DIR}/include
- )
-
-SET_SOURCE_FILES_PROPERTIES(
- ${CERT_SERVER_SRCS}
- PROPERTIES
- COMPILE_FLAGS "-D_GNU_SOURCE -fvisibility=hidden -fPIE"
- )
-
-ADD_EXECUTABLE(${TARGET_CERT_SERVER} ${CERT_SERVER_SRCS})
-
-TARGET_LINK_LIBRARIES(${TARGET_CERT_SERVER}
- ${CERT_SERVER_DEP_LIBRARIES}
- -pie
- )
-
-INSTALL(TARGETS ${TARGET_CERT_SERVER} DESTINATION ${BINDIR})
-
-########################################################
-INSTALL(TARGETS ${TARGET_VCORE_LIB}
- DESTINATION ${LIBDIR}
- )
-
-INSTALL(FILES
- ${VCORE_SRC_DIR}/SignatureValidator.h
- ${VCORE_SRC_DIR}/SignatureFinder.h
-
- ${VCORE_SRC_DIR}/Certificate.h
- ${VCORE_SRC_DIR}/SignatureData.h
- ${VCORE_SRC_DIR}/CertStoreType.h
- ${VCORE_SRC_DIR}/exception.h
- DESTINATION ${INCLUDEDIR}/cert-svc/vcore
- )
-
-INSTALL(FILES
- ${VCORE_DIR}/src/cert-svc/ccert.h
- ${VCORE_DIR}/src/cert-svc/cinstance.h
- ${VCORE_DIR}/src/cert-svc/cerror.h
- ${VCORE_DIR}/src/cert-svc/cpkcs12.h
- ${VCORE_DIR}/src/cert-svc/cprimitives.h
- ${VCORE_DIR}/src/cert-svc/cstring.h
- DESTINATION ${INCLUDEDIR}/cert-svc/cert-svc
- )
+++ /dev/null
-/**
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file ccrl.h
- * @author Bartlomiej Grzelewski (b.grzelewski@samsung.com)
- * @version 1.0
- * @brief This is part of C api for ValidationCore.
- */
-#ifndef _CERTSVC_CCRL_H_
-#define _CERTSVC_CCRL_H_
-
-#include <time.h>
-
-#include <cert-svc/ccert.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define CERTSVC_CRL_GOOD (1<<0)
-#define CERTSVC_CRL_REVOKED (1<<1)
-#define CERTSVC_CRL_VERIFICATION_ERROR (1<<3)
-#define CERTSVC_CRL_NO_SUPPORT (1<<4)
-
-typedef void (*CertSvcCrlCacheWrite)(
- const char *distributionPoint,
- const char *body,
- int bodySize,
- time_t nextUpdateTime,
- void *userParam);
-
-typedef int (*CertSvcCrlCacheRead)(
- const char *distributionPoint,
- char **body,
- int *bodySize,
- time_t *nextUpdateTime,
- void *userParam);
-
-typedef void (*CertSvcCrlFree)(
- char *buffer,
- void *userParam);
-
-void certsvc_crl_cache_functions(
- CertSvcInstance instance,
- CertSvcCrlCacheWrite writePtr,
- CertSvcCrlCacheRead readPtr,
- CertSvcCrlFree freePtr);
-
-int certsvc_crl_check(
- CertSvcCertificate certificate,
- CertSvcCertificate *trustedStore,
- int storeSize,
- int force,
- int *status,
- void *userParam);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
+++ /dev/null
-/**
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file cocsp.h
- * @author Bartlomiej Grzelewski (b.grzelewski@samsung.com)
- * @version 1.0
- * @brief This is C api for ValidationCore.
- */
-#ifndef _CERTSVC_OCSP_C_API_H_
-#define _CERTSVC_OCSP_C_API_H_
-
-#include <time.h>
-
-#include <cert-svc/ccert.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define CERTSVC_OCSP_GOOD (1<<0)
-#define CERTSVC_OCSP_REVOKED (1<<1)
-#define CERTSVC_OCSP_UNKNOWN (1<<2)
-#define CERTSVC_OCSP_VERIFICATION_ERROR (1<<3)
-#define CERTSVC_OCSP_NO_SUPPORT (1<<4)
-#define CERTSVC_OCSP_CONNECTION_FAILED (1<<5)
-#define CERTSVC_OCSP_ERROR (1<<6)
-/**
- * Implementation of ocsp call.
- *
- * Please note: to verify certificate you need certificate and his parrent.
- * This function will always verify chain_size-1 certificates from the chain.
- *
- * @param[in] chain Certificate to check.
- * @param[in] chain_size Size of certificate_array
- * @param[in] trusted Store with trusted certificates (additional certificates
- * that may by reqired during verification process).
- * @param[in] trusted_size Size of trusted certificate store.
- * @param[in] url Force OCSP to use specific server. Pass NULL to use OCSP server defined in certificate.
- * @param[out] status Bit field with description of chain validation.
- * @return CERTSVC_SUCCESS, CERTSVC_FAIL, CERTSVC_WRONG_ARGUMENT
- */
-int certsvc_ocsp_check(CertSvcCertificate *chain,
- int chainSize,
- CertSvcCertificate *trusted,
- int truestedSize,
- const char *url,
- int *status);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file char_traits.h
- * @author Piotr Marcinkiewicz (p.marcinkiew@samsung.com)
- * @version 1.0
- * @brief Char traits are used to create basic_string extended with
- * additional features
- * Current char traits could be extended in feature to boost
- * performance
- */
-#ifndef DPL_CHAR_TRAITS
-#define DPL_CHAR_TRAITS
-
-#include <cstring>
-#include <string>
-#include <ostream>
-#include <algorithm>
-#include <dpl/exception.h>
-
-namespace VcoreDPL {
-typedef std::char_traits<wchar_t> CharTraits;
-} // namespace VcoreDPL
-
-#endif // DPL_CHAR_TRAITS
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file file_input.h
- * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
- * @version 1.0
- * @brief This file is the implementation file of file input
- */
-#ifndef DPL_FILE_INPUT_H
-#define DPL_FILE_INPUT_H
-
-#include <dpl/noncopyable.h>
-#include <dpl/exception.h>
-#include <dpl/abstract_waitable_input.h>
-
-namespace VcoreDPL {
-class FileInput :
- private Noncopyable,
- public AbstractWaitableInput
-{
- public:
- class Exception
- {
- public:
- DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base)
- DECLARE_EXCEPTION_TYPE(Base, OpenFailed)
- DECLARE_EXCEPTION_TYPE(Base, CloseFailed)
- };
-
- protected:
- int m_fd;
-
- public:
- FileInput();
- FileInput(const std::string &fileName);
- virtual ~FileInput();
-
- void Open(const std::string &fileName);
- void Close();
-
- // AbstractInput
- virtual BinaryQueueAutoPtr Read(size_t size);
-
- // AbstractWaitableInput
- virtual WaitableHandle WaitableReadHandle() const;
-};
-} // namespace VcoreDPL
-
-#endif // DPL_FILE_INPUT_H
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file optional_value.h
- * @author Lukasz Wrzosek (l.wrzosek@samsung.com)
- * @version 1.0
- */
-
-#ifndef DPL_OPTIONAL_H
-#define DPL_OPTIONAL_H
-
-#include <dpl/exception.h>
-#include <dpl/availability.h>
-
-namespace VcoreDPL {
-template <typename Type>
-class Optional
-{
- class Exception
- {
- public:
- DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base)
- DECLARE_EXCEPTION_TYPE(Base, NullReference)
- };
-
- public:
- Optional() :
- m_null(true),
- m_value()
- {}
-
- Optional(const Type& t) :
- m_null(false),
- m_value(t)
- {}
-
- bool IsNull() const
- {
- return m_null;
- }
-
- Type& operator*()
- {
- if (m_null) {
- Throw(typename Exception::NullReference);
- }
- return m_value;
- }
-
- const Type& operator*() const
- {
- if (m_null) {
- Throw(typename Exception::NullReference);
- }
- return m_value;
- }
-
- const Type* operator->() const
- {
- if (m_null) {
- Throw(typename Exception::NullReference);
- }
- return &m_value;
- }
-
- Type* operator->()
- {
- if (m_null) {
- Throw(typename Exception::NullReference);
- }
- return &m_value;
- }
-
- bool operator!() const
- {
- return m_null;
- }
-
- Optional<Type>& operator=(const Type& other)
- {
- m_null = false;
- m_value = other;
- return *this;
- }
-
- bool operator==(const Optional<Type>& aSecond) const
- {
- return LogicalOperator<true>(*this, aSecond,
- std::equal_to<Type>(), std::equal_to<bool>());
- }
-
- bool operator==(const Type& aSecond) const
- {
- return Optional<Type>(aSecond) == *this;
- }
-
- bool operator!=(const Optional<Type>& aSecond) const
- {
- return !(*this == aSecond);
- }
-
- bool operator<(const Optional<Type>& aSecond) const
- {
- return LogicalOperator<false>(*this, aSecond,
- std::less<Type>(), std::less<bool>());
- }
-
- bool operator>(const Optional<Type>& aSecond) const
- {
- return LogicalOperator<false>(*this, aSecond,
- std::greater<Type>(), std::greater<bool>());
- }
-
- bool operator<=(const Optional<Type>& aSecond) const
- {
- return *this == aSecond || *this < aSecond;
- }
-
- bool operator>=(const Optional<Type>& aSecond) const
- {
- return *this == aSecond || *this > aSecond;
- }
-
- static Optional<Type> Null;
-
- private:
- bool m_null;
- Type m_value;
-
- template <bool taEquality, typename taComparator, typename taNullComparator>
- static bool LogicalOperator(const Optional<Type>& aFirst,
- const Optional<Type>& aSecond,
- taComparator aComparator,
- taNullComparator aNullComparator)
- {
- if (aFirst.m_null == aSecond.m_null) {
- if (aFirst.m_null) {
- return taEquality;
- } else {
- return aComparator(aFirst.m_value, aSecond.m_value);
- }
- } else {
- return aNullComparator(aFirst.m_null, aSecond.m_null);
- }
- }
-} DPL_DEPRECATED_WITH_MESSAGE("Use boost::optional instead");
-
-template<typename Type>
-Optional<Type> Optional<Type>::Null = Optional<Type>();
-} //namespace VcoreDPL
-
-template<typename Type>
-std::ostream& operator<<(std::ostream& aStream,
- const VcoreDPL::Optional<Type>& aOptional)
-{
- if (aOptional.IsNull()) {
- return aStream << "null optional";
- } else {
- return aStream << *aOptional;
- }
-}
-
-#endif // DPL_OPTIONAL_VALUE_H
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef DPL_OPTIONAL_TYPEDEFS_H
-#define DPL_OPTIONAL_TYPEDEFS_H
-
-#include <string>
-#include <dpl/string.h>
-#include <boost/optional.hpp>
-
-namespace VcoreDPL {
-typedef boost::optional<String> OptionalString;
-typedef boost::optional<int> OptionalInt;
-typedef boost::optional<unsigned int> OptionalUInt;
-typedef boost::optional<bool> OptionalBool;
-typedef boost::optional<float> OptionalFloat;
-typedef boost::optional<std::string> OptionalStdString;
-} //namespace VcoreDPL
-
-#endif /* DPL_OPTIONAL_TYPEDEFS_H */
-
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*!
- * @file scoped_ptr.h
- * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
- * @version 1.0
- * @brief This file is the implementation file of scoped array RAII
- *
- * This module is deprecated, please use standard C++11 feature: std::unique_ptr<Type[]>
- */
-#ifndef DPL_SCOPED_ARRAY_H
-#define DPL_SCOPED_ARRAY_H
-
-#include <cstddef>
-
-#include <dpl/assert.h>
-#include <dpl/scoped_resource.h>
-#include <dpl/availability.h>
-
-namespace VcoreDPL {
-template<typename Class>
-struct ScopedArrayPolicy
-{
- typedef Class* Type;
- static Type NullValue()
- {
- return NULL;
- }
- static void Destroy(Type ptr)
- {
- delete[] ptr;
- }
-};
-
-template<typename Class>
-class ScopedArray : public ScopedResource<ScopedArrayPolicy<Class> >
-{
- typedef ScopedArrayPolicy<Class> Policy;
- typedef ScopedResource<Policy> BaseType;
-
- public:
- explicit ScopedArray(Class *ptr = Policy::NullValue()) : BaseType(ptr) { }
-
- Class &operator [](std::ptrdiff_t k) const
- {
- Assert(this->m_value != Policy::NullValue() &&
- "Dereference of scoped NULL array!");
- Assert(k >= 0 && "Negative array index");
-
- return this->m_value[k];
- }
-} DPL_DEPRECATED_WITH_MESSAGE("use standard C++11 feature: std::unique_ptr<Type[]>");
-} // namespace VcoreDPL
-
-#endif // DPL_SCOPED_PTR_H
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file string.h
- * @author Piotr Marcinkiewicz (p.marcinkiew@samsung.com)
- * @version 1.0
- */
-#ifndef DPL_STRING
-#define DPL_STRING
-
-#include <dpl/exception.h>
-#include <dpl/char_traits.h>
-#include <string>
-#include <ostream>
-#include <numeric>
-
-namespace VcoreDPL {
-// @brief DPL string
-typedef std::basic_string<wchar_t, CharTraits> String;
-
-// @brief String exception class
-class StringException
-{
- public:
- DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base)
-
- // @brief Invalid init for UTF8 to UTF32 converter
- DECLARE_EXCEPTION_TYPE(Base, IconvInitErrorUTF8ToUTF32)
-
- // @brief Invalid taStdContainerinit for UTF32 to UTF32 converter
- DECLARE_EXCEPTION_TYPE(Base, IconvInitErrorUTF32ToUTF8)
-
- // @brief Invalid conversion for UTF8 to UTF32 converter
- DECLARE_EXCEPTION_TYPE(Base, IconvConvertErrorUTF8ToUTF32)
-
- // @brief Invalid conversion for UTF8 to UTF32 converter
- DECLARE_EXCEPTION_TYPE(Base, IconvConvertErrorUTF32ToUTF8)
-
- // @brief Invalid ASCII character detected in FromASCII
- DECLARE_EXCEPTION_TYPE(Base, InvalidASCIICharacter)
-
- // @brief Invalid ASCII character detected in FromASCII
- DECLARE_EXCEPTION_TYPE(Base, ICUInvalidCharacterFound)
-};
-
-//!\brief convert ASCII string to VcoreDPL::String
-String FromASCIIString(const std::string& aString);
-
-//!\brief convert UTF32 string to VcoreDPL::String
-String FromUTF32String(const std::wstring& aString);
-
-//@brief Returns String object created from UTF8 string
-//@param[in] aString input UTF-8 string
-String FromUTF8String(const std::string& aString);
-
-//@brief Returns String content as std::string
-std::string ToUTF8String(const String& aString);
-
-//@brief Compare two unicode strings
-int StringCompare(const String &left,
- const String &right,
- bool caseInsensitive = false);
-
-//@brief Splits the string into substrings.
-//@param[in] str Input string
-//@param[in] delimiters array or string containing a sequence of substring
-// delimiters. Can be also a single delimiter character.
-//@param[in] it InserterIterator that is used to save the generated substrings.
-template<typename StringType, typename Delimiters, typename InserterIterator>
-void Tokenize(const StringType& str,
- const Delimiters& delimiters,
- InserterIterator it,
- bool ignoreEmpty = false)
-{
- typename StringType::size_type nextSearchStart = 0;
- typename StringType::size_type pos;
- typename StringType::size_type length;
-
- while (true) {
- pos = str.find_first_of(delimiters, nextSearchStart);
- length =
- ((pos == StringType::npos) ? str.length() : pos) - nextSearchStart;
-
- if (!ignoreEmpty || length > 0) {
- *it = str.substr(nextSearchStart, length);
- it++;
- }
-
- if (pos == StringType::npos) {
- return;
- }
-
- nextSearchStart = pos + 1;
- }
-}
-
-namespace Utils {
-
-template<typename T> class ConcatFunc : public std::binary_function<T, T, T>
-{
-public:
- explicit ConcatFunc(const T & val) : m_delim(val) {}
- T operator()(const T & arg1, const T & arg2) const
- {
- return arg1 + m_delim + arg2;
- }
-private:
- T m_delim;
-};
-
-}
-
-template<typename ForwardIterator>
-typename ForwardIterator::value_type Join(ForwardIterator begin, ForwardIterator end, typename ForwardIterator::value_type delim)
-{
- typedef typename ForwardIterator::value_type value;
- if(begin == end) return value();
- Utils::ConcatFunc<value> func(delim);
- ForwardIterator init = begin;
- return std::accumulate(++begin, end, *init, func);
-}
-
-template<class StringType> void TrimLeft(StringType & obj, typename StringType::const_pointer separators)
-{
- obj.erase(0, obj.find_first_not_of(separators));
-}
-
-template<class StringType> void TrimRight(StringType & obj, typename StringType::const_pointer separators)
-{
- obj.erase(obj.find_last_not_of(separators)+1);
-}
-
-template<class StringType> void Trim(StringType & obj, typename StringType::const_pointer separators)
-{
- TrimLeft(obj, separators);
- TrimRight(obj, separators);
-}
-
-
-} //namespace VcoreDPL
-
-std::ostream& operator<<(std::ostream& aStream, const VcoreDPL::String& aString);
-
-#endif // DPL_STRING
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file thread.h
- * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
- * @version 1.0
- * @brief This file is the implementation file of thread
- */
-#ifndef DPL_THREAD_H
-#define DPL_THREAD_H
-
-#include <dpl/waitable_handle_watch_support.h>
-#include <dpl/noncopyable.h>
-#include <dpl/exception.h>
-#include <dpl/assert.h>
-#include <boost/optional.hpp>
-#include <stdint.h>
-#include <cstdlib>
-#include <pthread.h>
-#include <thread>
-#include <vector>
-#include <list>
-#include <mutex>
-
-namespace VcoreDPL {
-class Thread :
- private Noncopyable,
- public WaitableHandleWatchSupport
-{
- public:
- class Exception
- {
- public:
- DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base)
- DECLARE_EXCEPTION_TYPE(Base, CreateFailed)
- DECLARE_EXCEPTION_TYPE(Base, DestroyFailed)
- DECLARE_EXCEPTION_TYPE(Base, RunFailed)
- DECLARE_EXCEPTION_TYPE(Base, QuitFailed)
- DECLARE_EXCEPTION_TYPE(Base, UnmanagedThread)
- };
-
- typedef void (*EventDeleteProc)(void *event, void *userParam);
- typedef void (*EventDispatchProc)(void *event, void *userParam);
-
- protected:
- /**
- * Main thread entry
- * The method is intended to be overloaded with custom code.
- * Default implementation just executes Exec method to process
- * all thread exents
- */
- virtual int ThreadEntry();
-
- /**
- * Start processing of thread events
- */
- int Exec();
-
- private:
- struct InternalEvent
- {
- void *event;
- void *userParam;
- EventDispatchProc eventDispatchProc;
- EventDeleteProc eventDeleteProc;
-
- InternalEvent(void *eventArg,
- void *userParamArg,
- EventDispatchProc eventDispatchProcArg,
- EventDeleteProc eventDeleteProcArg) :
- event(eventArg),
- userParam(userParamArg),
- eventDispatchProc(eventDispatchProcArg),
- eventDeleteProc(eventDeleteProcArg)
- {}
- };
-
- struct InternalTimedEvent :
- InternalEvent
- {
- unsigned long dueTimeMiliseconds;
- unsigned long registerTimeMiliseconds;
-
- InternalTimedEvent(void *eventArg,
- void *userParamArg,
- unsigned long dueTimeMilisecondsArg,
- unsigned long registerTimeMilisecondsArg,
- EventDispatchProc eventDispatchProcArg,
- EventDeleteProc eventDeleteProcArg) :
- InternalEvent(eventArg,
- userParamArg,
- eventDispatchProcArg,
- eventDeleteProcArg),
- dueTimeMiliseconds(dueTimeMilisecondsArg),
- registerTimeMiliseconds(registerTimeMilisecondsArg)
- {}
-
- bool operator<(const InternalTimedEvent &other)
- {
- return registerTimeMiliseconds + dueTimeMiliseconds >
- other.registerTimeMiliseconds + other.dueTimeMiliseconds;
- }
- };
-
- // Internal event list
- typedef std::list<InternalEvent> InternalEventList;
-
- // Internal timed event list
- typedef std::vector<InternalTimedEvent> InternalTimedEventVector;
-
- // State managment
- std::thread m_thread;
- volatile bool m_abandon;
- volatile bool m_running;
- std::mutex m_stateMutex;
- WaitableEvent m_quitEvent;
-
- // Event processing
- std::mutex m_eventMutex;
- InternalEventList m_eventList;
- WaitableEvent m_eventInvoker;
-
- // Timed events processing
- std::mutex m_timedEventMutex;
- InternalTimedEventVector m_timedEventVector;
- WaitableEvent m_timedEventInvoker;
-
- // WaitableHandleWatchSupport
- virtual Thread *GetInvokerThread();
- virtual void HandleDirectInvoker();
- bool m_directInvoke;
-
- // Internals
- unsigned long GetCurrentTimeMiliseconds() const;
- void ProcessEvents();
- void ProcessTimedEvents();
-
- static void *StaticThreadEntry(void *param);
-
- public:
- explicit Thread();
- virtual ~Thread();
-
- /**
- * Run thread. Does nothing if thread is already running
- */
- void Run();
-
- /**
- * Send quit message to thread and wait for its end
- * Does nothing is thread is not running
- */
- void Quit();
-
- /**
- * Checks if current thread is main one
- * Returns true if it is main program thread, false otherwise
- */
- static bool IsMainThread();
-
- /**
- * Current thread retrieval
- * Returns DPL thread handle or NULL if it is main program thread
- */
- static Thread *GetCurrentThread();
-
- /**
- * Low-level event push, usually used only by EventSupport
- */
- void PushEvent(void *event,
- EventDispatchProc eventDispatchProc,
- EventDeleteProc eventDeleteProc,
- void *userParam);
-
- /**
- * Low-level timed event push, usually used only by EventSupport
- */
- void PushTimedEvent(void *event,
- double dueTimeSeconds,
- EventDispatchProc eventDispatchProc,
- EventDeleteProc eventDeleteProc,
- void *userParam);
-
- /**
- * Sleep for a number of seconds
- */
- static void Sleep(uint64_t seconds);
-
- /**
- * Sleep for a number of miliseconds
- */
- static void MiliSleep(uint64_t miliseconds);
-
- /**
- * Sleep for a number of microseconds
- */
- static void MicroSleep(uint64_t microseconds);
-
- /**
- * Sleep for a number of nanoseconds
- */
- static void NanoSleep(uint64_t nanoseconds);
-};
-
-extern bool g_TLSforMainCreated;
-
-// In case of using TLV in main thread, pthread_exit(NULL) has to be called in
-// this thread explicitly.
-// On the other hand, possibly, because of the kernel bug, there exist
-// a problem, if any other thread than main exist during pthread_exit call
-// (process can become non-responsive)
-// TODO further investigation is required.
-template<typename Type>
-class ThreadLocalVariable :
- public Noncopyable
-{
- public:
- typedef Type ValueType;
-
- class Exception
- {
- public:
- DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base)
- DECLARE_EXCEPTION_TYPE(Base, NullReference)
- DECLARE_EXCEPTION_TYPE(Base, KeyCreateFailed)
- };
-
- private:
- pthread_key_t m_key;
-
- struct ManagedValue
- {
- ValueType value;
- boost::optional<pthread_key_t> guardKey;
- };
-
- static void MainThreadExitClean()
- {
- // There is a possible bug in kernel. If this function is called
- // before ALL threads are closed, process will hang!
- // Because of that, by default this function has to be called in well
- // known "threads state".
-
- // pthread_exit(NULL);
- }
-
- static void InternalDestroy(void *specific)
- {
- // Destroy underlying type
- ManagedValue *instance = static_cast<ManagedValue *>(specific);
- if (!instance->guardKey) {
- delete instance;
- } else {
- int result = pthread_setspecific(*(instance->guardKey), instance);
-
- Assert(result == 0 &&
- "Failed to set thread local variable");
- }
- }
-
- Type &Reference(bool allowInstantiate = false)
- {
- ManagedValue *instance =
- static_cast<ManagedValue *>(pthread_getspecific(m_key));
-
- if (!instance) {
- // Check if it is allowed to instantiate
- if (!allowInstantiate) {
- Throw(typename Exception::NullReference);
- }
-
- // checking, if specific data is created for Main thread
- // If yes, pthread_exit(NULL) is required
- if (!g_TLSforMainCreated) {
- if (Thread::IsMainThread()) {
- g_TLSforMainCreated = true;
- atexit(&MainThreadExitClean);
- }
- }
-
- // Need to instantiate underlying type
- instance = new ManagedValue();
-
- int result = pthread_setspecific(m_key, instance);
-
- Assert(result == 0 &&
- "Failed to set thread local variable");
- }
-
- return instance->value;
- }
-
- public:
- ThreadLocalVariable()
- {
- int result = pthread_key_create(&m_key, &InternalDestroy);
- if (result != 0) {
- ThrowMsg(typename Exception::KeyCreateFailed,
- "Failed to allocate thread local variable: " << result);
- }
- }
-
- ~ThreadLocalVariable()
- {
- pthread_key_delete(m_key);
- }
-
- Type &operator=(const Type &other)
- {
- Type &reference = Reference(true);
- reference = other;
- return reference;
- }
-
- bool IsNull() const
- {
- return pthread_getspecific(m_key) == NULL;
- }
-
- Type& operator*()
- {
- return Reference();
- }
-
- const Type& operator*() const
- {
- return Reference();
- }
-
- const Type* operator->() const
- {
- return &Reference();
- }
-
- Type* operator->()
- {
- return &Reference();
- }
-
- bool operator!() const
- {
- return IsNull();
- }
-
- void Reset()
- {
- ManagedValue *specific =
- static_cast<ManagedValue *>(pthread_getspecific(m_key));
-
- if (!specific) {
- return;
- }
-
- // TODO Should be an assert? is it developers fault to Reset Guarded
- // value?
- specific->guardKey = boost::optional<pthread_key_t>();
-
- InternalDestroy(specific);
-
- int result = pthread_setspecific(m_key, NULL);
-
- Assert(result == 0 &&
- "Failed to reset thread local variable");
- }
-
- // GuardValue(true) allows to defer destroy (by pthread internal
- // functionality) thread specific value until GuardValue(false) will be
- // called.
- void GuardValue(bool guard)
- {
- ManagedValue *instance =
- static_cast<ManagedValue *>(pthread_getspecific(m_key));
-
- Assert(instance && "Failed to get the value");
-
- instance->guardKey = guard ? m_key : boost::optional<pthread_key_t>();
- }
-};
-} // namespace VcoreDPL
-
-#endif // DPL_THREAD_H
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file type_list.h
- * @author Bartosz Janiak (b.janiak@samsung.com)
- * @version 1.0
- * @brief Generic type list template
- */
-#ifndef DPL_TYPE_LIST_H
-#define DPL_TYPE_LIST_H
-
-#include <cstddef>
-
-namespace VcoreDPL {
-class TypeListGuard
-{
- public:
- template<size_t Index>
- struct Element
- {
- struct ERROR_TypeListElementIndexIsOutOfBounds;
- typedef ERROR_TypeListElementIndexIsOutOfBounds Type;
- };
-
- static const size_t Size = 0;
-};
-
-template<typename HeadType, typename TailType>
-class TypeList
-{
- private:
- class DummyClass
- {};
-
- template<typename List, size_t Enum>
- struct TypeCounter : public TypeCounter<typename List::Tail, Enum + 1>
- {};
-
- template<size_t Enum>
- struct TypeCounter<TypeListGuard, Enum>
- {
- static const size_t Size = Enum;
- };
-
- public:
- typedef TailType Tail;
- typedef HeadType Head;
- typedef TypeList<HeadType, TailType> ThisType;
-
- template<size_t Index, typename DummyType = DummyClass>
- struct Element
- {
- typedef typename TailType::template Element<Index - 1>::Type Type;
- };
-
- template<typename DummyType>
- struct Element<0, DummyType>
- {
- typedef HeadType Type;
- };
-
- template<typename Type, typename DummyType = DummyClass>
- struct Contains
- {
- typedef typename TailType::template Contains<Type>::Yes Yes;
- };
-
- template<typename DummyType>
- struct Contains<HeadType, DummyType>
- {
- typedef int Yes;
- };
-
- static const size_t Size = TypeCounter<ThisType, 0>::Size;
-};
-
-template<typename T1 = TypeListGuard, typename T2 = TypeListGuard,
- typename T3 = TypeListGuard, typename T4 = TypeListGuard,
- typename T5 = TypeListGuard, typename T6 = TypeListGuard,
- typename T7 = TypeListGuard, typename T8 = TypeListGuard,
- typename T9 = TypeListGuard, typename T10 = TypeListGuard,
- typename T11 = TypeListGuard, typename T12 = TypeListGuard,
- typename T13 = TypeListGuard, typename T14 = TypeListGuard,
- typename T15 = TypeListGuard, typename T16 = TypeListGuard,
- typename T17 = TypeListGuard, typename T18 = TypeListGuard,
- typename T19 = TypeListGuard, typename T20 = TypeListGuard,
- typename T21 = TypeListGuard, typename T22 = TypeListGuard,
- typename T23 = TypeListGuard, typename T24 = TypeListGuard,
- typename T25 = TypeListGuard, typename T26 = TypeListGuard,
- typename T27 = TypeListGuard, typename T28 = TypeListGuard,
- typename T29 = TypeListGuard, typename T30 = TypeListGuard,
- typename T31 = TypeListGuard, typename T32 = TypeListGuard,
- typename T33 = TypeListGuard, typename T34 = TypeListGuard,
- typename T35 = TypeListGuard, typename T36 = TypeListGuard,
- typename T37 = TypeListGuard, typename T38 = TypeListGuard,
- typename T39 = TypeListGuard, typename T40 = TypeListGuard,
- typename T41 = TypeListGuard, typename T42 = TypeListGuard,
- typename T43 = TypeListGuard, typename T44 = TypeListGuard,
- typename T45 = TypeListGuard, typename T46 = TypeListGuard,
- typename T47 = TypeListGuard, typename T48 = TypeListGuard,
- typename T49 = TypeListGuard, typename T50 = TypeListGuard,
- typename T51 = TypeListGuard, typename T52 = TypeListGuard,
- typename T53 = TypeListGuard, typename T54 = TypeListGuard,
- typename T55 = TypeListGuard, typename T56 = TypeListGuard,
- typename T57 = TypeListGuard, typename T58 = TypeListGuard,
- typename T59 = TypeListGuard, typename T60 = TypeListGuard,
- typename T61 = TypeListGuard, typename T62 = TypeListGuard,
- typename T63 = TypeListGuard, typename T64 = TypeListGuard>
-struct TypeListDecl
-{
- typedef TypeList<T1,
- typename TypeListDecl<
- T2, T3, T4, T5, T6, T7, T8,
- T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22,
- T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36,
- T37, T38, T39, T40, T41, T42, T43,
- T44, T45, T46, T47, T48, T49, T50,
- T51, T52, T53, T54, T55, T56, T57,
- T58, T59, T60, T61, T62, T63, T64>::Type> Type;
-};
-
-template<>
-struct TypeListDecl<TypeListGuard, TypeListGuard, TypeListGuard, TypeListGuard,
- TypeListGuard, TypeListGuard, TypeListGuard, TypeListGuard,
- TypeListGuard, TypeListGuard, TypeListGuard, TypeListGuard,
- TypeListGuard, TypeListGuard, TypeListGuard, TypeListGuard,
- TypeListGuard, TypeListGuard, TypeListGuard, TypeListGuard,
- TypeListGuard, TypeListGuard, TypeListGuard, TypeListGuard,
- TypeListGuard, TypeListGuard, TypeListGuard, TypeListGuard,
- TypeListGuard, TypeListGuard, TypeListGuard, TypeListGuard,
- TypeListGuard, TypeListGuard, TypeListGuard, TypeListGuard,
- TypeListGuard, TypeListGuard, TypeListGuard, TypeListGuard,
- TypeListGuard, TypeListGuard, TypeListGuard, TypeListGuard,
- TypeListGuard, TypeListGuard, TypeListGuard, TypeListGuard,
- TypeListGuard, TypeListGuard, TypeListGuard, TypeListGuard,
- TypeListGuard, TypeListGuard, TypeListGuard, TypeListGuard,
- TypeListGuard, TypeListGuard, TypeListGuard, TypeListGuard,
- TypeListGuard, TypeListGuard, TypeListGuard, TypeListGuard>
-{
- typedef TypeListGuard Type;
-};
-} // namespace VcoreDPL
-
-#endif // DPL_TYPE_LIST_H
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file waitable_event.h
- * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
- * @version 1.0
- * @brief This file is the implementation file of waitable event
- */
-#ifndef DPL_WAITABLE_EVENT_H
-#define DPL_WAITABLE_EVENT_H
-
-#include <dpl/waitable_handle.h>
-#include <dpl/noncopyable.h>
-#include <dpl/exception.h>
-#include <vector>
-
-namespace VcoreDPL {
-class WaitableEvent :
- private Noncopyable
-{
- public:
- class Exception
- {
- public:
- DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base)
- DECLARE_EXCEPTION_TYPE(Base, CreateFailed)
- DECLARE_EXCEPTION_TYPE(Base, DestroyFailed)
- DECLARE_EXCEPTION_TYPE(Base, SignalFailed)
- DECLARE_EXCEPTION_TYPE(Base, ResetFailed)
- };
-
- private:
- int m_pipe[2];
-
- public:
- WaitableEvent();
- virtual ~WaitableEvent();
-
- WaitableHandle GetHandle() const;
-
- void Signal() const;
- void Reset() const;
-};
-} // namespace VcoreDPL
-
-#endif // DPL_WAITABLE_EVENT_H
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file waitable_handle.h
- * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
- * @version 1.0
- * @brief This file is the header file of waitable handle
- */
-#ifndef DPL_WAITABLE_HANDLE_H
-#define DPL_WAITABLE_HANDLE_H
-
-#include <dpl/noncopyable.h>
-#include <dpl/exception.h>
-#include <vector>
-
-namespace VcoreDPL {
-/**
- * Waitable unix wait handle definition
- */
-typedef int WaitableHandle;
-
-/**
- * Waitable handle list
- */
-typedef std::vector<WaitableHandle> WaitableHandleList;
-
-/**
- * Wait mode
- */
-class WaitMode
-{
- public:
- enum Type
- {
- Read, ///< Wait for readability state changes
- Write ///< Wait for writability state changes
- };
-};
-
-/**
- * Waitable handle list ex
- */
-typedef std::vector<std::pair<WaitableHandle,
- WaitMode::Type> > WaitableHandleListEx;
-
-/**
- * Waitable handle index list
- */
-typedef std::vector<size_t> WaitableHandleIndexList;
-
-/**
- * Wait exceptions
- */
-DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, WaitFailed)
-
-/**
- * Wait for single handle readability
- * Convience function.
- *
- * @return Signaled waitable handle index list
- * @throw WaitFailed Fatal error occurred while waiting for signal
- */
-WaitableHandleIndexList WaitForSingleHandle(
- WaitableHandle handle,
- unsigned long miliseconds =
- 0xFFFFFFFF);
-
-/**
- * Wait for single handle
- * Convience function.
- *
- * @return Signaled waitable handle index list
- * @throw WaitFailed Fatal error occurred while waiting for signal
- */
-WaitableHandleIndexList WaitForSingleHandle(
- WaitableHandle handle,
- WaitMode::Type mode,
- unsigned long miliseconds =
- 0xFFFFFFFF);
-
-/**
- * Wait for multiple handles readability
- *
- * @return Signaled waitable handle index list
- * @throw WaitFailed Fatal error occurred while waiting for signal
- */
-WaitableHandleIndexList WaitForMultipleHandles(
- const WaitableHandleList &handleList,
- unsigned long miliseconds = 0xFFFFFFFF);
-
-/**
- * Wait for multiple handles readability
- *
- * @return Signaled waitable handle index list
- * @throw WaitFailed Fatal error occurred while waiting for signal
- */
-WaitableHandleIndexList WaitForMultipleHandles(
- const WaitableHandleListEx &handleListEx,
- unsigned long miliseconds = 0xFFFFFFFF);
-} // namespace VcoreDPL
-
-#endif // DPL_WAITABLE_HANDLE_H
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file waitable_handle_watch_support.h
- * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
- * @version 1.0
- * @brief This file is the implementation file of waitable handle watch
- * support
- */
-#ifndef DPL_WAITABLE_HANDLE_WATCH_SUPPORT_H
-#define DPL_WAITABLE_HANDLE_WATCH_SUPPORT_H
-
-#include <dpl/waitable_event.h>
-#include <dpl/waitable_handle.h>
-#include <dpl/exception.h>
-#include <list>
-#include <map>
-#include <mutex>
-
-namespace VcoreDPL {
-class Thread;
-
-class WaitableHandleWatchSupport
-{
- public:
- class WaitableHandleListener
- {
- public:
- virtual ~WaitableHandleListener() {}
-
- virtual void OnWaitableHandleEvent(WaitableHandle waitableHandle,
- WaitMode::Type mode) = 0;
- };
-
- protected:
- // Invoker waitable handle
- // Signaled by Add/Remove methods
- // After being signaled one must call Handle invoke to reset invoker
- WaitableHandle WaitableInvokerHandle() const;
-
- // Waitable handle ex list
- WaitableHandleListEx WaitableWatcherHandles() const;
-
- // Perform actions for signaled waitable handle
- // Called in execution context, after
- void HandleWatcher(WaitableHandle waitableHandle, WaitMode::Type mode);
-
- // Perform actions after invoker was signaled
- void InvokerFinished();
-
- // Get invoker context
- virtual Thread *GetInvokerThread() = 0;
-
- // Invoke direct invoker
- virtual void HandleDirectInvoker() = 0;
-
- private:
- // Waitable event watchers
- struct WaitableHandleWatcher
- {
- WaitableHandleListener *listener;
- WaitMode::Type mode;
-
- WaitableHandleWatcher(WaitableHandleListener *l, WaitMode::Type m) :
- listener(l),
- mode(m)
- {}
- };
-
- typedef std::list<WaitableHandleWatcher> WaitableHandleListenerList;
-
- struct WaitableHandleWatchers
- {
- WaitableHandleListenerList listeners;
- size_t readListenersCount;
- size_t writeListenersCount;
-
- WaitableHandleWatchers() :
- readListenersCount(0),
- writeListenersCount(0)
- {}
- };
-
- typedef std::map<WaitableHandle,
- WaitableHandleWatchers> WaitableHandleWatchersMap;
-
- // Waitable event watch support
- mutable std::recursive_mutex m_watchersMutex;
- WaitableHandleWatchersMap m_watchersMap;
- WaitableEvent m_watchersInvoker;
- WaitableEvent m_watchersInvokerCommit;
-
- // Invoke call
- void CommitInvoker();
-
- public:
- /**
- * Constructor
- */
- explicit WaitableHandleWatchSupport();
-
- /**
- * Destructor
- */
- virtual ~WaitableHandleWatchSupport();
-
- /**
- * Adds listener for specific waitable event
- *
- * @param[in] listener Listener to attach
- * @param[in] waitableHandle Waitable handle to listen for changes
- * @param[in] mode Type of changes to listen to
- * @return none
- * @see WaitMode::Type
- */
- void AddWaitableHandleWatch(WaitableHandleListener *listener,
- WaitableHandle waitableHandle,
- WaitMode::Type mode);
-
- /**
- * Remove listener for specific waitable event
- *
- * @param[in] listener Listener to detach
- * @param[in] waitableHandle Waitable handle to unlisten for changes
- * @param[in] mode Type of changes to unlisten to
- * @return none
- * @see WaitMode::Type
- */
- void RemoveWaitableHandleWatch(WaitableHandleListener *listener,
- WaitableHandle waitableHandle,
- WaitMode::Type mode);
-
-};
-} // namespace VcoreDPL
-
-#endif // DPL_WAITABLE_HANDLE_WATCH_SUPPORT_H
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file workaround.h
- * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
- * @version 1.0
- * @brief This file is the header file of workaround
- */
-#ifndef DPL_WORKAROUND_H
-#define DPL_WORKAROUND_H
-
-/**
- * Define following macro to track invalid waitable handles
- * in WaitForSingle/WaitForMultiple functions
- */
-#define DPL_ENABLE_WAITABLE_HANDLE_BADF_CHECK
-
-/**
- * Define following macro to enable workaround for problem
- * with GLIB loop integration and EBADF error handling
- */
-#define DPL_ENABLE_GLIB_LOOP_INTEGRATION_WORKAROUND
-
-/**
- * Define following macro to enable workaround for problem
- * with invalid conversions in htons/ntohs macros
- */
-#define DPL_ENABLE_HTONS_NTOHS_I386_WORKAROUND
-
-#endif // DPL_WORKAROUND_H
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file char_traits.cpp
- * @author Piotr Marcinkiewicz (p.marcinkiew@samsung.com)
- * @version 1.0
- * @biref Char traits are used to create basic_string extended with
- * additional features
- * Current char traits could be extended in feature to boost
- * performance
- */
-#include <stddef.h>
-#include <dpl/char_traits.h>
-
-//
-// Note:
-//
-// The file here is left blank to enable precompilation
-// of templates in corresponding header file.
-// Do not remove this file.
-//
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file file_input.cpp
- * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
- * @version 1.0
- * @brief This file is the implementation file of named input pipe
- */
-#include <stddef.h>
-#include <dpl/file_input.h>
-#include <dpl/binary_queue.h>
-#include <dpl/log/log.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-
-namespace VcoreDPL {
-namespace // anonymous
-{
-const size_t DEFAULT_READ_BUFFER_SIZE = 4096;
-} // namespace anonymous
-
-FileInput::FileInput() :
- m_fd(-1)
-{}
-
-FileInput::FileInput(const std::string& fileName) :
- m_fd(-1)
-{
- Open(fileName);
-}
-
-FileInput::~FileInput()
-{
- Close();
-}
-
-void FileInput::Open(const std::string& fileName)
-{
- // Open non-blocking
- int fd = TEMP_FAILURE_RETRY(open(fileName.c_str(), O_RDONLY | O_NONBLOCK));
-
- // Throw an exception if an error occurred
- if (fd == -1) {
- ThrowMsg(Exception::OpenFailed, fileName);
- }
-
- // Close if any existing
- Close();
-
- // Save new descriptor
- m_fd = fd;
-
- LogPedantic("Opened file: " << fileName);
-}
-
-void FileInput::Close()
-{
- if (m_fd == -1) {
- return;
- }
-
- if (TEMP_FAILURE_RETRY(close(m_fd)) == -1) {
- Throw(Exception::CloseFailed);
- }
-
- m_fd = -1;
-
- LogPedantic("Closed file");
-}
-
-BinaryQueueAutoPtr FileInput::Read(size_t size)
-{
- size_t bytesToRead = size >
- DEFAULT_READ_BUFFER_SIZE ? DEFAULT_READ_BUFFER_SIZE : size;
-
- // Malloc default read buffer size
- // It is unmanaged, so it can be then attached directly to binary queue
- void *buffer = malloc(bytesToRead);
-
- if (buffer == NULL) {
- throw std::bad_alloc();
- }
-
- LogPedantic("Trying to read " << bytesToRead << " bytes");
-
- ssize_t result = TEMP_FAILURE_RETRY(read(m_fd, buffer, bytesToRead));
-
- LogPedantic("Read " << result << " bytes from file");
-
- if (result > 0) {
- // Succedded to read socket data
- BinaryQueueAutoPtr binaryQueue(new BinaryQueue());
-
- // Append unmanaged memory
- binaryQueue->AppendUnmanaged(buffer,
- result,
- &BinaryQueue::BufferDeleterFree,
- NULL);
-
- // Return buffer
- return binaryQueue;
- } else if (result == 0) {
- // Socket was gracefuly closed
- free(buffer);
-
- // Return empty buffer
- return BinaryQueueAutoPtr(new BinaryQueue());
- } else {
- // Must first save errno value, because it may be altered
- int lastErrno = errno;
-
- // Free buffer
- free(buffer);
-
- // Interpret error result
- (void)lastErrno;
-
- // FIXME: Handle specific errno
- Throw(AbstractInput::Exception::ReadFailed);
- }
-}
-
-WaitableHandle FileInput::WaitableReadHandle() const
-{
- return static_cast<WaitableHandle>(m_fd);
-}
-} // namespace VcoreDPL
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file string.cpp
- * @author Piotr Marcinkiewicz (p.marcinkiew@samsung.com)
- * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
- * @version 1.0
- */
-#include <stddef.h>
-#include <memory>
-#include <dpl/string.h>
-#include <dpl/char_traits.h>
-#include <dpl/errno_string.h>
-#include <dpl/exception.h>
-#include <dpl/log/log.h>
-#include <string>
-#include <vector>
-#include <algorithm>
-#include <cstring>
-#include <errno.h>
-#include <iconv.h>
-#include <unicode/ustring.h>
-
-// TODO: Completely move to ICU
-namespace VcoreDPL {
-namespace //anonymous
-{
-class ASCIIValidator
-{
- const std::string& m_TestedString;
-
- public:
- ASCIIValidator(const std::string& aTestedString);
-
- void operator()(char aCharacter) const;
-};
-
-ASCIIValidator::ASCIIValidator(const std::string& aTestedString) :
- m_TestedString(aTestedString)
-{}
-
-void ASCIIValidator::operator()(char aCharacter) const
-{
- // Check for ASCII data range
- if (aCharacter <= 0) {
- ThrowMsg(
- StringException::InvalidASCIICharacter,
- "invalid character code " << static_cast<int>(aCharacter)
- << " from string [" <<
- m_TestedString
- << "] passed as ASCII");
- }
-}
-
-const iconv_t gc_IconvOperError = reinterpret_cast<iconv_t>(-1);
-const size_t gc_IconvConvertError = static_cast<size_t>(-1);
-} // namespace anonymous
-
-String FromUTF8String(const std::string& aIn)
-{
- if (aIn.empty()) {
- return String();
- }
-
- size_t inbytes = aIn.size();
-
- // Default iconv UTF-32 module adds BOM (4 bytes) in from of string
- // The worst case is when 8bit UTF-8 char converts to 32bit UTF-32
- // newsize = oldsize * 4 + end + bom
- // newsize - bytes for UTF-32 string
- // oldsize - letters in UTF-8 string
- // end - end character for UTF-32 (\0)
- // bom - Unicode header in front of string (0xfeff)
- size_t outbytes = sizeof(wchar_t) * (inbytes + 2);
- std::vector<wchar_t> output(inbytes + 2, 0);
-
- size_t outbytesleft = outbytes;
- char* inbuf = const_cast<char*>(aIn.c_str());
-
- // vector is used to provide buffer for iconv which expects char* buffer
- // but during conversion from UTF32 uses internaly wchar_t
- char* outbuf = reinterpret_cast<char*>(&output[0]);
-
- iconv_t iconvHandle = iconv_open("UTF-32", "UTF-8");
-
- if (gc_IconvOperError == iconvHandle) {
- int error = errno;
-
- ThrowMsg(StringException::IconvInitErrorUTF8ToUTF32,
- "iconv_open failed for " << "UTF-32 <- UTF-8" <<
- "error: " << GetErrnoString(error));
- }
-
- size_t iconvRet = iconv(iconvHandle,
- &inbuf,
- &inbytes,
- &outbuf,
- &outbytesleft);
-
- iconv_close(iconvHandle);
-
- if (gc_IconvConvertError == iconvRet) {
- ThrowMsg(StringException::IconvConvertErrorUTF8ToUTF32,
- "iconv failed for " << "UTF-32 <- UTF-8" << "error: "
- << GetErrnoString());
- }
-
- // Ignore BOM in front of UTF-32
- return &output[1];
-}
-
-std::string ToUTF8String(const VcoreDPL::String& aIn)
-{
- if (aIn.empty()) {
- return std::string();
- }
-
- size_t inbytes = aIn.size() * sizeof(wchar_t);
- size_t outbytes = inbytes + sizeof(char);
-
- // wstring returns wchar_t but iconv expects char*
- // iconv internally is processing input as wchar_t
- char* inbuf = reinterpret_cast<char*>(const_cast<wchar_t*>(aIn.c_str()));
- std::vector<char> output(inbytes, 0);
- char* outbuf = &output[0];
-
- size_t outbytesleft = outbytes;
-
- iconv_t iconvHandle = iconv_open("UTF-8", "UTF-32");
-
- if (gc_IconvOperError == iconvHandle) {
- ThrowMsg(StringException::IconvInitErrorUTF32ToUTF8,
- "iconv_open failed for " << "UTF-8 <- UTF-32"
- << "error: " << GetErrnoString());
- }
-
- size_t iconvRet = iconv(iconvHandle,
- &inbuf,
- &inbytes,
- &outbuf,
- &outbytesleft);
-
- iconv_close(iconvHandle);
-
- if (gc_IconvConvertError == iconvRet) {
- ThrowMsg(StringException::IconvConvertErrorUTF32ToUTF8,
- "iconv failed for " << "UTF-8 <- UTF-32"
- << "error: " << GetErrnoString());
- }
-
- return &output[0];
-}
-
-String FromASCIIString(const std::string& aString)
-{
- String output;
-
- std::for_each(aString.begin(), aString.end(), ASCIIValidator(aString));
- std::copy(aString.begin(), aString.end(), std::back_inserter<String>(output));
-
- return output;
-}
-
-String FromUTF32String(const std::wstring& aString)
-{
- return String(&aString[0]);
-}
-
-static UChar *ConvertToICU(const String &inputString)
-{
- std::unique_ptr<UChar[]> outputString;
- int32_t size = 0;
- int32_t convertedSize = 0;
- UErrorCode error = U_ZERO_ERROR;
-
- // Calculate size of output string
- ::u_strFromWCS(NULL,
- 0,
- &size,
- inputString.c_str(),
- -1,
- &error);
-
- if (error == U_ZERO_ERROR ||
- error == U_BUFFER_OVERFLOW_ERROR)
- {
- // What buffer size is ok ?
- LogDebug("ICU: Output buffer size: " << size);
- } else {
- ThrowMsg(StringException::ICUInvalidCharacterFound,
- "ICU: Failed to retrieve output string size. Error: "
- << error);
- }
-
- // Allocate proper buffer
- outputString.reset(new UChar[size + 1]);
- ::memset(outputString.get(), 0, sizeof(UChar) * (size + 1));
-
- error = U_ZERO_ERROR;
-
- // Do conversion
- ::u_strFromWCS(outputString.get(),
- size + 1,
- &convertedSize,
- inputString.c_str(),
- -1,
- &error);
-
- if (!U_SUCCESS(error)) {
- ThrowMsg(StringException::ICUInvalidCharacterFound,
- "ICU: Failed to convert string. Error: " << error);
- }
-
- // Done
- return outputString.release();
-}
-
-int StringCompare(const String &left,
- const String &right,
- bool caseInsensitive)
-{
- // Convert input strings
- std::unique_ptr<UChar[]> leftICU(ConvertToICU(left));
- std::unique_ptr<UChar[]> rightICU(ConvertToICU(right));
-
- if (caseInsensitive) {
- return static_cast<int>(u_strcasecmp(leftICU.get(), rightICU.get(), 0));
- } else {
- return static_cast<int>(u_strcmp(leftICU.get(), rightICU.get()));
- }
-}
-} //namespace VcoreDPL
-
-std::ostream& operator<<(std::ostream& aStream, const VcoreDPL::String& aString)
-{
- return aStream << VcoreDPL::ToUTF8String(aString);
-}
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file thread.cpp
- * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
- * @version 1.0
- * @brief This file is the implementation file of thread
- */
-#include <stddef.h>
-#include <dpl/thread.h>
-#include <dpl/log/log.h>
-#include <sys/time.h>
-#include <algorithm>
-#include <dpl/assert.h>
-#include <errno.h>
-#include <time.h>
-#include <string.h>
-
-namespace // anonymous
-{
-static const size_t NANOSECONDS_PER_SECOND =
- static_cast<uint64_t>(1000 * 1000 * 1000);
-
-static const size_t NANOSECONDS_PER_MILISECOND =
- static_cast<uint64_t>(1000 * 1000);
-
-static const size_t NANOSECONDS_PER_MICROSECOND =
- static_cast<uint64_t>(1000);
-
-static const std::thread::id g_mainThread = std::this_thread::get_id();
-
-class ThreadSpecific
-{
- public:
- pthread_key_t threadSpecific;
-
- ThreadSpecific() :
- threadSpecific(0)
- {
- threadSpecific = 0;
- pthread_key_create(&threadSpecific, NULL);
- }
-
- virtual ~ThreadSpecific()
- {
- pthread_key_delete(threadSpecific);
- }
-};
-
-static ThreadSpecific g_threadSpecific;
-} // namespace anonymous
-
-namespace VcoreDPL {
-bool g_TLSforMainCreated = false;
-
-Thread::Thread() :
- m_thread(),
- m_abandon(false),
- m_running(false),
- m_directInvoke(false)
-{}
-
-Thread::~Thread()
-{
- // Ensure that we quit thread
- // Always wait thread by yourself; if thread is still running
- // this may be sometimes very bad. When derived, some resources
- // may leak or be doubly freed
- Quit();
-
- // Remove any remainig events
- // Thread proc is surely not running now
- for (InternalEventList::iterator iterator = m_eventList.begin();
- iterator != m_eventList.end();
- ++iterator)
- {
- iterator->eventDeleteProc(iterator->event, iterator->userParam);
- }
-
- m_eventList.clear();
-}
-
-bool Thread::IsMainThread()
-{
- return (std::this_thread::get_id() == g_mainThread);
-}
-
-Thread *Thread::GetCurrentThread()
-{
- if (std::this_thread::get_id() == g_mainThread) {
- return NULL;
- }
-
- void *threadSpecific = pthread_getspecific(g_threadSpecific.threadSpecific);
-
- // Is this a managed thread ?
- if (threadSpecific == NULL) {
- Throw(Exception::UnmanagedThread);
- }
-
- return static_cast<Thread *>(threadSpecific);
-}
-
-void *Thread::StaticThreadEntry(void *param)
-{
- LogDebug("Entered static thread entry");
-
- // Retrieve context
- Thread *This = static_cast<Thread *>(param);
- Assert(This != NULL);
-
- // Set thread specific
- int result = pthread_setspecific(g_threadSpecific.threadSpecific, This);
-
- if (result)
- LogError("Failed to set threadSpecific.");
-
- // Enter thread proc
- // Do not allow exceptions to hit pthread core
- UNHANDLED_EXCEPTION_HANDLER_BEGIN
- {
- This->ThreadEntry();
- }
- UNHANDLED_EXCEPTION_HANDLER_END
-
- // Critical section
- {
- // Leave running state
- std::lock_guard<std::mutex> lock(This->m_stateMutex);
-
- This->m_running = false;
-
- // Abandon thread
- if (This->m_abandon) {
- LogDebug("Thread was abandoned");
- This->m_thread.detach();
- } else {
- LogDebug("Thread is joinable");
- }
- }
-
- return NULL;
-}
-
-int Thread::ThreadEntry()
-{
- LogDebug("Entered default thread entry");
- return Exec();
-}
-
-void Thread::ProcessEvents()
-{
- LogDebug("Processing events");
-
- // Steal current event list
- InternalEventList stolenEvents;
-
- // Enter event list critical section
- {
- std::lock_guard<std::mutex> lock(m_eventMutex);
- m_eventList.swap(stolenEvents);
- m_eventInvoker.Reset();
- }
-
- // Process event list
- LogDebug("Stolen " << stolenEvents.size() << " internal events");
-
- for (InternalEventList::iterator iterator = stolenEvents.begin();
- iterator != stolenEvents.end();
- ++iterator)
- {
- // Dispatch immediate event
- iterator->eventDispatchProc(iterator->event, iterator->userParam);
-
- // Delete event
- iterator->eventDeleteProc(iterator->event, iterator->userParam);
- }
-}
-
-void Thread::ProcessTimedEvents()
-{
- // Critical section on timed events mutex
- {
- std::lock_guard<std::mutex> lock(m_timedEventMutex);
-
- // Get current time
- unsigned long currentTimeMiliseconds = GetCurrentTimeMiliseconds();
-
- // Info
- LogDebug("Processing timed events. Time now: " << currentTimeMiliseconds << " ms");
-
- // All timed events are sorted chronologically
- // Emit timed out events
- while (!m_timedEventVector.empty() &&
- currentTimeMiliseconds >=
- m_timedEventVector.begin()->registerTimeMiliseconds +
- m_timedEventVector.begin()->dueTimeMiliseconds)
- {
- // Info
- LogDebug("Transforming timed event into immediate event. Absolute due time: " <<
- (m_timedEventVector.begin()->registerTimeMiliseconds +
- m_timedEventVector.begin()->dueTimeMiliseconds) << " ms");
-
- // Emit immediate event
- PushEvent(m_timedEventVector.begin()->event,
- m_timedEventVector.begin()->eventDispatchProc,
- m_timedEventVector.begin()->eventDeleteProc,
- m_timedEventVector.begin()->userParam);
-
- // Remove timed eventand fix heap
- std::pop_heap(m_timedEventVector.begin(), m_timedEventVector.end());
- m_timedEventVector.pop_back();
- }
- }
-}
-
-unsigned long Thread::GetCurrentTimeMiliseconds() const
-{
- timeval tv;
- gettimeofday(&tv, NULL);
- return static_cast<unsigned long>(tv.tv_sec) * 1000 +
- static_cast<unsigned long>(tv.tv_usec) / 1000;
-}
-
-int Thread::Exec()
-{
- LogDebug("Executing thread event processing");
-
- const std::size_t MIN_HANDLE_LIST_SIZE = 4;
-
- // Start processing of events
- WaitableHandleListEx handleList;
-
- // index 0: Quit waitable event handle
- handleList.push_back(std::make_pair(m_quitEvent.GetHandle(), WaitMode::Read));
-
- // index 1: Event occurred event handle
- handleList.push_back(std::make_pair(m_eventInvoker.GetHandle(),
- WaitMode::Read));
-
- // index 2: Timed event occurred event handle
- handleList.push_back(std::make_pair(m_timedEventInvoker.GetHandle(),
- WaitMode::Read));
-
- // index 3: Waitable handle watch support invoker
- handleList.push_back(std::make_pair(WaitableHandleWatchSupport::
- WaitableInvokerHandle(),
- WaitMode::Read));
-
- //
- // Watch list might have been initialized before threaded started
- // Need to fill waitable event watch list in this case
- //
- {
- WaitableHandleListEx waitableHandleWatchHandles =
- WaitableHandleWatchSupport::WaitableWatcherHandles();
- std::copy(
- waitableHandleWatchHandles.begin(),
- waitableHandleWatchHandles.end(), std::back_inserter(handleList));
- }
-
- // Quit flag
- bool quit = false;
-
- while (!quit) {
- // Retrieve minimum wait time, according to timed events list
- unsigned long minimumWaitTime;
-
- // Critical section on timed events mutex
- {
- std::lock_guard<std::mutex> lock(m_timedEventMutex);
-
- if (!m_timedEventVector.empty()) {
- unsigned long currentTimeMiliseconds =
- GetCurrentTimeMiliseconds();
- unsigned long destinationTimeMiliseconds =
- m_timedEventVector.begin()->registerTimeMiliseconds +
- m_timedEventVector.begin()->dueTimeMiliseconds;
-
- // Are we already late with timed event ?
- if (currentTimeMiliseconds > destinationTimeMiliseconds) {
- minimumWaitTime = 0;
- } else {
- minimumWaitTime = destinationTimeMiliseconds -
- currentTimeMiliseconds;
- }
- } else {
- minimumWaitTime = 0xFFFFFFFF; // Infinity
- }
- }
-
- // Info
- LogDebug("Thread loop minimum wait time: " << minimumWaitTime << " ms");
-
- // Do thread waiting
- WaitableHandleIndexList waitableHandleIndexList =
- WaitForMultipleHandles(handleList, minimumWaitTime);
-
- if (waitableHandleIndexList.empty()) {
- // Timeout occurred. Process timed events.
- LogDebug("Timed event list elapsed invoker");
- ProcessTimedEvents();
- continue;
- }
-
- // Go through each index
- for (WaitableHandleIndexList::const_iterator
- waitableHandleIndexIterator = waitableHandleIndexList.begin();
- waitableHandleIndexIterator != waitableHandleIndexList.end();
- ++waitableHandleIndexIterator)
- {
- size_t index = *waitableHandleIndexIterator;
-
- LogDebug("Event loop triggered with index: " << index);
-
- switch (index) {
- case 0:
- // Quit waitable event handle
- quit = true;
- break;
-
- case 1:
- // Event occurred event handle
- ProcessEvents();
-
- // Handle direct invoker
- if (m_directInvoke) {
- m_directInvoke = false;
-
- LogDebug("Handling direct invoker");
-
- // Update list
- while (handleList.size() > MIN_HANDLE_LIST_SIZE) {
- handleList.pop_back();
- }
-
- // Insert current waitable event handles instead
- {
- WaitableHandleListEx waitableHandleWatchHandles =
- WaitableHandleWatchSupport::WaitableWatcherHandles();
- std::copy(
- waitableHandleWatchHandles.begin(),
- waitableHandleWatchHandles.end(),
- std::back_inserter(handleList));
- }
- }
-
- // Done
- break;
-
- case 2:
- // Timed event list changed
- LogDebug("Timed event list changed invoker");
- ProcessTimedEvents();
-
- // Reset timed event invoker
- m_timedEventInvoker.Reset();
-
- // Done
- break;
-
- case 3:
- // Waitable handle watch support invoker
- LogDebug("Waitable handle watch invoker event occurred");
-
- // First, remove all previous handles
- while (handleList.size() > MIN_HANDLE_LIST_SIZE) {
- handleList.pop_back();
- }
-
- // Insert current waitable event handles instead
- {
- WaitableHandleListEx waitableHandleWatchHandles =
- WaitableHandleWatchSupport::WaitableWatcherHandles();
- std::copy(
- waitableHandleWatchHandles.begin(),
- waitableHandleWatchHandles.end(),
- std::back_inserter(handleList));
- }
-
- // Handle invoker in waitable watch support
- WaitableHandleWatchSupport::InvokerFinished();
-
- LogDebug("Waitable handle watch invoker event handled");
-
- // Done
- break;
-
- default:
- // Waitable event watch list
- LogDebug("Waitable handle watch event occurred");
-
- // Handle event in waitable handle watch
- {
- std::pair<WaitableHandle,
- WaitMode::Type> handle = handleList[index];
- WaitableHandleWatchSupport::HandleWatcher(handle.first,
- handle.second);
- }
-
- if (m_directInvoke) {
- m_directInvoke = false;
-
- LogDebug("Handling direct invoker");
-
- // Update list
- while (handleList.size() > MIN_HANDLE_LIST_SIZE) {
- handleList.pop_back();
- }
-
- // Insert current waitable event handles instead
- {
- WaitableHandleListEx waitableHandleWatchHandles =
- WaitableHandleWatchSupport::
- WaitableWatcherHandles();
- std::copy(waitableHandleWatchHandles.begin(),
- waitableHandleWatchHandles.end(),
- std::back_inserter(handleList));
- }
- }
-
- LogDebug("Waitable handle watch event handled");
-
- // Done
- break;
- }
- }
- }
-
- LogDebug("Leaving thread event processing");
- return 0;
-}
-
-void Thread::Run()
-{
- LogDebug("Running thread");
-
- // Critical section
- {
- std::lock_guard<std::mutex> lock(m_stateMutex);
-
- if (m_running) {
- return;
- }
-
- try{
- m_thread = std::thread(StaticThreadEntry,this);
- }catch(std::system_error e){
- Throw(Exception::RunFailed);
- }
-
- // At default, we abandon thread
- m_abandon = true;
-
- // Enter running state
- m_running = true;
- }
-
- LogDebug("Thread run");
-}
-
-void Thread::Quit()
-{
- // Critical section
- {
- std::lock_guard<std::mutex> lock(m_stateMutex);
-
- // Is thread running ?
- if (!m_running) {
- return;
- }
-
- LogDebug("Quitting thread...");
-
- // Do not abandon thread, we will join
- m_abandon = false;
-
- // Singal quit waitable event
- m_quitEvent.Signal();
- }
-
- try{
- m_thread.join();
- }catch(std::system_error e){
- Throw(Exception::QuitFailed);
- }
-
- LogDebug("Thread quit");
-}
-
-void Thread::PushEvent(void *event,
- EventDispatchProc eventDispatchProc,
- EventDeleteProc eventDeleteProc,
- void *userParam)
-{
- // Enter event list critical section
- std::lock_guard<std::mutex> lock(m_eventMutex);
-
- // Push new event
- m_eventList.push_back(InternalEvent(event, userParam, eventDispatchProc,
- eventDeleteProc));
-
- // Trigger invoker
- m_eventInvoker.Signal();
-
- LogDebug("Event pushed and invoker signaled");
-}
-
-void Thread::PushTimedEvent(void *event,
- double dueTimeSeconds,
- EventDispatchProc eventDispatchProc,
- EventDeleteProc eventDeleteProc,
- void *userParam)
-{
- // Check for developer errors
- Assert(dueTimeSeconds >= 0.0);
-
- // Enter timed event list critical section
- std::lock_guard<std::mutex> lock(m_timedEventMutex);
-
- // Get current time
- unsigned long currentTimeMiliseconds = GetCurrentTimeMiliseconds();
-
- // Convert to miliseconds
- unsigned long dueTimeMiliseconds =
- static_cast<unsigned long>(1000.0 * dueTimeSeconds);
-
- // Push new timed event
- m_timedEventVector.push_back(InternalTimedEvent(event, userParam,
- dueTimeMiliseconds,
- currentTimeMiliseconds,
- eventDispatchProc,
- eventDeleteProc));
-
- // Heapify timed events
- std::make_heap(m_timedEventVector.begin(), m_timedEventVector.end());
-
- // Trigger invoker
- m_timedEventInvoker.Signal();
-
- LogDebug("Timed event pushed and invoker signaled: "
- "due time: " << dueTimeMiliseconds << " ms, absolute due time: " <<
- (currentTimeMiliseconds + dueTimeMiliseconds) << " ms");
-}
-
-Thread *Thread::GetInvokerThread()
-{
- return this;
-}
-
-void Thread::HandleDirectInvoker()
-{
- // We must be in ProcessEvents call stack
- // Mark that situation to handle direct invoker
- m_directInvoke = true;
-}
-
-void Thread::Sleep(uint64_t seconds)
-{
- NanoSleep(seconds * NANOSECONDS_PER_SECOND);
-}
-
-void Thread::MiliSleep(uint64_t miliseconds)
-{
- NanoSleep(miliseconds * NANOSECONDS_PER_MILISECOND);
-}
-
-void Thread::MicroSleep(uint64_t microseconds)
-{
- NanoSleep(microseconds * NANOSECONDS_PER_MICROSECOND);
-}
-
-void Thread::NanoSleep(uint64_t nanoseconds)
-{
- timespec requestedTime = {
- static_cast<time_t>(
- nanoseconds / NANOSECONDS_PER_SECOND),
-
- static_cast<long>(
- nanoseconds % NANOSECONDS_PER_SECOND)
- };
-
- timespec remainingTime;
-
- for (;;) {
- if (nanosleep(&requestedTime, &remainingTime) == 0) {
- break;
- }
-
- int error = errno;
- Assert(error == EINTR);
-
- requestedTime = remainingTime;
- }
-}
-} // namespace VcoreDPL
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file waitable_event.cpp
- * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
- * @version 1.0
- * @brief This file is the implementation file of waitable event
- */
-#include <stddef.h>
-#include <dpl/waitable_event.h>
-#include <sys/select.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <errno.h>
-
-namespace VcoreDPL {
-WaitableEvent::WaitableEvent()
-{
- if (pipe(m_pipe) == -1) {
- Throw(Exception::CreateFailed);
- }
-
- if (fcntl(m_pipe[0], F_SETFL, O_NONBLOCK |
- fcntl(m_pipe[0], F_GETFL)) == -1)
- {
- Throw(Exception::CreateFailed);
- }
-}
-
-WaitableEvent::~WaitableEvent()
-{
- if (TEMP_FAILURE_RETRY(close(m_pipe[0])) == -1) {
- Throw(Exception::DestroyFailed);
- }
-
- if (TEMP_FAILURE_RETRY(close(m_pipe[1])) == -1) {
- Throw(Exception::DestroyFailed);
- }
-}
-
-WaitableHandle WaitableEvent::GetHandle() const
-{
- return m_pipe[0];
-}
-
-void WaitableEvent::Signal() const
-{
- char data = 0;
-
- if (TEMP_FAILURE_RETRY(write(m_pipe[1], &data, 1)) != 1) {
- Throw(Exception::SignalFailed);
- }
-}
-
-void WaitableEvent::Reset() const
-{
- char data;
-
- if (TEMP_FAILURE_RETRY(read(m_pipe[0], &data, 1)) != 1) {
- Throw(Exception::ResetFailed);
- }
-}
-} // namespace VcoreDPL
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file waitable_handle.cpp
- * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
- * @version 1.0
- * @brief This file is the implementation file of waitable handle
- */
-#include <stddef.h>
-#include <dpl/waitable_event.h>
-#include <dpl/workaround.h>
-#include <sys/select.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <dpl/assert.h>
-
-namespace VcoreDPL {
-namespace // anonymous
-{
-void CheckWaitableHandle(WaitableHandle handle)
-{
-#ifdef DPL_ENABLE_WAITABLE_HANDLE_BADF_CHECK
- // Try to get descriptor flags
- int result = fcntl(handle, F_GETFL);
-
- if (result == -1 && errno == EBADF) {
- AssertMsg(0, "CheckWaitableHandle: Invalid WaitableHandle! (EBADF)");
- }
-
- AssertMsg(result != -1, "CheckWaitableHandle: Invalid WaitableHandle!");
-#endif // DPL_ENABLE_WAITABLE_HANDLE_BADF_CHECK
-}
-} // namespace anonymous
-
-WaitableHandleIndexList WaitForSingleHandle(WaitableHandle handle,
- unsigned long miliseconds)
-{
- WaitableHandleList waitHandles;
- waitHandles.push_back(handle);
- return WaitForMultipleHandles(waitHandles, miliseconds);
-}
-
-WaitableHandleIndexList WaitForSingleHandle(WaitableHandle handle,
- WaitMode::Type mode,
- unsigned long miliseconds)
-{
- WaitableHandleListEx waitHandles;
- waitHandles.push_back(std::make_pair(handle, mode));
- return WaitForMultipleHandles(waitHandles, miliseconds);
-}
-
-WaitableHandleIndexList WaitForMultipleHandles(
- const WaitableHandleList &waitableHandleList,
- unsigned long miliseconds)
-{
- WaitableHandleListEx handleList;
-
- for (WaitableHandleList::const_iterator iterator = waitableHandleList.begin();
- iterator != waitableHandleList.end();
- ++iterator)
- {
- // Wait for multiple objects
- handleList.push_back(std::make_pair(*iterator, WaitMode::Read));
- }
-
- // Do waiting
- return WaitForMultipleHandles(handleList, miliseconds);
-}
-
-WaitableHandleIndexList WaitForMultipleHandles(
- const WaitableHandleListEx &waitableHandleListEx,
- unsigned long miliseconds)
-{
- fd_set readFds, writeFds, errorFds;
-
- // Fill sets
- int maxFd = -1;
-
- FD_ZERO(&readFds);
- FD_ZERO(&writeFds);
- FD_ZERO(&errorFds);
-
- // Add read wait handles
- for (WaitableHandleListEx::const_iterator iterator =
- waitableHandleListEx.begin();
- iterator != waitableHandleListEx.end();
- ++iterator)
- {
- if (iterator->first > maxFd) {
- maxFd = iterator->first;
- }
-
- CheckWaitableHandle(iterator->first);
-
- // Handle errors along with read and write events
- FD_SET(iterator->first, &errorFds);
-
- if (iterator->second == WaitMode::Read) {
- FD_SET(iterator->first, &readFds);
- } else if (iterator->second == WaitMode::Write) {
- FD_SET(iterator->first, &writeFds);
- }
- }
-
- // Do select
- timeval timeout;
- timeval *effectiveTimeout = NULL;
- if (miliseconds != 0xFFFFFFFF) {
- timeout.tv_sec = miliseconds / 1000;
- timeout.tv_usec = (miliseconds % 1000) * 1000;
- effectiveTimeout = &timeout;
- }
-
- if (TEMP_FAILURE_RETRY(select(maxFd + 1, &readFds, &writeFds, &errorFds,
- effectiveTimeout)) == -1)
- {
- Throw(WaitFailed);
- }
-
- // Check results
- WaitableHandleIndexList indexes;
- size_t index = 0;
-
- for (WaitableHandleListEx::const_iterator iterator =
- waitableHandleListEx.begin();
- iterator != waitableHandleListEx.end();
- ++iterator)
- {
- // Always return errors, no matter what type of listening is set
- if (FD_ISSET(iterator->first, &errorFds)) {
- indexes.push_back(index);
- } else if (iterator->second == WaitMode::Read) {
- if (FD_ISSET(iterator->first, &readFds)) {
- indexes.push_back(index);
- }
- } else if (iterator->second == WaitMode::Write) {
- if (FD_ISSET(iterator->first, &writeFds)) {
- indexes.push_back(index);
- }
- }
- ++index;
- }
-
- // Successfuly awaited some events or timeout occurred
- return indexes;
-}
-} // namespace VcoreDPL
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file waitable_handle_watch_support.cpp
- * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
- * @version 1.0
- * @brief This file is the implementation file of waitable handle watch
- * support
- */
-#include <stddef.h>
-#include <dpl/waitable_handle_watch_support.h>
-#include <dpl/thread.h>
-#include <dpl/log/log.h>
-#include <algorithm>
-#include <dpl/assert.h>
-
-namespace VcoreDPL {
-WaitableHandleWatchSupport::WaitableHandleWatchSupport()
-{}
-
-WaitableHandleWatchSupport::~WaitableHandleWatchSupport()
-{
- // Developer assertions
- if (!m_watchersMap.empty()) {
- LogWarning("### Leaked watchers map dump ###");
-
- for (WaitableHandleWatchersMap::const_iterator iterator =
- m_watchersMap.begin();
- iterator != m_watchersMap.end();
- ++iterator)
- {
- LogWarning("### Waitable handle: " << iterator->first);
-
- LogWarning("### Read listeners: " << iterator->second.readListenersCount);
- LogWarning("### Write listeners: " << iterator->second.writeListenersCount);
-
- for (WaitableHandleListenerList::const_iterator listenersIterator =
- iterator->second.listeners.begin();
- listenersIterator != iterator->second.listeners.end();
- ++listenersIterator)
- {
- LogWarning("### Mode: " << listenersIterator->mode
- << ". Listener: " << listenersIterator->listener);
- }
- }
- }
-}
-
-WaitableHandle WaitableHandleWatchSupport::WaitableInvokerHandle() const
-{
- return m_watchersInvoker.GetHandle();
-}
-
-WaitableHandleListEx WaitableHandleWatchSupport::WaitableWatcherHandles() const
-{
- // Critical section
- {
- std::lock_guard<std::recursive_mutex> lock(m_watchersMutex);
-
- WaitableHandleListEx handleList;
-
- for (WaitableHandleWatchersMap::const_iterator iterator =
- m_watchersMap.begin();
- iterator != m_watchersMap.end();
- ++iterator)
- {
- // Register waitable event id for wait
- // Check if there are any read listeners and write listeners
- // and register for both if applicable
- if (iterator->second.readListenersCount > 0) {
- handleList.push_back(std::make_pair(iterator->first,
- WaitMode::Read));
- }
-
- if (iterator->second.writeListenersCount > 0) {
- handleList.push_back(std::make_pair(iterator->first,
- WaitMode::Write));
- }
- }
-
- return handleList;
- }
-}
-
-void WaitableHandleWatchSupport::InvokerFinished()
-{
- LogDebug("Invoker finished called");
-
- // Reset invoker
- m_watchersInvoker.Reset();
-
- // Commit invoke
- m_watchersInvokerCommit.Signal();
-}
-
-void WaitableHandleWatchSupport::HandleWatcher(WaitableHandle waitableHandle,
- WaitMode::Type mode)
-{
- //
- // Waitable event occurred
- // Now call all listeners for that waitable event. It is possible
- // that some of listeners early disappeared. This is not a problem.
- // Warning: Listeners and/or watcher may also disappear during dispatching
- // handlers!
- //
- LogDebug("Waitable event occurred");
-
- // Critical section for other threads
- {
- std::lock_guard<std::recursive_mutex> lock(m_watchersMutex);
-
- // Notice: We must carefully call watchers here as they may disappear
- // (zero listeners) or be created during each of handler call
- // All removed listeners are handled correctly. Adding
- // additional listener to the same waitable handle
- // during handler dispatch sequence is _not_ supported.
- WaitableHandleWatchersMap trackedWatchers = m_watchersMap;
-
- for (WaitableHandleWatchersMap::const_iterator trackedWatchersIterator
- = trackedWatchers.begin();
- trackedWatchersIterator != trackedWatchers.end();
- ++trackedWatchersIterator)
- {
- // Check if this watcher still exists
- // If not, go to next tracked watcher
- if (m_watchersMap.find(trackedWatchersIterator->first) ==
- m_watchersMap.end())
- {
- LogDebug("Watcher disappeared during watcher handler");
- continue;
- }
-
- // Is this is a waitable handle that we are searching for ?
- if (waitableHandle != trackedWatchersIterator->first) {
- continue;
- }
-
- // Track watcher listeners list
- WaitableHandleListenerList trackedListeners =
- trackedWatchersIterator->second.listeners;
-
- LogDebug("Calling waitable event listeners (" << trackedListeners.size() << ")...");
-
- // Notice: We must carefully call listeners here as they may
- // disappear or be created during each of handler call
- // All removed listeners are handled correctly. Adding
- // additional listener to the same waitable handle
- // during handler dispatch sequence is should be also
- // handled, as an extremly case.
-
- // Call all waitable event listeners who listen for that event
- for (WaitableHandleListenerList::const_iterator
- trackedListenersIterator = trackedListeners.begin();
- trackedListenersIterator != trackedListeners.end();
- ++trackedListenersIterator)
- {
- // Check if this watcher still exists
- // If not, there cannot be another one. Must exit now (after
- // break, we actually exit)
- if (m_watchersMap.find(trackedWatchersIterator->first) ==
- m_watchersMap.end())
- {
- LogDebug("Watcher disappeared during watcher handler");
- break;
- }
-
- // Check if this watcher listener still exists
- // If not, go to next tracked watcher listener
- bool listenerStillExists = false;
-
- for (WaitableHandleListenerList::const_iterator
- searchListenerIterator =
- trackedWatchersIterator->second.listeners.begin();
- searchListenerIterator !=
- trackedWatchersIterator->second.listeners.end();
- ++searchListenerIterator)
- {
- if (searchListenerIterator->listener ==
- trackedListenersIterator->listener &&
- searchListenerIterator->mode ==
- trackedListenersIterator->mode)
- {
- listenerStillExists = true;
- break;
- }
- }
-
- if (!listenerStillExists) {
- LogDebug("Watcher listener disappeared during watcher handler");
- break;
- }
-
- // Is this is a listener mode that we are searching for ?
- if (mode != trackedListenersIterator->mode) {
- continue;
- }
-
- // Call waitable event watch listener
- LogDebug("Before tracker listener call...");
- trackedListenersIterator->listener->OnWaitableHandleEvent(
- trackedWatchersIterator->first,
- trackedListenersIterator->mode);
- LogDebug("After tracker listener call...");
- }
-
- // Now call all those listeners who registered during listener calls
- // FIXME: Implement! Notice, that scenario may be recursive!
-
- LogDebug("Waitable event listeners called");
-
- // No more waitable events possible - consistency check
- break;
- }
- }
-}
-
-void WaitableHandleWatchSupport::AddWaitableHandleWatch(
- WaitableHandleListener* listener,
- WaitableHandle waitableHandle,
- WaitMode::Type mode)
-{
- // Enter waitable event list critical section
- std::lock_guard<std::recursive_mutex> lock(m_watchersMutex);
-
- // Find proper list to register into
- WaitableHandleWatchersMap::iterator mapIterator = m_watchersMap.find(
- waitableHandle);
-
- if (mapIterator != m_watchersMap.end()) {
- // Assert if there is no such listener already that is listening in this
- // mode
- for (WaitableHandleListenerList::iterator listenersIterator =
- mapIterator->second.listeners.begin();
- listenersIterator != mapIterator->second.listeners.end();
- ++listenersIterator)
- {
- // Must not insert same listener-mode pair
- Assert(
- listenersIterator->listener != listener ||
- listenersIterator->mode != mode);
- }
- }
-
- LogDebug("Adding waitable handle watch : " << waitableHandle);
-
- // Push new waitable event watch
- if (mapIterator != m_watchersMap.end()) {
- mapIterator->second.listeners.push_back(WaitableHandleWatcher(listener,
- mode));
- } else {
- m_watchersMap[waitableHandle].listeners.push_back(WaitableHandleWatcher(
- listener, mode));
- }
-
- // Update counters
- switch (mode) {
- case WaitMode::Read:
- m_watchersMap[waitableHandle].readListenersCount++;
- break;
-
- case WaitMode::Write:
- m_watchersMap[waitableHandle].writeListenersCount++;
- break;
-
- default:
- Assert(0);
- }
-
- // Trigger waitable event invoker to commit changes
- CommitInvoker();
-
- LogDebug("Waitable event watch added and invoker signaled");
-}
-
-void WaitableHandleWatchSupport::RemoveWaitableHandleWatch(
- WaitableHandleListener *listener,
- WaitableHandle waitableHandle,
- WaitMode::Type mode)
-{
- // Enter waitable event list critical section
- std::lock_guard<std::recursive_mutex> lock(m_watchersMutex);
-
- // Find proper list with listener
- WaitableHandleWatchersMap::iterator mapIterator = m_watchersMap.find(
- waitableHandle);
-
- Assert(mapIterator != m_watchersMap.end());
-
- // Assert if there is such listener and mode
- WaitableHandleListenerList::iterator listIterator =
- mapIterator->second.listeners.end();
-
- for (WaitableHandleListenerList::iterator listenersIterator =
- mapIterator->second.listeners.begin();
- listenersIterator != mapIterator->second.listeners.end();
- ++listenersIterator)
- {
- // Check same pair listener-mode
- if (listenersIterator->listener == listener &&
- listenersIterator->mode == mode)
- {
- listIterator = listenersIterator;
- break;
- }
- }
-
- // Same pair listener-mode must exist
- Assert(listIterator != mapIterator->second.listeners.end());
-
- LogDebug("Removing waitable handle watch : " << waitableHandle);
-
- // Remove waitable event watch
- mapIterator->second.listeners.erase(listIterator);
-
- // Update counters
- switch (mode) {
- case WaitMode::Read:
- mapIterator->second.readListenersCount--;
- break;
-
- case WaitMode::Write:
- mapIterator->second.writeListenersCount--;
- break;
-
- default:
- Assert(0);
- }
-
- // If list is empty, remove it too
- if (mapIterator->second.listeners.empty()) {
- m_watchersMap.erase(mapIterator);
- }
-
- // Trigger waitable event invoker to commit changes
- CommitInvoker();
-
- LogDebug("Waitable event watch removed and invoker signaled");
-}
-
-void WaitableHandleWatchSupport::CommitInvoker()
-{
- // Check calling context and execute invoker
- if (Thread::GetCurrentThread() == GetInvokerThread()) {
- LogDebug("Calling direct invoker");
-
- // Direct invoker call
- HandleDirectInvoker();
- } else {
- LogDebug("Calling indirect invoker");
-
- // Indirect invoker call
- m_watchersInvoker.Signal();
-
- WaitableHandleList waitHandles;
- waitHandles.push_back(m_watchersInvokerCommit.GetHandle());
- WaitForMultipleHandles(waitHandles);
-
- m_watchersInvokerCommit.Reset();
- }
-}
-
-} // namespace VcoreDPL
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file naive_synchronization_object.h
- * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
- * @version 1.0
- * @brief This file is the implementation file of SQL naive
- * synchronization object
- */
-#ifndef DPL_NAIVE_SYNCHRONIZATION_OBJECT_H
-#define DPL_NAIVE_SYNCHRONIZATION_OBJECT_H
-
-#include <dpl/db/sql_connection.h>
-
-namespace VcoreDPL {
-namespace DB {
-/**
- * Naive synchronization object used to synchronize SQL connection
- * to the same database across different threads and processes
- */
-class NaiveSynchronizationObject :
- public SqlConnection::SynchronizationObject
-{
- public:
- // [SqlConnection::SynchronizationObject]
- virtual void Synchronize();
- virtual void NotifyAll();
-};
-} // namespace DB
-} // namespace VcoreDPL
-
-#endif // DPL_NAIVE_SYNCHRONIZATION_OBJECT_H
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file orm.h
- * @author Bartosz Janiak (b.janiak@samsung.com)
- * @version 1.0
- * @brief DPL-ORM: Object-relational mapping for sqlite database, written on top of DPL.
- */
-
-#include <cstdlib>
-#include <cstdio>
-#include <string>
-#include <typeinfo>
-#include <utility>
-#include <set>
-#include <list>
-#include <memory>
-#include <boost/optional.hpp>
-
-#include <dpl/db/sql_connection.h>
-#include <dpl/db/orm_interface.h>
-#include <dpl/string.h>
-#include <dpl/type_list.h>
-#include <dpl/assert.h>
-#include <dpl/foreach.h>
-
-#ifndef DPL_ORM_H
-#define DPL_ORM_H
-
-namespace VcoreDPL {
-namespace DB {
-namespace ORM {
-
-//TODO move to type utils
-#define DPL_CHECK_TYPE_INSTANTIABILITY(type) \
- { \
- type _ignored_; \
- (void)_ignored_; \
- }
-
-#define DECLARE_COLUMN_TYPE_LIST() typedef VcoreDPL::TypeListDecl<
-#define SELECTED_COLUMN(table_name, column_name) table_name::column_name,
-#define DECLARE_COLUMN_TYPE_LIST_END(name) VcoreDPL::TypeListGuard>::Type name;
-
-typedef size_t ColumnIndex;
-typedef size_t ArgumentIndex;
-typedef boost::optional<VcoreDPL::String> OptionalString;
-typedef boost::optional<int> OptionalInteger;
-typedef VcoreDPL::DB::SqlConnection::DataCommand DataCommand;
-
-namespace RelationTypes {
- extern const char Equal[];
- extern const char LessThan[];
- extern const char And[];
- extern const char Or[];
- extern const char Is[];
- extern const char In[];
- //TODO define more relation types
-}
-
-namespace DataCommandUtils {
- //TODO move to VcoreDPL::DataCommand?
- void BindArgument(DataCommand *command, ArgumentIndex index, int argument);
- void BindArgument(DataCommand *command, ArgumentIndex index, const OptionalInteger& argument);
- void BindArgument(DataCommand *command, ArgumentIndex index, const VcoreDPL::String& argument);
- void BindArgument(DataCommand *command, ArgumentIndex index, const OptionalString& argument);
-}
-class __attribute__ ((visibility("hidden"))) Expression {
-public:
- virtual ~Expression() {}
- virtual std::string GetString() const = 0;
- virtual ArgumentIndex BindTo(DataCommand *command, ArgumentIndex index) = 0;
-};
-
-typedef std::shared_ptr<Expression> ExpressionPtr;
-
-namespace OrderingUtils {
-
-template<typename CompoundType> inline std::string OrderByInternal()
-{
- std::string order = OrderByInternal<typename CompoundType::Tail>();
- if(!order.empty()) return CompoundType::Head::GetString() + ", " + order;
- else return CompoundType::Head::GetString();
-}
-
-template<> inline std::string OrderByInternal<TypeListGuard>()
-{
- return std::string();
-}
-
-}
-
-template<typename ColumnType>
-class __attribute__ ((visibility("hidden"))) OrderingExpression {
-protected:
- static std::string GetSchemaAndName()
- {
- std::string statement;
- statement += ColumnType::GetTableName();
- statement += ".";
- statement += ColumnType::GetColumnName();
- statement += " ";
- return statement;
- }
-public:
- virtual ~OrderingExpression() {}
-};
-
-template<const char* Operator, typename LeftExpression, typename RightExpression>
-class __attribute__ ((visibility("hidden"))) BinaryExpression : public Expression {
-protected:
- LeftExpression m_leftExpression;
- RightExpression m_rightExpression;
- bool m_outerParenthesis;
-public:
- BinaryExpression(const LeftExpression& leftExpression, const RightExpression& rightExpression, bool outerParenthesis = true) :
- m_leftExpression(leftExpression),
- m_rightExpression(rightExpression),
- m_outerParenthesis(outerParenthesis)
- {}
-
- virtual std::string GetString() const
- {
- return (m_outerParenthesis ? "( " : " " ) +
- m_leftExpression.GetString() + " " + Operator + " " + m_rightExpression.GetString() +
- (m_outerParenthesis ? " )" : " " ) ;
- }
-
- virtual ArgumentIndex BindTo(DataCommand *command, ArgumentIndex index)
- {
- index = m_leftExpression.BindTo(command, index);
- return m_rightExpression.BindTo(command, index);
- }
-
- template<typename TableDefinition>
- struct ValidForTable {
- typedef std::pair<typename LeftExpression ::template ValidForTable<TableDefinition>::Yes ,
- typename RightExpression::template ValidForTable<TableDefinition>::Yes >
- Yes;
- };
-};
-
-template<typename LeftExpression, typename RightExpression>
-BinaryExpression<RelationTypes::And, LeftExpression, RightExpression>
- And(const LeftExpression& leftExpression, const RightExpression& rightExpression)
-{
- return BinaryExpression<RelationTypes::And, LeftExpression, RightExpression>
- (leftExpression, rightExpression);
-}
-
-template<typename LeftExpression, typename RightExpression>
-BinaryExpression<RelationTypes::Or, LeftExpression, RightExpression>
- Or(const LeftExpression& leftExpression, const RightExpression& rightExpression)
-{
- return BinaryExpression<RelationTypes::Or, LeftExpression, RightExpression>
- (leftExpression, rightExpression);
-}
-
-template<typename ArgumentType>
-class __attribute__ ((visibility("hidden"))) ExpressionWithArgument : public Expression {
-protected:
- ArgumentType argument;
-
-public:
- explicit ExpressionWithArgument(const ArgumentType& _argument) : argument(_argument) {}
-
- virtual ArgumentIndex BindTo(DataCommand *command, ArgumentIndex index)
- {
- DataCommandUtils::BindArgument(command, index, argument);
- return index + 1;
- }
-};
-
-template<typename ColumnData, const char* Relation>
-class __attribute__ ((visibility("hidden"))) Compare : public ExpressionWithArgument<typename ColumnData::ColumnType> {
-public:
- explicit Compare(typename ColumnData::ColumnType column) :
- ExpressionWithArgument<typename ColumnData::ColumnType>(column)
- {}
-
- virtual std::string GetString() const
- {
- std::string statement;
- statement += ColumnData::GetTableName();
- statement += ".";
- statement += ColumnData::GetColumnName();
- statement += " ";
- statement += Relation;
- statement += " ?";
- return statement;
- }
-
- template<typename TableDefinition>
- struct ValidForTable {
- typedef typename TableDefinition::ColumnList::template Contains<ColumnData> Yes;
- };
-};
-#define ORM_DEFINE_COMPARE_EXPRESSION(name, relationType) \
- template<typename ColumnData> \
- class __attribute__ ((visibility("hidden"))) name : public Compare<ColumnData, RelationTypes::relationType> { \
- public: \
- name(typename ColumnData::ColumnType column) : \
- Compare<ColumnData, RelationTypes::relationType>(column) \
- {} \
- };
-
-ORM_DEFINE_COMPARE_EXPRESSION(Equals, Equal)
-ORM_DEFINE_COMPARE_EXPRESSION(Is, Is)
-
-#define ORM_DEFINE_ORDERING_EXPRESSION(name, value) \
- template<typename ColumnType> \
- class __attribute__ ((visibility("hidden"))) name \
- : OrderingExpression<ColumnType> { \
- public: \
- static std::string GetString() \
- { \
- std::string statement = OrderingExpression<ColumnType>::GetSchemaAndName(); \
- statement += value; \
- return statement; \
- } \
- };
-
-ORM_DEFINE_ORDERING_EXPRESSION(OrderingAscending, "ASC")
-ORM_DEFINE_ORDERING_EXPRESSION(OrderingDescending, "DESC")
-
-template<typename ColumnData1, typename ColumnData2>
-class __attribute__ ((visibility("hidden"))) CompareBinaryColumn {
-private:
- std::string m_relation;
-public:
- CompareBinaryColumn(const char* Relation) :
- m_relation(Relation)
- {}
-
- virtual ~CompareBinaryColumn() {}
-
- virtual std::string GetString() const
- {
- std::string statement;
- statement += ColumnData1::GetTableName();
- statement += ".";
- statement += ColumnData1::GetColumnName();
- statement += " ";
- statement += m_relation;
- statement += " ";
- statement += ColumnData2::GetTableName();
- statement += ".";
- statement += ColumnData2::GetColumnName();
-
- return statement;
- }
-};
-
-template<typename ColumnData1, typename ColumnData2>
-CompareBinaryColumn<ColumnData1, ColumnData2>
- Equal()
-{
- return CompareBinaryColumn<ColumnData1, ColumnData2>(RelationTypes::Equal);
-}
-
-template<typename ColumnData, const char* Relation>
-class __attribute__ ((visibility("hidden"))) NumerousArguments : public Expression {
-protected:
- std::set<typename ColumnData::ColumnType> m_argumentList;
-public:
- NumerousArguments(const std::set<typename ColumnData::ColumnType>& argumentList) : m_argumentList(argumentList) {}
-
- virtual std::string GetString() const
- {
- std::string statement;
- statement += ColumnData::GetColumnName();
- statement += " ";
- statement += Relation;
- statement += " ( ";
-
- int argumentCount = m_argumentList.size();
- while(argumentCount)
- {
- statement += "?";
- argumentCount--;
- if (argumentCount)
- {
- statement += ", ";
- }
- }
-
- statement += " )";
-
- return statement;
- }
-
- virtual ArgumentIndex BindTo(DataCommand *command, ArgumentIndex index)
- {
- ArgumentIndex argumentIndex = index;
- FOREACH(argumentIt, m_argumentList)
- {
- DataCommandUtils::BindArgument(command, argumentIndex, *argumentIt);
- argumentIndex++;
- }
- return argumentIndex + 1;
- }
-
- template<typename TableDefinition>
- struct ValidForTable {
- typedef typename TableDefinition::ColumnList::template Contains<ColumnData> Yes;
- };
-};
-
-#define ORM_DEFINE_COMPARE_EXPRESSION_NUMEROUS_ARGUMENTS(name, relationType) \
- template<typename ColumnData> \
- class __attribute__ ((visibility("hidden"))) name : public NumerousArguments<ColumnData, RelationTypes::relationType> { \
- public: \
- name(std::set<typename ColumnData::ColumnType> column) : \
- NumerousArguments<ColumnData, RelationTypes::relationType>(column) \
- {} \
- };
-
-ORM_DEFINE_COMPARE_EXPRESSION_NUMEROUS_ARGUMENTS(In, In)
-
-template<typename ColumnType>
-ColumnType GetColumnFromCommand(ColumnIndex columnIndex, DataCommand *command);
-
-class __attribute__ ((visibility("hidden"))) CustomColumnBase {
-public:
- CustomColumnBase() {}
- virtual ~CustomColumnBase() {}
-};
-
-template<typename ColumnType>
-class __attribute__ ((visibility("hidden"))) CustomColumn : public CustomColumnBase {
-private:
- ColumnType m_columnData;
-
-public:
- CustomColumn() {}
- CustomColumn(ColumnType data)
- {
- m_columnData = data;
- }
-
- void SetColumnData(ColumnType data)
- {
- m_columnData = data;
- }
-
- ColumnType GetColumnData() const
- {
- return m_columnData;
- }
-};
-
-template<typename ColumnList>
-class __attribute__ ((visibility("hidden"))) CustomRowUtil {
-public:
- static void MakeColumnList(std::vector<CustomColumnBase*>& columnList)
- {
- typedef CustomColumn<typename ColumnList::Head::ColumnType> Type;
- Type* pColumn = new Type();
- columnList.push_back(pColumn);
- CustomRowUtil<typename ColumnList::Tail>::MakeColumnList(columnList);
- }
-
- static void CopyColumnList(const std::vector<CustomColumnBase*>& srcList, std::vector<CustomColumnBase*>& dstList)
- {
- CopyColumnList(srcList, dstList, 0);
- }
-
- static ColumnIndex GetColumnIndex(const std::string& columnName)
- {
- return GetColumnIndex(columnName, 0);
- }
-
-private:
- static void CopyColumnList(const std::vector<CustomColumnBase*>& srcList, std::vector<CustomColumnBase*>& dstList, ColumnIndex index)
- {
- typedef CustomColumn<typename ColumnList::Head::ColumnType> Type;
- Type* pColumn = new Type(((Type*)(srcList.at(index)))->GetColumnData());
- dstList.push_back(pColumn);
- CustomRowUtil<typename ColumnList::Tail>::CopyColumnList(srcList, dstList, index + 1);
- }
-
- static ColumnIndex GetColumnIndex(const std::string& columnName, ColumnIndex index)
- {
- if (ColumnList::Head::GetColumnName() == columnName)
- return index;
-
- return CustomRowUtil<typename ColumnList::Tail>::GetColumnIndex(columnName, index + 1);
- }
-
-template<typename Other>
-friend class CustomRowUtil;
-};
-
-template<>
-class __attribute__ ((visibility("hidden"))) CustomRowUtil<VcoreDPL::TypeListGuard> {
-public:
- static void MakeColumnList(std::vector<CustomColumnBase*>&) {}
-private:
- static void CopyColumnList(const std::vector<CustomColumnBase*>&, std::vector<CustomColumnBase*>&, ColumnIndex) {}
- static ColumnIndex GetColumnIndex(const std::string&, ColumnIndex) { return -1; }
-
-template<typename Other>
-friend class CustomRowUtil;
-};
-
-template<typename ColumnList>
-class __attribute__ ((visibility("hidden"))) CustomRow {
-private:
- std::vector<CustomColumnBase*> m_columns;
-
-public:
- CustomRow()
- {
- CustomRowUtil<ColumnList>::MakeColumnList(m_columns);
- }
-
- CustomRow(const CustomRow& r)
- {
- CustomRowUtil<ColumnList>::CopyColumnList(r.m_columns, m_columns);
- }
-
- virtual ~CustomRow()
- {
- while (!m_columns.empty())
- {
- CustomColumnBase* pCustomColumn = m_columns.back();
- m_columns.pop_back();
- if (pCustomColumn)
- delete pCustomColumn;
- }
- }
-
- template<typename ColumnType>
- void SetColumnData(ColumnIndex columnIndex, ColumnType data)
- {
- typedef CustomColumn<ColumnType> Type;
- Assert(columnIndex < m_columns.size());
- Type* pColumn = dynamic_cast<Type*>(m_columns.at(columnIndex));
- Assert(pColumn);
- pColumn->SetColumnData(data);
- }
-
- template<typename ColumnData>
- typename ColumnData::ColumnType GetColumnData()
- {
- typedef CustomColumn<typename ColumnData::ColumnType> Type;
- ColumnIndex index = CustomRowUtil<ColumnList>::GetColumnIndex(ColumnData::GetColumnName());
- Assert(index < m_columns.size());
- Type* pColumn = dynamic_cast<Type*>(m_columns.at(index));
- Assert(pColumn);
- return pColumn->GetColumnData();
- }
-};
-
-template<typename CustomRow, typename ColumnType>
-void SetColumnData(CustomRow& row, ColumnType columnData, ColumnIndex columnIndex)
-{
- row.SetColumnData<ColumnType>(columnIndex, columnData);
-}
-
-template<typename ColumnList, typename CustomRow>
-class __attribute__ ((visibility("hidden"))) FillCustomRowUtil {
-public:
- static void FillCustomRow(CustomRow& row, DataCommand* command)
- {
- FillCustomRow(row, 0, command);
- }
-
-private:
- static void FillCustomRow(CustomRow& row, ColumnIndex columnIndex, DataCommand* command)
- {
- typename ColumnList::Head::ColumnType columnData;
- columnData = GetColumnFromCommand<typename ColumnList::Head::ColumnType>(columnIndex, command);
- SetColumnData<CustomRow, typename ColumnList::Head::ColumnType>(row, columnData, columnIndex);
- FillCustomRowUtil<typename ColumnList::Tail, CustomRow>::FillCustomRow(row, columnIndex + 1, command);
- }
-
-template<typename Other, typename OtherRow>
-friend class FillCustomRowUtil;
-};
-
-template<typename CustomRow>
-class __attribute__ ((visibility("hidden"))) FillCustomRowUtil<VcoreDPL::TypeListGuard, CustomRow> {
-private:
- static void FillCustomRow(CustomRow&, ColumnIndex, DataCommand *)
- { /* do nothing, we're past the last element of column list */ }
-
-template<typename Other, typename OtherRow>
-friend class FillCustomRowUtil;
-};
-
-template<typename ColumnList, typename Row>
-class __attribute__ ((visibility("hidden"))) FillRowUtil {
-public:
- static void FillRow(Row& row, DataCommand *command)
- {
- FillRow(row, 0, command);
- }
-
-private:
- static void FillRow(Row& row, ColumnIndex columnIndex, DataCommand *command)
- {
- typename ColumnList::Head::ColumnType rowField;
- rowField = GetColumnFromCommand<typename ColumnList::Head::ColumnType>(columnIndex, command);
- ColumnList::Head::SetRowField(row, rowField);
- FillRowUtil<typename ColumnList::Tail, Row>::FillRow(row, columnIndex + 1, command);
- }
-
-template<typename Other, typename OtherRow>
-friend class FillRowUtil;
-};
-
-template<typename Row>
-class __attribute__ ((visibility("hidden"))) FillRowUtil<VcoreDPL::TypeListGuard, Row> {
-private:
- static void FillRow(Row&, ColumnIndex, DataCommand *)
- { /* do nothing, we're past the last element of column list */ }
-
-template<typename Other, typename OtherRow>
-friend class FillRowUtil;
-};
-
-template<typename ColumnList>
-class __attribute__ ((visibility("hidden"))) JoinUtil {
-public:
- static std::string GetColumnNames()
- {
- std::string result;
- result = ColumnList::Head::GetTableName();
- result += ".";
- result += ColumnList::Head::GetColumnName();
- if (ColumnList::Tail::Size > 0)
- result += ", ";
-
- return result += JoinUtil<typename ColumnList::Tail>::GetColumnNames();
- }
-
- static std::string GetJoinTableName(const std::string& tableName)
- {
- std::string joinTableName = ColumnList::Head::GetTableName();
- if (tableName.find(joinTableName) == std::string::npos)
- return joinTableName;
-
- return JoinUtil<typename ColumnList::Tail>::GetJoinTableName(tableName);
- }
-};
-
-template<>
-class __attribute__ ((visibility("hidden"))) JoinUtil<VcoreDPL::TypeListGuard> {
-public:
- static std::string GetColumnNames() { return ""; }
- static std::string GetJoinTableName(std::string) { return ""; }
-};
-
-class Exception {
-public:
- DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base)
- DECLARE_EXCEPTION_TYPE(Base, SelectReuseWithDifferentQuerySignature)
- DECLARE_EXCEPTION_TYPE(Base, RowFieldNotInitialized)
- DECLARE_EXCEPTION_TYPE(Base, EmptyUpdateStatement)
-};
-
-template<typename TableDefinition>
-class __attribute__ ((visibility("hidden"))) Query
-{
-protected:
- explicit Query(IOrmInterface* interface) :
- m_interface(interface),
- m_command(NULL)
- {
- }
-
- virtual ~Query()
- {
- if (m_command == NULL)
- return;
-
- TableDefinition::FreeTableDataCommand(m_command, m_interface);
- }
-
- IOrmInterface* m_interface;
- DataCommand *m_command;
- std::string m_commandString;
- ArgumentIndex m_bindArgumentIndex;
-};
-
-template<typename TableDefinition>
-class __attribute__ ((visibility("hidden"))) QueryWithWhereClause : public Query<TableDefinition>
-{
-protected:
- ExpressionPtr m_whereExpression;
-
- void Prepare()
- {
- if ( !!m_whereExpression )
- {
- this->m_commandString += " WHERE ";
- this->m_commandString += m_whereExpression->GetString();
- }
- }
-
- void Bind()
- {
- if ( !!m_whereExpression )
- {
- this->m_bindArgumentIndex = m_whereExpression->BindTo(
- this->m_command, this->m_bindArgumentIndex);
- }
- }
-
-public:
- explicit QueryWithWhereClause(IOrmInterface* interface) :
- Query<TableDefinition>(interface)
- {
- }
-
- template<typename Expression>
- void Where(const Expression& expression)
- {
- DPL_CHECK_TYPE_INSTANTIABILITY(typename Expression::template ValidForTable<TableDefinition>::Yes);
- if ( !!m_whereExpression && ( typeid(Expression) != typeid(*m_whereExpression) ) )
- {
- std::ostringstream str;
- str << "Current ORM implementation doesn't allow to reuse Select"
- " instance with different query signature (particularly "
- "WHERE on different column).\n";
- str << "Query: ";
- str << this->m_commandString;
- ThrowMsg(Exception::SelectReuseWithDifferentQuerySignature,
- str.str());
- }
- //TODO maybe don't make a copy here but just generate the string part of the query.
- m_whereExpression.reset(new Expression(expression));
- }
-
-};
-
-template<typename TableDefinition>
-class __attribute__ ((visibility("hidden"))) Delete : public QueryWithWhereClause<TableDefinition>
-{
-protected:
- void Prepare()
- {
- if ( !this->m_command)
- {
- this->m_commandString = "DELETE FROM ";
- this->m_commandString += TableDefinition::GetName();
-
- QueryWithWhereClause<TableDefinition>::Prepare();
-
- this->m_command = TableDefinition::AllocTableDataCommand(
- this->m_commandString.c_str(),
- Query<TableDefinition>::m_interface);
- LogDebug("Prepared SQL command " << this->m_commandString);
- }
- }
-
- void Bind()
- {
- this->m_bindArgumentIndex = 1;
- QueryWithWhereClause<TableDefinition>::Bind();
- }
-
-public:
- explicit Delete(IOrmInterface *interface = NULL) :
- QueryWithWhereClause<TableDefinition>(interface)
- {
- }
-
- void Execute()
- {
- Prepare();
- Bind();
- this->m_command->Step();
- this->m_command->Reset();
- }
-};
-
-namespace {
-class BindVisitor {
-private:
- DataCommand *m_command;
-public:
- ArgumentIndex m_bindArgumentIndex;
-
- BindVisitor(DataCommand *command) :
- m_command(command),
- m_bindArgumentIndex(1)
- {}
-
- template<typename ColumnType>
- void Visit(const char*, const ColumnType& value, bool isSet)
- {
- if ( isSet )
- {
- DataCommandUtils::BindArgument(m_command, m_bindArgumentIndex, value);
- m_bindArgumentIndex++;
- }
- }
-};
-} //anonymous namespace
-template<typename TableDefinition>
-class __attribute__ ((visibility("hidden"))) Insert : public Query<TableDefinition>
-{
-public:
- typedef typename TableDefinition::Row Row;
- typedef VcoreDPL::DB::SqlConnection::RowID RowID;
-
-protected:
- boost::optional<std::string> m_orClause;
- Row m_row;
-
- class PrepareVisitor {
- public:
- std::string m_columnNames;
- std::string m_values;
-
- template<typename ColumnType>
- void Visit(const char* name, const ColumnType&, bool isSet)
- {
- if ( isSet )
- {
- if ( !m_columnNames.empty() )
- {
- m_columnNames += ", ";
- m_values += ", ";
- }
- m_columnNames += name;
- m_values += "?";
- }
- }
- };
-
- void Prepare()
- {
- if ( !this->m_command )
- {
- this->m_commandString = "INSERT ";
- if ( !!m_orClause )
- {
- this->m_commandString += " OR " + *m_orClause + " ";
- }
- this->m_commandString += "INTO ";
- this->m_commandString += TableDefinition::GetName();
-
- PrepareVisitor visitor;
- m_row.VisitColumns(visitor);
-
- this->m_commandString += " ( " + visitor.m_columnNames + " ) ";
- this->m_commandString += "VALUES ( " + visitor.m_values + " )";
-
- LogDebug("Prepared SQL command " << this->m_commandString);
- this->m_command = TableDefinition::AllocTableDataCommand(
- this->m_commandString.c_str(),
- Query<TableDefinition>::m_interface);
- }
- }
-
- void Bind()
- {
- BindVisitor visitor(this->m_command);
- m_row.VisitColumns(visitor);
- }
-
-public:
- explicit Insert(
- IOrmInterface* interface = NULL,
- const boost::optional<std::string>& orClause = boost::optional<std::string>()) :
- Query<TableDefinition>(interface),
- m_orClause(orClause)
- {
- }
-
- void Values(const Row& row)
- {
- if ( this->m_command )
- {
- if ( !row.IsSignatureMatching(m_row) )
- {
- ThrowMsg(Exception::SelectReuseWithDifferentQuerySignature,
- "Current ORM implementation doesn't allow to reuse Insert instance "
- "with different query signature.");
- }
- }
- m_row = row;
- }
-
- RowID Execute()
- {
- Prepare();
- Bind();
- this->m_command->Step();
-
- RowID result = TableDefinition::GetLastInsertRowID(
- Query<TableDefinition>::m_interface);
-
- this->m_command->Reset();
- return result;
- }
-};
-
-template<typename TableDefinition>
-class __attribute__ ((visibility("hidden"))) Select : public QueryWithWhereClause<TableDefinition>
-{
-public:
- typedef typename TableDefinition::ColumnList ColumnList;
- typedef typename TableDefinition::Row Row;
-
- typedef std::list<Row> RowList;
-protected:
- boost::optional<std::string> m_orderBy;
- std::string m_JoinClause;
- bool m_distinctResults;
-
- void Prepare(const char* selectColumnName)
- {
- if ( !this->m_command )
- {
- this->m_commandString = "SELECT ";
- if (m_distinctResults)
- this->m_commandString += "DISTINCT ";
- this->m_commandString += selectColumnName;
- this->m_commandString += " FROM ";
- this->m_commandString += TableDefinition::GetName();
-
- this->m_commandString += m_JoinClause;
-
- QueryWithWhereClause<TableDefinition>::Prepare();
-
- if ( !!m_orderBy )
- {
- this->m_commandString += " ORDER BY " + *m_orderBy;
- }
-
- this->m_command = TableDefinition::AllocTableDataCommand(
- this->m_commandString.c_str(),
- Query<TableDefinition>::m_interface);
-
- LogDebug("Prepared SQL command " << this->m_commandString);
- }
- }
-
- void Bind()
- {
- this->m_bindArgumentIndex = 1;
- QueryWithWhereClause<TableDefinition>::Bind();
- }
-
- template<typename ColumnType>
- ColumnType GetColumn(ColumnIndex columnIndex)
- {
- return GetColumnFromCommand<ColumnType>(columnIndex, this->m_command);
- }
-
- Row GetRow()
- {
- Row row;
- FillRowUtil<ColumnList, Row>::FillRow(row, this->m_command);
- return row;
- }
-
- template<typename ColumnList, typename CustomRow>
- CustomRow GetCustomRow()
- {
- CustomRow row;
- FillCustomRowUtil<ColumnList, CustomRow>::FillCustomRow(row, this->m_command);
- return row;
- }
-
-public:
-
- explicit Select(IOrmInterface *interface = NULL) :
- QueryWithWhereClause<TableDefinition>(interface),
- m_distinctResults(false)
- {
- }
-
- void Distinct()
- {
- m_distinctResults = true;
- }
-
- template<typename CompoundType>
- void OrderBy(const CompoundType&)
- {
- m_orderBy = OrderingUtils::OrderByInternal<typename CompoundType::Type>();
- }
-
- void OrderBy(const std::string & orderBy) //backward compatibility
- {
- m_orderBy = orderBy;
- }
-
- void OrderBy(const char * orderBy) //backward compatibility
- {
- m_orderBy = std::string(orderBy);
- }
-
- template<typename ColumnList, typename Expression>
- void Join(const Expression& expression) {
- std::string usedTableNames = TableDefinition::GetName();
- if (!m_JoinClause.empty())
- usedTableNames += m_JoinClause;
-
- this->m_JoinClause += " JOIN ";
- this->m_JoinClause += JoinUtil<ColumnList>::GetJoinTableName(usedTableNames);
- this->m_JoinClause += " ON ";
- this->m_JoinClause += expression.GetString();
- }
-
- template<typename ColumnData>
- typename ColumnData::ColumnType GetSingleValue()
- {
- Prepare(ColumnData::GetColumnName());
- Bind();
- this->m_command->Step();
-
- typename ColumnData::ColumnType result =
- GetColumn<typename ColumnData::ColumnType>(0);
-
- this->m_command->Reset();
- return result;
- }
-
- //TODO return range - pair of custom iterators
- template<typename ColumnData>
- std::list<typename ColumnData::ColumnType> GetValueList()
- {
- Prepare(ColumnData::GetColumnName());
- Bind();
-
- std::list<typename ColumnData::ColumnType> resultList;
-
- while (this->m_command->Step())
- resultList.push_back(GetColumn<typename ColumnData::ColumnType>(0));
-
- this->m_command->Reset();
- return resultList;
- }
-
- Row GetSingleRow()
- {
- Prepare("*");
- Bind();
- this->m_command->Step();
-
- Row result = GetRow();
-
- this->m_command->Reset();
- return result;
- }
-
- //TODO return range - pair of custom iterators
- RowList GetRowList()
- {
- Prepare("*");
- Bind();
-
- RowList resultList;
-
- while (this->m_command->Step())
- resultList.push_back(GetRow());
-
- this->m_command->Reset();
- return resultList;
- }
-
- template<typename ColumnList, typename CustomRow>
- CustomRow GetCustomSingleRow()
- {
- Prepare(JoinUtil<ColumnList>::GetColumnNames().c_str());
- Bind();
- this->m_command->Step();
-
- CustomRow result = GetCustomRow<ColumnList, CustomRow>();
-
- this->m_command->Reset();
- return result;
- }
-
- template<typename ColumnList, typename CustomRow>
- std::list<CustomRow> GetCustomRowList()
- {
- Prepare(JoinUtil<ColumnList>::GetColumnNames().c_str());
- Bind();
-
- std::list<CustomRow> resultList;
-
- while (this->m_command->Step())
- resultList.push_back(GetCustomRow<ColumnList, CustomRow>());
-
- this->m_command->Reset();
- return resultList;
- }
-};
-
-template<typename TableDefinition>
-class __attribute__ ((visibility("hidden"))) Update : public QueryWithWhereClause<TableDefinition> {
-public:
- typedef typename TableDefinition::Row Row;
-
-protected:
- boost::optional<std::string> m_orClause;
- Row m_row;
-
- class PrepareVisitor {
- public:
- std::string m_setExpressions;
-
- template<typename ColumnType>
- void Visit(const char* name, const ColumnType&, bool isSet)
- {
- if ( isSet )
- {
- if ( !m_setExpressions.empty() )
- {
- m_setExpressions += ", ";
- }
- m_setExpressions += name;
- m_setExpressions += " = ";
- m_setExpressions += "?";
- }
- }
- };
-
- void Prepare()
- {
- if ( !this->m_command )
- {
- this->m_commandString = "UPDATE ";
- if ( !!m_orClause )
- {
- this->m_commandString += " OR " + *m_orClause + " ";
- }
- this->m_commandString += TableDefinition::GetName();
- this->m_commandString += " SET ";
-
- // got through row columns and values
- PrepareVisitor visitor;
- m_row.VisitColumns(visitor);
-
- if(visitor.m_setExpressions.empty())
- {
- ThrowMsg(Exception::EmptyUpdateStatement, "No SET expressions in update statement");
- }
-
- this->m_commandString += visitor.m_setExpressions;
-
- // where
- QueryWithWhereClause<TableDefinition>::Prepare();
-
- this->m_command = TableDefinition::AllocTableDataCommand(
- this->m_commandString.c_str(),
- Query<TableDefinition>::m_interface);
- LogDebug("Prepared SQL command " << this->m_commandString);
- }
- }
-
- void Bind()
- {
- BindVisitor visitor(this->m_command);
- m_row.VisitColumns(visitor);
-
- this->m_bindArgumentIndex = visitor.m_bindArgumentIndex;
- QueryWithWhereClause<TableDefinition>::Bind();
- }
-
-
-public:
- explicit Update(IOrmInterface *interface = NULL,
- const boost::optional<std::string>& orClause = boost::optional<std::string>()) :
- QueryWithWhereClause<TableDefinition>(interface),
- m_orClause(orClause)
- {
- }
-
- void Values(const Row& row)
- {
- if ( this->m_command )
- {
- if ( !row.IsSignatureMatching(m_row) )
- {
- ThrowMsg(Exception::SelectReuseWithDifferentQuerySignature,
- "Current ORM implementation doesn't allow to reuse Update instance "
- "with different query signature.");
- }
- }
- m_row = row;
- }
-
- void Execute()
- {
- Prepare();
- Bind();
- this->m_command->Step();
- this->m_command->Reset();
- }
-};
-
-} //namespace ORM
-} //namespace DB
-} //namespace VcoreDPL
-
-#endif // DPL_ORM_H
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file orm_generator.h
- * @author Bartosz Janiak (b.janiak@samsung.com)
- * @version 1.0
- * @brief Macro definitions for generating the DPL-ORM table definitions from database definitions.
- */
-
-#ifndef ORM_GENERATOR_DATABASE_NAME
-#error You need to define database name in ORM_GENERATOR_DATABASE_NAME define before you include orm_generator.h file
-#endif
-
-#include <dpl/db/orm_interface.h>
-
-#define ORM_GENERATOR_DATABASE_NAME_LOCAL <ORM_GENERATOR_DATABASE_NAME>
-
-#ifdef DPL_ORM_GENERATOR_H
-#warning orm_generator.h is included multiply times. Make sure it has different ORM_GENERATOR_DATABASE_NAME set.
-#endif
-
-#define DPL_ORM_GENERATOR_H
-
-
-#include <boost/optional.hpp>
-#include <dpl/string.h>
-#include <dpl/type_list.h>
-#include <dpl/db/sql_connection.h>
-#include <dpl/db/orm.h>
-#include <dpl/assert.h>
-#include <string>
-
-/*
-
-This is true only when exactly one db is available.
-
-#if (defined DECLARE_COLUMN) || (defined INT) || (defined TINYINT) || \
- (defined INTEGER) || (defined BIGINT) || defined(VARCHAR) || defined(TEXT) || \
- (defined SQL) || (defined TABLE_CONSTRAINTS) || (defined OPTIONAL) || \
- (defined DATABASE_START) || (defined DATABASE_END) || (defined CREATE_TABLE) || \
- (defined COLUMN) || (defined COLUMN_NOT_NULL) || (defined CREATE_TABLE_END)
-
-#error This file temporarily defines many macros with generic names. To avoid name clash please include \
- this file as early as possible. If this is not possible please report this problem to DPL developers.
-
-#endif
-*/
-
-namespace VcoreDPL {
-namespace DB {
-namespace ORM {
-
-// Global macros
-
-#define STRINGIFY(s) _str(s)
-#define _str(s) #s
-#define DECLARE_COLUMN(FIELD, TYPE) \
- struct FIELD { \
- typedef TYPE ColumnType; \
- static const char* GetTableName() { return GetName(); } \
- static const char* GetColumnName() { return STRINGIFY(FIELD); } \
- static void SetRowField(Row& row, const TYPE& _value) { row.Set_##FIELD(_value);} \
- };
-
-#define INT int
-#define TINYINT int
-#define INTEGER int //TODO: should be long long?
-#define BIGINT int //TODO: should be long long?
-#define VARCHAR(x) VcoreDPL::String
-#define TEXT VcoreDPL::String
-
-#define SQL(...)
-#define TABLE_CONSTRAINTS(...)
-#define OPTIONAL(type) boost::optional< type >
-#define DATABASE_START(db_name) \
- namespace db_name \
- { \
- class ScopedTransaction \
- { \
- bool m_commited; \
- IOrmInterface *m_interface; \
- \
- public: \
- ScopedTransaction(IOrmInterface *interface) : \
- m_commited(false), \
- m_interface(interface) \
- { \
- Assert(interface != NULL); \
- m_interface->TransactionBegin(); \
- } \
- \
- ~ScopedTransaction() \
- { \
- if (!m_commited) \
- m_interface->TransactionRollback(); \
- } \
- \
- void Commit() \
- { \
- m_interface->TransactionCommit(); \
- m_commited = true; \
- } \
- };
-
-#define DATABASE_END() }
-
-// RowBase ostream operator<< declaration
-
-#define CREATE_TABLE(name) \
- namespace name { \
- class RowBase; \
- inline std::ostream& operator<<(std::ostream& ostr, const RowBase& row); \
- }
-#define COLUMN_NOT_NULL(name, type, ...)
-#define COLUMN(name, type, ...)
-#define CREATE_TABLE_END()
-
-#include ORM_GENERATOR_DATABASE_NAME_LOCAL
-
-#undef CREATE_TABLE
-#undef COLUMN_NOT_NULL
-#undef COLUMN
-#undef CREATE_TABLE_END
-
-#undef DATABASE_START
-#define DATABASE_START(db_name) namespace db_name {
-
-// RowBase class
-
-#define CREATE_TABLE(name) namespace name { class RowBase { \
- public: friend std::ostream& operator<<(std::ostream&, const RowBase&);
-#define COLUMN_NOT_NULL(name, type, ...) \
- protected: type name; bool m_##name##_set; \
- public: void Set_##name(const type& _value) { \
- m_##name##_set = true; \
- this->name = _value; \
- } \
- public: type Get_##name() const { \
- if ( !m_##name##_set ) { \
- ThrowMsg(Exception::RowFieldNotInitialized, \
- "You tried to read a row field that hasn't been set yet."); \
- } \
- return name; \
- }
-
-#define COLUMN(name, type, ...) \
- protected: OPTIONAL(type) name; bool m_##name##_set; \
- public: void Set_##name(const OPTIONAL(type)& _value) { \
- m_##name##_set = true; \
- this->name = _value; \
- } \
- public: OPTIONAL(type) Get_##name() const { \
- if ( !m_##name##_set ) { \
- ThrowMsg(Exception::RowFieldNotInitialized, \
- "You tried to read a row field that hasn't been set yet."); \
- } \
- return name; \
- }
-#define CREATE_TABLE_END() }; }
-
-#include ORM_GENERATOR_DATABASE_NAME_LOCAL
-
-#undef CREATE_TABLE
-#undef COLUMN_NOT_NULL
-#undef COLUMN
-#undef CREATE_TABLE_END
-
-// RowBase ostream operator<<
-
-#define CREATE_TABLE(name) std::ostream& name::operator<<(std::ostream& ostr, const RowBase& row) { using ::operator<< ; ostr << STRINGIFY(name) << " (";
-#define COLUMN_NOT_NULL(name, type, ...) ostr << " '" << row.name << "'" ;
-#define COLUMN(name, type, ...) ostr << " '" << row.name << "'" ;
-#define CREATE_TABLE_END() ostr << " )" ; return ostr; }
-
-#include ORM_GENERATOR_DATABASE_NAME_LOCAL
-
-#undef CREATE_TABLE
-#undef COLUMN_NOT_NULL
-#undef COLUMN
-#undef CREATE_TABLE_END
-
-// RowBase2 class (== RowBase + operator==)
-
-#define CREATE_TABLE(name) namespace name { class RowBase2 : public RowBase { \
- public: bool operator==(const RowBase2& row) const { return true
-#define COLUMN_NOT_NULL(name, type, ...) && (this->name == row.name)
-#define COLUMN(name, type, ...) && (this->name == row.name)
-#define CREATE_TABLE_END() ; } }; }
-
-#include ORM_GENERATOR_DATABASE_NAME_LOCAL
-
-#undef CREATE_TABLE
-#undef COLUMN_NOT_NULL
-#undef COLUMN
-#undef CREATE_TABLE_END
-
-// RowBase3 class (== RowBase2 + operator<)
-
-#define CREATE_TABLE(name) namespace name { class RowBase3 : public RowBase2 { \
- public: bool operator<(const RowBase3& row) const {
-#define COLUMN_NOT_NULL(name, type, ...) if (this->name < row.name) { return true; } if (this->name > row.name) { return false; }
-#define COLUMN(name, type, ...) if (this->name < row.name) { return true; } if (this->name > row.name) { return false; }
-#define CREATE_TABLE_END() return false; } }; }
-
-#include ORM_GENERATOR_DATABASE_NAME_LOCAL
-
-#undef CREATE_TABLE
-#undef COLUMN_NOT_NULL
-#undef COLUMN
-#undef CREATE_TABLE_END
-
-// RowBase4 class (== RowBase3 + IsSignatureMatching )
-
-#define CREATE_TABLE(name) namespace name { class RowBase4 : public RowBase3 { \
- public: bool IsSignatureMatching(const RowBase4& row) const { return true
-#define COLUMN_NOT_NULL(name, type, ...) && (this->m_##name##_set == row.m_##name##_set)
-#define COLUMN(name, type, ...) && (this->m_##name##_set == row.m_##name##_set)
-#define CREATE_TABLE_END() ; } }; }
-
-#include ORM_GENERATOR_DATABASE_NAME_LOCAL
-
-#undef CREATE_TABLE
-#undef COLUMN_NOT_NULL
-#undef COLUMN
-#undef CREATE_TABLE_END
-
-// RowBase5 class (== RowBase4 + default constructor)
-
-#define CREATE_TABLE(name) namespace name { class RowBase5 : public RowBase4 { \
- public: RowBase5() {
-#define COLUMN_NOT_NULL(name, type, ...) m_##name##_set = false;
-#define COLUMN(name, type, ...) m_##name##_set = false;
-#define CREATE_TABLE_END() } }; }
-
-#include ORM_GENERATOR_DATABASE_NAME_LOCAL
-
-#undef CREATE_TABLE
-#undef COLUMN_NOT_NULL
-#undef COLUMN
-#undef CREATE_TABLE_END
-
-// Row class (== RowBase5 + ForEachColumn )
-
-#define CREATE_TABLE(name) namespace name { class Row : public RowBase5 { \
- public: template<typename Visitor> \
- void VisitColumns(Visitor& visitor) const {
-#define COLUMN_NOT_NULL(name, type, ...) visitor.Visit(STRINGIFY(name), this->name, this->m_##name##_set);
-#define COLUMN(name, type, ...) visitor.Visit(STRINGIFY(name), this->name, this->m_##name##_set);
-#define CREATE_TABLE_END() } }; }
-
-#include ORM_GENERATOR_DATABASE_NAME_LOCAL
-
-#undef CREATE_TABLE
-#undef COLUMN_NOT_NULL
-#undef COLUMN
-#undef CREATE_TABLE_END
-
-// Field structure declarations
-
-#define CREATE_TABLE(name) namespace name { \
- static const char* GetName() { return STRINGIFY(name); }
-#define COLUMN_NOT_NULL(name, type, ...) DECLARE_COLUMN(name, type)
-#define COLUMN(name, type, ...) DECLARE_COLUMN(name, OPTIONAL(type))
-#define CREATE_TABLE_END() }
-
-#include ORM_GENERATOR_DATABASE_NAME_LOCAL
-
-#undef CREATE_TABLE
-#undef COLUMN_NOT_NULL
-#undef COLUMN
-#undef CREATE_TABLE_END
-
-// ColumnList typedef
-
-#define CREATE_TABLE(name) namespace name { typedef VcoreDPL::TypeListDecl<
-#define COLUMN_NOT_NULL(name, type, ...) name,
-#define COLUMN(name, type, ...) name,
-#define CREATE_TABLE_END() VcoreDPL::TypeListGuard>::Type ColumnList; }
-
-#include ORM_GENERATOR_DATABASE_NAME_LOCAL
-
-#undef CREATE_TABLE
-#undef COLUMN_NOT_NULL
-#undef COLUMN
-#undef CREATE_TABLE_END
-
-// TableDefinition struct
-
-#define CREATE_TABLE(table_name) \
- namespace table_name { \
- struct TableDefinition { \
- typedef table_name::ColumnList ColumnList; \
- typedef table_name::Row Row; \
- static const char* GetName() { return STRINGIFY(table_name); } \
- static VcoreDPL::DB::SqlConnection::DataCommand *AllocTableDataCommand( \
- const std::string &statement, \
- IOrmInterface *interface) \
- { \
- Assert(interface != NULL); \
- return interface->AllocDataCommand(statement); \
- } \
- static void FreeTableDataCommand( \
- VcoreDPL::DB::SqlConnection::DataCommand *command, \
- IOrmInterface *interface) \
- { \
- Assert(interface != NULL); \
- interface->FreeDataCommand(command); \
- } \
- static VcoreDPL::DB::SqlConnection::RowID GetLastInsertRowID( \
- IOrmInterface *interface) \
- { \
- Assert(interface != NULL); \
- return interface->GetLastInsertRowID(); \
- } \
- }; \
- }
-
-#define COLUMN_NOT_NULL(name, type, ...)
-#define COLUMN(name, type, ...)
-#define CREATE_TABLE_END()
-
-#include ORM_GENERATOR_DATABASE_NAME_LOCAL
-
-#undef CREATE_TABLE
-#undef COLUMN_NOT_NULL
-#undef COLUMN
-#undef CREATE_TABLE_END
-
-// Query typedefs
-
-#define CREATE_TABLE(name) \
- namespace name { \
- typedef Select<TableDefinition> Select; \
- typedef Insert<TableDefinition> Insert; \
- typedef Delete<TableDefinition> Delete; \
- typedef Update<TableDefinition> Update; \
- }
-#define COLUMN_NOT_NULL(name, type, ...)
-#define COLUMN(name, type, ...)
-#define CREATE_TABLE_END()
-
-#include ORM_GENERATOR_DATABASE_NAME_LOCAL
-
-#undef CREATE_TABLE
-#undef COLUMN_NOT_NULL
-#undef COLUMN
-#undef CREATE_TABLE_END
-
-
-// Global undefs
-#undef INT
-#undef TINYINT
-#undef INTEGER
-#undef BIGINT
-#undef VARCHAR
-#undef TEXT
-
-#undef SQL
-#undef TABLE_CONSTRAINTS
-#undef OPTIONAL
-#undef DATABASE_START
-#undef DATABASE_END
-
-} //namespace ORM
-} //namespace DB
-} //namespace VcoreDPL
-
-#undef ORM_GENERATOR_DATABASE_NAME
-#undef ORM_GENERATOR_DATABASE_NAME_LOCAL
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file orm_interface.h
- * @author Lukasz Marek (l.marek@samsung.com)
- * @version 1.0
- */
-
-#include <string>
-#include <dpl/db/sql_connection.h>
-
-#ifndef DPL_ORM_INTERFACE_H
-#define DPL_ORM_INTERFACE_H
-
-namespace VcoreDPL {
-namespace DB {
-namespace ORM {
-class IOrmInterface
-{
- public:
- virtual ~IOrmInterface() {}
- virtual VcoreDPL::DB::SqlConnection::DataCommand *AllocDataCommand(
- const std::string &statement) = 0;
- virtual void FreeDataCommand(VcoreDPL::DB::SqlConnection::DataCommand *command)
- = 0;
- virtual void TransactionBegin() = 0;
- virtual void TransactionCommit() = 0;
- virtual void TransactionRollback() = 0;
- virtual VcoreDPL::DB::SqlConnection::RowID GetLastInsertRowID() = 0;
-};
-}
-}
-}
-
-#endif
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file orm_macros.h
- * @author Bartosz Janiak (b.janiak@samsung.com)
- * @version 1.0
- * @brief Macro definitions for generating the SQL input file from
- * database definition.
- */
-
-//Do not include this file directly! It is used only for SQL code generation.
-
-#define CREATE_TABLE(name) CREATE TABLE name(
-#define COLUMN(name, type, ...) name type __VA_ARGS__,
-#define COLUMN_NOT_NULL(name, type, ...) name type __VA_ARGS__ not null,
-#define SQL(...) __VA_ARGS__
-#define TABLE_CONSTRAINTS(...) __VA_ARGS__,
-#define CREATE_TABLE_END() CHECK(1) );
-#define DATABASE_START(db_name)
-#define DATABASE_END()
-
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file sql_connection.h
- * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
- * @version 1.0
- * @brief This file is the implementation file of SQL connection
- */
-#ifndef DPL_SQL_CONNECTION_H
-#define DPL_SQL_CONNECTION_H
-
-#include <dpl/noncopyable.h>
-#include <dpl/exception.h>
-#include <dpl/availability.h>
-#include <memory>
-#include <boost/optional.hpp>
-#include <dpl/string.h>
-#include <dpl/log/vcore_log.h>
-#include <sqlite3.h>
-#include <string>
-#include <dpl/assert.h>
-#include <memory>
-#include <stdint.h>
-
-namespace VcoreDPL {
-namespace DB {
-/**
- * SQL connection class
- */
-class SqlConnection
-{
- public:
- /**
- * SQL Exception classes
- */
- class Exception
- {
- public:
- DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base)
- DECLARE_EXCEPTION_TYPE(Base, SyntaxError)
- DECLARE_EXCEPTION_TYPE(Base, ConnectionBroken)
- DECLARE_EXCEPTION_TYPE(Base, InternalError)
- DECLARE_EXCEPTION_TYPE(Base, InvalidColumn)
- };
-
- typedef int ColumnIndex;
- typedef int ArgumentIndex;
-
- /*
- * SQL processed data command
- */
- class DataCommand :
- private Noncopyable
- {
- private:
- SqlConnection *m_masterConnection;
- sqlite3_stmt *m_stmt;
-
- void CheckBindResult(int result);
- void CheckColumnIndex(SqlConnection::ColumnIndex column);
-
- DataCommand(SqlConnection *connection, const char *buffer);
-
- friend class SqlConnection;
-
- public:
- virtual ~DataCommand();
-
- /**
- * Bind null to the prepared statement argument
- *
- * @param position Index of argument to bind value to
- */
- void BindNull(ArgumentIndex position);
-
- /**
- * Bind int to the prepared statement argument
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindInteger(ArgumentIndex position, int value);
-
- /**
- * Bind int8_t to the prepared statement argument
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindInt8(ArgumentIndex position, int8_t value);
-
- /**
- * Bind int16 to the prepared statement argument
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindInt16(ArgumentIndex position, int16_t value);
-
- /**
- * Bind int32 to the prepared statement argument
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindInt32(ArgumentIndex position, int32_t value);
-
- /**
- * Bind int64 to the prepared statement argument
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindInt64(ArgumentIndex position, int64_t value);
-
- /**
- * Bind float to the prepared statement argument
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindFloat(ArgumentIndex position, float value);
-
- /**
- * Bind double to the prepared statement argument
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindDouble(ArgumentIndex position, double value);
-
- /**
- * Bind string to the prepared statement argument
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindString(ArgumentIndex position, const char *value);
-
- /**
- * Bind string to the prepared statement argument
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindString(ArgumentIndex position, const String& value);
-
- /**
- * Bind optional int to the prepared statement argument.
- * If optional is not set null will be bound
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindInteger(ArgumentIndex position, const boost::optional<int> &value);
-
- /**
- * Bind optional int8 to the prepared statement argument.
- * If optional is not set null will be bound
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindInt8(ArgumentIndex position, const boost::optional<int8_t> &value);
-
- /**
- * Bind optional int16 to the prepared statement argument.
- * If optional is not set null will be bound
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindInt16(ArgumentIndex position, const boost::optional<int16_t> &value);
-
- /**
- * Bind optional int32 to the prepared statement argument.
- * If optional is not set null will be bound
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindInt32(ArgumentIndex position, const boost::optional<int32_t> &value);
-
- /**
- * Bind optional int64 to the prepared statement argument.
- * If optional is not set null will be bound
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindInt64(ArgumentIndex position, const boost::optional<int64_t> &value);
-
- /**
- * Bind optional float to the prepared statement argument.
- * If optional is not set null will be bound
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindFloat(ArgumentIndex position, const boost::optional<float> &value);
-
- /**
- * Bind optional double to the prepared statement argument.
- * If optional is not set null will be bound
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindDouble(ArgumentIndex position, const boost::optional<double> &value);
-
- /**
- * Bind optional string to the prepared statement argument.
- * If optional is not set null will be bound
- *
- * @param position Index of argument to bind value to
- * @param value Value to bind
- */
- void BindString(ArgumentIndex position, const boost::optional<String> &value);
-
- /**
- * Execute the prepared statement and/or move
- * to the next row of the result
- *
- * @return True when there was a row returned
- */
- bool Step();
-
- /**
- * Reset prepared statement's arguments
- * All parameters will become null
- */
- void Reset();
-
- /**
- * Checks whether column value is null
- *
- * @throw Exception::InvalidColumn
- */
- bool IsColumnNull(ColumnIndex column);
-
- /**
- * Get integer value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- int GetColumnInteger(ColumnIndex column);
-
- /**
- * Get int8 value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- int8_t GetColumnInt8(ColumnIndex column);
-
- /**
- * Get int16 value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- int16_t GetColumnInt16(ColumnIndex column);
- /**
- * Get int32 value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- int32_t GetColumnInt32(ColumnIndex column);
-
- /**
- * Get int64 value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- int64_t GetColumnInt64(ColumnIndex column);
-
- /**
- * Get float value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- float GetColumnFloat(ColumnIndex column);
-
- /**
- * Get double value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- double GetColumnDouble(ColumnIndex column);
-
- /**
- * Get string value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- std::string GetColumnString(ColumnIndex column);
-
- /**
- * Get optional integer value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- boost::optional<int> GetColumnOptionalInteger(ColumnIndex column);
-
- /**
- * Get optional int8 value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- boost::optional<int8_t> GetColumnOptionalInt8(ColumnIndex column);
-
- /**
- * Get optional int16value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- boost::optional<int16_t> GetColumnOptionalInt16(ColumnIndex column);
-
- /**
- * Get optional int32 value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- boost::optional<int32_t> GetColumnOptionalInt32(ColumnIndex column);
-
- /**
- * Get optional int64 value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- boost::optional<int64_t> GetColumnOptionalInt64(ColumnIndex column);
-
- /**
- * Get optional float value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- boost::optional<float> GetColumnOptionalFloat(ColumnIndex column);
-
- /**
- * Get optional double value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- boost::optional<double> GetColumnOptionalDouble(ColumnIndex column);
-
- /**
- * Get optional string value from column in current row.
- *
- * @throw Exception::InvalidColumn
- */
- boost::optional<String> GetColumnOptionalString(ColumnIndex column);
- };
-
- // Move on copy semantics
- typedef std::auto_ptr<DataCommand> DataCommandAutoPtr;
-
- // Open flags
- class Flag
- {
- public:
- enum Type
- {
- None = 1 << 0,
- UseLucene = 1 << 1
- };
-
- enum Option
- {
- RO = SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_READONLY,
- /**
- * *TODO: please remove CREATE option from RW flag when all places
- * that need that switched do CRW
- */
- RW = SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_READWRITE |
- SQLITE_OPEN_CREATE,
- CRW = RW | SQLITE_OPEN_CREATE
- };
- };
-
- // RowID
- typedef sqlite3_int64 RowID;
-
- /**
- * Synchronization object used to synchronize SQL connection
- * to the same database across different threads and processes
- */
- class SynchronizationObject
- {
- public:
- virtual ~SynchronizationObject() {}
-
- /**
- * Synchronizes SQL connection for multiple clients.
- */
- virtual void Synchronize() = 0;
-
- /**
- * Notify all waiting clients that the connection is no longer locked.
- */
- virtual void NotifyAll() = 0;
- };
-
- protected:
- sqlite3 *m_connection;
-
- // Options
- bool m_usingLucene;
-
- // Stored data procedures
- int m_dataCommandsCount;
-
- // Synchronization object
- std::unique_ptr<SynchronizationObject> m_synchronizationObject;
-
- virtual void Connect(const std::string &address,
- Flag::Type = Flag::None, Flag::Option = Flag::RO);
- virtual void Disconnect();
-
- void TurnOnForeignKeys();
-
- static SynchronizationObject *AllocDefaultSynchronizationObject();
-
- public:
- /**
- * Open SQL connection
- *
- * Synchronization is archieved by using provided asynchronization object.
- * If synchronizationObject is set to NULL, so synchronization is performed.
- * Ownership of the synchronization object is transfered to sql connection
- * object.
- *
- * @param address Database file name
- * @param flags Open flags
- * @param synchronizationObject A synchronization object to use.
- */
- explicit SqlConnection(const std::string &address = std::string(),
- Flag::Type flags = Flag::None,
- Flag::Option options = Flag::RO,
- SynchronizationObject *synchronizationObject =
- AllocDefaultSynchronizationObject());
-
- /**
- * Destructor
- */
- virtual ~SqlConnection();
-
- /**
- * Execute SQL command without result
- *
- * @param format
- * @param ...
- */
- void ExecCommand(const char *format, ...) DPL_DEPRECATED_WITH_MESSAGE(
- "To prevent sql injection do not use this \
- method for direct sql execution");
-
- /**
- * Execute BEGIN; command to start new transaction
- *
- */
- void BeginTransaction();
-
- /**
- * Execute ROLLBACK; command to discard changes made
- *
- */
- void RollbackTransaction();
-
- /**
- * Execute COMMIT; command to commit changes in database
- *
- */
- void CommitTransaction();
-
- /**
- * Prepare stored procedure
- *
- * @param format SQL statement
- * @return Data command representing stored procedure
- */
- DataCommandAutoPtr PrepareDataCommand(const char *format, ...);
-
- /**
- * Check whether given table exists
- *
- * @param tableName Name of the table to check
- * @return True if given table name exists
- */
- bool CheckTableExist(const char *tableName);
-
- /**
- * Get last insert operation new row id
- *
- * @return Row ID
- */
- RowID GetLastInsertRowID() const;
-
- private:
- int db_util_open_with_options(const char *pszFilePath, sqlite3 **ppDB,
- int flags, const char *zVfs);
- int db_util_close(sqlite3 *pDB);
-
-};
-} // namespace DB
-} // namespace VcoreDPL
-
-#endif // DPL_SQL_CONNECTION_H
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file thread_database_support.h
- * @author Przemyslaw Dobrowolski (p.dobrowolsk)
- * @version 1.0
- * @brief This file contains the declaration of thread database support
- */
-
-#ifndef DPL_THREAD_DATABASE_SUPPORT_H
-#define DPL_THREAD_DATABASE_SUPPORT_H
-
-#include <string>
-#include <dpl/db/sql_connection.h>
-#include <dpl/db/orm_interface.h>
-#include <dpl/thread.h>
-#include <dpl/assert.h>
-#include <stdint.h>
-
-namespace VcoreDPL {
-namespace DB {
-/**
- * Thread database support
- *
- * Associate database connection with thread lifecycle
- *
- */
-
-class ThreadDatabaseSupport :
- public VcoreDPL::DB::ORM::IOrmInterface
-{
- private:
- typedef VcoreDPL::DB::SqlConnection *SqlConnectionPtr;
- typedef VcoreDPL::ThreadLocalVariable<SqlConnectionPtr> TLVSqlConnectionPtr;
- typedef VcoreDPL::ThreadLocalVariable<size_t> TLVSizeT;
- typedef VcoreDPL::ThreadLocalVariable<bool> TLVBool;
-
- TLVSqlConnectionPtr m_connection;
- TLVBool m_linger;
- TLVSizeT m_refCounter;
- TLVSizeT m_transactionDepth;
- TLVSizeT m_attachCount;
- TLVBool m_transactionCancel;
- std::string m_address;
- VcoreDPL::DB::SqlConnection::Flag::Type m_flags;
-
- TLVSqlConnectionPtr &Connection()
- {
- return m_connection;
- }
-
- TLVBool &Linger()
- {
- return m_linger;
- }
-
- TLVSizeT &RefCounter()
- {
- return m_refCounter;
- }
-
- TLVSizeT &TransactionDepth()
- {
- return m_transactionDepth;
- }
-
- TLVSizeT &AttachCount()
- {
- return m_attachCount;
- }
-
- TLVBool &TransactionCancel()
- {
- return m_transactionCancel;
- }
-
- void CheckedConnectionDelete()
- {
- Assert(!Connection().IsNull());
- Assert(*Linger() == true);
-
- if (*RefCounter() > 0 || *AttachCount() > 0) {
- return;
- }
-
- // Destroy connection
- LogDebug("Destroying thread database connection: " << m_address);
-
- delete *Connection();
-
- // Blocking destroy
- Connection().GuardValue(false);
- Linger().GuardValue(false);
- RefCounter().GuardValue(false);
- TransactionCancel().GuardValue(false);
- TransactionDepth().GuardValue(false);
- AttachCount().GuardValue(false);
-
- Connection().Reset();
- Linger().Reset();
- RefCounter().Reset();
- TransactionCancel().Reset();
- TransactionDepth().Reset();
- AttachCount().Reset();
- }
-
- void TransactionUnref()
- {
- LogDebug("Unref transaction");
-
- if (--(*TransactionDepth()) == 0) {
- LogDebug("Transaction is finalized");
-
- if (*TransactionCancel()) {
- LogDebug("Transaction will be rolled back");
- (*Connection())->RollbackTransaction();
- } else {
- LogDebug("Transaction will be commited");
- (*Connection())->CommitTransaction();
- }
- }
- }
-
- public:
- ThreadDatabaseSupport(const std::string &address,
- VcoreDPL::DB::SqlConnection::Flag::Type flags) :
- m_address(address),
- m_flags(flags)
- {}
-
- virtual ~ThreadDatabaseSupport()
- {}
-
- void AttachToThread(
- VcoreDPL::DB::SqlConnection::Flag::Option options =
- VcoreDPL::DB::SqlConnection::Flag::RO)
- {
- Linger() = false;
-
- if (!Connection().IsNull()) {
- // Add reference
- ++*AttachCount();
- return;
- }
-
- // Initialize SQL connection described in traits
- LogDebug("Attaching thread database connection: " << m_address);
-
- Connection() = new VcoreDPL::DB::SqlConnection(
- m_address.c_str(), m_flags, options);
-
- RefCounter() = 0;
-
- AttachCount() = 1;
-
- //Init Transaction related variables
- TransactionDepth() = 0;
- TransactionCancel() = false;
-
- // Blocking destroy
- Connection().GuardValue(true);
- Linger().GuardValue(true);
- RefCounter().GuardValue(true);
- TransactionDepth().GuardValue(true);
- AttachCount().GuardValue(true);
- TransactionCancel().GuardValue(true);
- }
-
- void DetachFromThread()
- {
- // Calling thread must support thread database connections
- Assert(!Connection().IsNull());
-
- // Remove reference
- --*AttachCount();
-
- if (*AttachCount() > 0) {
- return;
- }
-
- // It must not be in linger state yet
- Assert(*Linger() == false);
-
- LogDebug("Detaching thread database connection: " << m_address);
-
- // Enter linger state
- *Linger() = true;
-
- // Checked delete
- CheckedConnectionDelete();
- }
-
- bool IsAttached()
- {
- return !AttachCount().IsNull() && *AttachCount() > 0;
- }
-
- VcoreDPL::DB::SqlConnection::DataCommand *AllocDataCommand(
- const std::string &statement)
- {
- // Calling thread must support thread database connections
- Assert(!Connection().IsNull());
-
- // Calling thread must not be in linger state
- Assert(*Linger() == false);
-
- // Add reference
- ++*RefCounter();
-
- // Create new unmanaged data command
- return (*Connection())->PrepareDataCommand(statement.c_str()).release();
- }
-
- void FreeDataCommand(VcoreDPL::DB::SqlConnection::DataCommand *command)
- {
- // Calling thread must support thread database connections
- Assert(!Connection().IsNull());
-
- // Delete data command
- delete command;
-
- // Unreference SQL connection
- --*RefCounter();
-
- // If it is linger state, connection may be destroyed
- if (*Linger() == true) {
- CheckedConnectionDelete();
- }
- }
-
- void TransactionBegin()
- {
- // Calling thread must support thread database connections
- Assert(!Connection().IsNull());
-
- LogDebug("Begin transaction");
-
- // Addref transaction
- if (++(*TransactionDepth()) == 1) {
- LogDebug("Transaction is initialized");
-
- TransactionCancel() = false;
- (*Connection())->BeginTransaction();
- }
- }
-
- void TransactionCommit()
- {
- // Calling thread must support thread database connections
- Assert(!Connection().IsNull());
-
- LogDebug("Commit transaction");
-
- // Unref transation
- TransactionUnref();
- }
-
- void TransactionRollback()
- {
- // Calling thread must support thread database connections
- Assert(!Connection().IsNull());
-
- // Cancel and unref transaction
- TransactionCancel() = true;
- TransactionUnref();
- }
-
- VcoreDPL::DB::SqlConnection::RowID GetLastInsertRowID()
- {
- // Calling thread must support thread database connections
- Assert(!Connection().IsNull());
-
- return (*Connection())->GetLastInsertRowID();
- }
-
- bool CheckTableExist(const char *name)
- {
- // Calling thread must support thread database connections
- Assert(!Connection().IsNull());
-
- return (*Connection())->CheckTableExist(name);
- }
-};
-}
-}
-
-#endif // DPL_THREAD_DATABASE_SUPPORT_H
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file orm.cpp
- * @author Bartosz Janiak (b.janiak@samsung.com)
- * @version 1.0
- * @brief Static definitions and function template specialziations of
- * DPL-ORM.
- */
-#include <stddef.h>
-#include <dpl/db/orm.h>
-
-namespace VcoreDPL {
-namespace DB {
-namespace ORM {
-namespace RelationTypes {
-const char Equal[] = "=";
-const char LessThan[] = "<";
-const char And[] = "AND";
-const char Or[] = "OR";
-const char Is[] = "IS";
-const char In[] = "IN";
-}
-
-template<>
-int GetColumnFromCommand<int>(ColumnIndex columnIndex,
- DataCommand *command)
-{
- return command->GetColumnInteger(columnIndex);
-}
-
-template<>
-VcoreDPL::String GetColumnFromCommand<VcoreDPL::String>(ColumnIndex columnIndex,
- DataCommand *command)
-{
- return VcoreDPL::FromUTF8String(command->GetColumnString(columnIndex));
-}
-
-template<>
-OptionalInteger GetColumnFromCommand<OptionalInteger>(ColumnIndex columnIndex,
- DataCommand *command)
-{
- return command->GetColumnOptionalInteger(columnIndex);
-}
-
-template<>
-OptionalString GetColumnFromCommand<OptionalString>(ColumnIndex columnIndex,
- DataCommand *command)
-{
- return command->GetColumnOptionalString(columnIndex);
-}
-
-template<>
-double GetColumnFromCommand<double>(ColumnIndex columnIndex,
- DataCommand *command)
-{
- return command->GetColumnDouble(columnIndex);
-}
-
-void DataCommandUtils::BindArgument(DataCommand *command,
- ArgumentIndex index,
- int argument)
-{
- command->BindInteger(index, argument);
-}
-
-void DataCommandUtils::BindArgument(DataCommand *command,
- ArgumentIndex index,
- const OptionalInteger& argument)
-{
- command->BindInteger(index, argument);
-}
-
-void DataCommandUtils::BindArgument(DataCommand *command,
- ArgumentIndex index,
- const VcoreDPL::String& argument)
-{
- command->BindString(index, argument);
-}
-
-void DataCommandUtils::BindArgument(DataCommand *command,
- ArgumentIndex index,
- const OptionalString& argument)
-{
- command->BindString(index, argument);
-}
-}
-}
-}
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file sql_connection.cpp
- * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
- * @version 1.0
- * @brief This file is the implementation file of SQL connection
- */
-#include <stddef.h>
-#include <dpl/db/sql_connection.h>
-#include <dpl/db/naive_synchronization_object.h>
-#include <dpl/free_deleter.h>
-#include <memory>
-#include <dpl/noncopyable.h>
-#include <dpl/assert.h>
-#include <dpl/log/log.h>
-#include <unistd.h>
-#include <cstdio>
-#include <cstdarg>
-
-namespace VcoreDPL {
-namespace DB {
-namespace // anonymous
-{
-class ScopedNotifyAll :
- public Noncopyable
-{
- private:
- SqlConnection::SynchronizationObject *m_synchronizationObject;
-
- public:
- explicit ScopedNotifyAll(
- SqlConnection::SynchronizationObject *synchronizationObject) :
- m_synchronizationObject(synchronizationObject)
- {}
-
- ~ScopedNotifyAll()
- {
- if (!m_synchronizationObject) {
- return;
- }
-
- LogDebug("Notifying after successful synchronize");
- m_synchronizationObject->NotifyAll();
- }
-};
-} // namespace anonymous
-
-SqlConnection::DataCommand::DataCommand(SqlConnection *connection,
- const char *buffer) :
- m_masterConnection(connection),
- m_stmt(NULL)
-{
- Assert(connection != NULL);
-
- // Notify all after potentially synchronized database connection access
- ScopedNotifyAll notifyAll(connection->m_synchronizationObject.get());
-
- for (;;) {
- int ret = sqlite3_prepare_v2(connection->m_connection,
- buffer, strlen(buffer),
- &m_stmt, NULL);
-
- if (ret == SQLITE_OK) {
- LogDebug("Data command prepared successfuly");
- break;
- } else if (ret == SQLITE_BUSY) {
- LogDebug("Collision occurred while preparing SQL command");
-
- // Synchronize if synchronization object is available
- if (connection->m_synchronizationObject) {
- LogDebug("Performing synchronization");
- connection->m_synchronizationObject->Synchronize();
- continue;
- }
-
- // No synchronization object defined. Fail.
- }
-
- // Fatal error
- const char *error = sqlite3_errmsg(m_masterConnection->m_connection);
-
- LogDebug("SQL prepare data command failed");
- LogDebug(" Statement : " << buffer);
- LogDebug(" Error : " << error);
-
- ThrowMsg(Exception::SyntaxError, error);
- }
-
- LogDebug("Prepared data command : " << buffer);
-
- // Increment stored data command count
- ++m_masterConnection->m_dataCommandsCount;
-}
-
-SqlConnection::DataCommand::~DataCommand()
-{
- LogDebug("SQL data command finalizing");
-
- if (sqlite3_finalize(m_stmt) != SQLITE_OK) {
- LogDebug("Failed to finalize data command");
- }
-
- // Decrement stored data command count
- --m_masterConnection->m_dataCommandsCount;
-}
-
-void SqlConnection::DataCommand::CheckBindResult(int result)
-{
- if (result != SQLITE_OK) {
- const char *error = sqlite3_errmsg(
- m_masterConnection->m_connection);
-
- LogDebug("Failed to bind SQL statement parameter");
- LogDebug(" Error : " << error);
-
- ThrowMsg(Exception::SyntaxError, error);
- }
-}
-
-void SqlConnection::DataCommand::BindNull(
- SqlConnection::ArgumentIndex position)
-{
- CheckBindResult(sqlite3_bind_null(m_stmt, position));
- LogDebug("SQL data command bind null: [" << position << "]");
-}
-
-void SqlConnection::DataCommand::BindInteger(
- SqlConnection::ArgumentIndex position,
- int value)
-{
- CheckBindResult(sqlite3_bind_int(m_stmt, position, value));
- LogDebug("SQL data command bind integer: [" << position << "] -> " << value);
-}
-
-void SqlConnection::DataCommand::BindInt8(
- SqlConnection::ArgumentIndex position,
- int8_t value)
-{
- CheckBindResult(sqlite3_bind_int(m_stmt, position,
- static_cast<int>(value)));
- LogDebug("SQL data command bind int8: [" << position << "] -> " << value);
-}
-
-void SqlConnection::DataCommand::BindInt16(
- SqlConnection::ArgumentIndex position,
- int16_t value)
-{
- CheckBindResult(sqlite3_bind_int(m_stmt, position,
- static_cast<int>(value)));
- LogDebug("SQL data command bind int16: [" << position << "] -> " << value);}
-
-void SqlConnection::DataCommand::BindInt32(
- SqlConnection::ArgumentIndex position,
- int32_t value)
-{
- CheckBindResult(sqlite3_bind_int(m_stmt, position,
- static_cast<int>(value)));
- LogDebug("SQL data command bind int32: [" << position << "] -> " << value);
-}
-
-void SqlConnection::DataCommand::BindInt64(
- SqlConnection::ArgumentIndex position,
- int64_t value)
-{
- CheckBindResult(sqlite3_bind_int64(m_stmt, position,
- static_cast<sqlite3_int64>(value)));
- LogDebug("SQL data command bind int64: [" << position << "] -> " << value);
-}
-
-void SqlConnection::DataCommand::BindFloat(
- SqlConnection::ArgumentIndex position,
- float value)
-{
- CheckBindResult(sqlite3_bind_double(m_stmt, position,
- static_cast<double>(value)));
- LogDebug("SQL data command bind float: [" << position << "] -> " << value);
-}
-
-void SqlConnection::DataCommand::BindDouble(
- SqlConnection::ArgumentIndex position,
- double value)
-{
- CheckBindResult(sqlite3_bind_double(m_stmt, position, value));
- LogDebug("SQL data command bind double: [" << position << "] -> " << value);
-}
-
-void SqlConnection::DataCommand::BindString(
- SqlConnection::ArgumentIndex position,
- const char *value)
-{
- if (!value) {
- BindNull(position);
- return;
- }
-
- // Assume that text may disappear
- CheckBindResult(sqlite3_bind_text(m_stmt, position,
- value, strlen(value),
- SQLITE_TRANSIENT));
-
- LogDebug("SQL data command bind string: [" << position << "] -> " << value);
-}
-
-void SqlConnection::DataCommand::BindString(
- SqlConnection::ArgumentIndex position,
- const String &value)
-{
- BindString(position, ToUTF8String(value).c_str());
-}
-
-void SqlConnection::DataCommand::BindInteger(
- SqlConnection::ArgumentIndex position,
- const boost::optional<int> &value)
-{
- if (!value) {
- BindNull(position);
- } else {
- BindInteger(position, *value);
- }
-}
-
-void SqlConnection::DataCommand::BindInt8(
- SqlConnection::ArgumentIndex position,
- const boost::optional<int8_t> &value)
-{
- if (!value) {
- BindNull(position);
- } else {
- BindInt8(position, *value);
- }
-}
-
-void SqlConnection::DataCommand::BindInt16(
- SqlConnection::ArgumentIndex position,
- const boost::optional<int16_t> &value)
-{
- if (!value) {
- BindNull(position);
- } else {
- BindInt16(position, *value);
- }
-}
-
-void SqlConnection::DataCommand::BindInt32(
- SqlConnection::ArgumentIndex position,
- const boost::optional<int32_t> &value)
-{
- if (!value) {
- BindNull(position);
- } else {
- BindInt32(position, *value);
- }
-}
-
-void SqlConnection::DataCommand::BindInt64(
- SqlConnection::ArgumentIndex position,
- const boost::optional<int64_t> &value)
-{
- if (!value) {
- BindNull(position);
- } else {
- BindInt64(position, *value);
- }
-}
-
-void SqlConnection::DataCommand::BindFloat(
- SqlConnection::ArgumentIndex position,
- const boost::optional<float> &value)
-{
- if (!value) {
- BindNull(position);
- } else {
- BindFloat(position, *value);
- }
-}
-
-void SqlConnection::DataCommand::BindDouble(
- SqlConnection::ArgumentIndex position,
- const boost::optional<double> &value)
-{
- if (!value) {
- BindNull(position);
- } else {
- BindDouble(position, *value);
- }
-}
-
-void SqlConnection::DataCommand::BindString(
- SqlConnection::ArgumentIndex position,
- const boost::optional<String> &value)
-{
- if (!!value) {
- BindString(position, ToUTF8String(*value).c_str());
- } else {
- BindNull(position);
- }
-}
-
-bool SqlConnection::DataCommand::Step()
-{
- // Notify all after potentially synchronized database connection access
- ScopedNotifyAll notifyAll(
- m_masterConnection->m_synchronizationObject.get());
-
- for (;;) {
- int ret = sqlite3_step(m_stmt);
-
- if (ret == SQLITE_ROW) {
- LogDebug("SQL data command step ROW");
- return true;
- } else if (ret == SQLITE_DONE) {
- LogDebug("SQL data command step DONE");
- return false;
- } else if (ret == SQLITE_BUSY) {
- LogDebug("Collision occurred while executing SQL command");
-
- // Synchronize if synchronization object is available
- if (m_masterConnection->m_synchronizationObject) {
- LogDebug("Performing synchronization");
-
- m_masterConnection->
- m_synchronizationObject->Synchronize();
-
- continue;
- }
-
- // No synchronization object defined. Fail.
- }
-
- // Fatal error
- const char *error = sqlite3_errmsg(m_masterConnection->m_connection);
-
- LogDebug("SQL step data command failed");
- LogDebug(" Error : " << error);
-
- ThrowMsg(Exception::InternalError, error);
- }
-}
-
-void SqlConnection::DataCommand::Reset()
-{
- /*
- * According to:
- * http://www.sqlite.org/c3ref/stmt.html
- *
- * if last sqlite3_step command on this stmt returned an error,
- * then sqlite3_reset will return that error, althought it is not an error.
- * So sqlite3_reset allways succedes.
- */
- sqlite3_reset(m_stmt);
-
- LogDebug("SQL data command reset");
-}
-
-void SqlConnection::DataCommand::CheckColumnIndex(
- SqlConnection::ColumnIndex column)
-{
- if (column < 0 || column >= sqlite3_column_count(m_stmt)) {
- ThrowMsg(Exception::InvalidColumn, "Column index is out of bounds");
- }
-}
-
-bool SqlConnection::DataCommand::IsColumnNull(
- SqlConnection::ColumnIndex column)
-{
- LogDebug("SQL data command get column type: [" << column << "]");
- CheckColumnIndex(column);
- return sqlite3_column_type(m_stmt, column) == SQLITE_NULL;
-}
-
-int SqlConnection::DataCommand::GetColumnInteger(
- SqlConnection::ColumnIndex column)
-{
- LogDebug("SQL data command get column integer: [" << column << "]");
- CheckColumnIndex(column);
- int value = sqlite3_column_int(m_stmt, column);
- LogDebug(" Value : " << value);
- return value;
-}
-
-int8_t SqlConnection::DataCommand::GetColumnInt8(
- SqlConnection::ColumnIndex column)
-{
- LogDebug("SQL data command get column int8: [" << column << "]");
- CheckColumnIndex(column);
- int8_t value = static_cast<int8_t>(sqlite3_column_int(m_stmt, column));
- LogDebug(" Value : " << value);
- return value;
-}
-
-int16_t SqlConnection::DataCommand::GetColumnInt16(
- SqlConnection::ColumnIndex column)
-{
- LgDebug("SQL data command get column int16: [" << column << "]");
- CheckColumnIndex(column);
- int16_t value = static_cast<int16_t>(sqlite3_column_int(m_stmt, column));
- LogDebug(" Value : " << value);
- return value;
-}
-
-int32_t SqlConnection::DataCommand::GetColumnInt32(
- SqlConnection::ColumnIndex column)
-{
- LogDebug("SQL data command get column int32: [" << column << "]");
- CheckColumnIndex(column);
- int32_t value = static_cast<int32_t>(sqlite3_column_int(m_stmt, column));
- LogDebug(" Value : " << value);
- return value;
-}
-
-int64_t SqlConnection::DataCommand::GetColumnInt64(
- SqlConnection::ColumnIndex column)
-{
- LogDebug("SQL data command get column int64: [" << column << "]");
- CheckColumnIndex(column);
- int64_t value = static_cast<int64_t>(sqlite3_column_int64(m_stmt, column));
- LogDebug(" Value : " << value);
- return value;
-}
-
-float SqlConnection::DataCommand::GetColumnFloat(
- SqlConnection::ColumnIndex column)
-{
- LogDebug("SQL data command get column float: [" << column << "]");
- CheckColumnIndex(column);
- float value = static_cast<float>(sqlite3_column_double(m_stmt, column));
- LogDebug(" Value : " << value);
- return value;
-}
-
-double SqlConnection::DataCommand::GetColumnDouble(
- SqlConnection::ColumnIndex column)
-{
- LogDebug("SQL data command get column double: [" << column << "]");
- CheckColumnIndex(column);
- double value = sqlite3_column_double(m_stmt, column);
- LogDebug(" Value : " << value);
- return value;
-}
-
-std::string SqlConnection::DataCommand::GetColumnString(
- SqlConnection::ColumnIndex column)
-{
- LogDebug("SQL data command get column string: [" << column << "]");
- CheckColumnIndex(column);
-
- const char *value = reinterpret_cast<const char *>(
- sqlite3_column_text(m_stmt, column));
-
- LogDebug(" Value : " << value);
-
- if (value == NULL) {
- return std::string();
- }
-
- return std::string(value);
-}
-
-boost::optional<int> SqlConnection::DataCommand::GetColumnOptionalInteger(
- SqlConnection::ColumnIndex column)
-{
- LogDebug("SQL data command get column optional integer: [" << column << "]");
- CheckColumnIndex(column);
- if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) {
- return boost::optional<int>();
- }
- int value = sqlite3_column_int(m_stmt, column);
- LogDebug(" Value : " << value);
- return boost::optional<int>(value);
-}
-
-boost::optional<int8_t> SqlConnection::DataCommand::GetColumnOptionalInt8(
- SqlConnection::ColumnIndex column)
-{
- LogDebug("SQL data command get column optional int8: [" << column << "]");
- CheckColumnIndex(column);
- if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) {
- return boost::optional<int8_t>();
- }
- int8_t value = static_cast<int8_t>(sqlite3_column_int(m_stmt, column));
- LogDebug(" Value: " << value);
- return boost::optional<int8_t>(value);
-}
-
-boost::optional<int16_t> SqlConnection::DataCommand::GetColumnOptionalInt16(
- SqlConnection::ColumnIndex column)
-{
- LogDebug("SQL data command get column optional int16: [" << column << "]");
- CheckColumnIndex(column);
- if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) {
- return boost::optional<int16_t>();
- }
- int16_t value = static_cast<int16_t>(sqlite3_column_int(m_stmt, column));
- LogDebug(" Value : " << value);
- return boost::optional<int16_t>(value);
-}
-
-boost::optional<int32_t> SqlConnection::DataCommand::GetColumnOptionalInt32(
- SqlConnection::ColumnIndex column)
-{
- LogDebug("SQL data command get column optional int32: [" << column << "]");
- CheckColumnIndex(column);
- if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) {
- return boost::optional<int32_t>();
- }
- int32_t value = static_cast<int32_t>(sqlite3_column_int(m_stmt, column));
- LogDebug(" Value : " << value);
- return boost::optional<int32_t>(value);
-}
-
-boost::optional<int64_t> SqlConnection::DataCommand::GetColumnOptionalInt64(
- SqlConnection::ColumnIndex column)
-{
- LogDebug("SQL data command get column optional int64: [" << column << "]");
- CheckColumnIndex(column);
- if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) {
- return boost::optional<int64_t>();
- }
- int64_t value = static_cast<int64_t>(sqlite3_column_int64(m_stmt, column));
- LogDebug(" Value : " << value);
- return boost::optional<int64_t>(value);
-}
-
-boost::optional<float> SqlConnection::DataCommand::GetColumnOptionalFloat(
- SqlConnection::ColumnIndex column)
-{
- LogDebug("SQL data command get column optional float: [" << column << "]");
- CheckColumnIndex(column);
- if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) {
- return boost::optional<float>();
- }
- float value = static_cast<float>(sqlite3_column_double(m_stmt, column));
- LogDebug(" Value : " << value);
- return boost::optional<float>(value);
-}
-
-boost::optional<double> SqlConnection::DataCommand::GetColumnOptionalDouble(
- SqlConnection::ColumnIndex column)
-{
- LogDebug("SQL data command get column optional double: [" << column << "]");
- CheckColumnIndex(column);
- if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) {
- return boost::optional<double>();
- }
- double value = sqlite3_column_double(m_stmt, column);
- LogDebug(" Value : " << value);
- return boost::optional<double>(value);
-}
-
-boost::optional<String> SqlConnection::DataCommand::GetColumnOptionalString(
- SqlConnection::ColumnIndex column)
-{
- LogDebug("SQL data command get column optional string: [" << column << "]");
- CheckColumnIndex(column);
- if (sqlite3_column_type(m_stmt, column) == SQLITE_NULL) {
- return boost::optional<String>();
- }
- const char *value = reinterpret_cast<const char *>(
- sqlite3_column_text(m_stmt, column));
- LogDebug(" Value : " << value);
- String s = FromUTF8String(value);
- return boost::optional<String>(s);
-}
-
-void SqlConnection::Connect(const std::string &address,
- Flag::Type type,
- Flag::Option flag)
-{
- if (m_connection != NULL) {
- LogDebug("Already connected.");
- return;
- }
- LogDebug("Connecting to DB: " << address << "...");
-
- // Connect to database
- int result;
- if (type & Flag::UseLucene) {
- result = db_util_open_with_options(
- address.c_str(),
- &m_connection,
- flag,
- NULL);
-
- m_usingLucene = true;
- LogDebug("Lucene index enabled");
- } else {
- result = sqlite3_open_v2(
- address.c_str(),
- &m_connection,
- flag,
- NULL);
-
- m_usingLucene = false;
- LogDebug("Lucene index disabled");
- }
-
- if (result == SQLITE_OK) {
- LogDebug("Connected to DB");
- } else {
- LogDebug("Failed to connect to DB!");
- ThrowMsg(Exception::ConnectionBroken, address);
- }
-
- // Enable foreign keys
- TurnOnForeignKeys();
-}
-
-void SqlConnection::Disconnect()
-{
- if (m_connection == NULL) {
- LogDebug("Already disconnected.");
- return;
- }
-
- LogDebug("Disconnecting from DB...");
-
- // All stored data commands must be deleted before disconnect
- AssertMsg(m_dataCommandsCount == 0,
- "All stored procedures must be deleted"
- " before disconnecting SqlConnection");
-
- int result;
-
- if (m_usingLucene) {
- result = db_util_close(m_connection);
- } else {
- result = sqlite3_close(m_connection);
- }
-
- if (result != SQLITE_OK) {
- const char *error = sqlite3_errmsg(m_connection);
- LogDebug("SQL close failed");
- LogDebug(" Error : " << error);
- Throw(Exception::InternalError);
- }
-
- m_connection = NULL;
-
- LogDebug("Disconnected from DB");
-}
-
-bool SqlConnection::CheckTableExist(const char *tableName)
-{
- if (m_connection == NULL) {
- LogDebug("Cannot execute command. Not connected to DB!");
- return false;
- }
-
- DataCommandAutoPtr command =
- PrepareDataCommand("select tbl_name from sqlite_master where name=?;");
-
- command->BindString(1, tableName);
-
- if (!command->Step()) {
- LogDebug("No matching records in table");
- return false;
- }
-
- return command->GetColumnString(0) == tableName;
-}
-
-SqlConnection::SqlConnection(const std::string &address,
- Flag::Type flag,
- Flag::Option option,
- SynchronizationObject *synchronizationObject) :
- m_connection(NULL),
- m_usingLucene(false),
- m_dataCommandsCount(0),
- m_synchronizationObject(synchronizationObject)
-{
- LogDebug("Opening database connection to : " << address);
-
- // Connect to DB
- SqlConnection::Connect(address, flag, option);
-
- if (!m_synchronizationObject) {
- LogDebug("No synchronization object defined");
- }
-}
-
-SqlConnection::~SqlConnection()
-{
- LogDebug("Closing database connection");
-
- // Disconnect from DB
- Try
- {
- SqlConnection::Disconnect();
- }
- Catch(Exception::Base)
- {
- LogDebug("Failed to disconnect from database");
- }
-}
-
-void SqlConnection::ExecCommand(const char *format, ...)
-{
- if (m_connection == NULL) {
- LogDebug("Cannot execute command. Not connected to DB!");
- return;
- }
-
- if (format == NULL) {
- LogDebug("Null query!");
- ThrowMsg(Exception::SyntaxError, "Null statement");
- }
-
- char *rawBuffer;
-
- va_list args;
- va_start(args, format);
-
- if (vasprintf(&rawBuffer, format, args) == -1) {
- rawBuffer = NULL;
- }
-
- va_end(args);
-
- std::unique_ptr<char[],free_deleter> buffer(rawBuffer);
-
- if (!buffer) {
- LogDebug("Failed to allocate statement string");
- return;
- }
-
- LogDebug("Executing SQL command : " << buffer.get());
-
- // Notify all after potentially synchronized database connection access
- ScopedNotifyAll notifyAll(m_synchronizationObject.get());
-
- for (;;) {
- char *errorBuffer;
-
- int ret = sqlite3_exec(m_connection,
- buffer.get(),
- NULL,
- NULL,
- &errorBuffer);
-
- std::string errorMsg;
-
- // Take allocated error buffer
- if (errorBuffer != NULL) {
- errorMsg = errorBuffer;
- sqlite3_free(errorBuffer);
- }
-
- if (ret == SQLITE_OK) {
- return;
- }
-
- if (ret == SQLITE_BUSY) {
- LogDebug("Collision occurred while executing SQL command");
-
- // Synchronize if synchronization object is available
- if (m_synchronizationObject) {
- LogDebug("Performing synchronization");
- m_synchronizationObject->Synchronize();
- continue;
- }
-
- // No synchronization object defined. Fail.
- }
-
- // Fatal error
- LogDebug("Failed to execute SQL command. Error : " << errorMsg);
- ThrowMsg(Exception::SyntaxError, errorMsg);
- }
-}
-
-SqlConnection::DataCommandAutoPtr SqlConnection::PrepareDataCommand(
- const char *format,
- ...)
-{
- if (m_connection == NULL) {
- LogDebug("Cannot execute data command. Not connected to DB!");
- return DataCommandAutoPtr();
- }
-
- char *rawBuffer;
-
- va_list args;
- va_start(args, format);
-
- if (vasprintf(&rawBuffer, format, args) == -1) {
- rawBuffer = NULL;
- }
-
- va_end(args);
-
- std::unique_ptr<char[],free_deleter> buffer(rawBuffer);
-
- if (!buffer) {
- LogDebug("Failed to allocate statement string");
- return DataCommandAutoPtr();
- }
-
- LogDebug("Executing SQL data command : " << buffer.get());
-
- return DataCommandAutoPtr(new DataCommand(this, buffer.get()));
-}
-
-SqlConnection::RowID SqlConnection::GetLastInsertRowID() const
-{
- return static_cast<RowID>(sqlite3_last_insert_rowid(m_connection));
-}
-
-void SqlConnection::TurnOnForeignKeys()
-{
- ExecCommand("PRAGMA foreign_keys = ON;");
-}
-
-void SqlConnection::BeginTransaction()
-{
- ExecCommand("BEGIN;");
-}
-
-void SqlConnection::RollbackTransaction()
-{
- ExecCommand("ROLLBACK;");
-}
-
-void SqlConnection::CommitTransaction()
-{
- ExecCommand("COMMIT;");
-}
-
-SqlConnection::SynchronizationObject *
-SqlConnection::AllocDefaultSynchronizationObject()
-{
- return new NaiveSynchronizationObject();
-}
-
-int SqlConnection::db_util_open_with_options(const char *pszFilePath, sqlite3 **ppDB,
- int flags, const char *zVfs)
-{
- int mode;
-
- if((pszFilePath == NULL) || (ppDB == NULL)) {
- LogWarning("sqlite3 handle null error");
- return SQLITE_ERROR;
- }
-
- mode = R_OK;
-
- if((geteuid() != 0) && (access(pszFilePath, mode))) {
- if(errno == EACCES) {
- LogDebug("file access permission error");
- return SQLITE_PERM;
- }
- }
-
- /* Open DB */
- int rc = sqlite3_open_v2(pszFilePath, ppDB, flags, zVfs);
- if (SQLITE_OK != rc) {
- LogError("sqlite3_open_v2 error(" << rc << ")");
- return rc;
- }
-
- //rc = __db_util_open(*ppDB);
-
- return rc;
-}
-
-
-int SqlConnection::db_util_close(sqlite3 *pDB)
-{
- char *pszErrorMsg = NULL;
-
- /* Close DB */
- int rc = sqlite3_close(pDB);
- if (SQLITE_OK != rc) {
- LogWarning("Fail to change journal mode : " << pszErrorMsg);
- sqlite3_free(pszErrorMsg);
- return rc;
- }
-
- return SQLITE_OK;
-}
-
-} // namespace DB
-} // namespace VcoreDPL
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file thread_database_support.cpp
- * @author Przemyslaw Dobrowolski (p.dobrowolsk)
- * @version 1.0
- * @brief This file contains the definition of thread database support
- */
-#include <stddef.h>
-#include <dpl/db/thread_database_support.h>
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file process_pipe.h
- * @author Tomasz Iwanek (t.iwanek@samsung.com)
- * @version 1.0
- * @brief This file is the implementation pipe from process
- */
-#ifndef PROCESS_PIPE_H
-#define PROCESS_PIPE_H
-
-#include <dpl/file_input.h>
-#include <dpl/exception.h>
-
-#include <cstdio>
-
-namespace VcoreDPL {
-
-class ProcessPipe : public FileInput
-{
-public:
- class Exception
- {
- public:
- DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base)
- DECLARE_EXCEPTION_TYPE(Base, DoubleOpen)
- };
-
- enum class PipeErrorPolicy
- {
- NONE,
- OFF,
- PIPE
- };
-
- explicit ProcessPipe(PipeErrorPolicy err = PipeErrorPolicy::NONE);
- virtual ~ProcessPipe();
-
- void Open(const std::string &command);
- void Close();
-
-private:
- FILE * m_file;
- PipeErrorPolicy m_errPolicy;
-};
-
-}
-
-#endif // PROCESS_PIPE_H
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file process_pipe.cpp
- * @author Tomasz Iwanek (t.iwanek@samsung.com)
- * @version 1.0
- * @brief This file is the implementation pipe from process
- */
-
-#include <dpl/test/process_pipe.h>
-
-namespace VcoreDPL {
-
-ProcessPipe::ProcessPipe(PipeErrorPolicy err) : m_file(NULL), m_errPolicy(err)
-{
-}
-
-ProcessPipe::~ProcessPipe()
-{
-}
-
-void ProcessPipe::Open(const std::string & command)
-{
- if(m_file != NULL)
- {
- ThrowMsg(Exception::DoubleOpen, "Trying to open pipe second time. Close it first");
- }
-
- std::string stdErrRedirection;
- switch(m_errPolicy)
- {
- case PipeErrorPolicy::NONE: break;
- case PipeErrorPolicy::OFF: stdErrRedirection = " 2>/dev/null"; break;
- case PipeErrorPolicy::PIPE: stdErrRedirection = " 2>&1"; break;
- default: break;
- }
-
- std::string fcommand = command + stdErrRedirection;
- FILE * file = popen(fcommand.c_str(), "r");
-
- // Throw an exception if an error occurred
- if (file == NULL) {
- ThrowMsg(FileInput::Exception::OpenFailed, fcommand);
- }
-
- // Save new descriptor
- m_file = file;
- m_fd = fileno(m_file);
-}
-
-void ProcessPipe::Close()
-{
- if (m_fd == -1) {
- return;
- }
-
- if (pclose(m_file) == -1) {
- Throw(FileInput::Exception::CloseFailed);
- }
-
- m_fd = -1;
- m_file = NULL;
-}
-
-}
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*!
- * @author Bartlomiej Grzelewski(b.grzelewski@samsung.com)
- * @version 0.1
- * @file CRLCacheInterface.h
- * @brief CRLCacheInterface definition.
- */
-#ifndef _CRLCACHEINTERFACE_H_
-#define _CRLCACHEINTERFACE_H_
-
-#include <string>
-
-namespace ValidationCore {
-
-struct CRLCachedData
-{
- std::string distribution_point;
- std::string crl_body;
- time_t next_update_time;
-};
-
-class CRLCacheInterface {
-public:
- virtual bool getCRLResponse(CRLCachedData *ptr) = 0;
- virtual void setCRLResponse(CRLCachedData *ptr) = 0;
-};
-
-} // namespace ValidationCore
-
-#endif
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef VCORE_SRC_VCORE_CERTIFICATESTORAGE_H
-#define VCORE_SRC_VCORE_CERTIFICATESTORAGE_H
-
-#include <list>
-#include <openssl/x509.h>
-
-namespace ValidationCore {
-typedef std::list < X509* > X509CertificatesList;
-}
-
-#endif // VCORE_SRC_VCORE_CERTIFICATESTORAGE_H
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- *
- *
- * @file AbstractResponseCache.h
- * @author Tomasz Swierczek (t.swierczek@samsung.com)
- * @version 0.1
- * @brief Common interface for OCSP/CRL caches
- */
-
-#ifndef _VALIDATION_CORE_IABSTRACT_RESPONSE_CACHE_H_
-#define _VALIDATION_CORE_IABSTRACT_RESPONSE_CACHE_H_
-
-#include <vcore/VerificationStatus.h>
-
-namespace ValidationCore {
-
-class CertificateCollection;
-
-class IAbstractResponseCache {
- public:
- virtual VerificationStatus check(const CertificateCollection &certs) = 0;
- virtual VerificationStatus checkEndEntity(CertificateCollection &certs) = 0;
- virtual void updateCache() = 0;
-
- virtual ~IAbstractResponseCache()
- {
- }
-};
-
-} // namespace ValidationCore
-
-#endif /* _VALIDATION_CORE_IABSTRACT_RESPONSE_CACHE_H_ */
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*!
- * @author Piotr Marcinkiewicz(p.marcinkiew@samsung.com)
- * @version 0.4
- * @file CommonCertValidator.cpp
- * @brief Common routines for certificate validation over OCSP and CRL
- */
-
-#include "RevocationCheckerBase.h"
-
-#include <cstdlib>
-
-#include <openssl/pem.h>
-
-#include <dpl/scoped_fclose.h>
-
-#include "Certificate.h"
-#include "CertificateCollection.h"
-
-namespace {
-const char DefaultBundlePatch[] = "/opt/etc/ssl/certs/ca-certificates.crt";
-} //Anonymous name space
-
-namespace ValidationCore {
-CertificatePtr RevocationCheckerBase::loadPEMFile(const char* fileName)
-{
- VcoreDPL::ScopedFClose fd(fopen(fileName, "rb"));
-
- // no such file, return NULL
- if (!fd.Get()) {
- return CertificatePtr();
- }
-
- // create a new X509 certificate basing on file
- CertificatePtr cert(new Certificate(PEM_read_X509(fd.Get(),
- NULL,
- NULL,
- NULL)));
- return cert;
-}
-
-bool RevocationCheckerBase::sortCertList(CertificateList &lCertificates)
-{
- CertificateCollection collection;
- collection.load(lCertificates);
-
- if (collection.sort()) {
- lCertificates = collection.getChain();
- return true;
- }
- return false;
-}
-
-} // ValidationCore
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*!
- * @author Piotr Marcinkiewicz(p.marcinkiew@samsung.com)
- * @version 0.4
- * @file CommonCertValidator.h
- * @brief Common routines for certificate validation over OCSP and CRL
- */
-
-#ifndef WRT_ENGINE_SRC_VALIDATION_CORE_REVOCATIONCHECKERBASE_H_
-#define WRT_ENGINE_SRC_VALIDATION_CORE_REVOCATIONCHECKERBASE_H_
-
-#include <string>
-
-#include "Certificate.h"
-
-namespace ValidationCore {
-class RevocationCheckerBase
-{
- public:
- //! Loads a PEM file and returns X509 certificate object.
- static CertificatePtr loadPEMFile(const char* path);
-
- //! Sorts a list of certficates and verifies them if they form
- //! a valid chain
- static bool sortCertList(CertificateList &cert) __attribute__((deprecated));
-};
-} // ValidationCore
-
-#endif //ifndef WRT_ENGINE_SRC_VALIDATION_CORE_REVOCATIONCHECKERBASE_H_
-
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _SSLCONTAINERS_H
-#define _SSLCONTAINERS_H
-
-#include <openssl/x509v3.h>
-#include <openssl/ocsp.h>
-
-/*
- * default deleter functor with no overloaded operator()
- */
-template <typename T>
-struct MySSLFree {};
-
-/*
- * macro for defining custom deleters for openssl structs
- * usage DECLARE_DELETER(OpenSSLType)
- */
-#define DECLARE_DELETER(Type) template<> \
- struct MySSLFree <Type> \
- { \
- void operator() (Type* p) \
- { \
- Type ## _free(p); \
- } \
- \
- };
-
-/*
- * declare custom deleter for X509 structs
- */
-DECLARE_DELETER(X509)
-/*
- * declare custom deleter for OCSP_REQUEST structs
- */
-DECLARE_DELETER(OCSP_REQUEST)
-/*
- * declare custom deleter for OCSP_RESPONSE structs
- */
-DECLARE_DELETER(OCSP_RESPONSE)
-/*
- * declare custom deleter for OCSP_CERTID structs
- */
-DECLARE_DELETER(OCSP_CERTID)
-/*
- * declare custom deleter for OCSP_BASICRESP structs
- */
-DECLARE_DELETER(OCSP_BASICRESP)
-/*
- * declare custom deleter for X509_STORE structs
- */
-DECLARE_DELETER(X509_STORE)
-
-/*
- * undef it, so anyone could use that macro name
- */
-#undef DECLARE_DELETER
-
-/*
- * OpenSSL smart container
- * usage SSLSmartContainer <OpenSSLType> smartptr = ptrToOpenSSLType
- * remember to add OpenSSLType to macro list few lines above
- */
-template <typename T, typename deleter = MySSLFree<T> >
-class SSLSmartContainer
-{
- public:
- SSLSmartContainer() : m_pData(NULL)
- {
- }
-
- /*
- * explicit constructor, we don't want any auto casting
- */
- explicit SSLSmartContainer(T* pData)
- {
- m_pData = pData;
- }
-
- /*
- * overloaded assignment operator
- */
- SSLSmartContainer & operator=(SSLSmartContainer& pContainer)
- {
- /*
- * check if no assignment was done before
- */
- if (this != &pContainer) {
- // if so, free internal data
- deleter ssl_free;
- ssl_free(m_pData);
-
- // and assign new
- m_pData = pContainer.m_pData;
-
- pContainer.m_pData = NULL;
- }
-
- return *this;
- }
-
- SSLSmartContainer & operator=(T* pData)
- {
- /*
- * check if no assignment was done before
- */
- if (m_pData != pData) {
- // if so, free internal data
- deleter ssl_free;
- ssl_free(m_pData);
-
- // and assign new
- m_pData = pData;
- }
-
- return *this;
- }
-
- ~SSLSmartContainer()
- {
- deleter ssl_free;
- ssl_free(m_pData);
- }
-
- /*
- * overloaded operators for standardptr - like usage
- */
- SSLSmartContainer & operator*()
- {
- return *m_pData;
- }
- SSLSmartContainer* operator->()
- {
- return m_pData;
- }
-
- /*
- * auto cast to T operator
- */
- operator T *() const { return m_pData;
- }
-
- /*
- * detachs internal pointer from smart pointer
- */
- T* DetachPtr()
- {
- T* pData = m_pData;
- m_pData = NULL;
- return pData;
- }
-
- private:
- /*
- * blocked assignment from another types operator
- */
- template <typename S>
- T & operator = (S& pContainer)
- {
- return *this;
- }
-
- /*
- * internal data
- */
- T* m_pData;
-};
-
-#endif /* _SSLCONTAINERS_H */
-
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*!
- * @author Bartlomiej Grzelewski (b.grzelewski@samsung.com)
- * @version 0.2
- * @file VerficationStatus.cpp
- * @brief OCSP/CRL status.
- */
-#include <vcore/VerificationStatus.h>
-
-namespace ValidationCore {
-
-VerificationStatusSet::VerificationStatusSet()
- : m_verdictMap(0)
-{}
-
-void VerificationStatusSet::add(VerificationStatus status) {
- m_verdictMap |= status;
-}
-
-bool VerificationStatusSet::contains(VerificationStatus status) const {
- return m_verdictMap & status;
-}
-
-bool VerificationStatusSet::isEmpty() const {
- return 0 == m_verdictMap;
-}
-
-void VerificationStatusSet::operator+=(const VerificationStatusSet &second) {
- m_verdictMap |= second.m_verdictMap;
-}
-
-void VerificationStatusSet::reset() {
- m_verdictMap = 0;
-}
-
-VerificationStatus VerificationStatusSet::convertToStatus() const
-{
- if (m_verdictMap & VERIFICATION_STATUS_REVOKED) {
- return VERIFICATION_STATUS_REVOKED;
- }
-
- if (m_verdictMap & VERIFICATION_STATUS_VERIFICATION_ERROR) {
- return VERIFICATION_STATUS_VERIFICATION_ERROR;
- }
-
- if (m_verdictMap & VERIFICATION_STATUS_ERROR) {
- return VERIFICATION_STATUS_ERROR;
- }
-
- if (m_verdictMap & VERIFICATION_STATUS_UNKNOWN) {
- return VERIFICATION_STATUS_UNKNOWN;
- }
-
- if (m_verdictMap & VERIFICATION_STATUS_CONNECTION_FAILED) {
- return VERIFICATION_STATUS_CONNECTION_FAILED;
- }
-
- if (m_verdictMap & VERIFICATION_STATUS_NOT_SUPPORT) {
- return VERIFICATION_STATUS_NOT_SUPPORT;
- }
-
- if (m_verdictMap & VERIFICATION_STATUS_GOOD) {
- return VERIFICATION_STATUS_GOOD;
- }
-
- return VERIFICATION_STATUS_ERROR;
-}
-} // namespace ValidationCore
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*!
- * @author Bartlomiej Grzelewski (b.grzelewski@samsung.com)
- * @version 0.2
- * @file VerificationStatus.h
- * @brief OCSP/CRL status.
- */
-#ifndef _VALIDATION_CORE_VERIFICATION_STATUS_H_
-#define _VALIDATION_CORE_VERIFICATION_STATUS_H_
-
-namespace ValidationCore {
-enum VerificationStatus
-{
- //! The certificate has not been revoked.
- /*! Connection to OCSP responder was successful and the certificate
- * has not been revoked.
- */
- VERIFICATION_STATUS_GOOD = 1,
-
- //! The certificate has been revoked.
- /*! Connection to OCSP responder was successful and the certificate
- * has been revoked.
- * RFC2560: "The "revoked" state indicates that the certificate has
- * been revoked (either permanantly or temporarily
- * (on hold))."
- */
- VERIFICATION_STATUS_REVOKED = 1 << 1,
-
- //! The certificate status is unknown.
- /*! Connection to OCSP responder was successful and the certificate
- * has unknown status.
- *
- * RFC2560: "The "unknown" state indicates that the responder
- * doesn't know about the certificate being requested."
- */
- VERIFICATION_STATUS_UNKNOWN = 1 << 2,
-
- //! The certificate status was not figure out.
- /*! The response from ocsp/crl server contains broken signature. */
- VERIFICATION_STATUS_VERIFICATION_ERROR = 1 << 3,
-
- //! The certificate status was not figure out.
- /*! The certificate does not contain ocsp/crl extension. */
- VERIFICATION_STATUS_NOT_SUPPORT = 1 << 4,
-
- //! The certificate status was not figure out.
- /*! The CertMgr could not connect to OCSP responder. */
- VERIFICATION_STATUS_CONNECTION_FAILED = 1 << 5,
-
- //! The certificate status is unknown due to internal error inside OCSP
- VERIFICATION_STATUS_ERROR = 1 << 6
-};
-
-class VerificationStatusSet
-{
- public:
- VerificationStatusSet();
-
- void add(VerificationStatus status);
-
- bool contains(VerificationStatus status) const;
-
- bool isEmpty() const;
-
- void operator+=(const VerificationStatusSet &second);
-
- void reset();
-
- VerificationStatus convertToStatus() const;
-
- private:
- unsigned int m_verdictMap;
-};
-
-/* TODO this status should be defined in wrt-engine sources */
-enum WidgetVerificationStatus
-{
- // All certificate has been veficated and all certificates are good.
- // Widget is able to be installed.
- WIDGET_VERIFICATION_STATUS_GOOD,
- // Some certificate has been revoked. Widget is not able to be installed.
- WIDGET_VERIFICATION_STATUS_REVOKED,
-};
-
-} // namespace ValidationCore
-
-#endif // _VALIDATION_CORE_VERIFICATION_STATUS_H_
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file
- * @author Bartlomiej Grzelewski (b.grzelewski@samsung.com)
- * @version 1.0
- * @brief
- */
-#include "WacOrigin.h"
-
-#include <algorithm>
-#include <ctype.h>
-#include <idna.h>
-
-#include <dpl/log/log.h>
-
-#include <iri.h>
-#include "ValidatorCommon.h"
-
-namespace {
-const std::string SCHEME_HTTP = "http";
-const std::string SCHEME_HTTPS = "https";
-const int PORT_HTTP = 80;
-const int PORT_HTTPS = 443;
-}
-
-namespace ValidationCore {
-VC_DECLARE_DELETER(iri_struct, iri_destroy)
-
-WacOrigin::WacOrigin(const std::string &url) :
- m_port(0),
- m_parseFailed(false)
-{
- parse(url.c_str());
-}
-
-WacOrigin::WacOrigin(const char *url) :
- m_port(0),
- m_parseFailed(false)
-{
- parse(url);
-}
-
-bool WacOrigin::operator==(const WacOrigin &second) const
-{
- if (m_parseFailed || second.m_parseFailed) {
- return false;
- }
-
- return (m_scheme == second.m_scheme) &&
- (m_host == second.m_host) &&
- (m_port == second.m_port);
-}
-
-void WacOrigin::parse(const char *url)
-{
- // Step are taken from algorihtm:
- // http://www.w3.org/TR/html5/origin-0.html#origin-0
-
- // Step 1
- // Step 2
- AutoPtr<iri_struct> iri(iri_parse(url));
- if (!iri.get()) {
- m_parseFailed = true;
- return;
- }
-
- if (iri->scheme) {
- m_scheme = iri->scheme;
- } else {
- m_parseFailed = true;
- return;
- }
-
- // Step 3 - Skip this point.
- // WAC 2.0 PRV - we are suport only "http" and "https" schemas.
-
- // Step 4 - Todo
-
- // Step 5
- std::transform(m_scheme.begin(), m_scheme.end(), m_scheme.begin(), tolower);
-
- // Step 6 - we only support "http" and "https" schemas
- if ((m_scheme != SCHEME_HTTP) && (m_scheme != SCHEME_HTTPS)) {
- m_parseFailed = true;
- return;
- }
-
- // Step 7 - Skip. We do not support "file" schema.
-
- // Step 8
- if (iri->host) {
- m_host = iri->host;
- } else {
- m_parseFailed = true;
- return;
- }
-
- // Step 9
- char *output = NULL;
- if (IDNA_SUCCESS !=
- idna_to_ascii_lz(m_host.c_str(), &output, IDNA_USE_STD3_ASCII_RULES)) {
- LogError("libidn error");
- m_parseFailed = true;
- free(output);
- return;
- }
- m_host = output;
- free(output);
-
- // Step 10
- std::transform(m_host.begin(), m_host.end(), m_host.begin(), ::tolower);
-
- // Step 11
- if (iri->port) {
- m_port = iri->port;
- } else {
- setPort();
- }
-
- // Step 12 - Skip it. We do not return anything.
- // User should create geters if he need access to schema/host/port.
-}
-
-void WacOrigin::setPort()
-{
- if (SCHEME_HTTP == m_scheme) {
- m_port = PORT_HTTP;
- return;
- } else if (SCHEME_HTTPS == m_scheme) {
- m_port = PORT_HTTPS;
- return;
- } else {
- LogDebug("Scheme %s is not support by WAC2.0 " << m_scheme);
- m_parseFailed = true;
- }
-}
-} // namespace ValidationCore
+++ /dev/null
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * @file
- * @author Bartlomiej Grzelewski (b.grzelewski@samsung.com)
- * @version 1.0
- * @brief This is stub for HTML5Origin implementation.
- * This implementation is compatible with WAC 2.0 PRV requirements
- * and is _not_ full compatible with ORIGIN algorithm requirements
- * defined in http://www.w3.org/TR/html5/origin-0.html#origin-0
- */
-#ifndef _WRT_ENGINE_SRC_INSTALLER_CORE_VALIDATION_CORE_HTML5ORIGIN_H_
-#define _WRT_ENGINE_SRC_INSTALLER_CORE_VALIDATION_CORE_HTML5ORIGIN_H_
-
-#include <string>
-
-namespace ValidationCore {
-class WacOrigin
-{
- public:
-
- WacOrigin(const std::string &url);
- WacOrigin(const char *url);
-
- bool operator!=(const WacOrigin &second) const
- {
- return !(operator==(second));
- }
-
- bool operator==(const WacOrigin &second) const;
-
- private:
- void parse(const char *url);
- void setPort();
-
- std::string m_scheme;
- std::string m_host;
- int m_port;
- bool m_parseFailed; // if parsing failed we should return unique identifier
-};
-} //namespace ValidationCore
-
-#endif // _WRT_ENGINE_SRC_INSTALLER_CORE_VALIDATION_CORE_HTML5ORIGIN_H_
*/
#include <algorithm>
#include <string>
+#include <memory>
#include <string.h>
#include <openssl/bio.h>
#include <openssl/evp.h>
#include <dpl/log/log.h>
-#include <dpl/scoped_free.h>
-
#include <vcore/Base64.h>
namespace ValidationCore {
static bool whiteCharacter(char a)
{
- if (a == '\n') { return true; }
+ if (a == '\n')
+ return true;
+
return false;
}
|| m_input[i] == '+'
|| m_input[i] == '/'
|| m_input[i] == '=')
- {
continue;
- }
LogError("Base64 input contains illegal chars: " << m_input[i]);
return false;
}
BIO *b64, *bmem;
size_t len = m_input.size();
-
- VcoreDPL::ScopedFree<char> buffer(static_cast<char*>(malloc(len)));
-
- if (!buffer) {
- LogError("Error in malloc.");
- VcoreThrowMsg(Exception::InternalError, "Error in malloc.");
+ std::shared_ptr<char> buffer(new char[len], [](char *p){delete []p;});
+ if (!buffer.get()) {
+ LogError("Error in new");
+ VcoreThrowMsg(Exception::InternalError, "Error in new");
}
- memset(buffer.Get(), 0, len);
+ memset(buffer.get(), 0, len);
b64 = BIO_new(BIO_f_base64());
if (!b64) {
LogError("Couldn't create BIO object.");
VcoreThrowMsg(Exception::InternalError, "Couldn't create BIO object.");
}
BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
- VcoreDPL::ScopedFree<char> tmp(strdup(m_input.c_str()));
+
+ std::shared_ptr<char> tmp(strdup(m_input.c_str()), [](char *p){free(p);});
+ if (!tmp.get()) {
+ LogError("Error in strdup");
+ VcoreThrowMsg(Exception::InternalError, "Error in strdup");
+ }
+
m_input.clear();
- bmem = BIO_new_mem_buf(tmp.Get(), len);
+ bmem = BIO_new_mem_buf(tmp.get(), len);
if (!bmem) {
BIO_free(b64);
VcoreThrowMsg(Exception::InternalError, "Internal error in BIO");
}
- int readlen = BIO_read(bmem, buffer.Get(), len);
+ int readlen = BIO_read(bmem, buffer.get(), len);
m_output.clear();
bool status = true;
- if (readlen > 0) {
- m_output.append(buffer.Get(), readlen);
- } else {
+ if (readlen > 0)
+ m_output.append(buffer.get(), readlen);
+ else
status = false;
- }
BIO_free_all(bmem);
+
return status;
}
#include <cert-svc/ccert.h>
#include <cert-svc/cprimitives.h>
-#include <dpl/binary_queue.h>
-#include <dpl/foreach.h>
#include <dpl/log/log.h>
#include <vcore/Base64.h>
std::back_inserter(m_certList));
}
-bool CertificateCollection::load(const std::string &buffer)
-{
- Base64Decoder base64;
- base64.reset();
- base64.append(buffer);
- if (!base64.finalize()) {
- LogWarning("Error during chain decoding");
- return false;
- }
- std::string binaryData = base64.get();
-
- VcoreDPL::BinaryQueue queue;
- queue.AppendCopy(binaryData.c_str(), binaryData.size());
-
- int certNum;
- queue.FlattenConsume(&certNum, sizeof(int));
-
- CertificateList list;
- CertificatePtr certPtr;
-
- for (int i = 0; i < certNum; ++i) {
- int certSize;
- queue.FlattenConsume(&certSize, sizeof(int));
- std::vector<char> rawDERCert;
- rawDERCert.resize(certSize);
- queue.FlattenConsume(&rawDERCert[0], certSize);
- VcoreTry {
- list.push_back(CertificatePtr(new Certificate(std::string(
- rawDERCert.begin(),
- rawDERCert.end()))));
- } VcoreCatch (Certificate::Exception::Base) {
- LogWarning("Error during certificate creation.");
- return false;
- }
-
- LogDebug("Loading certificate. Certificate common name: " << list.back()->getCommonName());
- }
- load(list);
- return true;
-}
-
std::string CertificateCollection::toBase64String() const
{
std::ostringstream output;
int certNum = m_certList.size();
output << toBinaryString(certNum);
- FOREACH(i, m_certList){
+
+ for (auto i = m_certList.begin(); i != m_certList.end(); ++i) {
std::string derCert = (*i)->getDER();
output << toBinaryString(derCert.size());
output << derCert;
void load(const CertificateList &certList);
/*
- * This function will return false if base64 string is broken
- * (is not encoded in base64 format) or one from certificate
- * is broken (is not encoded in der format).
- *
- * This function will add new certificate to collection.
- * This function DOES NOT clean collection.
- */
- bool load(const std::string &base64);
-
- /*
* This function will return all certificates from
* collection encoded in base64 format.
*/
#include <pcrecpp.h>
-#include <dpl/errno_string.h>
#include <dpl/log/log.h>
namespace {
}
std::string m_dirpath;
- std::string m_errorDescription;
pcrecpp::RE m_signatureRegexp;
};
if ((dp = opendir(currentDir.c_str())) == NULL) {
LogError("Error opening directory : " << currentDir);
- m_errorDescription = currentDir;
return ERROR_OPENING_DIR;
}
LogDebug("Found file : " << (directory + dirp->d_name));
LogError("Unknown ERROR_REFERENCE_NOT_FOUND.");
closedir(dp);
- m_errorDescription = directory + dirp->d_name;
return ERROR_REFERENCE_NOT_FOUND;
}
} else {
LogError("Unknown file type.");
closedir(dp);
- m_errorDescription = directory + dirp->d_name;
return ERROR_UNSUPPORTED_FILE_TYPE;
}
}
if (errno != 0) {
- m_errorDescription = VcoreDPL::GetErrnoString();
- LogError("readdir failed. Errno code : " << errno << ", Description : " << m_errorDescription);
closedir(dp);
return ERROR_READING_DIR;
}
#define _VALIDATION_CORE_TIMECONVERSION_H_
#include <ctime>
-
-#include <openssl/x509.h>
+#include <openssl/asn1.h>
namespace ValidationCore {
// from OpenSSL asn1/a_utctm.c code
#ifndef _WRT_ENGINE_SRC_INSTALLER_CORE_VALIDATION_CORE_VALIDATORFACTORY_H_
#define _WRT_ENGINE_SRC_INSTALLER_CORE_VALIDATION_CORE_VALIDATORFACTORY_H_
-#include <CertificateIdentifier.h>
+#include <vcore/CertificateIdentifier.h>
namespace ValidationCore {
// First use of CertificateIdentificator should initialized it.
#include <openssl/evp.h>
#include <openssl/bio.h>
-#include <dpl/foreach.h>
#include <dpl/log/log.h>
#include <cert-svc/cinstance.h>
{}
~CertSvcInstanceImpl(){
- FOREACH(it, m_allocatedStringSet) {
+ auto it = m_allocatedStringSet.begin();
+ for (; it != m_allocatedStringSet.end(); ++it)
delete[] *it;
- }
}
inline void reset(){
m_stringListCounter = 0;
m_stringListMap.clear();
- FOREACH(it, m_allocatedStringSet) {
+ auto it = m_allocatedStringSet.begin();
+ for (; it != m_allocatedStringSet.end(); ++it)
delete[] *it;
- }
m_allocatedStringSet.clear();
}
#include <cert-service-debug.h>
-#include <cert-svc-client.h>
+#include <vcore/cert-svc-client.h>
void initialize_res_data(VcoreResponseData *pData)
{
#include <cert-service.h>
#include <cert-service-debug.h>
#include <cert-svc/cerror.h>
-#include <cert-svc-client.h>
+#include <vcore/cert-svc-client.h>
#include <vcore/utils.h>
-#include <pkcs12.h>
+
+#include <vcore/pkcs12.h>
#define SYSCALL(call) while(((call) == -1) && (errno == EINTR))