Merged in feature/HOR-3629 (pull request #5900)

Feature/HOR-3629

Approved-by: Julio Cesar Laura Avendaño <contact@julio-laura.com>
This commit is contained in:
Ronald Quenta
2017-08-11 03:48:37 +00:00
committed by Julio Cesar Laura Avendaño
127 changed files with 7914 additions and 1103 deletions

View File

@@ -1,4 +1,7 @@
<?php
use ProcessMaker\Plugins\PluginRegistry;
require_once 'classes/model/om/BaseAddonsManager.php';
require_once PATH_CORE . 'classes' . PATH_SEP . 'class.enterpriseUtils.php';
@@ -113,9 +116,8 @@ class AddonsManager extends BaseAddonsManager
if (!$this->isInstalled()) {
return false;
}
$oPluginRegistry = &PMPluginRegistry::getSingleton();
$status = $oPluginRegistry->getStatusPlugin($this->getAddonName());
return (strcmp($status, "enabled") == 0);
$oPluginRegistry = PluginRegistry::loadSingleton();
return $oPluginRegistry->isEnable($this->getAddonName());
} else {
throw new Exception("Addon type '{$this->getAddonType()}' unsupported");
}
@@ -130,7 +132,7 @@ class AddonsManager extends BaseAddonsManager
return false;
}
$oPluginRegistry = &PMPluginRegistry::getSingleton();
$oPluginRegistry = PluginRegistry::loadSingleton();
$filter = new InputFilter();
@@ -139,19 +141,12 @@ class AddonsManager extends BaseAddonsManager
require_once ($requiredPath);
if ($enable) {
//$oDetails = $oPluginRegistry->getPluginDetails($this->getAddonName());
//$oPluginRegistry->enablePlugin($oDetails->sNamespace);
//require_once (PATH_PLUGINS . $this->getAddonName() . ".php"); //ok
$oPluginRegistry->enablePlugin($this->getAddonName());
$oPluginRegistry->setupPlugins(); //get and setup enabled plugins
} else {
//$oDetails = $oPluginRegistry->getPluginDetails($this->getAddonName());
//$oPluginRegistry->disablePlugin($oDetails->sNamespace);
$oPluginRegistry->disablePlugin($this->getAddonName());
}
//$oPluginRegistry->setupPlugins();
file_put_contents(PATH_DATA_SITE . "plugin.singleton", $oPluginRegistry->serializeInstance());
$oPluginRegistry->savePlugin($this->getAddonName());
return true;
}
@@ -170,9 +165,9 @@ class AddonsManager extends BaseAddonsManager
return (null);
}
$oPluginRegistry = &PMPluginRegistry::getSingleton();
$oPluginRegistry = PluginRegistry::loadSingleton();
$details = $oPluginRegistry->getPluginDetails($this->getAddonName() . ".php");
$v = (!($details == null))? $details->iVersion : null;
$v = (!($details == null))? $details->getVersion() : null;
if ($v != "") {
return ($v);
@@ -387,7 +382,7 @@ class AddonsManager extends BaseAddonsManager
$_SESSION["__ENTERPRISE_INSTALL__"] = 1;
}
$oPluginRegistry = &PMPluginRegistry::getSingleton();
$oPluginRegistry = PluginRegistry::loadSingleton();
$oPluginRegistry->installPluginArchive($filename, $this->getAddonName());
$this->setState();
@@ -410,7 +405,7 @@ class AddonsManager extends BaseAddonsManager
return false;
}
$oPluginRegistry = &PMPluginRegistry::getSingleton();
$oPluginRegistry = PluginRegistry::loadSingleton();
$oPluginRegistry->uninstallPlugin($this->getAddonName());
return true;

View File

@@ -1,4 +1,7 @@
<?php
use ProcessMaker\Plugins\PluginRegistry;
require_once 'classes/model/om/BaseAddonsStore.php';
define("STORE_VERSION", 1);
@@ -348,7 +351,7 @@ class AddonsStore extends BaseAddonsStore
//Fill with local information
//List all plugins installed
$oPluginRegistry = &PMPluginRegistry::getSingleton();
$oPluginRegistry = PluginRegistry::loadSingleton();
$aPluginsPP = array();
if (file_exists(PATH_DATA_SITE . 'ee')) {
@@ -368,10 +371,10 @@ class AddonsStore extends BaseAddonsStore
$oDetails = $oPluginRegistry->getPluginDetails($sClassName . '.php');
if ($oDetails) {
$sStatus = $oDetails->enabled ? G::LoadTranslation('ID_ENABLED') : G::LoadTranslation('ID_DISABLED');
$sStatus = $oDetails->isEnabled() ? G::LoadTranslation('ID_ENABLED') : G::LoadTranslation('ID_DISABLED');
if (isset($oDetails->aWorkspaces)) {
if (!in_array(SYS_SYS, $oDetails->aWorkspaces)) {
if ($oDetails->getWorkspaces()) {
if (!in_array(SYS_SYS, $oDetails->getWorkspaces())) {
continue;
}
}
@@ -380,16 +383,16 @@ class AddonsStore extends BaseAddonsStore
continue;
}
$sEdit = (($oDetails->sSetupPage != '') && ($oDetails->enabled)? G::LoadTranslation('ID_SETUP') : ' ');
$sEdit = (($oDetails->getSetupPage() != '') && ($oDetails->isEnabled())? G::LoadTranslation('ID_SETUP') : ' ');
$aPlugin = array();
$aPluginId = $sClassName;
$aPluginTitle = $oDetails->sFriendlyName;
$aPluginDescription = $oDetails->sDescription;
$aPluginVersion = $oDetails->iVersion;
$aPluginTitle = $oDetails->getFriendlyName();
$aPluginDescription = $oDetails->getDescription();
$aPluginVersion = $oDetails->getVersion();
if (@in_array($sClassName, $pmLicenseManagerO->features)) {
$aPluginStatus = $sStatus;
$aPluginLinkStatus = 'pluginsChange?id=' . $sClassName . '.php&status=' . $oDetails->enabled;
$aPluginLinkStatus = 'pluginsChange?id=' . $sClassName . '.php&status=' . $oDetails->isEnabled();
$aPluginEdit = $sEdit;
$aPluginLinkEdit = 'pluginsSetup?id=' . $sClassName . '.php';
$aPluginStatusA = $sStatus == "Enabled" ? "installed" : 'disabled';

View File

@@ -25,6 +25,8 @@
*
*/
use ProcessMaker\Plugins\PluginRegistry;
/**
* Skeleton subclass for representing a row from the 'APP_DELEGATION' table.
*
@@ -292,7 +294,7 @@ class AppDelegation extends BaseAppDelegation
}
if ($flagActionsByEmail) {
$oPluginRegistry = &PMPluginRegistry::getSingleton();
$oPluginRegistry = PluginRegistry::loadSingleton();
$oPluginRegistry->executeTriggers(PM_CREATE_NEW_DELEGATION, $data);
}
}

View File

@@ -5,8 +5,7 @@
* @package workflow.engine.classes.model
*/
//require_once 'classes/model/om/BaseAppFolder.php';
//require_once 'classes/model/Application.php';
use ProcessMaker\Plugins\PluginRegistry;
/**
* Skeleton subclass for representing a row from the 'APP_FOLDER' table.
@@ -724,7 +723,7 @@ class AppFolder extends BaseAppFolder
}
if (! empty( $row1["APP_DOC_PLUGIN"] )) {
$pluginRegistry = &PMPluginRegistry::getSingleton();
$pluginRegistry = PluginRegistry::loadSingleton();
$pluginName = $row1["APP_DOC_PLUGIN"];
$fieldValue = "";
@@ -732,7 +731,7 @@ class AppFolder extends BaseAppFolder
$pluginDetail = $pluginRegistry->getPluginDetails( $pluginName . ".php" );
if ($pluginDetail) {
if ($pluginDetail->enabled) {
if ($pluginDetail->isEnabled()) {
require_once (PATH_PLUGINS . $pluginName . ".php");
$pluginNameClass = $pluginName . "Plugin";
$objPluginClass = new $pluginNameClass( $pluginName );

View File

@@ -5,10 +5,7 @@
* @package workflow.engine.classes.model
*/
//require_once 'classes/model/om/BaseCaseScheduler.php';
//require_once 'classes/model/Process.php';
//require_once 'classes/model/Task.php';
use ProcessMaker\Plugins\PluginRegistry;
/**
* Skeleton subclass for representing a row from the 'CASE_SCHEDULER' table.
@@ -448,6 +445,8 @@ class CaseScheduler extends BaseCaseScheduler
$params = array("sessionId" => $sessionId, "processId" => $processId, "taskId" => $taskId, "variables" => array());
//Here we are loading all plugins registered
$oPluginRegistry = PluginRegistry::loadSingleton();
//If this Job was was registered to be performed by a plugin
if (isset($row["CASE_SH_PLUGIN_UID"]) && $row["CASE_SH_PLUGIN_UID"] != "") {
//Check if the plugin is active
@@ -455,18 +454,7 @@ class CaseScheduler extends BaseCaseScheduler
if (count($pluginParts) == 2) {
//Here we are loading all plugins registered
//The singleton has a list of enabled plugins
$sSerializedFile = PATH_DATA_SITE . "plugin.singleton";
$oPluginRegistry = &PMPluginRegistry::getSingleton();
if (file_exists($sSerializedFile)) {
$oPluginRegistry->unSerializeInstance(file_get_contents($sSerializedFile));
}
$oPluginRegistry = &PMPluginRegistry::getSingleton();
$activePluginsForCaseScheduler = $oPluginRegistry->getCaseSchedulerPlugins();
foreach ($activePluginsForCaseScheduler as $key => $caseSchedulerPlugin) {
if (isset($caseSchedulerPlugin->sNamespace) && $caseSchedulerPlugin->sNamespace == $pluginParts[0] && isset($caseSchedulerPlugin->sActionId) && $caseSchedulerPlugin->sActionId == $pluginParts[1]) {
$caseSchedulerSelected = $caseSchedulerPlugin;
@@ -498,8 +486,6 @@ class CaseScheduler extends BaseCaseScheduler
$paramsAux = $params;
$paramsAux["executeTriggers"] = 1;
$oPluginRegistry = &PMPluginRegistry::getSingleton();
if ($oPluginRegistry->existsTrigger(PM_SCHEDULER_CREATE_CASE_BEFORE)) {
$oPluginRegistry->executeTriggers(PM_SCHEDULER_CREATE_CASE_BEFORE, $paramsAux);
}

View File

@@ -0,0 +1,247 @@
<?php
require_once 'classes/model/om/BasePluginsRegistry.php';
/**
* Skeleton subclass for representing a row from the 'PLUGINS_REGISTRY' table.
*
*
*
* You should add additional methods to this class to meet the
* application requirements. This class will only be generated as
* long as it does not already exist in the output directory.
*
* @package classes.model
*/
class PluginsRegistry extends BasePluginsRegistry
{
/**
* Load all Plugins
* @param string $keyType
* @return array
* @throws \Exception
*/
public static function loadPlugins($keyType = BasePeer::TYPE_FIELDNAME)
{
$criteria = new Criteria();
$dataSet = PluginsRegistryPeer::doSelect($criteria);
$plugins = [];
/** @var PluginsRegistry $row */
foreach ($dataSet as $row) {
$plugins[] = $row->toArray($keyType);
}
return $plugins;
}
/**
* Get all Plugins Enabled
* @param string $keyType
* @return array
*/
public static function getPluginsEnabled($keyType = BasePeer::TYPE_FIELDNAME)
{
$criteria = new Criteria();
$criteria->add(PluginsRegistryPeer::PLUGIN_ENABLE, true);
$dataSet = PluginsRegistryPeer::doSelect($criteria);
$plugins = [];
/** @var PluginsRegistry $row */
foreach ($dataSet as $row) {
$plugins[] = $row->toArray($keyType);
}
return $plugins;
}
/**
* Load plugin with Uid
* @param string $prUid
* @return array
* @throws Exception
*/
public static function load($prUid)
{
$oPluginsRegistry = PluginsRegistryPeer::retrieveByPK($prUid);
if ($oPluginsRegistry) {
/** @var array $aFields */
$aFields = $oPluginsRegistry->toArray(BasePeer::TYPE_FIELDNAME);
return $aFields;
} else {
throw new Exception("Plugin does not exist!");
}
}
/**
* Check if there is a plugin uid
* @param $prUid
* @return mixed|bool
*/
public static function exists($prUid)
{
$oPluginsRegistry = PluginsRegistryPeer::retrieveByPk($prUid);
if ($oPluginsRegistry) {
return true;
} else {
return false;
}
}
/**
* Load or creates if the record does not exist
* Load and makes a union with the data sent
*
* @param string $prUid
* @param array $pluginData
* @return array
*/
public static function loadOrCreateIfNotExists($prUid, $pluginData = [])
{
if (!self::exists($prUid)) {
$pluginData['PR_UID'] = $prUid;
self::create($pluginData);
} else {
$fields = self::load($prUid);
$pluginData = array_merge($fields, $pluginData);
}
return $pluginData;
}
/**
* Creates a record in the PLUGINS_REGISTRY table
* @param array $aData
* @return bool
* @throws Exception
*/
public static function create($aData)
{
$oConnection = Propel::getConnection(PluginsRegistryPeer::DATABASE_NAME);
try {
$oPluginsRegistry = new PluginsRegistry();
$oPluginsRegistry->fromArray($aData, BasePeer::TYPE_FIELDNAME);
if ($oPluginsRegistry->validate()) {
$oConnection->begin();
$oPluginsRegistry->save();
$oConnection->commit();
return true;
} else {
$sMessage = '';
$aValidationFailures = $oPluginsRegistry->getValidationFailures();
/** @var ValidationFailed $oValidationFailure */
foreach ($aValidationFailures as $oValidationFailure) {
$sMessage .= $oValidationFailure->getMessage() . '<br />';
}
throw (new Exception('The registry cannot be created!<br />' . $sMessage));
}
} catch (Exception $oError) {
$oConnection->rollback();
throw ($oError);
}
}
/**
* Modifies a record in the PLUGINS_REGISTRY table
* @param array $aData
* @return int
* @throws Exception
*/
public static function update($aData)
{
$oConnection = Propel::getConnection(PluginsRegistryPeer::DATABASE_NAME);
try {
$oPluginsRegistry = PluginsRegistryPeer::retrieveByPK($aData['PR_UID']);
if ($oPluginsRegistry) {
$oPluginsRegistry->fromArray($aData, BasePeer::TYPE_FIELDNAME);
if ($oPluginsRegistry->validate()) {
$oConnection->begin();
$iResult = $oPluginsRegistry->save();
$oConnection->commit();
return $iResult;
} else {
$sMessage = '';
$aValidationFailures = $oPluginsRegistry->getValidationFailures();
/** @var ValidationFailed $oValidationFailure */
foreach ($aValidationFailures as $oValidationFailure) {
$sMessage .= $oValidationFailure->getMessage() . '<br />';
}
throw (new Exception('The registry cannot be updated!<br />' . $sMessage));
}
} else {
throw (new Exception('This row doesn\'t exist!'));
}
} catch (Exception $oError) {
$oConnection->rollback();
throw ($oError);
}
}
/**
* Activate a plugin with your name
* @param string $Namespace
* @return int
* @throws Exception
*/
public static function enable($Namespace)
{
$oConnection = Propel::getConnection(PluginsRegistryPeer::DATABASE_NAME);
try {
$oPluginsRegistry = PluginsRegistryPeer::retrieveByPK(md5($Namespace));
if ($oPluginsRegistry) {
$oPluginsRegistry->fromArray(['PLUGIN_ENABLE' => true], BasePeer::TYPE_FIELDNAME);
if ($oPluginsRegistry->validate()) {
$oConnection->begin();
$iResult = $oPluginsRegistry->save();
$oConnection->commit();
return $iResult;
} else {
$sMessage = '';
$aValidationFailures = $oPluginsRegistry->getValidationFailures();
/** @var ValidationFailed $oValidationFailure */
foreach ($aValidationFailures as $oValidationFailure) {
$sMessage .= $oValidationFailure->getMessage() . '<br />';
}
throw (new Exception('The registry cannot be updated!<br />' . $sMessage));
}
} else {
throw (new Exception('This Plugin doesn\'t exist!'));
}
} catch (Exception $oError) {
$oConnection->rollback();
throw ($oError);
}
}
/**
* Disable a plugin with your name
* @param string $Namespace
* @return int
* @throws Exception
*/
public static function disable($Namespace)
{
$oConnection = Propel::getConnection(PluginsRegistryPeer::DATABASE_NAME);
try {
$oPluginsRegistry = PluginsRegistryPeer::retrieveByPK(md5($Namespace));
if ($oPluginsRegistry) {
$oPluginsRegistry->fromArray(['PLUGIN_ENABLE' => false], BasePeer::TYPE_FIELDNAME);
if ($oPluginsRegistry->validate()) {
$oConnection->begin();
$iResult = $oPluginsRegistry->save();
$oConnection->commit();
return $iResult;
} else {
$sMessage = '';
$aValidationFailures = $oPluginsRegistry->getValidationFailures();
/** @var ValidationFailed $oValidationFailure */
foreach ($aValidationFailures as $oValidationFailure) {
$sMessage .= $oValidationFailure->getMessage() . '<br />';
}
throw (new Exception('The registry cannot be updated!<br />' . $sMessage));
}
} else {
throw (new Exception('This Plugin doesn\'t exist!'));
}
} catch (Exception $oError) {
$oConnection->rollback();
throw ($oError);
}
}
}

View File

@@ -0,0 +1,23 @@
<?php
// include base peer class
require_once 'classes/model/om/BasePluginsRegistryPeer.php';
// include object class
include_once 'classes/model/PluginsRegistry.php';
/**
* Skeleton subclass for performing query and update operations on the 'PLUGINS_REGISTRY' table.
*
*
*
* You should add additional methods to this class to meet the
* application requirements. This class will only be generated as
* long as it does not already exist in the output directory.
*
* @package classes.model
*/
class PluginsRegistryPeer extends BasePluginsRegistryPeer {
} // PluginsRegistryPeer

View File

@@ -1,5 +1,7 @@
<?php
use ProcessMaker\Plugins\PluginRegistry;
require_once 'classes/model/om/BaseUsersProperties.php';
/**
@@ -320,15 +322,17 @@ class UsersProperties extends BaseUsersProperties
$userRole = $RBAC->aUserInfo['PROCESSMAKER']['ROLE']['ROL_CODE'];
}
$oPluginRegistry = &PMPluginRegistry::getSingleton();
$oPluginRegistry = PluginRegistry::loadSingleton();
$aRedirectLogin = $oPluginRegistry->getRedirectLogins();
if (isset( $aRedirectLogin ) && is_array( $aRedirectLogin )) {
foreach ($aRedirectLogin as $key => $detail) {
if (isset( $detail->sPathMethod ) && $detail->sRoleCode == $userRole) {
if (isset($aRedirectLogin) && is_array($aRedirectLogin)) {
/** @var \ProcessMaker\Plugins\Interfaces\RedirectDetail $detail */
foreach ($aRedirectLogin as $detail) {
$pathMethod = $detail->getPathMethod();
if (isset($pathMethod) && $detail->equalRoleCodeTo($userRole)) {
if (isset($_COOKIE['workspaceSkin'])) {
$url = '/sys' . SYS_SYS . '/' . $this->lang . '/' . $_COOKIE['workspaceSkin'] . '/' . $detail->sPathMethod;
$url = '/sys' . SYS_SYS . '/' . $this->lang . '/' . $_COOKIE['workspaceSkin'] . '/' . $pathMethod;
} else {
$url = '/sys' . SYS_SYS . '/' . $this->lang . '/' . SYS_SKIN . '/' . $detail->sPathMethod;
$url = '/sys' . SYS_SYS . '/' . $this->lang . '/' . SYS_SKIN . '/' . $pathMethod;
}
}
}

View File

@@ -0,0 +1,118 @@
<?php
require_once 'propel/map/MapBuilder.php';
include_once 'creole/CreoleTypes.php';
/**
* This class adds structure of 'PLUGINS_REGISTRY' table to 'workflow' DatabaseMap object.
*
*
*
* These statically-built map classes are used by Propel to do runtime db structure discovery.
* For example, the createSelectSql() method checks the type of a given column used in an
* ORDER BY clause to know whether it needs to apply SQL to make the ORDER BY case-insensitive
* (i.e. if it's a text column type).
*
* @package workflow.classes.model.map
*/
class PluginsRegistryMapBuilder
{
/**
* The (dot-path) name of this class
*/
const CLASS_NAME = 'classes.model.map.PluginsRegistryMapBuilder';
/**
* The database map.
*/
private $dbMap;
/**
* Tells us if this DatabaseMapBuilder is built so that we
* don't have to re-build it every time.
*
* @return boolean true if this DatabaseMapBuilder is built, false otherwise.
*/
public function isBuilt()
{
return ($this->dbMap !== null);
}
/**
* Gets the databasemap this map builder built.
*
* @return the databasemap
*/
public function getDatabaseMap()
{
return $this->dbMap;
}
/**
* The doBuild() method builds the DatabaseMap
*
* @return void
* @throws PropelException
*/
public function doBuild()
{
$this->dbMap = Propel::getDatabaseMap('workflow');
$tMap = $this->dbMap->addTable('PLUGINS_REGISTRY');
$tMap->setPhpName('PluginsRegistry');
$tMap->setUseIdGenerator(true);
$tMap->addColumn('ID', 'Id', 'int', CreoleTypes::INTEGER, true, null);
$tMap->addPrimaryKey('PR_UID', 'PrUid', 'string', CreoleTypes::VARCHAR, true, 32);
$tMap->addColumn('PLUGIN_NAMESPACE', 'PluginNamespace', 'string', CreoleTypes::VARCHAR, true, 100);
$tMap->addColumn('PLUGIN_DESCRIPTION', 'PluginDescription', 'string', CreoleTypes::VARCHAR, false, 200);
$tMap->addColumn('PLUGIN_CLASS_NAME', 'PluginClassName', 'string', CreoleTypes::VARCHAR, true, 100);
$tMap->addColumn('PLUGIN_FRIENDLY_NAME', 'PluginFriendlyName', 'string', CreoleTypes::VARCHAR, false, 150);
$tMap->addColumn('PLUGIN_FILE', 'PluginFile', 'string', CreoleTypes::VARCHAR, true, 250);
$tMap->addColumn('PLUGIN_FOLDER', 'PluginFolder', 'string', CreoleTypes::VARCHAR, true, 100);
$tMap->addColumn('PLUGIN_SETUP_PAGE', 'PluginSetupPage', 'string', CreoleTypes::VARCHAR, false, 100);
$tMap->addColumn('PLUGIN_COMPANY_LOGO', 'PluginCompanyLogo', 'string', CreoleTypes::VARCHAR, false, 100);
$tMap->addColumn('PLUGIN_WORKSPACES', 'PluginWorkspaces', 'string', CreoleTypes::VARCHAR, false, 100);
$tMap->addColumn('PLUGIN_VERSION', 'PluginVersion', 'string', CreoleTypes::VARCHAR, false, 50);
$tMap->addColumn('PLUGIN_ENABLE', 'PluginEnable', 'boolean', CreoleTypes::BOOLEAN, false, null);
$tMap->addColumn('PLUGIN_PRIVATE', 'PluginPrivate', 'boolean', CreoleTypes::BOOLEAN, false, null);
$tMap->addColumn('PLUGIN_MENUS', 'PluginMenus', 'string', CreoleTypes::LONGVARCHAR, false, null);
$tMap->addColumn('PLUGIN_FOLDERS', 'PluginFolders', 'string', CreoleTypes::LONGVARCHAR, false, null);
$tMap->addColumn('PLUGIN_TRIGGERS', 'PluginTriggers', 'string', CreoleTypes::LONGVARCHAR, false, null);
$tMap->addColumn('PLUGIN_PM_FUNCTIONS', 'PluginPmFunctions', 'string', CreoleTypes::LONGVARCHAR, false, null);
$tMap->addColumn('PLUGIN_REDIRECT_LOGIN', 'PluginRedirectLogin', 'string', CreoleTypes::LONGVARCHAR, false, null);
$tMap->addColumn('PLUGIN_STEPS', 'PluginSteps', 'string', CreoleTypes::LONGVARCHAR, false, null);
$tMap->addColumn('PLUGIN_CSS', 'PluginCss', 'string', CreoleTypes::LONGVARCHAR, false, null);
$tMap->addColumn('PLUGIN_JS', 'PluginJs', 'string', CreoleTypes::LONGVARCHAR, false, null);
$tMap->addColumn('PLUGIN_REST_SERVICE', 'PluginRestService', 'string', CreoleTypes::LONGVARCHAR, false, null);
$tMap->addColumn('PLUGIN_ATTRIBUTES', 'PluginAttributes', 'string', CreoleTypes::LONGVARCHAR, false, null);
} // doBuild()
} // PluginsRegistryMapBuilder

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff