Переглянути джерело

Ticket #652 - Basic module structure.

AntonLV 9 роки тому
батько
коміт
690cb8625c

+ 26 - 0
modules/boonex/elasticsearch/classes/BxElsConfig.php

@@ -0,0 +1,26 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    ElasticSearch ElasticSearch
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxElsConfig extends BxBaseModGeneralConfig
+{
+    function __construct($aModule)
+    {
+        parent::__construct($aModule);
+
+        $this->CNF = array (
+
+            // module icon
+            'ICON' => 'search col-blue2',
+        );
+    }
+}
+
+/** @} */

+ 20 - 0
modules/boonex/elasticsearch/classes/BxElsDb.php

@@ -0,0 +1,20 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    ElasticSearch ElasticSearch
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxElsDb extends BxBaseModGeneralDb
+{
+    function __construct(&$oConfig)
+    {
+        parent::__construct($oConfig);
+    }
+}
+
+/** @} */

+ 32 - 0
modules/boonex/elasticsearch/classes/BxElsModule.php

@@ -0,0 +1,32 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    ElasticSearch ElasticSearch
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxElsModule extends BxBaseModGeneralModule
+{
+    function __construct(&$aModule)
+    {
+        parent::__construct($aModule);
+    }
+
+    public function serviceAdd($sString, $iLanguageId = 0, $iOrig = 1)
+    {
+    }
+
+    public function serviceEdit($iKeyId, $sString, $iLanguageId = 0, $bMarkAsOrig = false, $bRemoveOther = false)
+    {
+    }
+
+    public function serviceDelete($iKeyId)
+    {
+    }
+}
+
+/** @} */

+ 31 - 0
modules/boonex/elasticsearch/classes/BxElsResponse.php

@@ -0,0 +1,31 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    ElasticSearch ElasticSearch
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxElsResponse extends BxDolAlertsResponse
+{
+    protected $_sModule;
+    protected $_oModule;
+
+    public function __construct()
+    {
+        parent::__construct();
+
+        $this->_sModule = 'bx_elasticsearch';
+        $this->_oModule = BxDolModule::getInstance($this->_sModule);
+    }
+
+    public function response($oAlert)
+    {
+        
+    }
+}
+
+/** @} */

+ 20 - 0
modules/boonex/elasticsearch/classes/BxElsTemplate.php

@@ -0,0 +1,20 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    ElasticSearch ElasticSearch
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxElsTemplate extends BxBaseModGeneralTemplate
+{
+    function __construct($oConfig, $oDb)
+    {
+        parent::__construct($oConfig, $oDb);
+    }
+}
+
+/** @} */

+ 72 - 0
modules/boonex/elasticsearch/install/config.php

@@ -0,0 +1,72 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    ElasticSearch ElasticSearch
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+$aConfig = array(
+    /**
+     * Main Section.
+     */
+    'type' => BX_DOL_MODULE_TYPE_MODULE,
+    'name' => 'bx_elasticsearch',
+    'title' => 'ElasticSearch',
+    'note' => 'Allows to translate content of the site on different languages',
+    'version' => '9.0.0',
+    'vendor' => 'BoonEx',
+    'help_url' => 'http://feed.boonex.com/?section={module_name}',
+
+    'compatible_with' => array(
+        '9.x.x'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/elasticsearch/',
+    'home_uri' => 'elasticsearch',
+
+    'db_prefix' => 'bx_els_',
+    'class_prefix' => 'BxEls',
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'ElasticSearch',
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 1,
+        'update_languages' => 1,
+     	'clear_db_cache' => 1,
+    ),
+    'uninstall' => array (
+        'execute_sql' => 1,
+        'update_languages' => 1,
+    	'clear_db_cache' => 1,
+    ),
+    'enable' => array(
+        'execute_sql' => 1,
+    	'process_form_check_functions' => 1,    //Note. It's essential to make this action AFTER 'execute_sql' one.
+        'clear_db_cache' => 1,
+    ),
+    'disable' => array (
+    	'process_form_check_functions' => 1,    //Note. It's essential to make this action BEFORE 'execute_sql' one.
+        'execute_sql' => 1,
+        'clear_db_cache' => 1,
+    ),
+
+    /**
+     * Dependencies Section
+     */
+    'dependencies' => array(),
+);
+
+/** @} */

+ 20 - 0
modules/boonex/elasticsearch/install/installer.php

@@ -0,0 +1,20 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    ElasticSearch ElasticSearch
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxElsInstaller extends BxDolStudioInstaller
+{
+    function __construct($aConfig)
+    {
+        parent::__construct($aConfig);
+    }
+}
+
+/** @} */

+ 26 - 0
modules/boonex/elasticsearch/install/langs/en.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources name="en" flag="gb" title="English">
+    <string name="_bx_mlc"><![CDATA[MLC]]></string>
+
+    <string name="_bx_mlc_option_summary_chars"><![CDATA[Number of characters in auto-cropped discussion summary]]></string>
+
+    <string name="_bx_mlc_lmi_cpt_keys"><![CDATA[Keys]]></string>
+
+    <string name="_bx_mlc_form_strings_input_submit"><![CDATA[Submit]]></string>
+    <string name="_bx_mlc_form_strings_input_close"><![CDATA[Close]]></string>
+    <string name="_bx_mlc_form_strings_popup_edit"><![CDATA[Edit Key]]></string>
+
+    <string name="_bx_mlc_grid_column_title_key"><![CDATA[Key]]></string>
+    <string name="_bx_mlc_grid_column_title_string"><![CDATA[Text]]></string>
+    <string name="_bx_mlc_grid_column_title_languages"><![CDATA[Languages]]></string>
+    <string name="_bx_mlc_grid_action_title_delete"><![CDATA[Delete]]></string>
+    <string name="_bx_mlc_grid_action_alt_edit"><![CDATA[Edit key]]></string>
+    <string name="_bx_mlc_grid_action_alt_delete"><![CDATA[Delete key]]></string>
+    <string name="_bx_mlc_grid_action_err_perform"><![CDATA[Cannot perform the action. Please report.]]></string>
+
+    
+    <string name=""><![CDATA[]]></string>
+    <string name=""><![CDATA[]]></string>
+    <string name=""><![CDATA[]]></string>
+    <string name=""><![CDATA[]]></string>
+</resources>

+ 24 - 0
modules/boonex/elasticsearch/install/sql/disable.sql

@@ -0,0 +1,24 @@
+
+-- SETTINGS
+DELETE FROM `top`, `toc`, `to` USING `sys_options_types` AS `top` LEFT JOIN `sys_options_categories` AS `toc` ON `top`.`id`=`toc`.`type_id` LEFT JOIN `sys_options` AS `to` ON `toc`.`id`=`to`.`category_id` WHERE `top`.`name` = 'bx_mlc';
+
+
+-- GRID
+DELETE FROM `sys_objects_grid` WHERE `object` IN ('bx_mlc_keys');
+DELETE FROM `sys_grid_fields` WHERE `object` IN ('bx_mlc_keys');
+DELETE FROM `sys_grid_actions` WHERE `object` IN ('bx_mlc_keys');
+
+
+-- FORM
+UPDATE `sys_form_inputs` SET `type`='text' WHERE `type`='text_mlc';
+UPDATE `sys_form_inputs` SET `type`='textarea' WHERE `type`='textarea_mlc';
+UPDATE `sys_form_inputs` SET `checker_func`='Avail' WHERE `checker_func`='AvailMlc';
+UPDATE `sys_form_inputs` SET `checker_func`='Length' WHERE `checker_func`='LengthMlc';
+
+
+-- INJECTIONS
+DELETE FROM `sys_injections` WHERE `name`='bx_mlc';
+
+
+-- CRON
+DELETE FROM `sys_cron_jobs` WHERE `name`='bx_mlc_translator';

+ 45 - 0
modules/boonex/elasticsearch/install/sql/enable.sql

@@ -0,0 +1,45 @@
+
+-- SETTINGS
+SET @iTypeOrder = (SELECT MAX(`order`) FROM `sys_options_types` WHERE `group` = 'modules');
+INSERT INTO `sys_options_types` (`group`, `name`, `caption`, `icon`, `order`) VALUES 
+('modules', 'bx_mlc', '_bx_mlc', 'bx_mlc@modules/boonex/mlc/|std-icon.svg', IF(NOT ISNULL(@iTypeOrder), @iTypeOrder + 1, 1));
+SET @iTypeId = LAST_INSERT_ID();
+
+INSERT INTO `sys_options_categories` (`type_id`, `name`, `caption`, `order` )  
+VALUES (@iTypeId, 'bx_mlc', '_bx_mlc', 1);
+SET @iCategId = LAST_INSERT_ID();
+
+--INSERT INTO `sys_options` (`name`, `value`, `category_id`, `caption`, `type`, `extra`, `check`, `check_error`, `order`) VALUES
+--('bx_mlc_autoapproval', 'on', @iCategId, '_bx_mlc_option_autoapproval', 'checkbox', '', '', '', 1);
+
+
+-- GRID
+INSERT INTO `sys_objects_grid` (`object`, `source_type`, `source`, `table`, `field_id`, `field_order`, `paginate_url`, `paginate_per_page`, `paginate_simple`, `paginate_get_start`, `paginate_get_per_page`, `filter_fields`, `filter_fields_translatable`, `filter_mode`, `sorting_fields`, `visible_for_levels`, `override_class_name`, `override_class_file`) VALUES
+('bx_mlc_keys', 'Sql', 'SELECT `tlk`.`id` AS `id`, `tlk`.`id` AS `key`, `tls`.`string` AS `string` FROM `bx_mlc_keys` AS `tlk` LEFT JOIN `bx_mlc_strings` AS `tls` ON `tlk`.`id`=`tls`.`key_id` WHERE `tls`.`orig`=\'1\' ', 'bx_mlc_keys', 'id', '', '', 20, NULL, 'start', '', 'string', '', 'like', 'string', 128, 'BxMlcGridKeys', 'modules/boonex/mlc/classes/BxMlcGridKeys.php');
+
+INSERT INTO `sys_grid_fields` (`object`, `name`, `title`, `width`, `translatable`, `chars_limit`, `params`, `order`) VALUES
+('bx_mlc_keys', 'checkbox', '', '2%', 0, '', '', 1),
+('bx_mlc_keys', 'key', '_bx_mlc_grid_column_title_key', '25%', 0, '16', '', 2),
+('bx_mlc_keys', 'string', '_bx_mlc_grid_column_title_string', '38%', 0, '32', '', 3),
+('bx_mlc_keys', 'languages', '_bx_mlc_grid_column_title_languages', '15%', 0, '', '', 4),
+('bx_mlc_keys', 'actions', '', '20%', 0, '', '', 5);
+
+INSERT INTO `sys_grid_actions` (`object`, `type`, `name`, `title`, `icon`, `icon_only`, `confirm`, `order`) VALUES
+('bx_mlc_keys', 'bulk', 'delete', '_bx_mlc_grid_action_title_delete', '', 0, 1, 1),
+('bx_mlc_keys', 'single', 'edit', '_bx_mlc_grid_action_alt_edit', 'pencil', 1, 0, 1),
+('bx_mlc_keys', 'single', 'delete', '_bx_mlc_grid_action_alt_delete', 'remove', 1, 1, 2);
+
+
+-- FORM
+UPDATE `sys_form_inputs` SET `type`='text_mlc' WHERE `type`='text' AND `module` NOT IN ('bx_developer', 'bx_payment') AND `object` NOT IN ('sys_login', 'sys_account', 'sys_forgot_password') AND `name` NOT IN ('email', 'keyword', 'price_single', 'trial_recurring') AND `checker_func` NOT IN ('EmailUniq', 'EmailExist');
+UPDATE `sys_form_inputs` SET `type`='textarea_mlc' WHERE `type`='textarea' AND `module` NOT IN ('bx_developer', 'bx_payment');
+
+
+-- INJECTIONS
+INSERT INTO `sys_injections` (`name`, `page_index`, `key`, `type`, `data`, `replace`, `active`) VALUES
+('bx_mlc', 0, 'injection_head', 'service', 'a:2:{s:6:"module";s:6:"bx_mlc";s:6:"method";s:14:"include_css_js";}', 0, 1);
+
+
+-- CRON
+INSERT INTO `sys_cron_jobs` (`name`, `time`, `class`, `file`, `service_call`) VALUES
+('bx_mlc_translator', '* * * * *', 'BxMlcCronTranslator', 'modules/boonex/mlc/classes/BxMlcCronTranslator.php', '');

+ 28 - 0
modules/boonex/elasticsearch/install/sql/install.sql

@@ -0,0 +1,28 @@
+
+-- Tables
+CREATE TABLE IF NOT EXISTS `bx_mlc_keys` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  PRIMARY KEY (`id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_mlc_strings` (
+  `key_id` int(11) NOT NULL DEFAULT '0',
+  `language_id` int(11) unsigned NOT NULL DEFAULT '0',
+  `string` text NOT NULL DEFAULT '',
+  `orig` tinyint(4) unsigned NOT NULL DEFAULT '0',
+  PRIMARY KEY (`key_id`,`language_id`),
+  FULLTEXT KEY `string` (`string`)
+);
+
+
+-- Studio page and widget
+INSERT INTO `sys_std_pages`(`index`, `name`, `header`, `caption`, `icon`) VALUES
+(3, 'bx_mlc', '_bx_mlc', '_bx_mlc', 'bx_mlc@modules/boonex/mlc/|std-icon.svg');
+SET @iPageId = LAST_INSERT_ID();
+
+SET @iParentPageId = (SELECT `id` FROM `sys_std_pages` WHERE `name` = 'home');
+SET @iParentPageOrder = (SELECT MAX(`order`) FROM `sys_std_pages_widgets` WHERE `page_id` = @iParentPageId);
+INSERT INTO `sys_std_widgets` (`page_id`, `module`, `url`, `click`, `icon`, `caption`, `cnt_notices`, `cnt_actions`) VALUES
+(@iPageId, 'bx_mlc', '{url_studio}module.php?name=bx_mlc&page=settings', '', 'bx_mlc@modules/boonex/mlc/|std-icon.svg', '_bx_mlc', '', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:11:"get_actions";s:6:"params";a:0:{}s:5:"class";s:18:"TemplStudioModules";}');
+INSERT INTO `sys_std_pages_widgets` (`page_id`, `widget_id`, `order`) VALUES
+(@iParentPageId, LAST_INSERT_ID(), IF(ISNULL(@iParentPageOrder), 1, @iParentPageOrder + 1));

+ 9 - 0
modules/boonex/elasticsearch/install/sql/uninstall.sql

@@ -0,0 +1,9 @@
+
+-- Tables
+DROP TABLE IF EXISTS `bx_mlc_keys`, `bx_mlc_strings`;
+
+
+-- Studio page and widget
+DELETE FROM `tp`, `tw`, `tpw`
+USING `sys_std_pages` AS `tp`, `sys_std_widgets` AS `tw`, `sys_std_pages_widgets` AS `tpw`
+WHERE `tp`.`id` = `tw`.`page_id` AND `tw`.`id` = `tpw`.`widget_id` AND `tp`.`name` = 'bx_mlc';

+ 18 - 0
modules/boonex/elasticsearch/request.php

@@ -0,0 +1,18 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    ElasticSearch ElasticSearch
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+require_once(BX_DIRECTORY_PATH_INC . 'profiles.inc.php');
+
+check_logged();
+
+BxDolRequest::processAsAction($GLOBALS['aModule'], $GLOBALS['aRequest']);
+
+/** @} */

+ 199 - 0
modules/boonex/elasticsearch/template/images/icons/std-icon.svg

@@ -0,0 +1,199 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="600px" height="600px" viewBox="0 0 600 600" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 40.3 (33839) - http://www.bohemiancoding.com/sketch -->
+    <title>Group 2 Copy 13</title>
+    <desc>Created with Sketch.</desc>
+    <defs>
+        <linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-1">
+            <stop stop-color="#FFFFFF" stop-opacity="0.2" offset="0%"></stop>
+            <stop stop-color="#000000" stop-opacity="0.138870018" offset="100%"></stop>
+        </linearGradient>
+        <linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-2">
+            <stop stop-color="#FFFFFF" offset="0%"></stop>
+            <stop stop-color="#F6F6F6" offset="35.2427758%"></stop>
+            <stop stop-color="#E5E5E5" offset="100%"></stop>
+        </linearGradient>
+        <path d="M200,0 L199.807692,0 C199.807692,0 199.807692,0 199.711538,0 L199.519231,0 C89.2307692,0.288461538 0,89.7115385 0,200 C0,310.288462 89.2307692,399.711538 199.519231,400 L199.711538,400 L199.807692,400 L200,400 C310.480769,400 400,310.480769 400,200 C400,89.5192308 310.480769,0 200,0 L200,0 Z M200,384.038462 L199.807692,384.038462 C199.807692,384.038462 199.807692,384.038462 199.711538,384.038462 L199.519231,384.038462 C98.1730769,383.75 15.9615385,301.442308 15.9615385,200 C15.9615385,98.5576923 98.0769231,16.25 199.519231,16.0576923 L199.711538,16.0576923 L199.807692,16.0576923 L200,16.0576923 C301.634615,16.0576923 384.038462,98.4615385 384.038462,200.096154 C384.038462,301.634615 301.634615,384.038462 200,384.038462 L200,384.038462 Z" id="path-3"></path>
+        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-4">
+            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <path d="M263.75,119.038462 C245.769231,123.365385 227.211538,125.961538 208.076923,126.538462 L208.076923,192.019231 L273.076923,192.019231 C272.5,165 269.134615,140.480769 263.75,119.038462 L263.75,119.038462 Z" id="path-5"></path>
+        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-6">
+            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <path d="M207.980769,33.1730769 L207.980769,111.923077 C225.769231,111.346154 243.076923,109.038462 259.711538,105 C247.115385,65.1923077 227.5,39.0384615 207.980769,33.1730769 L207.980769,33.1730769 Z" id="path-7"></path>
+        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-8">
+            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <path d="M139.807692,104.903846 C156.634615,108.942308 174.038462,111.346154 191.923077,111.923077 L191.923077,32.9807692 C172.403846,38.6538462 152.5,64.8076923 139.807692,104.903846 L139.807692,104.903846 Z" id="path-9"></path>
+        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-10">
+            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <path d="M319.807692,82.1153846 C298.076923,60 270.288462,43.8461538 239.134615,36.4423077 C253.365385,51.1538462 265.288462,73.6538462 273.846154,101.153846 C289.903846,96.25 305.288462,89.9038462 319.807692,82.1153846 L319.807692,82.1153846 Z" id="path-11"></path>
+        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-12">
+            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <path d="M287.788462,192.019231 L367.884615,192.019231 C366.153846,154.711538 352.211538,120.480769 329.903846,93.3653846 C313.461538,102.403846 296.057692,109.807692 277.884615,115.288462 C283.75,138.365385 287.211538,164.423077 287.788462,192.019231 L287.788462,192.019231 Z" id="path-13"></path>
+        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-14">
+            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <path d="M126.442308,192.019231 L192.019231,192.019231 L192.019231,126.538462 C172.692308,125.961538 153.942308,123.365385 135.865385,118.942308 C130.384615,140.384615 127.019231,165 126.442308,192.019231 L126.442308,192.019231 Z" id="path-15"></path>
+        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-16">
+            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <path d="M273.076923,207.980769 L207.980769,207.980769 L207.980769,273.365385 C227.115385,273.942308 245.769231,276.442308 263.75,280.865385 C269.134615,259.519231 272.5,234.903846 273.076923,207.980769 L273.076923,207.980769 Z" id="path-17"></path>
+        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-18">
+            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <path d="M135.865385,280.961538 C153.942308,276.538462 172.692308,273.942308 192.019231,273.365385 L192.019231,207.980769 L126.442308,207.980769 C127.019231,235 130.384615,259.615385 135.865385,280.961538 L135.865385,280.961538 Z" id="path-19"></path>
+        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-20">
+            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <path d="M192.019231,366.923077 L192.019231,287.980769 C174.134615,288.557692 156.634615,290.961538 139.807692,295 C152.5,335.096154 172.403846,361.346154 192.019231,366.923077 L192.019231,366.923077 Z" id="path-21"></path>
+        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-22">
+            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <path d="M239.134615,363.557692 C270.288462,356.057692 298.076923,340 319.903846,317.788462 C305.384615,310 290,303.653846 273.942308,298.75 C265.384615,326.346154 253.365385,348.75 239.134615,363.557692 L239.134615,363.557692 Z" id="path-23"></path>
+        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-24">
+            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <path d="M160.288462,36.6346154 C129.423077,44.1346154 101.826923,60.1923077 80.1923077,82.2115385 C94.6153846,89.9038462 109.807692,96.25 125.673077,101.057692 C134.230769,73.6538462 146.153846,51.3461538 160.288462,36.6346154 L160.288462,36.6346154 Z" id="path-25"></path>
+        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-26">
+            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <path d="M277.884615,284.711538 C296.153846,290.192308 313.557692,297.596154 330,306.634615 C352.307692,279.519231 366.25,245.288462 367.980769,207.980769 L287.884615,207.980769 C287.211538,235.576923 283.75,261.538462 277.884615,284.711538 L277.884615,284.711538 Z" id="path-27"></path>
+        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-28">
+            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <path d="M207.980769,287.980769 L207.980769,366.826923 C227.5,360.961538 247.115385,334.807692 259.711538,294.903846 C243.076923,290.865385 225.769231,288.557692 207.980769,287.980769 L207.980769,287.980769 Z" id="path-29"></path>
+        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-30">
+            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <path d="M121.730769,115.192308 C103.653846,109.711538 86.3461538,102.403846 70.0961538,93.3653846 C47.7884615,120.480769 33.8461538,154.711538 32.1153846,192.019231 L111.826923,192.019231 C112.307692,164.326923 115.865385,138.269231 121.730769,115.192308 L121.730769,115.192308 Z" id="path-31"></path>
+        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-32">
+            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <path d="M111.730769,207.980769 L32.0192308,207.980769 C33.75,245.288462 47.6923077,279.519231 70,306.634615 C86.25,297.692308 103.557692,290.288462 121.634615,284.807692 C115.865385,261.730769 112.307692,235.673077 111.730769,207.980769 L111.730769,207.980769 Z" id="path-33"></path>
+        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-34">
+            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+        <path d="M80.0961538,317.788462 C101.730769,339.807692 129.326923,355.865385 160.288462,363.365385 C146.153846,348.653846 134.230769,326.25 125.673077,298.846154 C109.807692,303.75 94.5192308,310.096154 80.0961538,317.788462 L80.0961538,317.788462 Z" id="path-35"></path>
+        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-36">
+            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
+        </filter>
+    </defs>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="Group-2-Copy-13">
+            <path d="M552.268958,552.268958 C600,504.537813 600,431.458333 600,300 C600,168.541667 600,95.4621875 552.268958,47.7310417 C504.537813,0 431.458333,0 300,0 C168.541667,0 95.4621875,0 47.7310417,47.7310417 C0,95.4621875 0,168.541667 0,300 C0,431.458333 0,504.537813 47.7310417,552.268958 C95.4621875,600 168.541667,600 300,600 C431.458333,600 504.537813,600 552.268958,552.268958 L552.268958,552.268958 Z" id="path-copy-14" fill="#FF4D63"></path>
+            <path d="M552.268958,552.268958 C600,504.537813 600,431.458333 600,300 C600,168.541667 600,95.4621875 552.268958,47.7310417 C504.537813,0 431.458333,0 300,0 C168.541667,0 95.4621875,0 47.7310417,47.7310417 C0,95.4621875 0,168.541667 0,300 C0,431.458333 0,504.537813 47.7310417,552.268958 C95.4621875,600 168.541667,600 300,600 C431.458333,600 504.537813,600 552.268958,552.268958 L552.268958,552.268958 Z" id="path-copy" fill="url(#linearGradient-1)"></path>
+            <g id="ios-world" transform="translate(100.000000, 104.000000)">
+                <g id="Layer_1">
+                    <g id="Group">
+                        <g id="Shape">
+                            <use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-3"></use>
+                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-3"></use>
+                        </g>
+                        <g id="Shape" opacity="0.5">
+                            <use fill="black" fill-opacity="1" filter="url(#filter-6)" xlink:href="#path-5"></use>
+                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-5"></use>
+                        </g>
+                        <g id="Shape" opacity="0.5">
+                            <use fill="black" fill-opacity="1" filter="url(#filter-8)" xlink:href="#path-7"></use>
+                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-7"></use>
+                        </g>
+                        <g id="Shape" opacity="0.5">
+                            <use fill="black" fill-opacity="1" filter="url(#filter-10)" xlink:href="#path-9"></use>
+                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-9"></use>
+                        </g>
+                        <g id="Shape" opacity="0.5">
+                            <use fill="black" fill-opacity="1" filter="url(#filter-12)" xlink:href="#path-11"></use>
+                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-11"></use>
+                        </g>
+                        <g id="Shape" opacity="0.5">
+                            <use fill="black" fill-opacity="1" filter="url(#filter-14)" xlink:href="#path-13"></use>
+                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-13"></use>
+                        </g>
+                        <g id="Shape" opacity="0.5">
+                            <use fill="black" fill-opacity="1" filter="url(#filter-16)" xlink:href="#path-15"></use>
+                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-15"></use>
+                        </g>
+                        <g id="Shape" opacity="0.5">
+                            <use fill="black" fill-opacity="1" filter="url(#filter-18)" xlink:href="#path-17"></use>
+                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-17"></use>
+                        </g>
+                        <g id="Shape" opacity="0.5">
+                            <use fill="black" fill-opacity="1" filter="url(#filter-20)" xlink:href="#path-19"></use>
+                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-19"></use>
+                        </g>
+                        <g id="Shape" opacity="0.5">
+                            <use fill="black" fill-opacity="1" filter="url(#filter-22)" xlink:href="#path-21"></use>
+                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-21"></use>
+                        </g>
+                        <g id="Shape" opacity="0.5">
+                            <use fill="black" fill-opacity="1" filter="url(#filter-24)" xlink:href="#path-23"></use>
+                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-23"></use>
+                        </g>
+                        <g id="Shape" opacity="0.5">
+                            <use fill="black" fill-opacity="1" filter="url(#filter-26)" xlink:href="#path-25"></use>
+                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-25"></use>
+                        </g>
+                        <g id="Shape" opacity="0.5">
+                            <use fill="black" fill-opacity="1" filter="url(#filter-28)" xlink:href="#path-27"></use>
+                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-27"></use>
+                        </g>
+                        <g id="Shape" opacity="0.5">
+                            <use fill="black" fill-opacity="1" filter="url(#filter-30)" xlink:href="#path-29"></use>
+                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-29"></use>
+                        </g>
+                        <g id="Shape" opacity="0.5">
+                            <use fill="black" fill-opacity="1" filter="url(#filter-32)" xlink:href="#path-31"></use>
+                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-31"></use>
+                        </g>
+                        <g id="Shape" opacity="0.5">
+                            <use fill="black" fill-opacity="1" filter="url(#filter-34)" xlink:href="#path-33"></use>
+                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-33"></use>
+                        </g>
+                        <g id="Shape" opacity="0.5">
+                            <use fill="black" fill-opacity="1" filter="url(#filter-36)" xlink:href="#path-35"></use>
+                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-35"></use>
+                        </g>
+                    </g>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>