From a0fda76abda7215ae28f6009586d37f7585aff95 Mon Sep 17 00:00:00 2001 From: Llewellyn van der Merwe Date: Sat, 20 Aug 2022 18:02:48 +0200 Subject: [PATCH] Adds getExtensionInstallClass and setInstallMethodScript to its own class. #950 --- README.md | 12 +- admin/README.txt | 12 +- admin/helpers/compiler/e_Interpretation.php | 221 ---------- admin/helpers/compiler/f_Infusion.php | 5 +- admin/models/ajax.php | 2 +- admin/sql/install.mysql.utf8.sql | 8 +- componentbuilder.xml | 6 +- componentbuilder_update_server.xml | 4 +- .../Extension/InstallScript.php | 388 ++++++++++++++++++ .../src/Componentbuilder/Extension/index.html | 1 + .../VDM.Joomla/src/Componentbuilder/Line.php | 40 ++ .../VDM.Joomla/src/Componentbuilder/Tab.php | 58 +++ .../src/Componentbuilder/index.html | 1 + script.php | 2 +- 14 files changed, 516 insertions(+), 244 deletions(-) create mode 100644 libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Extension/InstallScript.php create mode 100644 libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Extension/index.html create mode 100644 libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Line.php create mode 100644 libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Tab.php create mode 100644 libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/index.html diff --git a/README.md b/README.md index 8d145a9f3..3601367fb 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ The Component Builder for [Joomla](https://extensions.joomla.org/extension/compo Whether you're a seasoned [Joomla](https://extensions.joomla.org/extension/component-builder/) developer, or have just started, Component Builder will save you lots of time and money. A real must have! -You can install it quite easily and with no limitations. On [gitea](https://git.vdm.dev/joomla/Component-Builder/tags) is the latest release (3.1.4) with **ALL** its features and **ALL** concepts totally open-source and free! +You can install it quite easily and with no limitations. On [gitea](https://git.vdm.dev/joomla/Component-Builder/tags) is the latest release (3.1.5) with **ALL** its features and **ALL** concepts totally open-source and free! > Watch Quick Build of a Hello World component in [JCB on Youtube](https://www.youtube.com/watch?v=IQfsLYIeblk&list=PLQRGFI8XZ_wtGvPQZWBfDzzlERLQgpMRE&index=45) @@ -140,14 +140,14 @@ TODO + *Author*: [Llewellyn van der Merwe](mailto:joomla@vdm.io) + *Name*: [Component Builder](https://git.vdm.dev/joomla/Component-Builder) + *First Build*: 30th April, 2015 -+ *Last Build*: 9th July, 2022 -+ *Version*: 3.1.4 ++ *Last Build*: 20th August, 2022 ++ *Version*: 3.1.5 + *Copyright*: Copyright (C) 2015 Vast Development Method. All rights reserved. + *License*: GNU General Public License version 2 or later; see LICENSE.txt -+ *Line count*: **311349** ++ *Line count*: **311839** + *Field count*: **2002** -+ *File count*: **2050** -+ *Folder count*: **349** ++ *File count*: **2055** ++ *Folder count*: **351** > This **component** was build with a [Joomla](https://extensions.joomla.org/extension/component-builder/) [Automated Component Builder](http://joomlacomponentbuilder.com). > Developed by [Llewellyn van der Merwe](mailto:llewellyn@joomlacomponentbuilder.com) diff --git a/admin/README.txt b/admin/README.txt index 8d145a9f3..3601367fb 100644 --- a/admin/README.txt +++ b/admin/README.txt @@ -9,7 +9,7 @@ The Component Builder for [Joomla](https://extensions.joomla.org/extension/compo Whether you're a seasoned [Joomla](https://extensions.joomla.org/extension/component-builder/) developer, or have just started, Component Builder will save you lots of time and money. A real must have! -You can install it quite easily and with no limitations. On [gitea](https://git.vdm.dev/joomla/Component-Builder/tags) is the latest release (3.1.4) with **ALL** its features and **ALL** concepts totally open-source and free! +You can install it quite easily and with no limitations. On [gitea](https://git.vdm.dev/joomla/Component-Builder/tags) is the latest release (3.1.5) with **ALL** its features and **ALL** concepts totally open-source and free! > Watch Quick Build of a Hello World component in [JCB on Youtube](https://www.youtube.com/watch?v=IQfsLYIeblk&list=PLQRGFI8XZ_wtGvPQZWBfDzzlERLQgpMRE&index=45) @@ -140,14 +140,14 @@ TODO + *Author*: [Llewellyn van der Merwe](mailto:joomla@vdm.io) + *Name*: [Component Builder](https://git.vdm.dev/joomla/Component-Builder) + *First Build*: 30th April, 2015 -+ *Last Build*: 9th July, 2022 -+ *Version*: 3.1.4 ++ *Last Build*: 20th August, 2022 ++ *Version*: 3.1.5 + *Copyright*: Copyright (C) 2015 Vast Development Method. All rights reserved. + *License*: GNU General Public License version 2 or later; see LICENSE.txt -+ *Line count*: **311349** ++ *Line count*: **311839** + *Field count*: **2002** -+ *File count*: **2050** -+ *Folder count*: **349** ++ *File count*: **2055** ++ *Folder count*: **351** > This **component** was build with a [Joomla](https://extensions.joomla.org/extension/component-builder/) [Automated Component Builder](http://joomlacomponentbuilder.com). > Developed by [Llewellyn van der Merwe](mailto:llewellyn@joomlacomponentbuilder.com) diff --git a/admin/helpers/compiler/e_Interpretation.php b/admin/helpers/compiler/e_Interpretation.php index e14b1c4a9..95ba6ef24 100644 --- a/admin/helpers/compiler/e_Interpretation.php +++ b/admin/helpers/compiler/e_Interpretation.php @@ -29271,227 +29271,6 @@ function vdm_dkim() { ); } - public function getExtensionInstallClass(&$extension) - { - // yes we are adding it - $script = PHP_EOL . '/**'; - $script .= PHP_EOL . ' * ' . $extension->official_name - . ' script file.'; - $script .= PHP_EOL . ' *'; - $script .= PHP_EOL . ' * @package ' . $extension->class_name; - $script .= PHP_EOL . ' */'; - $script .= PHP_EOL . 'class ' . $extension->installer_class_name; - $script .= PHP_EOL . '{'; - // set constructor - if (isset($extension->add_php_script_construct) - && $extension->add_php_script_construct == 1 - && StringHelper::check( - $extension->php_script_construct - )) - { - $script .= $this->setInstallMethodScript( - 'construct', $extension->php_script_construct - ); - } - // add PHP in extension install - $addScriptMethods = array('php_preflight', 'php_postflight', - 'php_method'); - $addScriptTypes = array('install', 'update', 'uninstall', - 'discover_install'); - // set some buckets for sorting - $function_install = array(); - $function_update = array(); - $function_uninstall = array(); - $has_php_preflight = false; - $function_php_preflight = array('install' => array(), - 'uninstall' => array(), - 'discover_install' => array(), - 'update' => array()); - $has_php_postflight = false; - $function_php_postflight = array('install' => array(), - 'uninstall' => array(), - 'discover_install' => array(), - 'update' => array()); - // the function sorter - foreach ($addScriptMethods as $scriptMethod) - { - foreach ($addScriptTypes as $scriptType) - { - if (isset( - $extension->{'add_' . $scriptMethod . '_' . $scriptType} - ) - && $extension->{'add_' . $scriptMethod . '_' . $scriptType} - == 1 - && StringHelper::check( - $extension->{$scriptMethod . '_' . $scriptType} - )) - { - // add to the main methods - if ('php_method' === $scriptMethod) - { - ${'function_' . $scriptType}[] - = $extension->{$scriptMethod . '_' . $scriptType}; - } - else - { - ${'function_' . $scriptMethod}[$scriptType][] - = $extension->{$scriptMethod - . '_' . $scriptType}; - ${'has_' . $scriptMethod} = true; - } - } - } - } - // now add the install script. - if (ArrayHelper::check($function_install)) - { - $script .= $this->setInstallMethodScript( - 'install', $function_install - ); - } - // now add the update script. - if (ArrayHelper::check($function_update)) - { - $script .= $this->setInstallMethodScript( - 'update', $function_update - ); - } - // now add the uninstall script. - if (ArrayHelper::check($function_uninstall)) - { - $script .= $this->setInstallMethodScript( - 'uninstall', $function_uninstall - ); - } - // now add the preflight script. - if ($has_php_preflight) - { - $script .= $this->setInstallMethodScript( - 'preflight', $function_php_preflight - ); - } - // now add the postflight script. - if ($has_php_postflight) - { - $script .= $this->setInstallMethodScript( - 'postflight', $function_php_postflight - ); - } - $script .= PHP_EOL . '}' . PHP_EOL; - - return $script; - } - - protected function setInstallMethodScript($function_name, &$scripts) - { - $script = ''; - // build function - switch ($function_name) - { - case 'install': - case 'update': - case 'uninstall': - // the main function types - $script = PHP_EOL . PHP_EOL . $this->_t(1) . '/**'; - $script .= PHP_EOL . $this->_t(1) . ' * Called on ' - . $function_name; - $script .= PHP_EOL . $this->_t(1) . ' *'; - $script .= PHP_EOL . $this->_t(1) - . ' * @param Joomla\CMS\Installer\InstallerAdapter $adapter The object responsible for running this script'; - $script .= PHP_EOL . $this->_t(1) . ' *'; - $script .= PHP_EOL . $this->_t(1) - . ' * @return boolean True on success'; - $script .= PHP_EOL . $this->_t(1) . ' */'; - $script .= PHP_EOL . $this->_t(1) . 'public function ' - . $function_name . '($adapter)'; - $script .= PHP_EOL . $this->_t(1) . '{'; - $script .= PHP_EOL . implode(PHP_EOL . PHP_EOL, $scripts); - // return true - if ('uninstall' !== $function_name) - { - $script .= PHP_EOL . $this->_t(2) . 'return true;'; - } - break; - case 'preflight': - case 'postflight': - // the pre/post function types - $script = PHP_EOL . PHP_EOL . $this->_t(1) . '/**'; - $script .= PHP_EOL . $this->_t(1) - . ' * Called before any type of action'; - $script .= PHP_EOL . $this->_t(1) . ' *'; - $script .= PHP_EOL . $this->_t(1) - . ' * @param string $route Which action is happening (install|uninstall|discover_install|update)'; - $script .= PHP_EOL . $this->_t(1) - . ' * @param Joomla\CMS\Installer\InstallerAdapter $adapter The object responsible for running this script'; - $script .= PHP_EOL . $this->_t(1) . ' *'; - $script .= PHP_EOL . $this->_t(1) - . ' * @return boolean True on success'; - $script .= PHP_EOL . $this->_t(1) . ' */'; - $script .= PHP_EOL . $this->_t(1) . 'public function ' - . $function_name . '($route, $adapter)'; - $script .= PHP_EOL . $this->_t(1) . '{'; - $script .= PHP_EOL . $this->_t(2) . '//' . $this->setLine( - __LINE__ - ) . ' get application'; - $script .= PHP_EOL . $this->_t(2) - . '$app = JFactory::getApplication();' . PHP_EOL; - // add the default version check (TODO) must make this dynamic - if ('preflight' === $function_name) - { - $script .= PHP_EOL . $this->_t(2) . '//' . $this->setLine( - __LINE__ - ) . ' the default for both install and update'; - $script .= PHP_EOL . $this->_t(2) - . '$jversion = new JVersion();'; - $script .= PHP_EOL . $this->_t(2) - . "if (!\$jversion->isCompatible('3.8.0'))"; - $script .= PHP_EOL . $this->_t(2) . '{'; - $script .= PHP_EOL . $this->_t(3) - . "\$app->enqueueMessage('Please upgrade to at least Joomla! 3.8.0 before continuing!', 'error');"; - $script .= PHP_EOL . $this->_t(3) . 'return false;'; - $script .= PHP_EOL . $this->_t(2) . '}' . PHP_EOL; - } - // now add the scripts - foreach ($scripts as $route => $_script) - { - if (ArrayHelper::check($_script)) - { - // set the if and script - $script .= PHP_EOL . $this->_t(2) . "if ('" . $route - . "' === \$route)"; - $script .= PHP_EOL . $this->_t(2) . '{'; - $script .= PHP_EOL . implode( - PHP_EOL . PHP_EOL, $_script - ); - $script .= PHP_EOL . $this->_t(2) . '}' . PHP_EOL; - } - } - // return true - $script .= PHP_EOL . $this->_t(2) . 'return true;'; - break; - case 'construct': - // the __construct script - $script = PHP_EOL . PHP_EOL . $this->_t(1) . '/**'; - $script .= PHP_EOL . $this->_t(1) . ' * Constructor'; - $script .= PHP_EOL . $this->_t(1) . ' *'; - $script .= PHP_EOL . $this->_t(1) - . ' * @param Joomla\CMS\Installer\InstallerAdapter $adapter The object responsible for running this script'; - $script .= PHP_EOL . $this->_t(1) . ' */'; - $script .= PHP_EOL . $this->_t(1) - . 'public function __construct($adapter)'; - $script .= PHP_EOL . $this->_t(1) . '{'; - $script .= PHP_EOL . $scripts; - break; - default: - // oops error - return ''; - } - // close the function - $script .= PHP_EOL . $this->_t(1) . '}'; - - return $script; - } - /** * check if a translation should be added * diff --git a/admin/helpers/compiler/f_Infusion.php b/admin/helpers/compiler/f_Infusion.php index 88d2b1996..cd3acf537 100644 --- a/admin/helpers/compiler/f_Infusion.php +++ b/admin/helpers/compiler/f_Infusion.php @@ -19,6 +19,7 @@ use VDM\Joomla\Utilities\StringHelper; use VDM\Joomla\Utilities\ArrayHelper; use VDM\Joomla\Utilities\ObjectHelper; use VDM\Joomla\Utilities\FileHelper; +use VDM\Joomla\Componentbuilder\Extension\InstallScript; /** * Infusion class @@ -2393,7 +2394,7 @@ class Infusion extends Interpretation // INSTALLCLASS $this->fileContentDynamic[$module->key][$this->hhh . 'INSTALLCLASS' . $this->hhh] - = $this->getExtensionInstallClass($module); + = (new InstallScript($module))->get(); } // FIELDSET if (isset($module->form_files) @@ -2455,7 +2456,7 @@ class Infusion extends Interpretation // INSTALLCLASS $this->fileContentDynamic[$plugin->key][$this->hhh . 'INSTALLCLASS' . $this->hhh] - = $this->getExtensionInstallClass($plugin); + = (new InstallScript($plugin))->get(); } // FIELDSET if (isset($plugin->form_files) diff --git a/admin/models/ajax.php b/admin/models/ajax.php index ffa98741d..86ab41226 100644 --- a/admin/models/ajax.php +++ b/admin/models/ajax.php @@ -392,7 +392,7 @@ class ComponentbuilderModelAjax extends ListModel else { // download link of the latest version - $download = "https://git.vdm.dev/api/v1/repos/joomla/Component-Builder/archive/" . $tags[0]->name . ".zip?access_token=" . $token; + $download = "https://git.vdm.dev/api/v1/repos/joomla/pkg-component-builder/archive/" . $tags[0]->name . ".zip?access_token=" . $token; return ['notice' => '' . JText::_('COM_COMPONENTBUILDER_OUT_OF_DATE') . '! ' . JText::_('COM_COMPONENTBUILDER_DOWNLOAD_UPDATE') . '!']; diff --git a/admin/sql/install.mysql.utf8.sql b/admin/sql/install.mysql.utf8.sql index 9fd04d5ce..64a96020e 100644 --- a/admin/sql/install.mysql.utf8.sql +++ b/admin/sql/install.mysql.utf8.sql @@ -1967,7 +1967,7 @@ INSERT INTO `#__componentbuilder_joomla_component` (`id`, `add_license`, `licens -- INSERT INTO `#__componentbuilder_power` (`id`, `add_head`, `description`, `extends`, `extends_custom`, `guid`, `head`, `implements`, `implements_custom`, `load_selection`, `main_class_code`, `method_selection`, `name`, `namespace`, `power_version`, `property_selection`, `system_name`, `type`, `use_selection`, `params`, `published`, `created`, `modified`, `version`, `ordering`) VALUES -(1, '', 'Basic shared utilities, a legacy implementation\r\n\r\n@since 3.0.9', '', '', '79d765b3-7319-4988-9730-446c7f347020', '', '', '', '{}', 'CS8qKg0KCSAqIFRoZSBNYWluIEFjdGl2ZSBMYW5ndWFnZQ0KCSAqIA0KCSAqIEB2YXIgICAgICBzdHJpbmcNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICovDQoJcHVibGljIHN0YXRpYyAkbGFuZ1RhZzsNCg0KCS8qKg0KCSAqIENoZWNrIGlmIGhhdmUgYSBzdHJpbmcgd2l0aCBhIGxlbmd0aA0KCSAqDQoJICogQGlucHV0ICAgIHN0cmluZyAgJHN0cmluZyBUaGUgc3RyaW5nIHRvIGNoZWNrDQoJICoNCgkgKiBAcmV0dXJucyBib29sIHRydWUgb24gc3VjY2Vzcw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKg0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgU3RyaW5nSGVscGVyOjpjaGVjaygkc3RyaW5nKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNoZWNrU3RyaW5nKCRzdHJpbmcpOiBib29sDQoJew0KCQlyZXR1cm4gU3RyaW5nSGVscGVyOjpjaGVjaygkc3RyaW5nKTsNCgl9DQoNCgkvKioNCgkgKiBTaG9ydGVuIGEgc3RyaW5nDQoJICoNCgkgKiBAaW5wdXQgICAgc3RyaW5nICAkc3RyaW5nIFRoYXQgeW91IHdvdWxkIGxpa2UgdG8gc2hvcnRlbg0KCSAqDQoJICogQHJldHVybnMgc3RyaW5nIG9uIHN1Y2Nlc3MNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIFN0cmluZ0hlbHBlcjo6c2hvcnRlbigkc3RyaW5nLCAkbGVuZ3RoLCAkYWRkVGlwKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNob3J0ZW4oJHN0cmluZywgJGxlbmd0aCA9IDQwLCAkYWRkVGlwID0gdHJ1ZSkNCgl7DQoJCXJldHVybiBTdHJpbmdIZWxwZXI6OnNob3J0ZW4oJHN0cmluZywgJGxlbmd0aCwgJGFkZFRpcCk7DQoJfQ0KDQoJLyoqDQoJICogTWFraW5nIHN0cmluZ3Mgc2FmZSAodmFyaW91cyB3YXlzKQ0KCSAqDQoJICogQGlucHV0ICAgIHN0cmluZyAgJHN0cmluZyBUaGF0IHlvdSB3b3VsZCBsaWtlIHRvIG1ha2Ugc2FmZQ0KCSAqDQoJICogQHJldHVybnMgc3RyaW5nIG9uIHN1Y2Nlc3MNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIFN0cmluZ0hlbHBlcjo6c2FmZSgkc3RyaW5nLCAkdHlwZSwgJHNwYWNlciwgJHJlcGxhY2VOdW1iZXJzLCAka2VlcE9ubHlDaGFyYWN0ZXJzKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNhZmVTdHJpbmcoJHN0cmluZywgJHR5cGUgPSAnTCcsICRzcGFjZXIgPSAnXycsICRyZXBsYWNlTnVtYmVycyA9IHRydWUsICRrZWVwT25seUNoYXJhY3RlcnMgPSB0cnVlKQ0KCXsNCgkJLy8gc2V0IHRoZSBsb2NhbCBjb21wb25lbnQgb3B0aW9uDQoJCXNlbGY6OnNldENvbXBvbmVudE9wdGlvbigpOw0KDQoJCXJldHVybiBTdHJpbmdIZWxwZXI6OnNhZmUoJHN0cmluZywgJHR5cGUsICRzcGFjZXIsICRyZXBsYWNlTnVtYmVycywgJGtlZXBPbmx5Q2hhcmFjdGVycyk7DQoJfQ0KDQoJLyoqDQoJICogTWFraW5nIGNsYXNzIG9yIGZ1bmN0aW9uIG5hbWUgc2FmZQ0KCSAqDQoJICogQGlucHV0CXN0cmluZyAgICAgICBUaGUgbmFtZSB5b3Ugd291bGQgbGlrZSB0byBtYWtlIHNhZmUNCgkgKg0KCSAqIEByZXR1cm5zIHN0cmluZyBvbiBzdWNjZXNzDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBDbGFzc2Z1bmN0aW9uSGVscGVyOjpzYWZlKCRuYW1lKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNhZmVDbGFzc0Z1bmN0aW9uTmFtZSgkbmFtZSkNCgl7DQoJCXJldHVybiBDbGFzc2Z1bmN0aW9uSGVscGVyOjpzYWZlKCRuYW1lKTsNCgl9DQoNCgkvKioNCgkgKiBNYWtpbmcgZmllbGQgbmFtZXMgc2FmZQ0KCSAqDQoJICogQGlucHV0CXN0cmluZyAgICAgICBUaGUgeW91IHdvdWxkIGxpa2UgdG8gbWFrZSBzYWZlDQoJICogQGlucHV0CWJvb2xlYW4gICAgICBUaGUgc3dpdGNoIHRvIHJldHVybiBhbiBBTEwgVVBQRVIgQ0FTRSBzdHJpbmcNCgkgKiBAaW5wdXQJc3RyaW5nICAgICAgIFRoZSBzdHJpbmcgdG8gdXNlIGluIHdoaXRlIHNwYWNlDQoJICoNCgkgKiBAcmV0dXJucyBzdHJpbmcgb24gc3VjY2Vzcw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKg0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgRmllbGRIZWxwZXI6OnNhZmUoJHN0cmluZywgJGFsbGNhcCwgJHNwYWNlcik7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzYWZlRmllbGROYW1lKCRzdHJpbmcsICRhbGxjYXAgPSBmYWxzZSwgJHNwYWNlciA9ICdfJykNCgl7DQoJCS8vIHNldCB0aGUgbG9jYWwgY29tcG9uZW50IG9wdGlvbg0KCQlzZWxmOjpzZXRDb21wb25lbnRPcHRpb24oKTsNCg0KCQlyZXR1cm4gRmllbGRIZWxwZXI6OnNhZmUoJHN0cmluZywgJGFsbGNhcCwgJHNwYWNlcik7DQoJfQ0KDQoJLyoqDQoJICogTWFraW5nIGZpZWxkIHR5cGUgbmFtZSBzYWZlDQoJICoNCgkgKiBAaW5wdXQJc3RyaW5nICAgICAgIFRoZSB5b3Ugd291bGQgbGlrZSB0byBtYWtlIHNhZmUNCgkgKg0KCSAqIEByZXR1cm5zIHN0cmluZyBvbiBzdWNjZXNzDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBUeXBlSGVscGVyOjpzYWZlKCRzdHJpbmcpOw0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2FmZVR5cGVOYW1lKCRzdHJpbmcpDQoJew0KCQkvLyBzZXQgdGhlIGxvY2FsIGNvbXBvbmVudCBvcHRpb24NCgkJc2VsZjo6c2V0Q29tcG9uZW50T3B0aW9uKCk7DQoNCgkJcmV0dXJuIFR5cGVIZWxwZXI6OnNhZmUoJHN0cmluZyk7DQoJfQ0KDQoJLyoqDQoJICogTWFraW5nIG5hbWVzcGFjZSBzYWZlDQoJICoNCgkgKiBAaW5wdXQJc3RyaW5nICAgICAgIFRoZSB5b3Ugd291bGQgbGlrZSB0byBtYWtlIHNhZmUNCgkgKg0KCSAqIEByZXR1cm5zIHN0cmluZyBvbiBzdWNjZXNzDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBOYW1lc3BhY2VIZWxwZXI6OnNhZmUoJHN0cmluZyk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzYWZlTmFtZXNwYWNlKCRzdHJpbmcpDQoJew0KCQlyZXR1cm4gTmFtZXNwYWNlSGVscGVyOjpzYWZlKCRzdHJpbmcpOw0KCX0NCg0KCS8qKg0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKiANCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIFN0cmluZ0hlbHBlcjo6dHJhbnNsaXRlcmF0ZSgkc3RyaW5nKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHRyYW5zbGl0ZXJhdGUoJHN0cmluZykNCgl7DQoJCS8vIHNldCB0aGUgbG9jYWwgY29tcG9uZW50IG9wdGlvbg0KCQlzZWxmOjpzZXRDb21wb25lbnRPcHRpb24oKTsNCg0KCQlyZXR1cm4gU3RyaW5nSGVscGVyOjp0cmFuc2xpdGVyYXRlKCRzdHJpbmcpOw0KCX0NCg0KCS8qKg0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKiANCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIFN0cmluZ0hlbHBlcjo6aHRtbCgkdmFyLCAkY2hhcnNldCwgJHNob3J0ZW4sICRsZW5ndGgpOw0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaHRtbEVzY2FwZSgkdmFyLCAkY2hhcnNldCA9ICdVVEYtOCcsICRzaG9ydGVuID0gZmFsc2UsICRsZW5ndGggPSA0MCkNCgl7DQoJCS8vIHNldCB0aGUgbG9jYWwgY29tcG9uZW50IG9wdGlvbg0KCQlzZWxmOjpzZXRDb21wb25lbnRPcHRpb24oKTsNCg0KCQlyZXR1cm4gU3RyaW5nSGVscGVyOjpodG1sKCR2YXIsICRjaGFyc2V0LCAkc2hvcnRlbiwgJGxlbmd0aCk7DQoJfQ0KDQoJLyoqDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqIA0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgU3RyaW5nSGVscGVyOjpudW1iZXJzKCRzdHJpbmcpOw0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVwbGFjZU51bWJlcnMoJHN0cmluZykNCgl7DQoJCXJldHVybiBTdHJpbmdIZWxwZXI6Om51bWJlcnMoJHN0cmluZyk7DQoJfQ0KDQoJLyoqDQoJICogQ29udmVydCBhbiBpbnRlZ2VyIGludG8gYW4gRW5nbGlzaCB3b3JkIHN0cmluZw0KCSAqIFRoYW5rcyB0byBUb20gTmljaG9sc29uIDxodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24uc3RydmFsLnBocCM0MTk4OD4NCgkgKg0KCSAqIEBpbnB1dCAgICBpbnQgJHggYW4gaW50DQoJICoNCgkgKiBAcmV0dXJucyBzdHJpbmcgYSBzdHJpbmcNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIFN0cmluZ0hlbHBlcjo6bnVtYmVyKCR4KTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG51bWJlclRvU3RyaW5nKCR4KQ0KCXsNCgkJcmV0dXJuIFN0cmluZ0hlbHBlcjo6bnVtYmVyKCR4KTsNCgl9DQoNCgkvKioNCgkgKiBSYW5kb20gS2V5DQoJICoNCgkgKiBAaW5wdXQgaW50ICRzaXplIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZw0KCSAqDQoJICogQHJldHVybnMgc3RyaW5nIGEgc3RyaW5nIG9mIHJhbmRvbSBjaGFyYWN0ZXJzDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBTdHJpbmdIZWxwZXI6OnJhbmRvbSgkc2l6ZSk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiByYW5kb21rZXkoJHNpemUpOiBzdHJpbmcNCgl7DQoJCXJldHVybiBTdHJpbmdIZWxwZXI6OnJhbmRvbSgkc2l6ZSk7DQoJfQ0KDQoJLyoqDQoJICogQ2hlY2sgaWYgeW91IGhhdmUgYSBqc29uIHN0cmluZw0KCSAqDQoJICogQGlucHV0ICAgIHN0cmluZyAgJHN0cmluZyAgVGhlIGpzb24gc3RyaW5nIHRvIGNoZWNrDQoJICoNCgkgKiBAcmV0dXJucyBib29sIHRydWUgb24gc3VjY2Vzcw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKg0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgSnNvbkhlbHBlcjo6Y2hlY2soJHN0cmluZyk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGVja0pzb24oJHN0cmluZyk6IGJvb2wNCgl7DQoJCXJldHVybiBKc29uSGVscGVyOjpjaGVjaygkc3RyaW5nKTsNCgl9DQoNCgkvKioNCgkgKiBAc2luY2UgIDMuMC45DQoJICogDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBKc29uSGVscGVyOjpzdHJpbmcoJHZhbHVlLCAkc3BlcmF0b3IsICR0YWJsZSwgJGlkLCAkbmFtZSk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBqc29uVG9TdHJpbmcoJHZhbHVlLCAkc3BlcmF0b3IgPSAiLCAiLCAkdGFibGUgPSBudWxsLCAkaWQgPSAnaWQnLCAkbmFtZSA9ICduYW1lJykNCgl7DQoJCXJldHVybiBKc29uSGVscGVyOjpzdHJpbmcoJHZhbHVlLCAkc3BlcmF0b3IsICR0YWJsZSwgJGlkLCAkbmFtZSk7DQoJfQ0KDQoJLyoqDQoJICogQ2hlY2sgaWYgeW91IGhhdmUgYW4gYXJyYXkgd2l0aCBhIGxlbmd0aA0KCSAqDQoJICogQGlucHV0ICAgIG1peGVkICRhcnJheSAgICAgICAgICAgICAgVGhlIGFycmF5IHRvIGNoZWNrDQoJICogQGlucHV0ICAgIGJvb2wgICRyZW1vdmVFbXB0eVN0cmluZyAgU2hvdWxkIHdlIHJlbW92ZSBlbXB0eSB2YWx1ZXMNCgkgKg0KCSAqIEByZXR1cm5zIGludCAgbnVtYmVyIG9mIGl0ZW1zIGluIGFycmF5IG9uIHN1Y2Nlc3MNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIEFycmF5SGVscGVyOjpjaGVjaygkYXJyYXksICRyZW1vdmVFbXB0eVN0cmluZyk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGVja0FycmF5KCRhcnJheSwgJHJlbW92ZUVtcHR5U3RyaW5nID0gZmFsc2UpOiBpbnQNCgl7DQoJCXJldHVybiBBcnJheUhlbHBlcjo6Y2hlY2soJGFycmF5LCAkcmVtb3ZlRW1wdHlTdHJpbmcpOw0KCX0NCg0KCS8qKg0KCSAqIE1lcmdlIGFuIGFycmF5IG9mIGFycmF5J3MNCgkgKg0KCSAqIEBpbnB1dCAgICBtaXhlZCAgJGFycmF5cyBUaGUgYXJyYXlzIHlvdSB3b3VsZCBsaWtlIHRvIG1lcmdlDQoJICoNCgkgKiBAcmV0dXJucyBtaXhlZCBhcnJheSBvbiBzdWNjZXNzDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBBcnJheUhlbHBlcjo6bWVyZ2UoJGFycmF5cyk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtZXJnZUFycmF5cygkYXJyYXlzKQ0KCXsNCgkJcmV0dXJuIEFycmF5SGVscGVyOjptZXJnZSgkYXJyYXlzKTsNCgl9DQoNCgkvKioNCgkgKiBDaGVjayBpZiB5b3UgaGF2ZSBhbiBvYmplY3Qgd2l0aCBhIGxlbmd0aA0KCSAqDQoJICogQGlucHV0ICAgIG9iamVjdCAkb2JqZWN0ICBUaGUgb2JqZWN0IHRvIGNoZWNrDQoJICoNCgkgKiBAcmV0dXJucyBib29sIHRydWUgb24gc3VjY2Vzcw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKg0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgT2JqZWN0SGVscGVyOjpjaGVjaygkb2JqZWN0KTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNoZWNrT2JqZWN0KCRvYmplY3QpOiBib29sDQoJew0KCQlyZXR1cm4gT2JqZWN0SGVscGVyOjpjaGVjaygkb2JqZWN0KTsNCgl9DQoNCgkvKioNCgkgKiBHZXQgYSBWYXJpYWJsZSANCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgICR0YWJsZSAgICAgICAgVGhlIHRhYmxlIGZyb20gd2hpY2ggdG8gZ2V0IHRoZSB2YXJpYWJsZQ0KCSAqIEBwYXJhbSAgIHN0cmluZyAgICR3aGVyZSAgICAgICAgVGhlIHZhbHVlIHdoZXJlDQoJICogQHBhcmFtICAgc3RyaW5nICAgJHdoZXJlU3RyaW5nICBUaGUgdGFyZ2V0L2ZpZWxkIHN0cmluZyB3aGVyZS9uYW1lDQoJICogQHBhcmFtICAgc3RyaW5nICAgJHdoYXQgICAgICAgICBUaGUgcmV0dXJuIGZpZWxkDQoJICogQHBhcmFtICAgc3RyaW5nICAgJG9wZXJhdG9yICAgICBUaGUgb3BlcmF0b3IgYmV0d2VlbiAkd2hlcmVTdHJpbmcvZmllbGQgYW5kICR3aGVyZS92YWx1ZQ0KCSAqIEBwYXJhbSAgIHN0cmluZyAgICRtYWluICAgICAgICAgVGhlIGNvbXBvbmVudCBpbiB3aGljaCB0aGUgdGFibGUgaXMgZm91bmQNCgkgKg0KCSAqIEByZXR1cm4gIG1peCBzdHJpbmcvaW50L2Zsb2F0DQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBHZXRIZWxwZXI6OnZhcigkdGFibGUsICR3aGVyZSwgJHdoZXJlU3RyaW5nLCAkd2hhdCwgJG9wZXJhdG9yLCAkbWFpbik7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRWYXIoJHRhYmxlLCAkd2hlcmUgPSBudWxsLCAkd2hlcmVTdHJpbmcgPSAndXNlcicsICR3aGF0ID0gJ2lkJywgJG9wZXJhdG9yID0gJz0nLCAkbWFpbiA9IG51bGwpDQoJew0KCQkvLyBzZXQgdGhlIGxvY2FsIGNvbXBvbmVudCBvcHRpb24NCgkJc2VsZjo6c2V0Q29tcG9uZW50T3B0aW9uKCk7DQoNCgkJcmV0dXJuIEdldEhlbHBlcjo6dmFyKCR0YWJsZSwgJHdoZXJlLCAkd2hlcmVTdHJpbmcsICR3aGF0LCAkb3BlcmF0b3IsICRtYWluKTsNCgl9DQoNCgkvKioNCgkgKiBHZXQgYXJyYXkgb2YgdmFyaWFibGVzDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmcgICAkdGFibGUgICAgICAgIFRoZSB0YWJsZSBmcm9tIHdoaWNoIHRvIGdldCB0aGUgdmFyaWFibGVzDQoJICogQHBhcmFtICAgc3RyaW5nICAgJHdoZXJlICAgICAgICBUaGUgdmFsdWUgd2hlcmUNCgkgKiBAcGFyYW0gICBzdHJpbmcgICAkd2hlcmVTdHJpbmcgIFRoZSB0YXJnZXQvZmllbGQgc3RyaW5nIHdoZXJlL25hbWUNCgkgKiBAcGFyYW0gICBzdHJpbmcgICAkd2hhdCAgICAgICAgIFRoZSByZXR1cm4gZmllbGQNCgkgKiBAcGFyYW0gICBzdHJpbmcgICAkb3BlcmF0b3IgICAgIFRoZSBvcGVyYXRvciBiZXR3ZWVuICR3aGVyZVN0cmluZy9maWVsZCBhbmQgJHdoZXJlL3ZhbHVlDQoJICogQHBhcmFtICAgc3RyaW5nICAgJG1haW4gICAgICAgICBUaGUgY29tcG9uZW50IGluIHdoaWNoIHRoZSB0YWJsZSBpcyBmb3VuZA0KCSAqIEBwYXJhbSAgIGJvb2wgICAgICR1bmlxdWUgICAgICAgVGhlIHN3aXRjaCB0byByZXR1cm4gYSB1bmlxdWUgYXJyYXkNCgkgKg0KCSAqIEByZXR1cm4gIGFycmF5DQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBHZXRIZWxwZXI6OnZhcnMoJHRhYmxlLCAkd2hlcmUsICR3aGVyZVN0cmluZywgJHdoYXQsICRvcGVyYXRvciwgJG1haW4sICR1bmlxdWUpOw0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VmFycygkdGFibGUsICR3aGVyZSA9IG51bGwsICR3aGVyZVN0cmluZyA9ICd1c2VyJywgJHdoYXQgPSAnaWQnLCAkb3BlcmF0b3IgPSAnSU4nLCAkbWFpbiA9IG51bGwsICR1bmlxdWUgPSB0cnVlKQ0KCXsNCgkJLy8gc2V0IHRoZSBsb2NhbCBjb21wb25lbnQgb3B0aW9uDQoJCXNlbGY6OnNldENvbXBvbmVudE9wdGlvbigpOw0KDQoJCXJldHVybiBHZXRIZWxwZXI6OnZhcnMoJHRhYmxlLCAkd2hlcmUsICR3aGVyZVN0cmluZywgJHdoYXQsICRvcGVyYXRvciwgJG1haW4sICR1bmlxdWUpOw0KCX0NCg0KCS8qKg0KCSAqIGdldCBhbGwgc3RyaW5ncyBiZXR3ZWVuIHR3byBvdGhlciBzdHJpbmdzDQoJICoNCgkgKiBAcGFyYW0gIHN0cmluZyAgICAgICAgICAkY29udGVudCAgICBUaGUgY29udGVudCB0byBzZWFyY2gNCgkgKiBAcGFyYW0gIHN0cmluZyAgICAgICAgICAkc3RhcnQgICAgICAgIFRoZSBzdGFydGluZyB2YWx1ZQ0KCSAqIEBwYXJhbSAgc3RyaW5nICAgICAgICAgICRlbmQgICAgICAgICBUaGUgZW5kaW5nIHZhbHVlDQoJICoNCgkgKiBAcmV0dXJuICBhcnJheSAgICAgICAgICBPbiBzdWNjZXNzDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBHZXRIZWxwZXI6OmFsbEJldHdlZW4oJGNvbnRlbnQsICRzdGFydCwgJGVuZCk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRBbGxCZXR3ZWVuKCRjb250ZW50LCAkc3RhcnQsICRlbmQpDQoJew0KCQlyZXR1cm4gR2V0SGVscGVyOjphbGxCZXR3ZWVuKCRjb250ZW50LCAkc3RhcnQsICRlbmQpOw0KCX0NCg0KCS8qKg0KCSAqIGdldCBhIHN0cmluZyBiZXR3ZWVuIHR3byBvdGhlciBzdHJpbmdzDQoJICogDQoJICogQHBhcmFtICBzdHJpbmcgICAgICAgICAgJGNvbnRlbnQgICAgVGhlIGNvbnRlbnQgdG8gc2VhcmNoDQoJICogQHBhcmFtICBzdHJpbmcgICAgICAgICAgJHN0YXJ0ICAgICAgICBUaGUgc3RhcnRpbmcgdmFsdWUNCgkgKiBAcGFyYW0gIHN0cmluZyAgICAgICAgICAkZW5kICAgICAgICAgVGhlIGVuZGluZyB2YWx1ZQ0KCSAqIEBwYXJhbSAgc3RyaW5nICAgICAgICAgICRkZWZhdWx0ICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpZiBub25lIGZvdW5kDQoJICoNCgkgKiBAcmV0dXJuICBzdHJpbmcgICAgICAgICAgT24gc3VjY2VzcyAvIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBHZXRIZWxwZXI6OmJldHdlZW4oJGNvbnRlbnQsICRzdGFydCwgJGVuZCwgJGRlZmF1bHQpOw0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0QmV0d2VlbigkY29udGVudCwgJHN0YXJ0LCAkZW5kLCAkZGVmYXVsdCA9ICcnKQ0KCXsNCgkJcmV0dXJuIEdldEhlbHBlcjo6YmV0d2VlbigkY29udGVudCwgJHN0YXJ0LCAkZW5kLCAkZGVmYXVsdCk7DQoJfQ0KDQoJLyoqDQoJICogYmMgbWF0aCB3cmFwcGVyICh2ZXJ5IGJhc2ljIG5vdCBmb3IgYWNjb3VudGluZykNCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgICR0eXBlICAgIFRoZSB0eXBlIGJjIG1hdGgNCgkgKiBAcGFyYW0gICBpbnQgICAgICAkdmFsMSAgICBUaGUgZmlyc3QgdmFsdWUNCgkgKiBAcGFyYW0gICBpbnQgICAgICAkdmFsMiAgICBUaGUgc2Vjb25kIHZhbHVlDQoJICogQHBhcmFtICAgaW50ICAgICAgJHNjYWxlICAgVGhlIHNjYWxlIHZhbHVlDQoJICoNCgkgKiBAcmV0dXJuIGZsb2F0fGludA0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKg0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgTWF0aEhlbHBlcjo6YmMoJHR5cGUsICR2YWwxLCAkdmFsMiwgJHNjYWxlKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGJjbWF0aCgkdHlwZSwgJHZhbDEsICR2YWwyLCAkc2NhbGUgPSAwKQ0KCXsNCgkJcmV0dXJuIE1hdGhIZWxwZXI6OmJjKCR0eXBlLCAkdmFsMSwgJHZhbDIsICRzY2FsZSk7DQoJfQ0KDQoJLyoqDQoJICogQmFzaWMgc3VtIG9mIGFuIGFycmF5IHdpdGggbW9yZSBwcmVjaXNpb24NCgkgKg0KCSAqIEBwYXJhbSAgIGFycmF5ICAgJGFycmF5ICAgIFRoZSB2YWx1ZXMgdG8gc3VtDQoJICogQHBhcmFtICAgaW50ICAgICAgJHNjYWxlICAgVGhlIHNjYWxlIHZhbHVlDQoJICoNCgkgKiBAcmV0dXJuIGZsb2F0fGludA0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKg0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgTWF0aEhlbHBlcjo6c3VtKCRhcnJheSwgJHNjYWxlKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGJjc3VtKCRhcnJheSwgJHNjYWxlID0gNCkNCgl7DQoJCXJldHVybiBNYXRoSGVscGVyOjpzdW0oJGFycmF5LCAkc2NhbGUpOw0KCX0NCg0KICAgICAgICAvKioNCiAgICAgICAgICogY3JlYXRlIHBsdWdpbiBjbGFzcyBuYW1lDQoJICoNCgkgKiBAaW5wdXQJc3RyaW5nICAgICAgIFRoZSBncm91cCBuYW1lDQoJICogQGlucHV0CXN0cmluZyAgICAgICBUaGUgbmFtZQ0KCSAqDQoJICogQHJldHVybiBzdHJpbmcNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIFBsdWdpbkhlbHBlcjo6c2FmZSgkbmFtZSwgJGdyb3VwKTsNCiAgICAgICAgICovDQogICAgICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlUGx1Z2luQ2xhc3NOYW1lKCRncm91cCwgJG5hbWUpDQoJew0KCQlyZXR1cm4gUGx1Z2luSGVscGVyOjpzYWZlQ2xhc3NOYW1lKCRuYW1lLCAkZ3JvdXApOw0KCX0NCg0KCS8qKg0KCSAqIFJldHVybnMgYSBHVUlEdjQgc3RyaW5nDQoJICogDQoJICogVGhhbmtzIHRvIERhdmUgUGVhcnNvbiAoYW5kIG90aGVyKQ0KCSAqIGh0dHBzOi8vd3d3LnBocC5uZXQvbWFudWFsL2VuL2Z1bmN0aW9uLmNvbS1jcmVhdGUtZ3VpZC5waHAjMTE5MTY4IA0KCSAqDQoJICogVXNlcyB0aGUgYmVzdCBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgbWV0aG9kDQoJICogZm9yIGFsbCBzdXBwb3J0ZWQgcGxhdGZvcm1zIHdpdGggZmFsbGJhY2sgdG8gYW4gb2xkZXIsDQoJICogbGVzcyBzZWN1cmUgdmVyc2lvbi4NCgkgKg0KCSAqIEBwYXJhbSBib29sICR0cmltDQoJICoNCgkgKiBAcmV0dXJuIHN0cmluZw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKg0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgR3VpZEhlbHBlcjo6Z2V0KCR0cmltKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEdVSUQoJHRyaW0gPSB0cnVlKQ0KCXsNCgkJcmV0dXJuIEd1aWRIZWxwZXI6OmdldCgkdHJpbSk7DQoJfQ0KDQoJLyoqDQoJICogVmFsaWRhdGUgdGhlIEdsb2JhbGx5IFVuaXF1ZSBJZGVudGlmaWVyICggYW5kIGNoZWNrIGlmIHRhYmxlIGFscmVhZHkgaGFzIHRoaXMgaWRlbnRpZmllcikNCgkgKg0KCSAqIEBwYXJhbSBzdHJpbmcgICAgICAgJGd1aWQNCgkgKiBAcGFyYW0gc3RyaW5nICAgICAgICR0YWJsZQ0KCSAqIEBwYXJhbSBpbnQgICAgICAgICAgICAkaWQNCgkgKiBAcGFyYW0gc3RyaW5nfG51bGwgJGNvbXBvbmVudA0KCSAqDQoJICogQHJldHVybiBib29sDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBHdWlkSGVscGVyOjp2YWxpZCgkZ3VpZCwgJHRhYmxlLCAkaWQsICRjb21wb25lbnQpOw0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdmFsaWRHVUlEKCRndWlkLCAkdGFibGUgPSBudWxsLCAkaWQgPSAwLCAkY29tcG9uZW50ID0gbnVsbCkNCgl7DQoJCS8vIHNldCB0aGUgbG9jYWwgY29tcG9uZW50IG9wdGlvbg0KCQlzZWxmOjpzZXRDb21wb25lbnRPcHRpb24oKTsNCg0KCQlyZXR1cm4gR3VpZEhlbHBlcjo6dmFsaWQoJGd1aWQsICR0YWJsZSwgJGlkLCAkY29tcG9uZW50KTsNCgl9DQoNCgkvKioNCgkgKiBnZXQgdGhlIElURU0gb2YgYSBHVUlEIGJ5IHRhYmxlDQoJICoNCgkgKiBAcGFyYW0gc3RyaW5nICAgICAgICAgICAkZ3VpZA0KCSAqIEBwYXJhbSBzdHJpbmcgICAgICAgICAgICR0YWJsZQ0KCSAqIEBwYXJhbSBzdHJpbmcvYXJyYXkgICR3aGF0DQoJICogQHBhcmFtIHN0cmluZ3xudWxsICAgICRjb21wb25lbnQNCgkgKg0KCSAqIEByZXR1cm4gbWl4DQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBHdWlkSGVscGVyOjp2YWxpZCgkZ3VpZCwgJHRhYmxlLCAkaWQsICRjb21wb25lbnQpOw0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0R1VJRCgkZ3VpZCwgJHRhYmxlLCAkd2hhdCA9ICdhLmlkJywgJGNvbXBvbmVudCA9IG51bGwpDQoJew0KCQkvLyBzZXQgdGhlIGxvY2FsIGNvbXBvbmVudCBvcHRpb24NCgkJc2VsZjo6c2V0Q29tcG9uZW50T3B0aW9uKCk7DQoNCgkJcmV0dXJuIEd1aWRIZWxwZXI6Oml0ZW0oJGd1aWQsICR0YWJsZSwgJHdoYXQsICRjb21wb25lbnQpOw0KCX0NCg0KCS8qKg0KCSAqIFZhbGlkYXRlIHRoZSBHbG9iYWxseSBVbmlxdWUgSWRlbnRpZmllcg0KCSAqDQoJICogVGhhbmtzIHRvIExld2llDQoJICogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE1MTU0NTYvMTQyOTY3Nw0KCSAqDQoJICogQHBhcmFtIHN0cmluZyAkZ3VpZA0KCSAqDQoJICogQHJldHVybiBib29sDQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIEd1aWRIZWxwZXI6OnZhbGlkYXRlKCRndWlkKTsNCgkgKi8NCglwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIHZhbGlkYXRlR1VJRCgkZ3VpZCkNCgl7DQoJCXJldHVybiBHdWlkSGVscGVyOjp2YWxpZGF0ZSgkZ3VpZCk7DQoJfQ0KDQoJLyoqDQoJICogVGhlIHppcHBlciBtZXRob2QNCgkgKiANCgkgKiBAcGFyYW0gIHN0cmluZyAgICR3b3JraW5nRElSICAgIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGl0ZW1zIG11c3QgYmUgemlwcGVkDQoJICogQHBhcmFtICBzdHJpbmcgICAkZmlsZXBhdGggICAgICAgICAgVGhlIHBhdGggdG8gd2hlcmUgdGhlIHppcCBmaWxlIG11c3QgYmUgcGxhY2VkDQoJICoNCgkgKiBAcmV0dXJuICBib29sIHRydWUgICBPbiBzdWNjZXNzDQoJICoNCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIEZpbGVIZWxwZXI6OnppcCgkd29ya2luZ0RJUiwgJGZpbGVwYXRoKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHppcCgkd29ya2luZ0RJUiwgJiRmaWxlcGF0aCkNCgl7DQoJCXJldHVybiBGaWxlSGVscGVyOjp6aXAoJHdvcmtpbmdESVIsICRmaWxlcGF0aCk7DQoJfQ0KDQoJLyoqDQoJICogZ2V0IHRoZSBjb250ZW50IG9mIGEgZmlsZQ0KCSAqDQoJICogQHBhcmFtICBzdHJpbmcgICAgICAgICRwYXRoICAgVGhlIHBhdGggdG8gdGhlIGZpbGUNCgkgKiBAcGFyYW0gIHN0cmluZy9ib29sICAgJG5vbmUgICBUaGUgcmV0dXJuIHZhbHVlIGlmIG5vIGNvbnRlbnQgd2FzIGZvdW5kDQoJICoNCgkgKiBAcmV0dXJuICBzdHJpbmcgICBPbiBzdWNjZXNzDQoJICoNCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIEZpbGVIZWxwZXI6OmdldENvbnRlbnQoJHBhdGgsICRub25lKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEZpbGVDb250ZW50cygkcGF0aCwgJG5vbmUgPSAnJykNCgl7DQoJCXJldHVybiBGaWxlSGVscGVyOjpnZXRDb250ZW50KCRwYXRoLCAkbm9uZSk7DQoJfQ0KDQoJLyoqDQoJICogV3JpdGUgYSBmaWxlIHRvIHRoZSBzZXJ2ZXINCgkgKg0KCSAqIEBwYXJhbSAgc3RyaW5nICAgJHBhdGggICAgVGhlIHBhdGggYW5kIGZpbGUgbmFtZSB3aGVyZSB0byBzYWZlIHRoZSBkYXRhDQoJICogQHBhcmFtICBzdHJpbmcgICAkZGF0YSAgICBUaGUgZGF0YSB0byBzYWZlDQoJICoNCgkgKiBAcmV0dXJuICBib29sIHRydWUgICBPbiBzdWNjZXNzDQoJICoNCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIEZpbGVIZWxwZXI6OndyaXRlKCRwYXRoLCAkZGF0YSk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB3cml0ZUZpbGUoJHBhdGgsICRkYXRhKQ0KCXsNCgkJcmV0dXJuIEZpbGVIZWxwZXI6OndyaXRlKCRwYXRoLCAkZGF0YSk7DQoJfQ0KDQoJLyoqDQoJICogZ2V0IGFsbCB0aGUgZmlsZSBwYXRocyBpbiBmb2xkZXIgYW5kIHN1YiBmb2xkZXJzDQoJICogDQoJICogQHBhcmFtICAgc3RyaW5nICAkZm9sZGVyICAgICBUaGUgbG9jYWwgcGF0aCB0byBwYXJzZQ0KCSAqIEBwYXJhbSAgIGFycmF5ICAgJGZpbGVUeXBlcyAgVGhlIHR5cGUgb2YgZmlsZXMgdG8gZ2V0DQoJICoNCgkgKiBAcmV0dXJuICB2b2lkDQoJICoNCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIEZpbGVIZWxwZXI6OmdldFBhdGhzKCRmb2xkZXIsICRmaWxlVHlwZXMgLCAkcmVjdXJzZSwgJGZ1bGwpOw0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0QWxsRmlsZVBhdGhzKCRmb2xkZXIsICRmaWxlVHlwZXMgPSBhcnJheSgnXC5waHAnLCAnXC5qcycsICdcLmNzcycsICdcLmxlc3MnKSwgJHJlY3Vyc2UgPSB0cnVlLCAkZnVsbCA9IHRydWUpDQoJew0KCQlyZXR1cm4gRmlsZUhlbHBlcjo6Z2V0UGF0aHMoJGZvbGRlciwgJGZpbGVUeXBlcyAsICRyZWN1cnNlLCAkZnVsbCk7DQoJfQ0KDQoJLyoqDQoJICogR2V0IHRoZSBmaWxlIHBhdGggb3IgdXJsDQoJICoNCgkgKiBAcGFyYW0gIHN0cmluZyAgICR0eXBlICAgICAgICAgICAgICBUaGUgKHVybC9wYXRoKSB0eXBlIHRvIHJldHVybg0KCSAqIEBwYXJhbSAgc3RyaW5nICAgJHRhcmdldCAgICAgICAgICAgIFRoZSBQYXJhbXMgVGFyZ2V0IG5hbWUgKGlmIHNldCkNCgkgKiBAcGFyYW0gIHN0cmluZyAgICRmaWxlVHlwZSAgICAgICAgICBUaGUga2luZCBvZiBmaWxlbmFtZSB0byBnZW5lcmF0ZSAoaWYgbm90IHNldCBubyBmaWxlIG5hbWUgaXMgZ2VuZXJhdGVkKQ0KCSAqIEBwYXJhbSAgc3RyaW5nICAgJGtleSAgICAgICAgICAgICAgIFRoZSBrZXkgdG8gYWRqdXN0IHRoZSBmaWxlbmFtZSAoaWYgbm90IHNldCBpZ25vcmVkKQ0KCSAqIEBwYXJhbSAgc3RyaW5nICAgJGRlZmF1bHQgICAgICAgICAgIFRoZSBkZWZhdWx0IHBhdGggaWYgbm90IHNldCBpbiBQYXJhbXMgKGZhbGxiYWNrIHBhdGgpDQoJICogQHBhcmFtICBib29sICAgICAkY3JlYXRlSWZOb3RTZXQgICAgVGhlIHN3aXRjaCB0byBjcmVhdGUgdGhlIGZvbGRlciBpZiBub3QgZm91bmQNCgkgKg0KCSAqIEByZXR1cm4gIHN0cmluZyAgICBPbiBzdWNjZXNzIHRoZSBwYXRoIG9yIHVybCBpcyByZXR1cm5lZCBiYXNlZCBvbiB0aGUgdHlwZSByZXF1ZXN0ZWQNCgkgKg0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKg0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgRmlsZUhlbHBlcjo6Z2V0UGF0aCgkdHlwZSwgJHRhcmdldCwgJGZpbGVUeXBlLCAka2V5LCAkZGVmYXVsdCwgJGNyZWF0ZUlmTm90U2V0KTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEZpbGVQYXRoKCR0eXBlID0gJ3BhdGgnLCAkdGFyZ2V0ID0gJ2ZpbGVwYXRoJywgJGZpbGVUeXBlID0gbnVsbCwgJGtleSA9ICcnLCAkZGVmYXVsdCA9ICcnLCAkY3JlYXRlSWZOb3RTZXQgPSB0cnVlKQ0KCXsNCgkJLy8gc2V0IHRoZSBsb2NhbCBjb21wb25lbnQgb3B0aW9uDQoJCXNlbGY6OnNldENvbXBvbmVudE9wdGlvbigpOw0KDQoJCXJldHVybiBGaWxlSGVscGVyOjpnZXRQYXRoKCR0eXBlLCAkdGFyZ2V0LCAkZmlsZVR5cGUsICRrZXksICRkZWZhdWx0LCAkY3JlYXRlSWZOb3RTZXQpOw0KCX0NCg0KCS8qKg0KCSAqIENoZWNrIGlmIGZpbGUgZXhpc3QNCgkgKg0KCSAqIEBwYXJhbSAgc3RyaW5nICAgJHBhdGggICBUaGUgdXJsL3BhdGggdG8gY2hlY2sNCgkgKg0KCSAqIEByZXR1cm4gIGJvb2wgICAgICBJZiBleGlzdCB0cnVlDQoJICoNCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIEZpbGVIZWxwZXI6OmV4aXN0cygkcGF0aCk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB1cmxFeGlzdHMoJHBhdGgpDQoJew0KCQlyZXR1cm4gRmlsZUhlbHBlcjo6ZXhpc3RzKCRwYXRoKTsNCgl9DQoNCgkvKioNCgkgKiBTZXQgdGhlIGNvbXBvbmVudCBvcHRpb24NCgkgKg0KCSAqIEBwYXJhbSAgIFN0cmluZ3xudWxsICAgICAgICRvcHRpb24gICAgVGhlIG9wdGlvbiBmb3IgdGhlIGNvbXBvbmVudC4NCgkgKg0KCSAqIEBzaW5jZSAgMy4wLjExDQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRDb21wb25lbnRPcHRpb24oJG9wdGlvbiA9IG51bGwpDQoJew0KCQkvLyBzZXQgdGhlIGxvY2FsIGNvbXBvbmVudCBvcHRpb24NCgkJaWYgKGVtcHR5KCRvcHRpb24pKQ0KCQl7DQoJCQlpZiAoZW1wdHkoSGVscGVyOjokb3B0aW9uKSAmJiBwcm9wZXJ0eV9leGlzdHMoX19DTEFTU19fLCAnQ29tcG9uZW50Q29kZU5hbWUnKSkNCgkJCXsNCgkJCQlIZWxwZXI6OiRvcHRpb24gPSAnY29tXycgLiBzZWxmOjokQ29tcG9uZW50Q29kZU5hbWU7DQoJCQl9DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQlIZWxwZXI6OiRvcHRpb24gPSAkb3B0aW9uOw0KCQl9DQoJfQ0K', '{}', 'Utilities', 'VDM\\Joomla\\Utilities', '1.0.0', '{}', 'Utilities', 'trait', '{\"use_selection0\":{\"use\":\"1f28cb53-60d9-4db1-b517-3c7dc6b429ef\",\"as\":\"default\"},\"use_selection1\":{\"use\":\"4b225c51-d293-48e4-b3f6-5136cf5c3f18\",\"as\":\"default\"},\"use_selection2\":{\"use\":\"0a59c65c-9daf-4bc9-baf4-e063ff9e6a8a\",\"as\":\"default\"},\"use_selection3\":{\"use\":\"91004529-94a9-4590-b842-e7c6b624ecf5\",\"as\":\"default\"},\"use_selection4\":{\"use\":\"152c8793-8b75-4715-996a-257b9f65451c\",\"as\":\"default\"},\"use_selection5\":{\"use\":\"db87c339-5bb6-4291-a7ef-2c48ea1b06bc\",\"as\":\"default\"},\"use_selection6\":{\"use\":\"9c513baf-b279-43fd-ae29-a585c8cbc4f0\",\"as\":\"default\"},\"use_selection7\":{\"use\":\"a223b31e-ea1d-4cdf-92ae-5f9becffaff0\",\"as\":\"default\"},\"use_selection8\":{\"use\":\"9ef0eb24-aae4-4f5a-99af-d724db44808f\",\"as\":\"default\"},\"use_selection9\":{\"use\":\"a8935cbe-7701-40dc-bfd5-675f2d600954\",\"as\":\"default\"},\"use_selection10\":{\"use\":\"30c5b4c2-f75f-4d15-869a-f8bfedd87358\",\"as\":\"default\"},\"use_selection11\":{\"use\":\"ce8cf834-6bac-44fb-941c-861f7e046cc0\",\"as\":\"default\"},\"use_selection12\":{\"use\":\"3cf76fbf-fd95-4a33-878e-7aff6d36b7f6\",\"as\":\"default\"},\"use_selection13\":{\"use\":\"640b5352-fb09-425f-a26e-cd44eda03f15\",\"as\":\"default\"}}', '', 1, '2021-11-06 13:25:19', '2022-06-07 13:29:51', 69, 1), +(1, '', 'Basic shared utilities, a legacy implementation\r\n\r\n@since 3.0.9', '', '', '79d765b3-7319-4988-9730-446c7f347020', '', '', '', '{\"load_selection0\":{\"load\":\"1d929017-a5de-4e0f-9b5a-838934857e26\"}}', 'CS8qKg0KCSAqIFRoZSBNYWluIEFjdGl2ZSBMYW5ndWFnZQ0KCSAqIA0KCSAqIEB2YXIgICAgICBzdHJpbmcNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICovDQoJcHVibGljIHN0YXRpYyAkbGFuZ1RhZzsNCg0KCS8qKg0KCSAqIENoZWNrIGlmIGhhdmUgYSBzdHJpbmcgd2l0aCBhIGxlbmd0aA0KCSAqDQoJICogQGlucHV0ICAgIHN0cmluZyAgJHN0cmluZyBUaGUgc3RyaW5nIHRvIGNoZWNrDQoJICoNCgkgKiBAcmV0dXJucyBib29sIHRydWUgb24gc3VjY2Vzcw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKg0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgU3RyaW5nSGVscGVyOjpjaGVjaygkc3RyaW5nKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNoZWNrU3RyaW5nKCRzdHJpbmcpOiBib29sDQoJew0KCQlyZXR1cm4gU3RyaW5nSGVscGVyOjpjaGVjaygkc3RyaW5nKTsNCgl9DQoNCgkvKioNCgkgKiBTaG9ydGVuIGEgc3RyaW5nDQoJICoNCgkgKiBAaW5wdXQgICAgc3RyaW5nICAkc3RyaW5nIFRoYXQgeW91IHdvdWxkIGxpa2UgdG8gc2hvcnRlbg0KCSAqDQoJICogQHJldHVybnMgc3RyaW5nIG9uIHN1Y2Nlc3MNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIFN0cmluZ0hlbHBlcjo6c2hvcnRlbigkc3RyaW5nLCAkbGVuZ3RoLCAkYWRkVGlwKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNob3J0ZW4oJHN0cmluZywgJGxlbmd0aCA9IDQwLCAkYWRkVGlwID0gdHJ1ZSkNCgl7DQoJCXJldHVybiBTdHJpbmdIZWxwZXI6OnNob3J0ZW4oJHN0cmluZywgJGxlbmd0aCwgJGFkZFRpcCk7DQoJfQ0KDQoJLyoqDQoJICogTWFraW5nIHN0cmluZ3Mgc2FmZSAodmFyaW91cyB3YXlzKQ0KCSAqDQoJICogQGlucHV0ICAgIHN0cmluZyAgJHN0cmluZyBUaGF0IHlvdSB3b3VsZCBsaWtlIHRvIG1ha2Ugc2FmZQ0KCSAqDQoJICogQHJldHVybnMgc3RyaW5nIG9uIHN1Y2Nlc3MNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIFN0cmluZ0hlbHBlcjo6c2FmZSgkc3RyaW5nLCAkdHlwZSwgJHNwYWNlciwgJHJlcGxhY2VOdW1iZXJzLCAka2VlcE9ubHlDaGFyYWN0ZXJzKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNhZmVTdHJpbmcoJHN0cmluZywgJHR5cGUgPSAnTCcsICRzcGFjZXIgPSAnXycsICRyZXBsYWNlTnVtYmVycyA9IHRydWUsICRrZWVwT25seUNoYXJhY3RlcnMgPSB0cnVlKQ0KCXsNCgkJLy8gc2V0IHRoZSBsb2NhbCBjb21wb25lbnQgb3B0aW9uDQoJCXNlbGY6OnNldENvbXBvbmVudE9wdGlvbigpOw0KDQoJCXJldHVybiBTdHJpbmdIZWxwZXI6OnNhZmUoJHN0cmluZywgJHR5cGUsICRzcGFjZXIsICRyZXBsYWNlTnVtYmVycywgJGtlZXBPbmx5Q2hhcmFjdGVycyk7DQoJfQ0KDQoJLyoqDQoJICogTWFraW5nIGNsYXNzIG9yIGZ1bmN0aW9uIG5hbWUgc2FmZQ0KCSAqDQoJICogQGlucHV0CXN0cmluZyAgICAgICBUaGUgbmFtZSB5b3Ugd291bGQgbGlrZSB0byBtYWtlIHNhZmUNCgkgKg0KCSAqIEByZXR1cm5zIHN0cmluZyBvbiBzdWNjZXNzDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBDbGFzc2Z1bmN0aW9uSGVscGVyOjpzYWZlKCRuYW1lKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNhZmVDbGFzc0Z1bmN0aW9uTmFtZSgkbmFtZSkNCgl7DQoJCXJldHVybiBDbGFzc2Z1bmN0aW9uSGVscGVyOjpzYWZlKCRuYW1lKTsNCgl9DQoNCgkvKioNCgkgKiBNYWtpbmcgZmllbGQgbmFtZXMgc2FmZQ0KCSAqDQoJICogQGlucHV0CXN0cmluZyAgICAgICBUaGUgeW91IHdvdWxkIGxpa2UgdG8gbWFrZSBzYWZlDQoJICogQGlucHV0CWJvb2xlYW4gICAgICBUaGUgc3dpdGNoIHRvIHJldHVybiBhbiBBTEwgVVBQRVIgQ0FTRSBzdHJpbmcNCgkgKiBAaW5wdXQJc3RyaW5nICAgICAgIFRoZSBzdHJpbmcgdG8gdXNlIGluIHdoaXRlIHNwYWNlDQoJICoNCgkgKiBAcmV0dXJucyBzdHJpbmcgb24gc3VjY2Vzcw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKg0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgRmllbGRIZWxwZXI6OnNhZmUoJHN0cmluZywgJGFsbGNhcCwgJHNwYWNlcik7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzYWZlRmllbGROYW1lKCRzdHJpbmcsICRhbGxjYXAgPSBmYWxzZSwgJHNwYWNlciA9ICdfJykNCgl7DQoJCS8vIHNldCB0aGUgbG9jYWwgY29tcG9uZW50IG9wdGlvbg0KCQlzZWxmOjpzZXRDb21wb25lbnRPcHRpb24oKTsNCg0KCQlyZXR1cm4gRmllbGRIZWxwZXI6OnNhZmUoJHN0cmluZywgJGFsbGNhcCwgJHNwYWNlcik7DQoJfQ0KDQoJLyoqDQoJICogTWFraW5nIGZpZWxkIHR5cGUgbmFtZSBzYWZlDQoJICoNCgkgKiBAaW5wdXQJc3RyaW5nICAgICAgIFRoZSB5b3Ugd291bGQgbGlrZSB0byBtYWtlIHNhZmUNCgkgKg0KCSAqIEByZXR1cm5zIHN0cmluZyBvbiBzdWNjZXNzDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBUeXBlSGVscGVyOjpzYWZlKCRzdHJpbmcpOw0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2FmZVR5cGVOYW1lKCRzdHJpbmcpDQoJew0KCQkvLyBzZXQgdGhlIGxvY2FsIGNvbXBvbmVudCBvcHRpb24NCgkJc2VsZjo6c2V0Q29tcG9uZW50T3B0aW9uKCk7DQoNCgkJcmV0dXJuIFR5cGVIZWxwZXI6OnNhZmUoJHN0cmluZyk7DQoJfQ0KDQoJLyoqDQoJICogTWFraW5nIG5hbWVzcGFjZSBzYWZlDQoJICoNCgkgKiBAaW5wdXQJc3RyaW5nICAgICAgIFRoZSB5b3Ugd291bGQgbGlrZSB0byBtYWtlIHNhZmUNCgkgKg0KCSAqIEByZXR1cm5zIHN0cmluZyBvbiBzdWNjZXNzDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBOYW1lc3BhY2VIZWxwZXI6OnNhZmUoJHN0cmluZyk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzYWZlTmFtZXNwYWNlKCRzdHJpbmcpDQoJew0KCQlyZXR1cm4gTmFtZXNwYWNlSGVscGVyOjpzYWZlKCRzdHJpbmcpOw0KCX0NCg0KCS8qKg0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKiANCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIFN0cmluZ0hlbHBlcjo6dHJhbnNsaXRlcmF0ZSgkc3RyaW5nKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHRyYW5zbGl0ZXJhdGUoJHN0cmluZykNCgl7DQoJCS8vIHNldCB0aGUgbG9jYWwgY29tcG9uZW50IG9wdGlvbg0KCQlzZWxmOjpzZXRDb21wb25lbnRPcHRpb24oKTsNCg0KCQlyZXR1cm4gU3RyaW5nSGVscGVyOjp0cmFuc2xpdGVyYXRlKCRzdHJpbmcpOw0KCX0NCg0KCS8qKg0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKiANCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIFN0cmluZ0hlbHBlcjo6aHRtbCgkdmFyLCAkY2hhcnNldCwgJHNob3J0ZW4sICRsZW5ndGgpOw0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaHRtbEVzY2FwZSgkdmFyLCAkY2hhcnNldCA9ICdVVEYtOCcsICRzaG9ydGVuID0gZmFsc2UsICRsZW5ndGggPSA0MCkNCgl7DQoJCS8vIHNldCB0aGUgbG9jYWwgY29tcG9uZW50IG9wdGlvbg0KCQlzZWxmOjpzZXRDb21wb25lbnRPcHRpb24oKTsNCg0KCQlyZXR1cm4gU3RyaW5nSGVscGVyOjpodG1sKCR2YXIsICRjaGFyc2V0LCAkc2hvcnRlbiwgJGxlbmd0aCk7DQoJfQ0KDQoJLyoqDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqIA0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgU3RyaW5nSGVscGVyOjpudW1iZXJzKCRzdHJpbmcpOw0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVwbGFjZU51bWJlcnMoJHN0cmluZykNCgl7DQoJCXJldHVybiBTdHJpbmdIZWxwZXI6Om51bWJlcnMoJHN0cmluZyk7DQoJfQ0KDQoJLyoqDQoJICogQ29udmVydCBhbiBpbnRlZ2VyIGludG8gYW4gRW5nbGlzaCB3b3JkIHN0cmluZw0KCSAqIFRoYW5rcyB0byBUb20gTmljaG9sc29uIDxodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24uc3RydmFsLnBocCM0MTk4OD4NCgkgKg0KCSAqIEBpbnB1dCAgICBpbnQgJHggYW4gaW50DQoJICoNCgkgKiBAcmV0dXJucyBzdHJpbmcgYSBzdHJpbmcNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIFN0cmluZ0hlbHBlcjo6bnVtYmVyKCR4KTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG51bWJlclRvU3RyaW5nKCR4KQ0KCXsNCgkJcmV0dXJuIFN0cmluZ0hlbHBlcjo6bnVtYmVyKCR4KTsNCgl9DQoNCgkvKioNCgkgKiBSYW5kb20gS2V5DQoJICoNCgkgKiBAaW5wdXQgaW50ICRzaXplIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZw0KCSAqDQoJICogQHJldHVybnMgc3RyaW5nIGEgc3RyaW5nIG9mIHJhbmRvbSBjaGFyYWN0ZXJzDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBTdHJpbmdIZWxwZXI6OnJhbmRvbSgkc2l6ZSk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiByYW5kb21rZXkoJHNpemUpOiBzdHJpbmcNCgl7DQoJCXJldHVybiBTdHJpbmdIZWxwZXI6OnJhbmRvbSgkc2l6ZSk7DQoJfQ0KDQoJLyoqDQoJICogQ2hlY2sgaWYgeW91IGhhdmUgYSBqc29uIHN0cmluZw0KCSAqDQoJICogQGlucHV0ICAgIHN0cmluZyAgJHN0cmluZyAgVGhlIGpzb24gc3RyaW5nIHRvIGNoZWNrDQoJICoNCgkgKiBAcmV0dXJucyBib29sIHRydWUgb24gc3VjY2Vzcw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKg0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgSnNvbkhlbHBlcjo6Y2hlY2soJHN0cmluZyk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGVja0pzb24oJHN0cmluZyk6IGJvb2wNCgl7DQoJCXJldHVybiBKc29uSGVscGVyOjpjaGVjaygkc3RyaW5nKTsNCgl9DQoNCgkvKioNCgkgKiBAc2luY2UgIDMuMC45DQoJICogDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBKc29uSGVscGVyOjpzdHJpbmcoJHZhbHVlLCAkc3BlcmF0b3IsICR0YWJsZSwgJGlkLCAkbmFtZSk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBqc29uVG9TdHJpbmcoJHZhbHVlLCAkc3BlcmF0b3IgPSAiLCAiLCAkdGFibGUgPSBudWxsLCAkaWQgPSAnaWQnLCAkbmFtZSA9ICduYW1lJykNCgl7DQoJCXJldHVybiBKc29uSGVscGVyOjpzdHJpbmcoJHZhbHVlLCAkc3BlcmF0b3IsICR0YWJsZSwgJGlkLCAkbmFtZSk7DQoJfQ0KDQoJLyoqDQoJICogQ2hlY2sgaWYgeW91IGhhdmUgYW4gYXJyYXkgd2l0aCBhIGxlbmd0aA0KCSAqDQoJICogQGlucHV0ICAgIG1peGVkICRhcnJheSAgICAgICAgICAgICAgVGhlIGFycmF5IHRvIGNoZWNrDQoJICogQGlucHV0ICAgIGJvb2wgICRyZW1vdmVFbXB0eVN0cmluZyAgU2hvdWxkIHdlIHJlbW92ZSBlbXB0eSB2YWx1ZXMNCgkgKg0KCSAqIEByZXR1cm5zIGludCAgbnVtYmVyIG9mIGl0ZW1zIGluIGFycmF5IG9uIHN1Y2Nlc3MNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIEFycmF5SGVscGVyOjpjaGVjaygkYXJyYXksICRyZW1vdmVFbXB0eVN0cmluZyk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGVja0FycmF5KCRhcnJheSwgJHJlbW92ZUVtcHR5U3RyaW5nID0gZmFsc2UpOiBpbnQNCgl7DQoJCXJldHVybiBBcnJheUhlbHBlcjo6Y2hlY2soJGFycmF5LCAkcmVtb3ZlRW1wdHlTdHJpbmcpOw0KCX0NCg0KCS8qKg0KCSAqIE1lcmdlIGFuIGFycmF5IG9mIGFycmF5J3MNCgkgKg0KCSAqIEBpbnB1dCAgICBtaXhlZCAgJGFycmF5cyBUaGUgYXJyYXlzIHlvdSB3b3VsZCBsaWtlIHRvIG1lcmdlDQoJICoNCgkgKiBAcmV0dXJucyBtaXhlZCBhcnJheSBvbiBzdWNjZXNzDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBBcnJheUhlbHBlcjo6bWVyZ2UoJGFycmF5cyk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtZXJnZUFycmF5cygkYXJyYXlzKQ0KCXsNCgkJcmV0dXJuIEFycmF5SGVscGVyOjptZXJnZSgkYXJyYXlzKTsNCgl9DQoNCgkvKioNCgkgKiBDaGVjayBpZiB5b3UgaGF2ZSBhbiBvYmplY3Qgd2l0aCBhIGxlbmd0aA0KCSAqDQoJICogQGlucHV0ICAgIG9iamVjdCAkb2JqZWN0ICBUaGUgb2JqZWN0IHRvIGNoZWNrDQoJICoNCgkgKiBAcmV0dXJucyBib29sIHRydWUgb24gc3VjY2Vzcw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKg0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgT2JqZWN0SGVscGVyOjpjaGVjaygkb2JqZWN0KTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNoZWNrT2JqZWN0KCRvYmplY3QpOiBib29sDQoJew0KCQlyZXR1cm4gT2JqZWN0SGVscGVyOjpjaGVjaygkb2JqZWN0KTsNCgl9DQoNCgkvKioNCgkgKiBHZXQgYSBWYXJpYWJsZSANCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgICR0YWJsZSAgICAgICAgVGhlIHRhYmxlIGZyb20gd2hpY2ggdG8gZ2V0IHRoZSB2YXJpYWJsZQ0KCSAqIEBwYXJhbSAgIHN0cmluZyAgICR3aGVyZSAgICAgICAgVGhlIHZhbHVlIHdoZXJlDQoJICogQHBhcmFtICAgc3RyaW5nICAgJHdoZXJlU3RyaW5nICBUaGUgdGFyZ2V0L2ZpZWxkIHN0cmluZyB3aGVyZS9uYW1lDQoJICogQHBhcmFtICAgc3RyaW5nICAgJHdoYXQgICAgICAgICBUaGUgcmV0dXJuIGZpZWxkDQoJICogQHBhcmFtICAgc3RyaW5nICAgJG9wZXJhdG9yICAgICBUaGUgb3BlcmF0b3IgYmV0d2VlbiAkd2hlcmVTdHJpbmcvZmllbGQgYW5kICR3aGVyZS92YWx1ZQ0KCSAqIEBwYXJhbSAgIHN0cmluZyAgICRtYWluICAgICAgICAgVGhlIGNvbXBvbmVudCBpbiB3aGljaCB0aGUgdGFibGUgaXMgZm91bmQNCgkgKg0KCSAqIEByZXR1cm4gIG1peCBzdHJpbmcvaW50L2Zsb2F0DQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBHZXRIZWxwZXI6OnZhcigkdGFibGUsICR3aGVyZSwgJHdoZXJlU3RyaW5nLCAkd2hhdCwgJG9wZXJhdG9yLCAkbWFpbik7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRWYXIoJHRhYmxlLCAkd2hlcmUgPSBudWxsLCAkd2hlcmVTdHJpbmcgPSAndXNlcicsICR3aGF0ID0gJ2lkJywgJG9wZXJhdG9yID0gJz0nLCAkbWFpbiA9IG51bGwpDQoJew0KCQkvLyBzZXQgdGhlIGxvY2FsIGNvbXBvbmVudCBvcHRpb24NCgkJc2VsZjo6c2V0Q29tcG9uZW50T3B0aW9uKCk7DQoNCgkJcmV0dXJuIEdldEhlbHBlcjo6dmFyKCR0YWJsZSwgJHdoZXJlLCAkd2hlcmVTdHJpbmcsICR3aGF0LCAkb3BlcmF0b3IsICRtYWluKTsNCgl9DQoNCgkvKioNCgkgKiBHZXQgYXJyYXkgb2YgdmFyaWFibGVzDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmcgICAkdGFibGUgICAgICAgIFRoZSB0YWJsZSBmcm9tIHdoaWNoIHRvIGdldCB0aGUgdmFyaWFibGVzDQoJICogQHBhcmFtICAgc3RyaW5nICAgJHdoZXJlICAgICAgICBUaGUgdmFsdWUgd2hlcmUNCgkgKiBAcGFyYW0gICBzdHJpbmcgICAkd2hlcmVTdHJpbmcgIFRoZSB0YXJnZXQvZmllbGQgc3RyaW5nIHdoZXJlL25hbWUNCgkgKiBAcGFyYW0gICBzdHJpbmcgICAkd2hhdCAgICAgICAgIFRoZSByZXR1cm4gZmllbGQNCgkgKiBAcGFyYW0gICBzdHJpbmcgICAkb3BlcmF0b3IgICAgIFRoZSBvcGVyYXRvciBiZXR3ZWVuICR3aGVyZVN0cmluZy9maWVsZCBhbmQgJHdoZXJlL3ZhbHVlDQoJICogQHBhcmFtICAgc3RyaW5nICAgJG1haW4gICAgICAgICBUaGUgY29tcG9uZW50IGluIHdoaWNoIHRoZSB0YWJsZSBpcyBmb3VuZA0KCSAqIEBwYXJhbSAgIGJvb2wgICAgICR1bmlxdWUgICAgICAgVGhlIHN3aXRjaCB0byByZXR1cm4gYSB1bmlxdWUgYXJyYXkNCgkgKg0KCSAqIEByZXR1cm4gIGFycmF5DQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBHZXRIZWxwZXI6OnZhcnMoJHRhYmxlLCAkd2hlcmUsICR3aGVyZVN0cmluZywgJHdoYXQsICRvcGVyYXRvciwgJG1haW4sICR1bmlxdWUpOw0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VmFycygkdGFibGUsICR3aGVyZSA9IG51bGwsICR3aGVyZVN0cmluZyA9ICd1c2VyJywgJHdoYXQgPSAnaWQnLCAkb3BlcmF0b3IgPSAnSU4nLCAkbWFpbiA9IG51bGwsICR1bmlxdWUgPSB0cnVlKQ0KCXsNCgkJLy8gc2V0IHRoZSBsb2NhbCBjb21wb25lbnQgb3B0aW9uDQoJCXNlbGY6OnNldENvbXBvbmVudE9wdGlvbigpOw0KDQoJCXJldHVybiBHZXRIZWxwZXI6OnZhcnMoJHRhYmxlLCAkd2hlcmUsICR3aGVyZVN0cmluZywgJHdoYXQsICRvcGVyYXRvciwgJG1haW4sICR1bmlxdWUpOw0KCX0NCg0KCS8qKg0KCSAqIGdldCBhbGwgc3RyaW5ncyBiZXR3ZWVuIHR3byBvdGhlciBzdHJpbmdzDQoJICoNCgkgKiBAcGFyYW0gIHN0cmluZyAgICAgICAgICAkY29udGVudCAgICBUaGUgY29udGVudCB0byBzZWFyY2gNCgkgKiBAcGFyYW0gIHN0cmluZyAgICAgICAgICAkc3RhcnQgICAgICAgIFRoZSBzdGFydGluZyB2YWx1ZQ0KCSAqIEBwYXJhbSAgc3RyaW5nICAgICAgICAgICRlbmQgICAgICAgICBUaGUgZW5kaW5nIHZhbHVlDQoJICoNCgkgKiBAcmV0dXJuICBhcnJheSAgICAgICAgICBPbiBzdWNjZXNzDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBHZXRIZWxwZXI6OmFsbEJldHdlZW4oJGNvbnRlbnQsICRzdGFydCwgJGVuZCk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRBbGxCZXR3ZWVuKCRjb250ZW50LCAkc3RhcnQsICRlbmQpDQoJew0KCQlyZXR1cm4gR2V0SGVscGVyOjphbGxCZXR3ZWVuKCRjb250ZW50LCAkc3RhcnQsICRlbmQpOw0KCX0NCg0KCS8qKg0KCSAqIGdldCBhIHN0cmluZyBiZXR3ZWVuIHR3byBvdGhlciBzdHJpbmdzDQoJICogDQoJICogQHBhcmFtICBzdHJpbmcgICAgICAgICAgJGNvbnRlbnQgICAgVGhlIGNvbnRlbnQgdG8gc2VhcmNoDQoJICogQHBhcmFtICBzdHJpbmcgICAgICAgICAgJHN0YXJ0ICAgICAgICBUaGUgc3RhcnRpbmcgdmFsdWUNCgkgKiBAcGFyYW0gIHN0cmluZyAgICAgICAgICAkZW5kICAgICAgICAgVGhlIGVuZGluZyB2YWx1ZQ0KCSAqIEBwYXJhbSAgc3RyaW5nICAgICAgICAgICRkZWZhdWx0ICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpZiBub25lIGZvdW5kDQoJICoNCgkgKiBAcmV0dXJuICBzdHJpbmcgICAgICAgICAgT24gc3VjY2VzcyAvIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBHZXRIZWxwZXI6OmJldHdlZW4oJGNvbnRlbnQsICRzdGFydCwgJGVuZCwgJGRlZmF1bHQpOw0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0QmV0d2VlbigkY29udGVudCwgJHN0YXJ0LCAkZW5kLCAkZGVmYXVsdCA9ICcnKQ0KCXsNCgkJcmV0dXJuIEdldEhlbHBlcjo6YmV0d2VlbigkY29udGVudCwgJHN0YXJ0LCAkZW5kLCAkZGVmYXVsdCk7DQoJfQ0KDQoJLyoqDQoJICogYmMgbWF0aCB3cmFwcGVyICh2ZXJ5IGJhc2ljIG5vdCBmb3IgYWNjb3VudGluZykNCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgICR0eXBlICAgIFRoZSB0eXBlIGJjIG1hdGgNCgkgKiBAcGFyYW0gICBpbnQgICAgICAkdmFsMSAgICBUaGUgZmlyc3QgdmFsdWUNCgkgKiBAcGFyYW0gICBpbnQgICAgICAkdmFsMiAgICBUaGUgc2Vjb25kIHZhbHVlDQoJICogQHBhcmFtICAgaW50ICAgICAgJHNjYWxlICAgVGhlIHNjYWxlIHZhbHVlDQoJICoNCgkgKiBAcmV0dXJuIGZsb2F0fGludA0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKg0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgTWF0aEhlbHBlcjo6YmMoJHR5cGUsICR2YWwxLCAkdmFsMiwgJHNjYWxlKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGJjbWF0aCgkdHlwZSwgJHZhbDEsICR2YWwyLCAkc2NhbGUgPSAwKQ0KCXsNCgkJcmV0dXJuIE1hdGhIZWxwZXI6OmJjKCR0eXBlLCAkdmFsMSwgJHZhbDIsICRzY2FsZSk7DQoJfQ0KDQoJLyoqDQoJICogQmFzaWMgc3VtIG9mIGFuIGFycmF5IHdpdGggbW9yZSBwcmVjaXNpb24NCgkgKg0KCSAqIEBwYXJhbSAgIGFycmF5ICAgJGFycmF5ICAgIFRoZSB2YWx1ZXMgdG8gc3VtDQoJICogQHBhcmFtICAgaW50ICAgICAgJHNjYWxlICAgVGhlIHNjYWxlIHZhbHVlDQoJICoNCgkgKiBAcmV0dXJuIGZsb2F0fGludA0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKg0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgTWF0aEhlbHBlcjo6c3VtKCRhcnJheSwgJHNjYWxlKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGJjc3VtKCRhcnJheSwgJHNjYWxlID0gNCkNCgl7DQoJCXJldHVybiBNYXRoSGVscGVyOjpzdW0oJGFycmF5LCAkc2NhbGUpOw0KCX0NCg0KICAgICAgICAvKioNCiAgICAgICAgICogY3JlYXRlIHBsdWdpbiBjbGFzcyBuYW1lDQoJICoNCgkgKiBAaW5wdXQJc3RyaW5nICAgICAgIFRoZSBncm91cCBuYW1lDQoJICogQGlucHV0CXN0cmluZyAgICAgICBUaGUgbmFtZQ0KCSAqDQoJICogQHJldHVybiBzdHJpbmcNCgkgKiANCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIFBsdWdpbkhlbHBlcjo6c2FmZSgkbmFtZSwgJGdyb3VwKTsNCiAgICAgICAgICovDQogICAgICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlUGx1Z2luQ2xhc3NOYW1lKCRncm91cCwgJG5hbWUpDQoJew0KCQlyZXR1cm4gUGx1Z2luSGVscGVyOjpzYWZlQ2xhc3NOYW1lKCRuYW1lLCAkZ3JvdXApOw0KCX0NCg0KCS8qKg0KCSAqIFJldHVybnMgYSBHVUlEdjQgc3RyaW5nDQoJICogDQoJICogVGhhbmtzIHRvIERhdmUgUGVhcnNvbiAoYW5kIG90aGVyKQ0KCSAqIGh0dHBzOi8vd3d3LnBocC5uZXQvbWFudWFsL2VuL2Z1bmN0aW9uLmNvbS1jcmVhdGUtZ3VpZC5waHAjMTE5MTY4IA0KCSAqDQoJICogVXNlcyB0aGUgYmVzdCBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgbWV0aG9kDQoJICogZm9yIGFsbCBzdXBwb3J0ZWQgcGxhdGZvcm1zIHdpdGggZmFsbGJhY2sgdG8gYW4gb2xkZXIsDQoJICogbGVzcyBzZWN1cmUgdmVyc2lvbi4NCgkgKg0KCSAqIEBwYXJhbSBib29sICR0cmltDQoJICoNCgkgKiBAcmV0dXJuIHN0cmluZw0KCSAqIA0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKg0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgR3VpZEhlbHBlcjo6Z2V0KCR0cmltKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEdVSUQoJHRyaW0gPSB0cnVlKQ0KCXsNCgkJcmV0dXJuIEd1aWRIZWxwZXI6OmdldCgkdHJpbSk7DQoJfQ0KDQoJLyoqDQoJICogVmFsaWRhdGUgdGhlIEdsb2JhbGx5IFVuaXF1ZSBJZGVudGlmaWVyICggYW5kIGNoZWNrIGlmIHRhYmxlIGFscmVhZHkgaGFzIHRoaXMgaWRlbnRpZmllcikNCgkgKg0KCSAqIEBwYXJhbSBzdHJpbmcgICAgICAgJGd1aWQNCgkgKiBAcGFyYW0gc3RyaW5nICAgICAgICR0YWJsZQ0KCSAqIEBwYXJhbSBpbnQgICAgICAgICAgICAkaWQNCgkgKiBAcGFyYW0gc3RyaW5nfG51bGwgJGNvbXBvbmVudA0KCSAqDQoJICogQHJldHVybiBib29sDQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBHdWlkSGVscGVyOjp2YWxpZCgkZ3VpZCwgJHRhYmxlLCAkaWQsICRjb21wb25lbnQpOw0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdmFsaWRHVUlEKCRndWlkLCAkdGFibGUgPSBudWxsLCAkaWQgPSAwLCAkY29tcG9uZW50ID0gbnVsbCkNCgl7DQoJCS8vIHNldCB0aGUgbG9jYWwgY29tcG9uZW50IG9wdGlvbg0KCQlzZWxmOjpzZXRDb21wb25lbnRPcHRpb24oKTsNCg0KCQlyZXR1cm4gR3VpZEhlbHBlcjo6dmFsaWQoJGd1aWQsICR0YWJsZSwgJGlkLCAkY29tcG9uZW50KTsNCgl9DQoNCgkvKioNCgkgKiBnZXQgdGhlIElURU0gb2YgYSBHVUlEIGJ5IHRhYmxlDQoJICoNCgkgKiBAcGFyYW0gc3RyaW5nICAgICAgICAgICAkZ3VpZA0KCSAqIEBwYXJhbSBzdHJpbmcgICAgICAgICAgICR0YWJsZQ0KCSAqIEBwYXJhbSBzdHJpbmcvYXJyYXkgICR3aGF0DQoJICogQHBhcmFtIHN0cmluZ3xudWxsICAgICRjb21wb25lbnQNCgkgKg0KCSAqIEByZXR1cm4gbWl4DQoJICogDQoJICogQHNpbmNlICAzLjAuOQ0KCSAqDQoJICogQGRlcHJlY2F0ZWQgIDQuMCAtIFVzZSBHdWlkSGVscGVyOjp2YWxpZCgkZ3VpZCwgJHRhYmxlLCAkaWQsICRjb21wb25lbnQpOw0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0R1VJRCgkZ3VpZCwgJHRhYmxlLCAkd2hhdCA9ICdhLmlkJywgJGNvbXBvbmVudCA9IG51bGwpDQoJew0KCQkvLyBzZXQgdGhlIGxvY2FsIGNvbXBvbmVudCBvcHRpb24NCgkJc2VsZjo6c2V0Q29tcG9uZW50T3B0aW9uKCk7DQoNCgkJcmV0dXJuIEd1aWRIZWxwZXI6Oml0ZW0oJGd1aWQsICR0YWJsZSwgJHdoYXQsICRjb21wb25lbnQpOw0KCX0NCg0KCS8qKg0KCSAqIFZhbGlkYXRlIHRoZSBHbG9iYWxseSBVbmlxdWUgSWRlbnRpZmllcg0KCSAqDQoJICogVGhhbmtzIHRvIExld2llDQoJICogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE1MTU0NTYvMTQyOTY3Nw0KCSAqDQoJICogQHBhcmFtIHN0cmluZyAkZ3VpZA0KCSAqDQoJICogQHJldHVybiBib29sDQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIEd1aWRIZWxwZXI6OnZhbGlkYXRlKCRndWlkKTsNCgkgKi8NCglwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIHZhbGlkYXRlR1VJRCgkZ3VpZCkNCgl7DQoJCXJldHVybiBHdWlkSGVscGVyOjp2YWxpZGF0ZSgkZ3VpZCk7DQoJfQ0KDQoJLyoqDQoJICogVGhlIHppcHBlciBtZXRob2QNCgkgKiANCgkgKiBAcGFyYW0gIHN0cmluZyAgICR3b3JraW5nRElSICAgIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGl0ZW1zIG11c3QgYmUgemlwcGVkDQoJICogQHBhcmFtICBzdHJpbmcgICAkZmlsZXBhdGggICAgICAgICAgVGhlIHBhdGggdG8gd2hlcmUgdGhlIHppcCBmaWxlIG11c3QgYmUgcGxhY2VkDQoJICoNCgkgKiBAcmV0dXJuICBib29sIHRydWUgICBPbiBzdWNjZXNzDQoJICoNCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIEZpbGVIZWxwZXI6OnppcCgkd29ya2luZ0RJUiwgJGZpbGVwYXRoKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHppcCgkd29ya2luZ0RJUiwgJiRmaWxlcGF0aCkNCgl7DQoJCXJldHVybiBGaWxlSGVscGVyOjp6aXAoJHdvcmtpbmdESVIsICRmaWxlcGF0aCk7DQoJfQ0KDQoJLyoqDQoJICogZ2V0IHRoZSBjb250ZW50IG9mIGEgZmlsZQ0KCSAqDQoJICogQHBhcmFtICBzdHJpbmcgICAgICAgICRwYXRoICAgVGhlIHBhdGggdG8gdGhlIGZpbGUNCgkgKiBAcGFyYW0gIHN0cmluZy9ib29sICAgJG5vbmUgICBUaGUgcmV0dXJuIHZhbHVlIGlmIG5vIGNvbnRlbnQgd2FzIGZvdW5kDQoJICoNCgkgKiBAcmV0dXJuICBzdHJpbmcgICBPbiBzdWNjZXNzDQoJICoNCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIEZpbGVIZWxwZXI6OmdldENvbnRlbnQoJHBhdGgsICRub25lKTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEZpbGVDb250ZW50cygkcGF0aCwgJG5vbmUgPSAnJykNCgl7DQoJCXJldHVybiBGaWxlSGVscGVyOjpnZXRDb250ZW50KCRwYXRoLCAkbm9uZSk7DQoJfQ0KDQoJLyoqDQoJICogV3JpdGUgYSBmaWxlIHRvIHRoZSBzZXJ2ZXINCgkgKg0KCSAqIEBwYXJhbSAgc3RyaW5nICAgJHBhdGggICAgVGhlIHBhdGggYW5kIGZpbGUgbmFtZSB3aGVyZSB0byBzYWZlIHRoZSBkYXRhDQoJICogQHBhcmFtICBzdHJpbmcgICAkZGF0YSAgICBUaGUgZGF0YSB0byBzYWZlDQoJICoNCgkgKiBAcmV0dXJuICBib29sIHRydWUgICBPbiBzdWNjZXNzDQoJICoNCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIEZpbGVIZWxwZXI6OndyaXRlKCRwYXRoLCAkZGF0YSk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB3cml0ZUZpbGUoJHBhdGgsICRkYXRhKQ0KCXsNCgkJcmV0dXJuIEZpbGVIZWxwZXI6OndyaXRlKCRwYXRoLCAkZGF0YSk7DQoJfQ0KDQoJLyoqDQoJICogZ2V0IGFsbCB0aGUgZmlsZSBwYXRocyBpbiBmb2xkZXIgYW5kIHN1YiBmb2xkZXJzDQoJICogDQoJICogQHBhcmFtICAgc3RyaW5nICAkZm9sZGVyICAgICBUaGUgbG9jYWwgcGF0aCB0byBwYXJzZQ0KCSAqIEBwYXJhbSAgIGFycmF5ICAgJGZpbGVUeXBlcyAgVGhlIHR5cGUgb2YgZmlsZXMgdG8gZ2V0DQoJICoNCgkgKiBAcmV0dXJuICB2b2lkDQoJICoNCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIEZpbGVIZWxwZXI6OmdldFBhdGhzKCRmb2xkZXIsICRmaWxlVHlwZXMgLCAkcmVjdXJzZSwgJGZ1bGwpOw0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0QWxsRmlsZVBhdGhzKCRmb2xkZXIsICRmaWxlVHlwZXMgPSBhcnJheSgnXC5waHAnLCAnXC5qcycsICdcLmNzcycsICdcLmxlc3MnKSwgJHJlY3Vyc2UgPSB0cnVlLCAkZnVsbCA9IHRydWUpDQoJew0KCQlyZXR1cm4gRmlsZUhlbHBlcjo6Z2V0UGF0aHMoJGZvbGRlciwgJGZpbGVUeXBlcyAsICRyZWN1cnNlLCAkZnVsbCk7DQoJfQ0KDQoJLyoqDQoJICogR2V0IHRoZSBmaWxlIHBhdGggb3IgdXJsDQoJICoNCgkgKiBAcGFyYW0gIHN0cmluZyAgICR0eXBlICAgICAgICAgICAgICBUaGUgKHVybC9wYXRoKSB0eXBlIHRvIHJldHVybg0KCSAqIEBwYXJhbSAgc3RyaW5nICAgJHRhcmdldCAgICAgICAgICAgIFRoZSBQYXJhbXMgVGFyZ2V0IG5hbWUgKGlmIHNldCkNCgkgKiBAcGFyYW0gIHN0cmluZyAgICRmaWxlVHlwZSAgICAgICAgICBUaGUga2luZCBvZiBmaWxlbmFtZSB0byBnZW5lcmF0ZSAoaWYgbm90IHNldCBubyBmaWxlIG5hbWUgaXMgZ2VuZXJhdGVkKQ0KCSAqIEBwYXJhbSAgc3RyaW5nICAgJGtleSAgICAgICAgICAgICAgIFRoZSBrZXkgdG8gYWRqdXN0IHRoZSBmaWxlbmFtZSAoaWYgbm90IHNldCBpZ25vcmVkKQ0KCSAqIEBwYXJhbSAgc3RyaW5nICAgJGRlZmF1bHQgICAgICAgICAgIFRoZSBkZWZhdWx0IHBhdGggaWYgbm90IHNldCBpbiBQYXJhbXMgKGZhbGxiYWNrIHBhdGgpDQoJICogQHBhcmFtICBib29sICAgICAkY3JlYXRlSWZOb3RTZXQgICAgVGhlIHN3aXRjaCB0byBjcmVhdGUgdGhlIGZvbGRlciBpZiBub3QgZm91bmQNCgkgKg0KCSAqIEByZXR1cm4gIHN0cmluZyAgICBPbiBzdWNjZXNzIHRoZSBwYXRoIG9yIHVybCBpcyByZXR1cm5lZCBiYXNlZCBvbiB0aGUgdHlwZSByZXF1ZXN0ZWQNCgkgKg0KCSAqIEBzaW5jZSAgMy4wLjkNCgkgKg0KCSAqIEBkZXByZWNhdGVkICA0LjAgLSBVc2UgRmlsZUhlbHBlcjo6Z2V0UGF0aCgkdHlwZSwgJHRhcmdldCwgJGZpbGVUeXBlLCAka2V5LCAkZGVmYXVsdCwgJGNyZWF0ZUlmTm90U2V0KTsNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEZpbGVQYXRoKCR0eXBlID0gJ3BhdGgnLCAkdGFyZ2V0ID0gJ2ZpbGVwYXRoJywgJGZpbGVUeXBlID0gbnVsbCwgJGtleSA9ICcnLCAkZGVmYXVsdCA9ICcnLCAkY3JlYXRlSWZOb3RTZXQgPSB0cnVlKQ0KCXsNCgkJLy8gc2V0IHRoZSBsb2NhbCBjb21wb25lbnQgb3B0aW9uDQoJCXNlbGY6OnNldENvbXBvbmVudE9wdGlvbigpOw0KDQoJCXJldHVybiBGaWxlSGVscGVyOjpnZXRQYXRoKCR0eXBlLCAkdGFyZ2V0LCAkZmlsZVR5cGUsICRrZXksICRkZWZhdWx0LCAkY3JlYXRlSWZOb3RTZXQpOw0KCX0NCg0KCS8qKg0KCSAqIENoZWNrIGlmIGZpbGUgZXhpc3QNCgkgKg0KCSAqIEBwYXJhbSAgc3RyaW5nICAgJHBhdGggICBUaGUgdXJsL3BhdGggdG8gY2hlY2sNCgkgKg0KCSAqIEByZXR1cm4gIGJvb2wgICAgICBJZiBleGlzdCB0cnVlDQoJICoNCgkgKiBAc2luY2UgIDMuMC45DQoJICoNCgkgKiBAZGVwcmVjYXRlZCAgNC4wIC0gVXNlIEZpbGVIZWxwZXI6OmV4aXN0cygkcGF0aCk7DQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB1cmxFeGlzdHMoJHBhdGgpDQoJew0KCQlyZXR1cm4gRmlsZUhlbHBlcjo6ZXhpc3RzKCRwYXRoKTsNCgl9DQoNCgkvKioNCgkgKiBTZXQgdGhlIGNvbXBvbmVudCBvcHRpb24NCgkgKg0KCSAqIEBwYXJhbSAgIFN0cmluZ3xudWxsICAgICAgICRvcHRpb24gICAgVGhlIG9wdGlvbiBmb3IgdGhlIGNvbXBvbmVudC4NCgkgKg0KCSAqIEBzaW5jZSAgMy4wLjExDQoJICovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRDb21wb25lbnRPcHRpb24oJG9wdGlvbiA9IG51bGwpDQoJew0KCQkvLyBzZXQgdGhlIGxvY2FsIGNvbXBvbmVudCBvcHRpb24NCgkJaWYgKGVtcHR5KCRvcHRpb24pKQ0KCQl7DQoJCQlpZiAoZW1wdHkoSGVscGVyOjokb3B0aW9uKSAmJiBwcm9wZXJ0eV9leGlzdHMoX19DTEFTU19fLCAnQ29tcG9uZW50Q29kZU5hbWUnKSkNCgkJCXsNCgkJCQlIZWxwZXI6OiRvcHRpb24gPSAnY29tXycgLiBzZWxmOjokQ29tcG9uZW50Q29kZU5hbWU7DQoJCQl9DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQlIZWxwZXI6OiRvcHRpb24gPSAkb3B0aW9uOw0KCQl9DQoJfQ0K', '{}', 'Utilities', 'VDM\\Joomla\\Utilities', '1.0.0', '{}', 'Utilities', 'trait', '{\"use_selection0\":{\"use\":\"1f28cb53-60d9-4db1-b517-3c7dc6b429ef\",\"as\":\"default\"},\"use_selection1\":{\"use\":\"4b225c51-d293-48e4-b3f6-5136cf5c3f18\",\"as\":\"default\"},\"use_selection2\":{\"use\":\"0a59c65c-9daf-4bc9-baf4-e063ff9e6a8a\",\"as\":\"default\"},\"use_selection3\":{\"use\":\"91004529-94a9-4590-b842-e7c6b624ecf5\",\"as\":\"default\"},\"use_selection4\":{\"use\":\"152c8793-8b75-4715-996a-257b9f65451c\",\"as\":\"default\"},\"use_selection5\":{\"use\":\"db87c339-5bb6-4291-a7ef-2c48ea1b06bc\",\"as\":\"default\"},\"use_selection6\":{\"use\":\"9c513baf-b279-43fd-ae29-a585c8cbc4f0\",\"as\":\"default\"},\"use_selection7\":{\"use\":\"a223b31e-ea1d-4cdf-92ae-5f9becffaff0\",\"as\":\"default\"},\"use_selection8\":{\"use\":\"9ef0eb24-aae4-4f5a-99af-d724db44808f\",\"as\":\"default\"},\"use_selection9\":{\"use\":\"a8935cbe-7701-40dc-bfd5-675f2d600954\",\"as\":\"default\"},\"use_selection10\":{\"use\":\"30c5b4c2-f75f-4d15-869a-f8bfedd87358\",\"as\":\"default\"},\"use_selection11\":{\"use\":\"ce8cf834-6bac-44fb-941c-861f7e046cc0\",\"as\":\"default\"},\"use_selection12\":{\"use\":\"3cf76fbf-fd95-4a33-878e-7aff6d36b7f6\",\"as\":\"default\"},\"use_selection13\":{\"use\":\"640b5352-fb09-425f-a26e-cd44eda03f15\",\"as\":\"default\"}}', '', 1, '2021-11-06 13:25:19', '2022-08-20 15:18:05', 70, 1), (2, 1, 'To extrude tables structures from lila', '', '', '050f5a27-3aab-4087-8a3d-e2302fcfd5db', 'dXNlIERpcmVjdG9yeUl0ZXJhdG9yOw0KdXNlIFNwbEZpbGVPYmplY3Q7DQp1c2Ugc3RkQ2xhc3M7DQp1c2UgZnVuY3Rpb24gYXJyYXlfcG9wOw0KdXNlIGZ1bmN0aW9uIGNvdW50Ow0KdXNlIGZ1bmN0aW9uIGV4cGxvZGU7DQp1c2UgZnVuY3Rpb24gZmlsZV9leGlzdHM7DQp1c2UgZnVuY3Rpb24gaXNfbnVsbDsNCnVzZSBmdW5jdGlvbiBhcnJheV9yZXZlcnNlOw0KdXNlIGZ1bmN0aW9uIHN0cl9yZXBsYWNlOw0KdXNlIGZ1bmN0aW9uIHN0cmxlbjsNCnVzZSBmdW5jdGlvbiBzdHJwb3M7DQp1c2UgZnVuY3Rpb24gc3RycnBvczsNCnVzZSBmdW5jdGlvbiBzdWJzdHI7DQp1c2UgZnVuY3Rpb24gdHJpbTsNCg==', '', '', '', 'CS8qKg0KCSAqIEFkZGluZyB0aGUgdXRpbGl0aWVzIHRyYWl0IHRvIHRoaXMgY2xhc3MNCgkgKiBTaW5jZSB3ZSBuZWVkIHNvbWUgb2YgaXRzIGZ1bmN0aW9ucw0KCSAqLw0KCXVzZSBVdGlsOw0KDQoJLyoqDQoJICogVGhlIG1vZHVsZSBuYW1lDQoJICoNCgkgKiBAdmFyIHN0cmluZw0KCSAqLw0KCXByb3RlY3RlZCAkbW9kdWxlOw0KDQoJLyoqDQoJICogVGhlIGFjdGlvbg0KCSAqDQoJICogQHZhciBzdHJpbmcNCgkgKi8NCglwcm90ZWN0ZWQgJGFjdGlvbjsNCg0KCS8qKg0KCSAqIFRoZSB0YWJsZXMgYXJyYXkNCgkgKg0KCSAqIEB2YXIgYXJyYXkNCgkgKi8NCglwcm90ZWN0ZWQgJHRhYmxlcyA9IGFycmF5KCk7DQoNCgkvKioNCgkgKiBUaGUgbGlua3MgYXJyYXkNCgkgKg0KCSAqIEB2YXIgYXJyYXkNCgkgKi8NCglwcm90ZWN0ZWQgJGxpbmtzID0gYXJyYXkoKTsNCg0KCS8qKg0KCSAqIFRoZSB0bXAgYXJyYXkNCgkgKg0KCSAqIEB2YXIgYXJyYXkNCgkgKi8NCglwcm90ZWN0ZWQgJHRtcCA9IGFycmF5KCk7DQoNCgkvKioNCgkgKiBUaGUgZmllbGQgbGlua2VyDQoJICoNCgkgKiBAdmFyIG1peGVkDQoJICovDQoJcHJvdGVjdGVkICRmaWVsZCA9IG51bGw7DQoNCgkvKioNCgkgKiBUaGUgdGFibGUgbGlua2VyDQoJICoNCgkgKiBAdmFyIG1peGVkDQoJICovDQoJcHJvdGVjdGVkICR0YWJsZSA9IG51bGw7DQoNCgkvKioNCgkgKiBUaGUgaW5kZXhlcg0KCSAqDQoJICogQHZhciBtaXhlZA0KCSAqLw0KCXByb3RlY3RlZCAkaW5kZXggPSBmYWxzZTsNCg0KCS8qKg0KCSAqIFRoZSBkaXJlY3RvcnkNCgkgKg0KCSAqIEB2YXIgRGlyZWN0b3J5SXRlcmF0b3INCgkgKi8NCglwcm90ZWN0ZWQgJGRpcmVjdG9yeTsNCg0KCS8qKg0KCSAqIENvbnN0cnVjdG9yDQoJICoNCgkgKiBAcGFyYW0gICBEaXJlY3RvcnlJdGVyYXRvciAgJGRpciAgVGhlIGRpcmVjdG9yeSBvYmplY3Qgb2YgZGYgZmlsZXMNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoRGlyZWN0b3J5SXRlcmF0b3IgJGRpcikNCgl7DQoJCS8vIHNldCB0aGUgZGlyZWN0b3J5DQoJCSR0aGlzLT5kaXJlY3RvcnkgPSAkZGlyOw0KCQkvLyBsb2FkIHRoZSBsaW5rYWdlDQoJCSR0aGlzLT5zZXRMaW5rcygpOw0KCQkvLyBidWlsZCB0aGUganNvbiB0YWJsZSBzdHJ1Y3R1cmUNCgkJJHRoaXMtPnNldFRhYmxlcygpOw0KCQkvLyBsaW5lLXVwIHRoZSBpbmRleCBhbmQgbGlua3MNCgkJJHRoaXMtPnNldFJlbGF0aW9uc2hpcHMoKTsNCgl9DQoNCgkvKioNCgkgKiBnZXQgcHJvcGVydHkNCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJGtleSAgVGhlIGtleSB2YWx1ZSB0byByZXR1cm4NCgkgKg0KCSAqIEByZXR1cm4gbWl4ZWQNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gX19nZXQoc3RyaW5nICRrZXkpDQoJew0KCQkka2V5ID0gc3RydG9sb3dlcigka2V5KTsNCgkJaWYgKCRrZXkgPT09ICd0YWJsZXMnKQ0KCQl7DQoJCQlyZXR1cm4gJHRoaXMtPnRhYmxlczsNCgkJfQ0KCQllbHNlaWYgKCRrZXkgPT09ICdsaW5rcycpDQoJCXsNCgkJCXJldHVybiAkdGhpcy0+bGlua3M7DQoJCX0NCgkJLy8ganVzdCB0d28gbGF5ZXJzICh0YWJsZS5tb2R1bGVfbmFtZS50YWJsZV9uYW1lKSBpbiBmb3Igbm93DQoJCWVsc2VpZiAoc3RycG9zKCRrZXksICcuJykgIT09IGZhbHNlKQ0KCQl7DQoJCQkka2V5X2FycmF5ID0gZXhwbG9kZSgnLicsICRrZXkpOw0KCQkJLy8gdGFibGVzDQoJCQlpZiAoJGtleV9hcnJheVswXSA9PT0gJ3RhYmxlJyAmJiBpc3NldCgka2V5X2FycmF5WzFdKSAmJiBpc3NldCgkdGhpcy0+dGFibGVzWyRrZXlfYXJyYXlbMV1dKQ0KCQkJCSYmIGlzc2V0KCRrZXlfYXJyYXlbMl0pICYmIGlzc2V0KCR0aGlzLT50YWJsZXNbJGtleV9hcnJheVsxXV1bJGtleV9hcnJheVsyXV0pKQ0KCQkJew0KCQkJCXJldHVybiAkdGhpcy0+dGFibGVzWyRrZXlfYXJyYXlbMV1dWyRrZXlfYXJyYXlbMl1dOw0KCQkJfQ0KCQkJLy8gbGlua3MNCgkJCWVsc2VpZiAoJGtleV9hcnJheVswXSA9PT0gJ2xpbmsnICYmIGlzc2V0KCRrZXlfYXJyYXlbMV0pICYmIGlzc2V0KCR0aGlzLT5saW5rc1ska2V5X2FycmF5WzFdXSkNCgkJCQkmJiBpc3NldCgka2V5X2FycmF5WzJdKSAmJiBpc3NldCgkdGhpcy0+bGlua3NbJGtleV9hcnJheVsxXV1bJGtleV9hcnJheVsyXV0pKQ0KCQkJew0KCQkJCXJldHVybiAkdGhpcy0+bGlua3NbJGtleV9hcnJheVsxXV1bJGtleV9hcnJheVsyXV07DQoJCQl9DQoJCX0NCg0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KDQoJLyoqDQoJICogbGluLXVwIHRoZSBsaW5rcyBhbmQgaW5kZXggdmFsdWVzDQoJICoNCgkgKiBAcmV0dXJuICB2b2lkDQoJICovDQoJcHJvdGVjdGVkIGZ1bmN0aW9uIHNldFJlbGF0aW9uc2hpcHMoKQ0KCXsNCgkJLy8gbGluZSB1cCBpbmRleCBmaWVsZHMNCgkJZm9yZWFjaCAoJHRoaXMtPnRtcFsnaW5kZXgnXSBhcyAkbW9kID0+ICR0YWJsZXMpDQoJCXsNCgkJCWZvcmVhY2ggKCR0YWJsZXMgYXMgJHRhYmxlID0+ICRpbmRleF9uYW1lcykNCgkJCXsNCgkJCQlmb3JlYWNoICgkaW5kZXhfbmFtZXMgYXMgJGluZGV4ID0+ICRmaWVsZHMpDQoJCQkJew0KCQkJCQkkdGhpcy0+dGFibGVzWyRtb2RdWyR0YWJsZV0tPmluZGV4WyRpbmRleF0tPmluZGV4X2ZpZWxkID0gJGZpZWxkczsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJLy8gY2xlYXIgdGhlIHRtcCBpbmRleA0KCQl1bnNldCgkdGhpcy0+dG1wWydpbmRleCddKTsNCgkJLy8gbGluZSB1cCBsaW5rcyB3aXRoIHRoZSBsaW5rZWQgZGF0YQ0KCQlmb3JlYWNoICgkdGhpcy0+dG1wWydsaW5rcyddIGFzICRwYXJlbnRfbW9kID0+ICRjaGlsZHJlbikNCgkJew0KCQkJLy8gdGhpc19tb2RlbChwYXJlbnRfbW9kKSA9IG90aGVyX3RhYmxlc1tjaGlsZHJlbj1jaGlsZF0gPSB0aGlzX3RhYmxlW3BhcmVudHM9cGFyZW50XSA9IGtleXNbZmllbGRzXQ0KCQkJZm9yZWFjaCAoJGNoaWxkcmVuIGFzICRjaGlsZCA9PiAkcGFyZW50cykNCgkJCXsNCgkJCQlmb3JlYWNoICgkcGFyZW50cyBhcyAkcGFyZW50ID0+ICRmaWVsZHMpDQoJCQkJew0KCQkJCQkvLyBjaGVjayBpZiB0aGlzIGlzIGEgbGVnaXRpbWF0ZSBtYXRjaA0KCQkJCQlpZiAoISR0aGlzLT5sZWdpdGltYXRlSW5kZXhMaW5rKCRwYXJlbnRfbW9kLCAkcGFyZW50LCAkZmllbGRzKSkNCgkJCQkJew0KCQkJCQkJY29udGludWU7DQoJCQkJCX0NCgkJCQkJJGNoaWxkX21vZCA9ICR0aGlzLT5nZXRNb2ROYW1lKCRjaGlsZCk7DQoJCQkJCS8vIHNldCB0aGUgbGluaw0KCQkJCQlpZiAoIWlzc2V0KCR0aGlzLT50YWJsZXNbJGNoaWxkX21vZF1bJGNoaWxkXS0+bGlua3MpKQ0KCQkJCQl7DQoJCQkJCQkkdGhpcy0+dGFibGVzWyRjaGlsZF9tb2RdWyRjaGlsZF0tPmxpbmtzID0gYXJyYXkoKTsNCgkJCQkJfQ0KCQkJCQkvLyBub3cgc2V0IHRoZSBtb2R1bGUNCgkJCQkJaWYgKCFpc3NldCgkdGhpcy0+dGFibGVzWyRjaGlsZF9tb2RdWyRjaGlsZF0tPmxpbmtzWyRwYXJlbnRfbW9kXSkpDQoJCQkJCXsNCgkJCQkJCSR0aGlzLT50YWJsZXNbJGNoaWxkX21vZF1bJGNoaWxkXS0+bGlua3NbJHBhcmVudF9tb2RdID0gbmV3IHN0ZENsYXNzKCk7DQoJCQkJCQkvLyBzZXQgdGhlIG5hbWUNCgkJCQkJCSR0aGlzLT50YWJsZXNbJGNoaWxkX21vZF1bJGNoaWxkXS0+bGlua3NbJHBhcmVudF9tb2RdLT5tb2R1bGUgPSAkcGFyZW50X21vZDsNCgkJCQkJfQ0KCQkJCQkvLyBub3cgc2V0IHRoZSB0YWJsZQ0KCQkJCQlpZiAoIWlzc2V0KCR0aGlzLT50YWJsZXNbJGNoaWxkX21vZF1bJGNoaWxkXS0+bGlua3NbJHBhcmVudF9tb2RdLT50YWJsZXMpKQ0KCQkJCQl7DQoJCQkJCQkkdGhpcy0+dGFibGVzWyRjaGlsZF9tb2RdWyRjaGlsZF0tPmxpbmtzWyRwYXJlbnRfbW9kXS0+dGFibGVzID0gYXJyYXkoKTsNCgkJCQkJfQ0KCQkJCQkvLyBzZXQgdGhlIGZpZWxkcw0KCQkJCQlmb3JlYWNoICgkZmllbGRzIGFzICRmaWVsZCkNCgkJCQkJew0KCQkJCQkJJHRoaXMtPnRhYmxlc1skY2hpbGRfbW9kXVskY2hpbGRdLT5saW5rc1skcGFyZW50X21vZF0tPnRhYmxlc1skcGFyZW50XVtdID0gJGZpZWxkOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KDQoJLyoqDQoJICogY2hlY2sgaWYgYSBmaWVsZCBpcyByZWFsbHkgYW4gaW5kZXggbGluaw0KCSAqDQoJICogQHBhcmFtICAgc3RyaW5nICAkbW9kICAgICBUaGUgbW9kdWxlIHRhYmxlIHRvIGNoZWNrDQoJICogQHBhcmFtICAgc3RyaW5nICAkdGFibGUgICBUaGUgdGFibGUgaW5kZXggdG8gY2hlY2sNCgkgKiBAcGFyYW0gICBhcnJheSAgICRmaWVsZHMgIFRoZSBmaWVsZHMgdGhhdCBtdXN0IGJlIHBhcnQgb2YgdGhlIG1vZHVsZS50YWJsZS5pbmRleA0KCSAqDQoJICogQHJldHVybiAgYm9vbA0KCSAqLw0KCXByb3RlY3RlZCBmdW5jdGlvbiBsZWdpdGltYXRlSW5kZXhMaW5rKHN0cmluZyAkbW9kLCBzdHJpbmcgJHRhYmxlLCBhcnJheSAkZmllbGRzKTogYm9vbA0KCXsNCgkJLy8gY2hlY2sgaWYgdGFibGUgaGFzIGtleXMNCgkJaWYgKGlzc2V0KCR0aGlzLT5saW5rc1skbW9kXVskdGFibGVdLT5rZXlzKSAmJiAkdGhpcy0+Y2hlY2tBcnJheSgkdGhpcy0+bGlua3NbJG1vZF1bJHRhYmxlXS0+a2V5cykgJiYgJHRoaXMtPmNoZWNrQXJyYXkoJGZpZWxkcykpDQoJCXsNCgkJCSRvbmUgPSAoYXJyYXkpIGFycmF5X2RpZmYoJHRoaXMtPmxpbmtzWyRtb2RdWyR0YWJsZV0tPmtleXMsICRmaWVsZHMpOw0KCQkJJHR3byA9IChhcnJheSkgYXJyYXlfZGlmZigkZmllbGRzLCAkdGhpcy0+bGlua3NbJG1vZF1bJHRhYmxlXS0+a2V5cyk7DQoJCQlpZiAoISR0aGlzLT5jaGVja0FycmF5KCRvbmUpICYmICEkdGhpcy0+Y2hlY2tBcnJheSgkdHdvKSkNCgkJCXsNCgkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0NCgkJfQ0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KDQoJLyoqDQoJICogYnVpbGQgdGhlIGpzb24gc3RydWN0dXJlcw0KCSAqDQoJICogQHJldHVybiAgdm9pZA0KCSAqLw0KCXByb3RlY3RlZCBmdW5jdGlvbiBzZXRUYWJsZXMoKQ0KCXsNCgkJLy8gc2V0IHRoZSBhY3Rpb24NCgkJJHRoaXMtPmFjdGlvbiA9ICd0YWJsZXMnOw0KCQkkdGhpcy0+ZmllbGQgID0gbnVsbDsNCgkJJHRoaXMtPnRhYmxlICA9IG51bGw7DQoJCSR0aGlzLT5pbmRleCAgPSBmYWxzZTsNCgkJLy8gbm93IGdvIG92ZXIgdGhlbQ0KCQlmb3JlYWNoICgkdGhpcy0+ZGlyZWN0b3J5IGFzICRmaWxlX2luZm8pDQoJCXsNCgkJCS8vIHdlIGRvIG5vdCBhY3Qgb24gZGlyZWN0b3J5IGRvdA0KCQkJaWYgKCEkZmlsZV9pbmZvLT5pc0RvdCgpKQ0KCQkJew0KCQkJCS8vIGdldCB0aGUgcGF0aCBuYW1lDQoJCQkJJHBhdGhfbmFtZSA9ICRmaWxlX2luZm8tPmdldFBhdGhuYW1lKCk7DQoJCQkJLy8gZ2V0IHRoZSBtb2R1bGUgbmFtZQ0KCQkJCSR0aGlzLT5tb2R1bGUgPSBzdHJfcmVwbGFjZSgnX3RhYmxlcy5kZicsICcnLCAkZmlsZV9pbmZvLT5nZXRiYXNlbmFtZSgpKTsNCgkJCQkvLyB3ZSByZXNldCB0aGUgdGFibGUgd2l0aCBlYWNoIGxvb3A7DQoJCQkJJHRoaXMtPnskdGhpcy0+YWN0aW9ufVskdGhpcy0+bW9kdWxlXSA9IGFycmF5KCk7DQoJCQkJLy8gYmFzaWMgZ2V0IGZpbGUgZnVuY3Rpb24NCgkJCQlmb3JlYWNoIChuZXcgU3BsRmlsZU9iamVjdCgkcGF0aF9uYW1lKSBhcyAkbGluZV9jb250ZW50KQ0KCQkJCXsNCgkJCQkJLy8gbGV0cyBnZXQgdGhlIGxpbmsgcGFyc2VkDQoJCQkJCWlmICghJHRoaXMtPnBhcnNlcigkbGluZV9jb250ZW50KSkNCgkJCQkJew0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQoNCgkvKioNCgkgKiBsb2FkIHRoZSBsaW5rcw0KCSAqDQoJICogQHJldHVybiAgdm9pZA0KCSAqLw0KCXByb3RlY3RlZCBmdW5jdGlvbiBzZXRMaW5rcygpDQoJew0KCQkvLyBzZXQgdGhlIGFjdGlvbg0KCQkkdGhpcy0+YWN0aW9uID0gJ2xpbmtzJzsNCgkJLy8gbm93IGdvIG92ZXIgdGhlbQ0KCQlmb3JlYWNoICgkdGhpcy0+ZGlyZWN0b3J5IGFzICRmaWxlX2luZm8pDQoJCXsNCgkJCS8vIHdlIGRvIG5vdCBhY3Qgb24gZGlyZWN0b3J5IGRvdA0KCQkJaWYgKCEkZmlsZV9pbmZvLT5pc0RvdCgpKQ0KCQkJew0KCQkJCS8vIGdldCB0aGUgcGF0aCBuYW1lDQoJCQkJJHBhdGhfbmFtZSA9ICRmaWxlX2luZm8tPmdldFBhdGhuYW1lKCk7DQoJCQkJLy8gZ2V0IG1hcHBpbmcgcGF0aA0KCQkJCSRtYXBwaW5nX3BhdGhfbmFtZSA9IHN0cl9yZXBsYWNlKGFycmF5KCcvc3RydWN0dXJlLycsICcuZGYnKSwgYXJyYXkoJy9tYXBwaW5nLycsICcuZGF0YScpLCAkcGF0aF9uYW1lKTsNCgkJCQkvLyBtYWtlIHN1cmUgd2UgaGF2ZSBhIGZpbGUNCgkJCQlpZiAoZmlsZV9leGlzdHMoJG1hcHBpbmdfcGF0aF9uYW1lKSkNCgkJCQl7DQoJCQkJCS8vIGdldCB0aGUgbW9kdWxlIG5hbWUNCgkJCQkJJHRoaXMtPm1vZHVsZSA9IHN0cl9yZXBsYWNlKCdfdGFibGVzLmRmJywgJycsICRmaWxlX2luZm8tPmdldGJhc2VuYW1lKCkpOw0KCQkJCQkvLyB3ZSByZXNldCB0aGUgdGFibGUgd2l0aCBlYWNoIGxvb3A7DQoJCQkJCSR0aGlzLT57JHRoaXMtPmFjdGlvbn1bJHRoaXMtPm1vZHVsZV0gPSBhcnJheSgpOw0KCQkJCQkvLyBiYXNpYyBnZXQgZmlsZSBmdW5jdGlvbg0KCQkJCQlmb3JlYWNoIChuZXcgU3BsRmlsZU9iamVjdCgkbWFwcGluZ19wYXRoX25hbWUpIGFzICRsaW5lX2NvbnRlbnQpDQoJCQkJCXsNCgkJCQkJCS8vIGxldHMgZ2V0IHRoZSBsaW5rYWdlcw0KCQkJCQkJaWYgKCEkdGhpcy0+c2V0TGluaygkbGluZV9jb250ZW50KSkNCgkJCQkJCXsNCgkJCQkJCQlicmVhazsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCg0KCS8qKg0KCSAqIEZ1bmN0aW9uIHRvIGFkZCB0aGUgbGlua3MNCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJGxpbmUgIFRoZSBjb250ZW50IGxpbmUgZnJvbSB0aGUgZmlsZQ0KCSAqDQoJICogQHJldHVybiAgYm9vbA0KCSAqLw0KCXByb3RlY3RlZCBmdW5jdGlvbiBzZXRMaW5rKHN0cmluZyAkbGluZSk6IGJvb2wNCgl7DQoJCS8vIG5vdyBuZXcgbGluZXMNCgkJaWYgKCFlbXB0eSh0cmltKCRsaW5lKSkgJiYgc3RycG9zKCRsaW5lLCAnPScpICE9PSBmYWxzZSkNCgkJew0KCQkJLy8gZ2V0IHRoZSB0YWJsZSBuYW1lDQoJCQkkZGF0YV9hcnJheSA9IChhcnJheSkgZXhwbG9kZSgnPScsICRsaW5lKTsNCgkJCS8vIG5vdyBsb29wIHRoZSBmaWVsZHMNCgkJCSRmaWVsZHMgPSBhcnJheV9yZXZlcnNlKCRkYXRhX2FycmF5KTsNCgkJCS8vIGxvYWQgdGhlIHRhYmxlDQoJCQkkdGhpcy0+dGFibGUgPSBhcnJheV9wb3AoJGZpZWxkcyk7DQoJCQkvLyBtYWtlIHN1cmUgd2UgaGF2ZSBuYW1lIGZpeCBhcHBsaWVkDQoJCQkkdGhpcy0+Zml4TmFtZXMoKTsNCgkJCS8vIGNoYW5nZSBiYWNrIHRvIGEgc3RpbmcNCgkJCSRmaWVsZHMgPSB0cmltKGltcGxvZGUoJyAnLCAkZmllbGRzKSk7DQoJCQkvLyBjaGVjayBpZiB3ZSBoYXZlIGZpZWxkcw0KCQkJaWYgKCFlbXB0eSgkZmllbGRzKSkNCgkJCXsNCgkJCQkvLyBjaGVjayBpZiB3ZSBoYXZlIGFuIGFycmF5DQoJCQkJaWYgKHN0cnBvcygkZmllbGRzLCAnKCcpICE9PSBmYWxzZSkNCgkJCQl7DQoJCQkJCS8vIGdldCBhcnJheSBmaWVsZHMNCgkJCQkJJGZpZWxkcyA9IGV4cGxvZGUoJyAnLCB0cmltKCRmaWVsZHMsICIoKSIpKTsNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJLy8gc2V0IGFycmF5IGZpZWxkcw0KCQkJCQkkZmllbGRzID0gYXJyYXkoJGZpZWxkcyk7DQoJCQkJfQ0KCQkJCS8vIGNoZWNrIGlmIHdlIHN0aWxsIGhhdmUgYW4gYXJyYXkgb2YgZmllbGRzDQoJCQkJaWYgKCR0aGlzLT5jaGVja0FycmF5KCRmaWVsZHMsIHRydWUpKQ0KCQkJCXsNCgkJCQkJLy8gY2hlY2sgaWYgaXQgaXMgdGhlIGxpbmtlciBsaW5lDQoJCQkJCWlmIChzdHJwb3MoJHRoaXMtPnRhYmxlLCAnX19saW5rJykgIT09IGZhbHNlKQ0KCQkJCQl7DQoJCQkJCQkvLyBmaXggdGhlIHRhYmxlDQoJCQkJCQkkdGhpcy0+dGFibGUgPSBzdHJfcmVwbGFjZSgnX19saW5rJywgJycsICR0aGlzLT50YWJsZSk7DQoJCQkJCQkvLyBjaGVjayBpZiB3ZSBoYXZlIHRoZSBjb3JyZWN0IGNvbnZlbnRpb24NCgkJCQkJCWZvcmVhY2ggKCRmaWVsZHMgYXMgJGZpZWxkKQ0KCQkJCQkJew0KCQkJCQkJCWlmIChzdHJwb3MoJGZpZWxkLCAnLicpICE9PSBmYWxzZSkNCgkJCQkJCQl7DQoJCQkJCQkJCS8vIGdldCBhcnJheSBvdGhlcl90YWJsZS5maWVsZA0KCQkJCQkJCQkkZmllbGRfYXJyYXkgPSBleHBsb2RlKCcuJywgdHJpbSgkZmllbGQpKTsNCgkJCQkJCQkJLy8gbWFrZSBzdXJlIHdlIGhhdmUgdHdvIHZhbHVlcw0KCQkJCQkJCQlpZiAoY291bnQoJGZpZWxkX2FycmF5KSA9PSAyKQ0KCQkJCQkJCQl7DQoJCQkJCQkJCQkvLyBmaXggdGhlIG5hbWVzDQoJCQkJCQkJCQkkdGhpcy0+Zml4TmFtZSgkZmllbGRfYXJyYXlbMF0pOw0KCQkJCQkJCQkJJHRoaXMtPmZpeE5hbWUoJGZpZWxkX2FycmF5WzFdKTsNCgkJCQkJCQkJCS8vIHNldCB0aGUgdGhpc19tb2RlbCA9IG90aGVyX3RhYmxlID0gdGhpc190YWJsZSA9IGtleXMNCgkJCQkJCQkJCSR0aGlzLT50bXBbJ2xpbmtzJ11bJHRoaXMtPm1vZHVsZV1bJGZpZWxkX2FycmF5WzBdXVskdGhpcy0+dGFibGVdW10gPSAkZmllbGRfYXJyYXlbMV07DQoJCQkJCQkJCX0NCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJZWxzZQ0KCQkJCQl7DQoJCQkJCQkvLyBzZXQgdGhlIGZpZWxkcw0KCQkJCQkJJHRoaXMtPnNldFRhYmxlVmFsdWUoJ2tleXMnLCBhcnJheV9tYXAoZnVuY3Rpb24gKCRmaWVsZCkgew0KCQkJCQkJCS8vIG1ha2Ugc3VyZSB3ZSBoYXZlIG5hbWUgZml4IGFwcGxpZWQNCgkJCQkJCQkkdGhpcy0+Zml4TmFtZSgkZmllbGQpOw0KDQoJCQkJCQkJcmV0dXJuICRmaWVsZDsNCgkJCQkJCX0sICRmaWVsZHMpKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuIHRydWU7DQoJCX0NCg0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KDQoJLyoqDQoJICogRnVuY3Rpb24gdG8gbWFuYWdlIHBhcnNpbmcgb2YgZWFjaCBsaW5lDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmcgICRsaW5lICBUaGUgY29udGVudCBsaW5lIGZyb20gdGhlIGZpbGUNCgkgKg0KCSAqIEByZXR1cm4gIGJvb2wNCgkgKi8NCglwcm90ZWN0ZWQgZnVuY3Rpb24gcGFyc2VyKHN0cmluZyAkbGluZSk6IGJvb2wNCgl7DQoJCS8vIGVuZCBvZiBibG9jaw0KCQlpZiAoZW1wdHkodHJpbSgkbGluZSkpKQ0KCQl7DQoJCQkkdGhpcy0+ZmllbGQgPSBudWxsOw0KCQkJJHRoaXMtPnRhYmxlID0gbnVsbDsNCgkJCSR0aGlzLT5pbmRleCA9IGZhbHNlOw0KCQl9DQoJCS8vIGVuZCBvZiBmaWxlDQoJCWVsc2VpZiAodHJpbSgkbGluZSkgPT0gJy4nKQ0KCQl7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJLy8gbmV3IHRhYmxlDQoJCWVsc2VpZiAoc3RycG9zKCRsaW5lLCAnQUREIFRBQkxFJykgIT09IGZhbHNlKQ0KCQl7DQoJCQlyZXR1cm4gJHRoaXMtPnNldFRhYmxlKCRsaW5lKTsNCgkJfQ0KCQkvLyBuZXcgZmllbGQNCgkJZWxzZWlmIChzdHJwb3MoJGxpbmUsICdBREQgRklFTEQnKSAhPT0gZmFsc2UpDQoJCXsNCgkJCXJldHVybiAkdGhpcy0+c2V0RmllbGQoJGxpbmUpOw0KCQl9DQoJCS8vIG5ldyB0YWJsZSBpbmRleA0KCQllbHNlaWYgKHN0cnBvcygkbGluZSwgJ0FERCBJTkRFWCcpICE9PSBmYWxzZSkNCgkJew0KCQkJcmV0dXJuICR0aGlzLT5zZXRUYWJsZUluZGV4KCRsaW5lKTsNCgkJfQ0KCQkvLyBuZXcgdGFibGUgcHJvcGVydHkNCgkJZWxzZWlmICghJHRoaXMtPmluZGV4ICYmIGlzc2V0KCR0aGlzLT50YWJsZSkgJiYgc3RybGVuKCR0aGlzLT50YWJsZSkgPiAzICYmIGlzX251bGwoJHRoaXMtPmZpZWxkKQ0KCQkJJiYgaXNzZXQoJHRoaXMtPnskdGhpcy0+YWN0aW9ufVskdGhpcy0+bW9kdWxlXVskdGhpcy0+dGFibGVdLT5uYW1lKSkNCgkJew0KCQkJcmV0dXJuICR0aGlzLT5zZXRUYWJsZVByb3BlcnR5KCRsaW5lKTsNCgkJfQ0KCQkvLyBuZXcgaW5kZXggcHJvcGVydHkNCgkJZWxzZWlmICgkdGhpcy0+aW5kZXggJiYgaXNzZXQoJHRoaXMtPnRhYmxlKSAmJiBzdHJsZW4oJHRoaXMtPnRhYmxlKSA+IDMgJiYgIWlzX251bGwoJHRoaXMtPmZpZWxkKQ0KCQkJJiYgaXNzZXQoJHRoaXMtPnskdGhpcy0+YWN0aW9ufVskdGhpcy0+bW9kdWxlXVskdGhpcy0+dGFibGVdLT5pbmRleFskdGhpcy0+ZmllbGRdKSkNCgkJew0KCQkJcmV0dXJuICR0aGlzLT5zZXRUYWJsZUluZGV4UHJvcGVydHkoJGxpbmUpOw0KCQl9DQoJCS8vIG5ldyBmaWVsZCBwcm9wZXJ0eQ0KCQllbHNlaWYgKCEkdGhpcy0+aW5kZXggJiYgaXNzZXQoJHRoaXMtPnRhYmxlKSAmJiBzdHJsZW4oJHRoaXMtPnRhYmxlKSA+IDMgJiYgIWlzX251bGwoJHRoaXMtPmZpZWxkKQ0KCQkJJiYgaXNzZXQoJHRoaXMtPnskdGhpcy0+YWN0aW9ufVskdGhpcy0+bW9kdWxlXVskdGhpcy0+dGFibGVdLT5maWVsZHNbJHRoaXMtPmZpZWxkXSkpDQoJCXsNCgkJCXJldHVybiAkdGhpcy0+c2V0RmllbGRQcm9wZXJ0eSgkbGluZSk7DQoJCX0NCg0KCQlyZXR1cm4gdHJ1ZTsNCg0KCX0NCg0KCS8qKg0KCSAqIGFkZCBhIG5ldyBmaWVsZA0KCSAqDQoJICogQHBhcmFtICAgc3RyaW5nICAkbGluZSAgVGhlIGxpbmUgZnJvbSB0aGUgZmlsZQ0KCSAqDQoJICogQHJldHVybiAgYm9vbA0KCSAqDQoJICovDQoJcHJvdGVjdGVkIGZ1bmN0aW9uIHNldEZpZWxkKHN0cmluZyAkbGluZSk6IGJvb2wNCgl7DQoJCS8vIGdldCB0aGUgbmFtZQ0KCQlpZiAoKCR0aGlzLT50YWJsZSA9ICR0aGlzLT5nZXRCZXR3ZWVuKCRsaW5lLCAnIE9GICInLCAnIiBBUycsIG51bGwpKSAhPSBudWxsICYmDQoJCQkoJHRoaXMtPmZpZWxkID0gJHRoaXMtPmdldEJldHdlZW4oJGxpbmUsICdBREQgRklFTEQgIicsICciIE9GJywgbnVsbCkpICE9IG51bGwpDQoJCXsNCgkJCS8vIG1ha2Ugc3VyZSB3ZSBoYXZlIG5hbWUgZml4IGFwcGxpZWQNCgkJCSR0aGlzLT5maXhOYW1lcygpOw0KDQoJCQkvLyBzZXQgZmllbGQgdmFsdWUNCgkJCXJldHVybiAkdGhpcy0+c2V0RmllbGRWYWx1ZSgnZmllbGRzJywgJHRoaXMtPmZpZWxkLCAnbmFtZScsICR0aGlzLT5maWVsZCkgJiYNCgkJCQkvLyBzZXQgZmllbGQgdmFsdWUNCgkJCQkkdGhpcy0+c2V0RmllbGRWYWx1ZSgnZmllbGRzJywgJHRoaXMtPmZpZWxkLCAnZGF0YV90eXBlJywNCgkJCQkJdHJpbShzdWJzdHIoJGxpbmUsIHN0cnJwb3MoJGxpbmUsICdBUycpICsgMikpKTsNCgkJfQ0KDQoJCXJldHVybiBmYWxzZTsNCgl9DQoNCgkvKioNCgkgKiBhZGQgYSBuZXcgZmllbGQgcHJvcGVydHkNCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJGxpbmUgIFRoZSBsaW5lIGZyb20gdGhlIGZpbGUNCgkgKg0KCSAqIEByZXR1cm4gIGJvb2wNCgkgKg0KCSAqLw0KCXByb3RlY3RlZCBmdW5jdGlvbiBzZXRGaWVsZFByb3BlcnR5KHN0cmluZyAkbGluZSk6IGJvb2wNCgl7DQoJCS8vIGlmIGJvdGggdGFibGUgYW5kIGZpZWxkIGFyZSBzZXQsIHRoZW4gd2UgYXJlIGxvYWRpbmcgZmllbGQgdmFsdWVzDQoJCSRsaW5lX2FycmF5ID0gKGFycmF5KSBleHBsb2RlKCcgJywgdHJpbSgkbGluZSkpOw0KCQkvLyBnZXQgdGhlIG1haW4ga2V5DQoJCSRrZXkgPSBhcnJheV9zaGlmdCgkbGluZV9hcnJheSk7DQoJCS8vIG1ha2Ugc3VyZSB3ZSBoYXZlIG5hbWUgZml4IGFwcGxpZWQNCgkJJHRoaXMtPmZpeE5hbWUoJGtleSk7DQoJCS8vIGlmIHdlIGhhdmUgbW9yZSB0aGFuIG9uZSB2YWx1ZQ0KCQlpZiAoJGtleSA9PSAnaGVscCcgfHwgJGtleSA9PSAnbGFiZWwnIHx8ICRrZXkgPT0gJ2NvbHVtbl9sYWJlbCcpDQoJCXsNCgkJCS8vIHNldCBmaWVsZCB2YWx1ZQ0KCQkJcmV0dXJuICR0aGlzLT5zZXRGaWVsZFZhbHVlKCdmaWVsZHMnLCAkdGhpcy0+ZmllbGQsICRrZXksIGltcGxvZGUoJyAnLCBhcnJheV9tYXAoZnVuY3Rpb24gKCR2YWwpIHsNCgkJCQlyZXR1cm4gdHJpbSgkdmFsLCAnIicpOw0KCQkJfSwgJGxpbmVfYXJyYXkpKSk7DQoJCX0NCgkJZWxzZWlmIChjb3VudCgkbGluZV9hcnJheSkgPiAxKQ0KCQl7DQoJCQkvLyBzZXQgZmllbGQgdmFsdWUNCgkJCXJldHVybiAkdGhpcy0+c2V0RmllbGRWYWx1ZSgnZmllbGRzJywgJHRoaXMtPmZpZWxkLCAka2V5LCBhcnJheV9tYXAoZnVuY3Rpb24gKCR2YWwpIHsNCgkJCQlyZXR1cm4gdHJpbSgkdmFsLCAnIicpOw0KCQkJfSwgJGxpbmVfYXJyYXkpKTsNCgkJfQ0KCQllbHNlaWYgKGNvdW50KCRsaW5lX2FycmF5KSA9PSAxKQ0KCQl7DQoJCQkvLyBzZXQgZmllbGQgdmFsdWUNCgkJCXJldHVybiAkdGhpcy0+c2V0RmllbGRWYWx1ZSgnZmllbGRzJywgJHRoaXMtPmZpZWxkLCAka2V5LCB0cmltKGFycmF5X3NoaWZ0KCRsaW5lX2FycmF5KSwgJyInKSk7DQoJCX0NCg0KCQkvLyBzZXQgZmllbGQgdmFsdWUNCgkJcmV0dXJuICR0aGlzLT5zZXRGaWVsZFZhbHVlKCdmaWVsZHMnLCAkdGhpcy0+ZmllbGQsICRrZXksIHRydWUpOw0KCX0NCg0KCS8qKg0KCSAqIHNldCBmaWVsZCB2YWx1ZQ0KCSAqDQoJICogQHBhcmFtICAgc3RyaW5nICAkdHlwZSAgICAgVGhlIGZpZWxkIHR5cGUNCgkgKiBAcGFyYW0gICBzdHJpbmcgICRrZXkgICAgICBUaGUgdmFsdWUgb2JqZWN0IGtleQ0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJHBvaW50ZXIgIFRoZSB2YWx1ZSBrZXkvcG9pbnRlcg0KCSAqIEBwYXJhbSAgIG1peGVkICAgJHZhbHVlICAgIFRoZSB2YWx1ZQ0KCSAqDQoJICogQHJldHVybiAgYm9vbA0KCSAqDQoJICovDQoJcHJvdGVjdGVkIGZ1bmN0aW9uIHNldEZpZWxkVmFsdWUoc3RyaW5nICR0eXBlLCBzdHJpbmcgJGtleSwgc3RyaW5nICRwb2ludGVyLCAkdmFsdWUpOiBib29sDQoJew0KCQkvLyBtYWtlIHN1cmUgdGhlIHRhYmxlIGlzIHJlYWR5DQoJCWlmIChlbXB0eSgkdGhpcy0+dGFibGUpIHx8ICEkdGhpcy0+c2V0VGFibGVOYW1lKCkpDQoJCXsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQkvLyBtYWtlIHN1cmUgd2UgaGF2ZSBuYW1lIGZpeCBhcHBsaWVkDQoJCSR0aGlzLT5maXhOYW1lcygpOw0KCQkvLyBtYWtlIHN1cmUgdGhlIGZpZWxkcyB0eXBlIGFycmF5IGlzIHNldA0KCQlpZiAoIWlzc2V0KCR0aGlzLT57JHRoaXMtPmFjdGlvbn1bJHRoaXMtPm1vZHVsZV1bJHRoaXMtPnRhYmxlXS0+eyR0eXBlfSkpDQoJCXsNCgkJCS8vIHNldCB0aGUgZmllbGQgdHlwZQ0KCQkJJHRoaXMtPnskdGhpcy0+YWN0aW9ufVskdGhpcy0+bW9kdWxlXVskdGhpcy0+dGFibGVdLT57JHR5cGV9ID0gYXJyYXkoKTsNCgkJfQ0KCQkvLyBzZXQgdGhlIHZhbHVlIGlmIG5vdCBhbHJlYWR5IHNldA0KCQlpZiAoIWlzc2V0KCR0aGlzLT57JHRoaXMtPmFjdGlvbn1bJHRoaXMtPm1vZHVsZV1bJHRoaXMtPnRhYmxlXS0+eyR0eXBlfVska2V5XSkpDQoJCXsNCgkJCSR0aGlzLT57JHRoaXMtPmFjdGlvbn1bJHRoaXMtPm1vZHVsZV1bJHRoaXMtPnRhYmxlXS0+eyR0eXBlfVska2V5XSA9IG5ldyBzdGRDbGFzcygpOw0KCQl9DQoJCS8vIHNldCB0aGUgdmFsdWUgaWYgbm90IGFscmVhZHkgc2V0DQoJCWlmICghaXNzZXQoJHRoaXMtPnskdGhpcy0+YWN0aW9ufVskdGhpcy0+bW9kdWxlXVskdGhpcy0+dGFibGVdLT57JHR5cGV9WyRrZXldLT57JHBvaW50ZXJ9KSkNCgkJew0KCQkJJHRoaXMtPnskdGhpcy0+YWN0aW9ufVskdGhpcy0+bW9kdWxlXVskdGhpcy0+dGFibGVdLT57JHR5cGV9WyRrZXldLT57JHBvaW50ZXJ9ID0gJHZhbHVlOw0KCQl9DQoNCgkJcmV0dXJuIHRydWU7DQoJfQ0KDQoJLyoqDQoJICogYWRkIGEgbmV3IHRhYmxlDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmcgICRsaW5lICBUaGUgbGluZSBmcm9tIHRoZSBmaWxlDQoJICoNCgkgKiBAcmV0dXJuICBib29sDQoJICoNCgkgKi8NCglwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0VGFibGUoc3RyaW5nICRsaW5lKTogYm9vbA0KCXsNCgkJLy8gZ2V0IHRoZSBuYW1lDQoJCWlmICgoJHRoaXMtPnRhYmxlID0gJHRoaXMtPmdldEJldHdlZW4oJGxpbmUsICdBREQgVEFCTEUgIicsICciJywgbnVsbCkpICE9IG51bGwpDQoJCXsNCgkJCS8vIHNldCB0YWJsZQ0KCQkJcmV0dXJuICR0aGlzLT5zZXRUYWJsZU5hbWUoKTsNCgkJfQ0KDQoJCXJldHVybiBmYWxzZTsNCgl9DQoNCgkvKioNCgkgKiBzZXQgdGFibGUgbmFtZQ0KCSAqDQoJICogQHJldHVybiAgYm9vbA0KCSAqDQoJICovDQoJcHJvdGVjdGVkIGZ1bmN0aW9uIHNldFRhYmxlTmFtZSgpOiBib29sDQoJew0KCQkvLyBtYWtlIHN1cmUgd2UgaGF2ZSBuYW1lIGZpeCBhcHBsaWVkDQoJCSR0aGlzLT5maXhOYW1lcygpOw0KCQkvLyBub3cgY2hlY2sgaWYgaXRzIHNldCBhbHJlYWR5DQoJCWlmIChpc3NldCgkdGhpcy0+dGFibGUpICYmIGlzc2V0KCR0aGlzLT57JHRoaXMtPmFjdGlvbn1bJHRoaXMtPm1vZHVsZV1bJHRoaXMtPnRhYmxlXSkpDQoJCXsNCgkJCXJldHVybiB0cnVlOw0KCQl9DQoNCgkJLy8gc2V0IHRoZSB0YWJsZSBuYW1lDQoJCXJldHVybiAkdGhpcy0+c2V0VGFibGVWYWx1ZSgnbmFtZScsICR0aGlzLT50YWJsZSk7DQoJfQ0KDQoJLyoqDQoJICogc2V0IHRhYmxlIHZhbHVlDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmcgICRrZXkgICAgVGhlIHZhbHVlIG9iamVjdCBrZXkNCgkgKiBAcGFyYW0gICBtaXhlZCAgICR2YWx1ZSAgVGhlIHZhbHVlDQoJICoNCgkgKiBAcmV0dXJuICBib29sDQoJICoNCgkgKi8NCglwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0VGFibGVWYWx1ZShzdHJpbmcgJGtleSwgJHZhbHVlKTogYm9vbA0KCXsNCgkJLy8gY2hlY2sgaWYgdGhlIHRhYmxlIHZhbHVlIGlzIHNldA0KCQlpZiAoZW1wdHkoJHRoaXMtPnRhYmxlKSkNCgkJew0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCS8vIG1ha2Ugc3VyZSB3ZSBoYXZlIG5hbWUgZml4IGFwcGxpZWQNCgkJJHRoaXMtPmZpeE5hbWVzKCk7DQoJCS8vIGNoZWNrIGlmIHRhYmxlIG9iamVjdCBleGlzdA0KCQlpZiAoIWlzc2V0KCR0aGlzLT57JHRoaXMtPmFjdGlvbn1bJHRoaXMtPm1vZHVsZV1bJHRoaXMtPnRhYmxlXSkpDQoJCXsNCgkJCS8vIHNldCB0aGUgdGFibGUgb2JqZWN0DQoJCQkkdGhpcy0+eyR0aGlzLT5hY3Rpb259WyR0aGlzLT5tb2R1bGVdWyR0aGlzLT50YWJsZV0gPSBuZXcgc3RkQ2xhc3MoKTsNCgkJfQ0KCQkvLyBjaGVjayBpZiB0aGUga2V5IHZhbHVlIGV4aXN0DQoJCWlmICghaXNzZXQoJHRoaXMtPnskdGhpcy0+YWN0aW9ufVskdGhpcy0+bW9kdWxlXVskdGhpcy0+dGFibGVdLT57JGtleX0pKQ0KCQl7DQoJCQkvLyBzZXQgdGhlIHRhYmxlIHZhbHVlDQoJCQkkdGhpcy0+eyR0aGlzLT5hY3Rpb259WyR0aGlzLT5tb2R1bGVdWyR0aGlzLT50YWJsZV0tPnska2V5fSA9ICR2YWx1ZTsNCgkJfQ0KDQoJCXJldHVybiB0cnVlOw0KCX0NCg0KCS8qKg0KCSAqIGFkZCBhIG5ldyB0YWJsZSBwcm9wZXJ0eQ0KCSAqDQoJICogQHBhcmFtICAgc3RyaW5nICAkbGluZSAgVGhlIGxpbmUgZnJvbSB0aGUgZmlsZQ0KCSAqDQoJICogQHJldHVybiAgYm9vbA0KCSAqDQoJICovDQoJcHJvdGVjdGVkIGZ1bmN0aW9uIHNldFRhYmxlUHJvcGVydHkoc3RyaW5nICRsaW5lKTogYm9vbA0KCXsNCgkJLy8gaWYgb25seSB0YWJsZSBpcyBzZXQsIHRoZW4gd2UgYXJlIGxvYWRpbmcgdGFibGUgdmFsdWVzDQoJCSRsaW5lX2FycmF5ID0gKGFycmF5KSBleHBsb2RlKCcgJywgdHJpbSgkbGluZSkpOw0KCQkvLyBnZXQgdGhlIG1haW4ga2V5DQoJCSRrZXkgPSBhcnJheV9zaGlmdCgkbGluZV9hcnJheSk7DQoJCS8vIG1ha2Ugc3VyZSB3ZSBoYXZlIG5hbWUgZml4IGFwcGxpZWQNCgkJJHRoaXMtPmZpeE5hbWUoJGtleSk7DQoJCS8vIGlmIHdlIGhhdmUgbW9yZSB0aGFuIG9uZSB2YWx1ZQ0KCQlpZiAoJGtleSA9PSAnbGFiZWwnKQ0KCQl7DQoJCQlyZXR1cm4gJHRoaXMtPnNldFRhYmxlVmFsdWUoJGtleSwgaW1wbG9kZSgnICcsIGFycmF5X21hcChmdW5jdGlvbiAoJHZhbCkgew0KCQkJCXJldHVybiB0cmltKCR2YWwsICciJyk7DQoJCQl9LCAkbGluZV9hcnJheSkpKTsNCgkJfQ0KCQllbHNlaWYgKGNvdW50KCRsaW5lX2FycmF5KSA+IDEpDQoJCXsNCgkJCXJldHVybiAkdGhpcy0+c2V0VGFibGVWYWx1ZSgka2V5LCBhcnJheV9tYXAoZnVuY3Rpb24gKCR2YWwpIHsNCgkJCQlyZXR1cm4gdHJpbSgkdmFsLCAnIicpOw0KCQkJfSwgJGxpbmVfYXJyYXkpKTsNCgkJfQ0KCQllbHNlaWYgKGNvdW50KCRsaW5lX2FycmF5KSA9PSAxKQ0KCQl7DQoJCQlyZXR1cm4gJHRoaXMtPnNldFRhYmxlVmFsdWUoJGtleSwgdHJpbShhcnJheV9zaGlmdCgkbGluZV9hcnJheSksICciJykpOw0KCQl9DQoNCgkJcmV0dXJuICR0aGlzLT5zZXRUYWJsZVZhbHVlKCRrZXksIHRydWUpOw0KCX0NCg0KCS8qKg0KCSAqIGFkZCBhIG5ldyB0YWJsZSBpbmRleA0KCSAqDQoJICogQHBhcmFtICAgc3RyaW5nICAkbGluZSAgVGhlIGxpbmUgZnJvbSB0aGUgZmlsZQ0KCSAqDQoJICogQHJldHVybiAgYm9vbA0KCSAqDQoJICovDQoJcHJvdGVjdGVkIGZ1bmN0aW9uIHNldFRhYmxlSW5kZXgoc3RyaW5nICRsaW5lKTogYm9vbA0KCXsNCgkJLy8gZ2V0IHRoZSBuYW1lDQoJCWlmICgoJHRoaXMtPnRhYmxlID0gJHRoaXMtPmdldEJldHdlZW4oJGxpbmUsICcgT04gIicsICciJywgbnVsbCkpICE9IG51bGwgJiYNCgkJCSgkdGhpcy0+ZmllbGQgPSAkdGhpcy0+Z2V0QmV0d2VlbigkbGluZSwgJ0FERCBJTkRFWCAiJywgJyIgT04nLCBudWxsKSkgIT0gbnVsbCkNCgkJew0KCQkJLy8gd2UgYXJlIGluIGluZGV4IGNvdW50cnkNCgkJCSR0aGlzLT5pbmRleCA9IHRydWU7DQoJCQkvLyBtYWtlIHN1cmUgd2UgaGF2ZSBuYW1lIGZpeCBhcHBsaWVkDQoJCQkkdGhpcy0+Zml4TmFtZXMoKTsNCg0KCQkJLy8gc2V0IGZpZWxkIHZhbHVlDQoJCQlyZXR1cm4gJHRoaXMtPnNldEZpZWxkVmFsdWUoJ2luZGV4JywgJHRoaXMtPmZpZWxkLCAnbmFtZScsICR0aGlzLT5maWVsZCk7DQoJCX0NCg0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KDQoJLyoqDQoJICogYWRkIGEgbmV3IHRhYmxlIGluZGV4IHByb3BlcnR5DQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmcgICRsaW5lICBUaGUgbGluZSBmcm9tIHRoZSBmaWxlDQoJICoNCgkgKiBAcmV0dXJuICBib29sDQoJICoNCgkgKi8NCglwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0VGFibGVJbmRleFByb3BlcnR5KHN0cmluZyAkbGluZSk6IGJvb2wNCgl7DQoJCS8vIGlmIGJvdGggdGFibGUgYW5kIGZpZWxkIGFyZSBzZXQsIHRoZW4gd2UgYXJlIGxvYWRpbmcgZmllbGQgdmFsdWVzDQoJCSRsaW5lX2FycmF5ID0gKGFycmF5KSBleHBsb2RlKCcgJywgdHJpbSgkbGluZSkpOw0KCQkvLyBnZXQgdGhlIG1haW4ga2V5DQoJCSRrZXkgPSBhcnJheV9zaGlmdCgkbGluZV9hcnJheSk7DQoJCS8vIG1ha2Ugc3VyZSB3ZSBoYXZlIG5hbWUgZml4IGFwcGxpZWQNCgkJJHRoaXMtPmZpeE5hbWUoJGtleSk7DQoJCS8vIGlmIHRoaXMgaXMgYW4gaW5kZXggZmllbGQNCgkJaWYgKCRrZXkgPT0gJ2luZGV4X2ZpZWxkJykNCgkJew0KCQkJLy8gZ2V0IHRoZSBmaWVsZCBuYW1lDQoJCQkkZmllbGRfbmFtZSA9IHRyaW0oJGxpbmVfYXJyYXlbMF0sICciJyk7DQoJCQkvLyBmaXhlIHRoZSBmaWVsZA0KCQkJJHRoaXMtPmZpeE5hbWUoJGZpZWxkX25hbWUpOw0KCQkJLy8gc2V0IGluZGV4IGZpZWxkIHZhbHVlDQoJCQkkdGhpcy0+dG1wWydpbmRleCddWyR0aGlzLT5tb2R1bGVdWyR0aGlzLT50YWJsZV1bJHRoaXMtPmZpZWxkXVtdID0gJGZpZWxkX25hbWU7DQoNCgkJCS8vIHdlIGhhdmUgb3VyIGRhdGEsIHNvIHdlIHJldHVybiB0cnVlDQoJCQlyZXR1cm4gdHJ1ZTsNCgkJfQ0KCQllbHNlaWYgKGNvdW50KCRsaW5lX2FycmF5KSA+IDEpDQoJCXsNCgkJCS8vIHNldCBmaWVsZCB2YWx1ZQ0KCQkJcmV0dXJuICR0aGlzLT5zZXRGaWVsZFZhbHVlKCdpbmRleCcsICR0aGlzLT5maWVsZCwgJGtleSwgYXJyYXlfbWFwKGZ1bmN0aW9uICgkdmFsKSB7DQoJCQkJcmV0dXJuIHRyaW0oJHZhbCwgJyInKTsNCgkJCX0sICRsaW5lX2FycmF5KSk7DQoJCX0NCgkJZWxzZWlmIChjb3VudCgkbGluZV9hcnJheSkgPT0gMSkNCgkJew0KCQkJLy8gc2V0IGZpZWxkIHZhbHVlDQoJCQlyZXR1cm4gJHRoaXMtPnNldEZpZWxkVmFsdWUoJ2luZGV4JywgJHRoaXMtPmZpZWxkLCAka2V5LCB0cmltKGFycmF5X3NoaWZ0KCRsaW5lX2FycmF5KSwgJyInKSk7DQoJCX0NCg0KCQkvLyBzZXQgZmllbGQgdmFsdWUNCgkJcmV0dXJuICR0aGlzLT5zZXRGaWVsZFZhbHVlKCdpbmRleCcsICR0aGlzLT5maWVsZCwgJGtleSwgdHJ1ZSk7DQoJfQ0KDQoJLyoqDQoJICogZml4IGFsbCBrZXkgbmFtZXMNCgkgKg0KCSAqIEByZXR1cm4gIHZvaWQNCgkgKg0KCSAqLw0KCXByb3RlY3RlZCBmdW5jdGlvbiBmaXhOYW1lcygpDQoJew0KCQkvLyBmaXggdGhlIHRhYmxlIG5hbWUNCgkJaWYgKGlzc2V0KCR0aGlzLT50YWJsZSkpDQoJCXsNCgkJCS8vIGZpeCB0YWJsZSBuYW1lcw0KCQkJJHRoaXMtPmZpeE5hbWUoJHRoaXMtPnRhYmxlKTsNCgkJfQ0KCQkvLyBmaXggdGhlIHRhYmxlIG5hbWUNCgkJaWYgKGlzc2V0KCR0aGlzLT5maWVsZCkpDQoJCXsNCgkJCS8vIGZpeCB0YWJsZSBuYW1lcw0KCQkJJHRoaXMtPmZpeE5hbWUoJHRoaXMtPmZpZWxkKTsNCgkJfQ0KCX0NCg0KCS8qKg0KCSAqIGZpeCBhbGwga2V5IG5hbWVzDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmcgICRuYW1lICBUaGUgc3RyaW5nIHRvIGZpeA0KCSAqDQoJICogQHJldHVybiAgdm9pZA0KCSAqDQoJICovDQoJcHJvdGVjdGVkIGZ1bmN0aW9uIGZpeE5hbWUoc3RyaW5nICYkbmFtZSkNCgl7DQoJCS8vIGZpeCBuYW1lDQoJCSRuYW1lID0gc3RyX3JlcGxhY2UoJy0nLCAnXycsIHN0cnRvbG93ZXIoJG5hbWUpKTsNCgl9DQoNCgkvKioNCgkgKiBnZXQgdGhlIG1vZHVsZSBrZXkgd2hlcmUgdGhpcyB0YWJsZSBpcyBmb3VuZA0KCSAqDQoJICogQHBhcmFtICAgc3RyaW5nICAkdGFibGUgIFRoZSBzdHJpbmcgdG8gZml4DQoJICoNCgkgKiBAcmV0dXJuICBtaXhlZCAgVGhlIG1vZHVsZSB3aGVyZSB0aGlzIHRhYmxlIGlzIGZvdW5kDQoJICoNCgkgKi8NCglwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0TW9kTmFtZShzdHJpbmcgJHRhYmxlKQ0KCXsNCgkJLy8gd2UgZmlyc3QgdHJ5IHRvIGdldCB0aGUgbW9kIG5hbWUgZnJvbSB0aGUgdGFibGUgbmFtZQ0KCQkkdGFibGVfYXJyYXkgPSBleHBsb2RlKCdfJywgJHRhYmxlKTsNCgkJLy8gY2hlY2sgaWYgdGFibGUgZXhpc3QgaW4gdGhpcyBtb2QgZ3JvdXANCgkJaWYgKGlzc2V0KCR0aGlzLT50YWJsZXNbJHRhYmxlX2FycmF5WzBdXVskdGFibGVdKSkNCgkJew0KCQkJcmV0dXJuICR0YWJsZV9hcnJheVswXTsNCgkJfQ0KCQkvLyBub3cgd2UgZG8gdGhlIGJydXRlZm9yY2Ugd2F5DQoJCWZvcmVhY2ggKCR0aGlzLT50YWJsZXMgYXMgJG1vZCA9PiAkbW9kcykNCgkJew0KCQkJaWYgKGlzc2V0KCRtb2RzWyR0YWJsZV0pKQ0KCQkJew0KCQkJCXJldHVybiAkbW9kOw0KCQkJfQ0KCQl9DQoNCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg==', '{}', 'ExtrudeTables', '[[[COMPANY]]]\\[[[Component]]]\\ExtrudeTables', '1.0.0', '{}', 'Lila Extrude Tables', 'class', '{\"use_selection0\":{\"use\":\"79d765b3-7319-4988-9730-446c7f347020\"}}', '', 1, '2021-11-06 14:28:17', '2021-11-13 16:34:22', 33, 2), (3, '', '', '', '', '7e6e7fe8-725d-411e-889a-4f1618c11840', '', '', '', '', 'Ly8gaGVscA==', '{}', 'TestingInterface', '[[[Component]]]\\Power\\TestingInterface', '1.0.0', '{}', 'Testing Interface', 'interface', '{}', '', 1, '2021-11-07 15:54:41', '2021-11-09 04:37:44', 7, 3), (4, '', 'To store tables structures from lila', '', '', 'c4469632-3914-400e-b861-972b2d463963', '', '', '', '', 'CS8qKg0KCSAqIEFkZGluZyB0aGUgdXRpbGl0aWVzIHRyYWl0IHRvIHRoaXMgY2xhc3MNCgkgKiBTaW5jZSB3ZSBuZWVkIHNvbWUgb2YgaXRzIGZ1bmN0aW9ucw0KCSAqLw0KCXVzZSBVdGlsOw0KDQoJLyoqDQoJICogVGhlIGRhdGENCgkgKg0KCSAqIEB2YXIgRXh0cnVkZQ0KCSAqLw0KCXByb3RlY3RlZCAkZGF0YTsNCg0KCS8qKg0KCSAqIENvbnN0cnVjdG9yDQoJICoNCgkgKiBAcGFyYW0gICBFeHRydWRlICAkZGF0YSAgVGhlIGV4dHJ1ZGVkIGRhdGENCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoRXh0cnVkZVRhYmxlcyAkZGF0YSkNCgl7DQoJCSR0aGlzLT5kYXRhID0gJGRhdGE7DQoJfQ0KDQoJLyoqDQoJICogZ2V0IHRoZSBwYXJhbWV0ZXJzIG9mIGVhY2ggYXJlYSBpbiB0aGUgZGF0YSBzZXQNCgkgKg0KCSAqIEBwYXJhbSAgIG1peGVkICAkYXJlYSAgVGhlIGFyZWEgb2YgcGFyYW1zDQoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCA9IGFsbA0KCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlDQoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzDQoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgNCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rcw0KCSAqDQoJICogQHJldHVybiAgYXJyYXkNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0UGFyYW1zKCRhcmVhID0gbnVsbCk6IGFycmF5DQoJew0KCQkvLyBsZXRzIGdldCBhbGwgdGhlIHRhYmxlIHBhcmFtcw0KCQkkcGFyYW1zWyd0YWJsZSddID0gYXJyYXkoKTsNCgkJLy8gbGV0cyBnZXQgYWxsIHRoZSBmaWVsZCBwYXJhbXMNCgkJJHBhcmFtc1snZmllbGRzJ10gPSBhcnJheSgpOw0KCQkvLyBsZXRzIGdldCBhbGwgdGhlIGluZGV4IHBhcmFtcw0KCQkkcGFyYW1zWydpbmRleCddID0gYXJyYXkoKTsNCgkJLy8gbGV0cyBnZXQgYWxsIHRoZSBsaW5rcyBwYXJhbXMNCgkJJHBhcmFtc1snbGlua3MnXSA9IGFycmF5KCk7DQoJCS8vIGxvb3Agb3ZlciB0aGUgZnVsbCBkYXRhc2V0DQoJCWZvcmVhY2ggKCR0aGlzLT5kYXRhLT50YWJsZXMgYXMgJG1vZCA9PiAkdGFibGVzKQ0KCQl7DQoJCQlmb3JlYWNoICgkdGFibGVzIGFzICR0YWJsZV92YWx1ZXMpDQoJCQl7DQoJCQkJZm9yZWFjaCAoJHRhYmxlX3ZhbHVlcyBhcyAkdGFibGVfcGFyYW0gPT4gJHZhbHVlcykNCgkJCQl7DQoJCQkJCS8vIGxldHMgZ2V0IGFsbCB0aGUgZmllbGQgcGFyYW1zDQoJCQkJCS8vIGxldHMgZ2V0IGFsbCB0aGUgaW5kZXggcGFyYW1zDQoJCQkJCS8vIGxldHMgZ2V0IGFsbCB0aGUgbGlua3MgcGFyYW1zDQoJCQkJCWlmICgkdGFibGVfcGFyYW0gPT09ICdmaWVsZHMnIHx8ICR0YWJsZV9wYXJhbSA9PT0gJ2luZGV4JyB8fCAkdGFibGVfcGFyYW0gPT09ICdsaW5rcycpDQoJCQkJCXsNCgkJCQkJCWZvcmVhY2ggKCR2YWx1ZXMgYXMgJGZpZWxkcykNCgkJCQkJCXsNCgkJCQkJCQlmb3JlYWNoICgkZmllbGRzIGFzICRwYXJhbSA9PiAkdmFsdWUpDQoJCQkJCQkJew0KCQkJCQkJCQkkcGFyYW1zWyR0YWJsZV9wYXJhbV1bJHBhcmFtXSA9ICRwYXJhbTsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJLy8gbGV0cyBnZXQgYWxsIHRoZSB0YWJsZSBwYXJhbXMNCgkJCQkJZWxzZQ0KCQkJCQl7DQoJCQkJCQkkcGFyYW1zWyd0YWJsZSddWyR0YWJsZV9wYXJhbV0gPSAkdGFibGVfcGFyYW07DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCX0NCgkJLy8gY2hlY2sgaWYgYW4gYXJlYSBpcyBjYWxsZWQgYW5kIGZvdW5kDQoJCWlmICgkYXJlYSAmJiBpc3NldCgkcGFyYW1zWyRhcmVhXSkpDQoJCXsNCgkJCXJldHVybiAkcGFyYW1zWyRhcmVhXTsNCgkJfQ0KCQkvLyBpZiBhcmVhIGlzIGNhbGxlZCB0aGF0IGRvZXMgbm90IGV4aXN0DQoJCWVsc2VpZiAoJGFyZWEpDQoJCXsNCgkJCXJldHVybiBhcnJheSgpOw0KCQl9DQoJCS8vIHJldHVybiBhbGwgb24gbnVsbCBhcmVhDQoJCXJldHVybiAkcGFyYW1zOw0KCX0NCg==', '{}', 'StoreTables', '[[[COMPANY]]]\\[[[Component]]]\\StoreTables', '1.0.0', '{}', 'Lila Store Tables', 'class', '{\"use_selection0\":{\"use\":\"79d765b3-7319-4988-9730-446c7f347020\"}}', '', 1, '2021-11-13 17:52:23', '2021-11-13 22:21:46', 14, 2), @@ -1995,7 +1995,11 @@ INSERT INTO `#__componentbuilder_power` (`id`, `add_head`, `description`, `exten (26, '', 'Mime Helper\r\n\r\n@since 3.0.11', '', '', 'f11dc790-713e-4706-9a85-a318ed3ad56e', '', '', '', '{}', 'W0VYVEVSTkFMQ09ERT1odHRwczovL2dpc3QuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0xsZXdlbGx5bnZkbS83NGJlMzczMzU3ZTEzMWI4Nzc1YTc1ODJjM2RlNTA4Yi9yYXcvbWltZV90eXBlcy5waHBdDQoNCltFWFRFUk5BTENPREU9aHR0cHM6Ly9naXN0LmdpdGh1YnVzZXJjb250ZW50LmNvbS9MbGV3ZWxseW52ZG0vNzRiZTM3MzM1N2UxMzFiODc3NWE3NTgyYzNkZTUwOGIvcmF3L2dldC5waHBdDQoNCltFWFRFUk5BTENPREU9aHR0cHM6Ly9naXN0LmdpdGh1YnVzZXJjb250ZW50LmNvbS9MbGV3ZWxseW52ZG0vNzRiZTM3MzM1N2UxMzFiODc3NWE3NTgyYzNkZTUwOGIvcmF3L2V4dGVuc2lvbnMucGhwXQ==', '{}', 'MimeHelper', 'VDM\\Joomla\\Utilities.MimeHelper', '1.0.0', '{}', 'Utilities MimeHelper', 'abstract class', '{}', '', 1, '2022-05-16 14:27:38', '2022-05-21 13:27:39', 3, 9), (27, '', 'Just to link powers to the power updater component', '', '', '8025e71c-8e21-44cb-b23e-dce2fb5a1ab5', '', '', '', '{\"load_selection0\":{\"load\":\"db4a1e4d-be59-4e87-8b4d-c40512752232\"},\"load_selection1\":{\"load\":\"79d765b3-7319-4988-9730-446c7f347020\"},\"load_selection2\":{\"load\":\"d7600b43-771a-4747-9f5d-952765721799\"},\"load_selection3\":{\"load\":\"962b15d8-915f-4cd7-aea6-7cf82afdc20b\"},\"load_selection4\":{\"load\":\"f11dc790-713e-4706-9a85-a318ed3ad56e\"}}', '', '{}', 'Updater', 'VDM\\Powe\\Updater', '1.0.0', '{}', 'Power Updater', 'class', '{}', '', 1, '2022-05-21 13:15:55', '2022-06-11 16:54:51', 3, 13), (28, 1, 'Start looking here:\r\nhttps://git.vdm.dev/api/swagger#/repository/repoGetContents', 'c65aaf1f-817c-49a2-8202-282e3904f5b1', '', 'ef011ee1-64f0-4048-b013-777473b727dd', 'dXNlIEpvb21sYVxDTVNcSHR0cFxIdHRwOw0KdXNlIEpvb21sYVxSZWdpc3RyeVxSZWdpc3RyeTs=', '', '', '{}', 'CS8qKg0KCSAqIEdldHMgdGhlIG1ldGFkYXRhIGFuZCBjb250ZW50cyAoaWYgYSBmaWxlKSBvZiBhbiBlbnRyeSBpbiBhIHJlcG9zaXRvcnksIG9yIGEgbGlzdCBvZiBlbnRyaWVzIGlmIGEgZGlyDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmcgICRvd25lciAgICAgICBSZXBvc2l0b3J5IG93bmVyLg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJHJlcG8gICAgICAgICBSZXBvc2l0b3J5IG5hbWUuDQoJICogQHBhcmFtICAgc3RyaW5nICAkZmlsZXBhdGggICAgUmVwb3NpdG9yeSBmaWxlIHBhdGguDQoJICoNCgkgKiBAcmV0dXJuICBvYmplY3QNCgkgKg0KCSAqIEBzaW5jZSAgIDEuMA0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXQoJG93bmVyLCAkcmVwbywgJGZpbGVwYXRoKQ0KCXsNCgkJLy8gQnVpbGQgdGhlIHJlcXVlc3QgcGF0aC4NCgkJJHBhdGggPSAnL3JlcG9zLycgLiAkb3duZXIgLiAnLycgLiAkcmVwbyAuICcvY29udGVudHMvJyAuICRmaWxlcGF0aDsNCg0KCQkvLyBTZW5kIHRoZSByZXF1ZXN0Lg0KCQlyZXR1cm4gJHRoaXMtPnByb2Nlc3NSZXNwb25zZSgNCgkJCSR0aGlzLT5jbGllbnQtPmdldCgkdGhpcy0+ZmV0Y2hVcmwoJHBhdGgpKQ0KCQkpOw0KCX0NCg==', '{}', 'File', 'VDM\\Gitea\\Package.Repo.File', '1.0.0', '{}', 'Gitea Repo File', 'class', '{}', '', 1, '2022-05-21 13:40:09', '2022-07-09 10:28:20', 10, 4), -(29, 1, 'Start looking here:\r\nhttps://git.vdm.dev/api/swagger#/repository/repoCreateWikiPage', 'c65aaf1f-817c-49a2-8202-282e3904f5b1', '', 'c4a188de-ad78-4a6d-9d5b-01866846d701', 'dXNlIEpvb21sYVxDTVNcSHR0cFxIdHRwOw0KdXNlIEpvb21sYVxSZWdpc3RyeVxSZWdpc3RyeTs=', '', '', '{}', 'CS8qKg0KCSAqIEdldCBhIHJlcG9zaXRvcnkgd2lraSBwYWdlDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmcgICRvd25lciAgICAgICAgICAgICAgIFRoZSByZXBvc2l0b3J5IG93bmVyDQoJICogQHBhcmFtICAgc3RyaW5nICAkcmVwbyAgICAgICAgICAgICAgICAgVGhlIHJlcG9zaXRvcnkgbmFtZQ0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJHBhZ2VOYW1lICAgICAgIFRoZSBwYWdlIG5hbWUNCgkgKg0KCSAqIEByZXR1cm4gIG9iamVjdA0KCSAqDQoJICogQHNpbmNlICAgMS4wDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldChzdHJpbmcgJG93bmVyLCBzdHJpbmcgJHJlcG8sIHN0cmluZyAkcGFnZU5hbWUpDQoJew0KCQkvLyBCdWlsZCB0aGUgcmVxdWVzdCBwYXRoLg0KCQkkcGF0aCA9ICcvcmVwb3MvJyAuICRvd25lciAuICcvJyAuICRyZXBvIC4gJy93aWtpL3BhZ2UvJyAuICRwYWdlTmFtZTsNCg0KCQkvLyBTZW5kIHRoZSByZXF1ZXN0Lg0KCQlyZXR1cm4gJHRoaXMtPnByb2Nlc3NSZXNwb25zZSgNCgkJCSR0aGlzLT5jbGllbnQtPmdldCgkdGhpcy0+ZmV0Y2hVcmwoJHBhdGgpKQ0KCQkpOw0KCX0NCg0KCS8qKg0KCSAqIEdldCBhIHJlcG9zaXRvcnkgd2lraSBodG1sIHBhZ2UNCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJG93bmVyICAgICAgICAgICAgICAgVGhlIHJlcG9zaXRvcnkgb3duZXINCgkgKiBAcGFyYW0gICBzdHJpbmcgICRyZXBvICAgICAgICAgICAgICAgICBUaGUgcmVwb3NpdG9yeSBuYW1lDQoJICogQHBhcmFtICAgc3RyaW5nICAkcGFnZU5hbWUgICAgICAgVGhlIHBhZ2UgbmFtZQ0KCSAqDQoJICogQHJldHVybiAgb2JqZWN0DQoJICoNCgkgKiBAc2luY2UgICAxLjANCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0SHRtbChzdHJpbmcgJG93bmVyLCBzdHJpbmcgJHJlcG8sIHN0cmluZyAkcGFnZU5hbWUpDQoJew0KCQkvLyBnZXQgdGhlIGdpdGVhIHdpa2kgcGFnZQ0KCQkkcGFnZSA9ICR0aGlzLT5nZXQoJG93bmVyLCAkcmVwbywgJHBhZ2VOYW1lKTsNCg0KCQlpZiAoZW1wdHkoJHBhZ2UtPmNvbnRlbnQpKQ0KCQl7DQoJCQl0aHJvdyBuZXcgXEV4Y2VwdGlvbignV2lraSBwYWdlIGNvdWxkIG5vdCBiZSBmb3VuZC4nKTsNCgkJfQ0KDQoJCS8vIEJ1aWxkIHRoZSByZXF1ZXN0IHBhdGguDQoJCSRwYXRoID0gJy9tYXJrZG93bic7DQoNCgkJLy8gR2V0IGhlYWRlcnMNCgkJJGhlYWRlcnMgPSAkdGhpcy0+Y2xpZW50LT5nZXRPcHRpb24oJ2hlYWRlcnMnLCBhcnJheSgpKTsNCg0KCQkkaGVhZGVyc1snYWNjZXB0J10gPSAndGV4dC9odG1sJzsNCgkJJGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nOw0KDQoJCS8vIGJ1aWxkIHRoZSBwb3N0IGJvZHkNCgkJJGRhdGEgPSBbDQoJCQknQ29udGV4dCcgPT4gJ3N0cmluZycsDQoJCQknTW9kZScgPT4gJ3N0cmluZycsDQoJCQknVGV4dCcgPT4gJHBhZ2UtPmNvbnRlbnQsDQoJCQknV2lraScgPT4gdHJ1ZQ0KCQldOw0KDQoJCS8vIFBvc3QgdGhlIHJlcXVlc3QuDQoJCXJldHVybiAkdGhpcy0+cHJvY2Vzc1Jlc3BvbnNlKA0KCQkJJHRoaXMtPmNsaWVudC0+cG9zdCgkdGhpcy0+ZmV0Y2hVcmwoJHBhdGgpLCBqc29uX2VuY29kZSgkZGF0YSksICRoZWFkZXJzKQ0KCQkpOw0KCX0NCg==', '{}', 'Wiki', 'VDM\\Gitea\\Package.Repo.Wiki', '1.0.0', '{}', 'Gitea Repo Wiki', 'class', '{}', '', 1, '2022-07-09 10:21:53', '2022-07-09 12:18:07', 9, 4); +(29, 1, 'Start looking here:\r\nhttps://git.vdm.dev/api/swagger#/repository/repoCreateWikiPage', 'c65aaf1f-817c-49a2-8202-282e3904f5b1', '', 'c4a188de-ad78-4a6d-9d5b-01866846d701', 'dXNlIEpvb21sYVxDTVNcSHR0cFxIdHRwOw0KdXNlIEpvb21sYVxSZWdpc3RyeVxSZWdpc3RyeTs=', '', '', '{}', 'CS8qKg0KCSAqIEdldCBhIHJlcG9zaXRvcnkgd2lraSBwYWdlDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmcgICRvd25lciAgICAgICAgICAgICAgIFRoZSByZXBvc2l0b3J5IG93bmVyDQoJICogQHBhcmFtICAgc3RyaW5nICAkcmVwbyAgICAgICAgICAgICAgICAgVGhlIHJlcG9zaXRvcnkgbmFtZQ0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJHBhZ2VOYW1lICAgICAgIFRoZSBwYWdlIG5hbWUNCgkgKg0KCSAqIEByZXR1cm4gIG9iamVjdA0KCSAqDQoJICogQHNpbmNlICAgMS4wDQoJICovDQoJcHVibGljIGZ1bmN0aW9uIGdldChzdHJpbmcgJG93bmVyLCBzdHJpbmcgJHJlcG8sIHN0cmluZyAkcGFnZU5hbWUpDQoJew0KCQkvLyBCdWlsZCB0aGUgcmVxdWVzdCBwYXRoLg0KCQkkcGF0aCA9ICcvcmVwb3MvJyAuICRvd25lciAuICcvJyAuICRyZXBvIC4gJy93aWtpL3BhZ2UvJyAuICRwYWdlTmFtZTsNCg0KCQkvLyBTZW5kIHRoZSByZXF1ZXN0Lg0KCQlyZXR1cm4gJHRoaXMtPnByb2Nlc3NSZXNwb25zZSgNCgkJCSR0aGlzLT5jbGllbnQtPmdldCgkdGhpcy0+ZmV0Y2hVcmwoJHBhdGgpKQ0KCQkpOw0KCX0NCg0KCS8qKg0KCSAqIEdldCBhIHJlcG9zaXRvcnkgd2lraSBodG1sIHBhZ2UNCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJG93bmVyICAgICAgICAgICAgICAgVGhlIHJlcG9zaXRvcnkgb3duZXINCgkgKiBAcGFyYW0gICBzdHJpbmcgICRyZXBvICAgICAgICAgICAgICAgICBUaGUgcmVwb3NpdG9yeSBuYW1lDQoJICogQHBhcmFtICAgc3RyaW5nICAkcGFnZU5hbWUgICAgICAgVGhlIHBhZ2UgbmFtZQ0KCSAqDQoJICogQHJldHVybiAgb2JqZWN0DQoJICoNCgkgKiBAc2luY2UgICAxLjANCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0SHRtbChzdHJpbmcgJG93bmVyLCBzdHJpbmcgJHJlcG8sIHN0cmluZyAkcGFnZU5hbWUpDQoJew0KCQkvLyBnZXQgdGhlIGdpdGVhIHdpa2kgcGFnZQ0KCQkkcGFnZSA9ICR0aGlzLT5nZXQoJG93bmVyLCAkcmVwbywgJHBhZ2VOYW1lKTsNCg0KCQlpZiAoZW1wdHkoJHBhZ2UtPmNvbnRlbnQpKQ0KCQl7DQoJCQl0aHJvdyBuZXcgXEV4Y2VwdGlvbignV2lraSBwYWdlIGNvdWxkIG5vdCBiZSBmb3VuZC4nKTsNCgkJfQ0KDQoJCS8vIEJ1aWxkIHRoZSByZXF1ZXN0IHBhdGguDQoJCSRwYXRoID0gJy9tYXJrZG93bic7DQoNCgkJLy8gR2V0IGhlYWRlcnMNCgkJJGhlYWRlcnMgPSAkdGhpcy0+Y2xpZW50LT5nZXRPcHRpb24oJ2hlYWRlcnMnLCBhcnJheSgpKTsNCg0KCQkkaGVhZGVyc1snYWNjZXB0J10gPSAndGV4dC9odG1sJzsNCgkJJGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nOw0KDQoJCS8vIGJ1aWxkIHRoZSBwb3N0IGJvZHkNCgkJJGRhdGEgPSBbDQoJCQknQ29udGV4dCcgPT4gJ3N0cmluZycsDQoJCQknTW9kZScgPT4gJ3N0cmluZycsDQoJCQknVGV4dCcgPT4gJHBhZ2UtPmNvbnRlbnQsDQoJCQknV2lraScgPT4gdHJ1ZQ0KCQldOw0KDQoJCS8vIFBvc3QgdGhlIHJlcXVlc3QuDQoJCXJldHVybiAkdGhpcy0+cHJvY2Vzc1Jlc3BvbnNlKA0KCQkJJHRoaXMtPmNsaWVudC0+cG9zdCgkdGhpcy0+ZmV0Y2hVcmwoJHBhdGgpLCBqc29uX2VuY29kZSgkZGF0YSksICRoZWFkZXJzKQ0KCQkpOw0KCX0NCg==', '{}', 'Wiki', 'VDM\\Gitea\\Package.Repo.Wiki', '1.0.0', '{}', 'Gitea Repo Wiki', 'class', '{}', '', 1, '2022-07-09 10:21:53', '2022-07-09 12:18:07', 9, 4), +(30, 1, 'Start looking here:\r\nhttps://git.vdm.dev/api/swagger#/repository/repoGetContents', 'c65aaf1f-817c-49a2-8202-282e3904f5b1', '', '6ad3beb1-a769-4a6c-b300-5cda7adc6c0d', 'dXNlIEpvb21sYVxDTVNcSHR0cFxIdHRwOw0KdXNlIEpvb21sYVxSZWdpc3RyeVxSZWdpc3RyeTs=', '', '', '{}', 'CS8qKg0KCSAqIEdldHMgdGhlIG1ldGFkYXRhIGFuZCBjb250ZW50cyAoaWYgYSBmaWxlKSBvZiBhbiBlbnRyeSBpbiBhIHJlcG9zaXRvcnksIG9yIGEgbGlzdCBvZiBlbnRyaWVzIGlmIGEgZGlyDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmcgICRvd25lciAgICAgICBSZXBvc2l0b3J5IG93bmVyLg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJHJlcG8gICAgICAgICBSZXBvc2l0b3J5IG5hbWUuDQoJICogQHBhcmFtICAgc3RyaW5nICAkZmlsZXBhdGggICAgUmVwb3NpdG9yeSBmaWxlIHBhdGguDQoJICoNCgkgKiBAcmV0dXJuICBvYmplY3QNCgkgKg0KCSAqIEBzaW5jZSAgIDEuMA0KCSAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXQoJG93bmVyLCAkcmVwbywgJGZpbGVwYXRoKQ0KCXsNCgkJLy8gQnVpbGQgdGhlIHJlcXVlc3QgcGF0aC4NCgkJJHBhdGggPSAnL3JlcG9zLycgLiAkb3duZXIgLiAnLycgLiAkcmVwbyAuICcvY29udGVudHMvJyAuICRmaWxlcGF0aDsNCg0KCQkvLyBTZW5kIHRoZSByZXF1ZXN0Lg0KCQlyZXR1cm4gJHRoaXMtPnByb2Nlc3NSZXNwb25zZSgNCgkJCSR0aGlzLT5jbGllbnQtPmdldCgkdGhpcy0+ZmV0Y2hVcmwoJHBhdGgpKQ0KCQkpOw0KCX0NCg==', '{}', 'File', 'VDM\\Gitea\\Package.Repo.File', '1.0.1', '{}', 'Gitea Repo File', 'class', '{}', '', -2, '2022-07-11 18:35:50', '2022-07-09 10:28:20', 1, 4), +(31, '', 'Loading the Extension Installation Script Class\r\n\r\n@since 3.1.5', '', '', '1d929017-a5de-4e0f-9b5a-838934857e26', '', '', '', '{}', 'CS8qKg0KCSAqIFRoZSBMaW5lIG51bWJlcmluZyBNZXRob2RzDQoJICoNCgkgKiBAc2luY2UgMy4xLjUNCgkgKi8NCgl1c2UgTGluZTsNCg0KCS8qKg0KCSAqIFRoZSBUYWIgQWRkaW5nIE1ldGhvZA0KCSAqDQoJICogQHNpbmNlIDMuMS41DQoJICovDQoJdXNlIFRhYjsNCg0KCS8qKg0KCSAqIFRoZSBleHRlbnNpb24NCgkgKg0KCSAqIEB2YXIgICAgIG9iamVjdA0KCSAqIEBzaW5jZSAzLjEuNQ0KCSAqLw0KCXByb3RlY3RlZCBvYmplY3QgJGV4dGVuc2lvbjsNCg0KCS8qKg0KCSAqIFRoZSBtZXRob2RzDQoJICoNCgkgKiBAdmFyICAgICBhcnJheQ0KCSAqIEBzaW5jZSAzLjEuNQ0KCSAqLw0KCXByb3RlY3RlZCBhcnJheSAkbWV0aG9kcyA9IFsncGhwX3NjcmlwdCcsICdwaHBfcHJlZmxpZ2h0JywgJ3BocF9wb3N0ZmxpZ2h0JywgJ3BocF9tZXRob2QnXTsNCg0KCS8qKg0KCSAqIFRoZSB0eXBlcw0KCSAqDQoJICogQHZhciAgICAgYXJyYXkNCgkgKiBAc2luY2UgMy4xLjUNCgkgKi8NCglwcm90ZWN0ZWQgYXJyYXkgJHR5cGVzID0gWydjb25zdHJ1Y3QnLCAnaW5zdGFsbCcsICd1cGRhdGUnLCAndW5pbnN0YWxsJywgJ2Rpc2NvdmVyX2luc3RhbGwnXTsNCg0KCS8qKg0KCSAqIFRoZSBjb25zdHJ1Y3QgYnVja2V0DQoJICoNCgkgKiBAdmFyICAgICBhcnJheQ0KCSAqIEBzaW5jZSAzLjEuNQ0KCSAqLw0KCXByb3RlY3RlZCBhcnJheSAkY29uc3RydWN0ID0gW107DQoNCgkvKioNCgkgKiBUaGUgaW5zdGFsbCBidWNrZXQNCgkgKg0KCSAqIEB2YXIgICAgIGFycmF5DQoJICogQHNpbmNlIDMuMS41DQoJICovDQoJcHJvdGVjdGVkIGFycmF5ICRpbnN0YWxsID0gW107DQoNCgkvKioNCgkgKiBUaGUgdXBkYXRlIGJ1Y2tldA0KCSAqDQoJICogQHZhciAgICAgYXJyYXkNCgkgKiBAc2luY2UgMy4xLjUNCgkgKi8NCglwcm90ZWN0ZWQgYXJyYXkgJHVwZGF0ZSA9IFtdOw0KDQoJLyoqDQoJICogVGhlIHVuaW5zdGFsbCBidWNrZXQNCgkgKg0KCSAqIEB2YXIgICAgIGFycmF5DQoJICogQHNpbmNlIDMuMS41DQoJICovDQoJcHJvdGVjdGVkIGFycmF5ICR1bmluc3RhbGwgPSBbXTsNCg0KCS8qKg0KCSAqIFRoZSBwcmVmbGlnaHQgc3dpdGNoDQoJICoNCgkgKiBAdmFyICAgICBib29sDQoJICogQHNpbmNlIDMuMS41DQoJICovDQoJcHJvdGVjdGVkIGJvb2wgJHByZWZsaWdodEFjdGl2ZSA9IGZhbHNlOw0KDQoJLyoqDQoJICogVGhlIHByZWZsaWdodCBidWNrZXQNCgkgKg0KCSAqIEB2YXIgICAgIGFycmF5DQoJICogQHNpbmNlIDMuMS41DQoJICovDQoJcHJvdGVjdGVkIGFycmF5ICRwcmVmbGlnaHRCdWNrZXQgPSBbJ2luc3RhbGwnID0+IFtdLCAndW5pbnN0YWxsJyA9PiBbXSwgJ2Rpc2NvdmVyX2luc3RhbGwnID0+IFtdLCAndXBkYXRlJyA9PiBbXV07DQoNCgkvKioNCgkgKiBUaGUgcG9zdGZsaWdodCBzd2l0Y2gNCgkgKg0KCSAqIEB2YXIgICAgIGJvb2wNCgkgKiBAc2luY2UgMy4xLjUNCgkgKi8NCglwcm90ZWN0ZWQgYm9vbCAkcG9zdGZsaWdodEFjdGl2ZSA9IGZhbHNlOw0KDQoJLyoqDQoJICogVGhlIHBvc3RmbGlnaHQgYnVja2V0DQoJICoNCgkgKiBAdmFyICAgICBhcnJheQ0KCSAqIEBzaW5jZSAzLjEuNQ0KCSAqLw0KCXByb3RlY3RlZCBhcnJheSAkcG9zdGZsaWdodEJ1Y2tldCA9IFsnaW5zdGFsbCcgPT4gW10sICd1bmluc3RhbGwnID0+IFtdLCAnZGlzY292ZXJfaW5zdGFsbCcgPT4gW10sICd1cGRhdGUnID0+IFtdXTsNCg0KCS8qKg0KCSAqIENvbnN0cnVjdG9yDQoJICogQHNpbmNlIDMuMS41DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KG9iamVjdCAkZXh0ZW5zaW9uKQ0KCXsNCgkJLy8gbG9vcCBvdmVyIG1ldGhvZHMgYW5kIHR5cGVzDQoJCWZvcmVhY2ggKCR0aGlzLT5tZXRob2RzIGFzICRtZXRob2QpDQoJCXsNCgkJCWZvcmVhY2ggKCR0aGlzLT50eXBlcyBhcyAkdHlwZSkNCgkJCXsNCgkJCQlpZiAoaXNzZXQoJGV4dGVuc2lvbi0+eydhZGRfJyAuICRtZXRob2QgLiAnXycgLiAkdHlwZX0pDQoJCQkJCSYmICRleHRlbnNpb24tPnsnYWRkXycgLiAkbWV0aG9kIC4gJ18nIC4gJHR5cGV9ID09IDENCgkJCQkJJiYgU3RyaW5nSGVscGVyOjpjaGVjaygNCgkJCQkJCSRleHRlbnNpb24tPnskbWV0aG9kIC4gJ18nIC4gJHR5cGV9DQoJCQkJCSkpDQoJCQkJew0KCQkJCQkvLyBhZGQgdG8gdGhlIG1haW4gbWV0aG9kcw0KCQkJCQlpZiAoJ3BocF9tZXRob2QnID09PSAkbWV0aG9kIHx8ICdwaHBfc2NyaXB0JyA9PT0gJG1ldGhvZCkNCgkJCQkJew0KCQkJCQkJJHRoaXMtPnskdHlwZX1bXSA9ICRleHRlbnNpb24tPnskbWV0aG9kIC4gJ18nIC4gJHR5cGV9Ow0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJLy8gZ2V0IHRoZSBmbGlnaHQga2V5DQoJCQkJCQkkZmxpZ2h0ID0gc3RyX3JlcGxhY2UoJ3BocF8nLCAnJywgJG1ldGhvZCk7DQoJCQkJCQkvLyBsb2FkIHRoZSBzY3JpcHQgdG8gb3VyIGJ1Y2tldA0KCQkJCQkJJHRoaXMtPnskZmxpZ2h0IC4gJ0J1Y2tldCd9WyR0eXBlXVtdICA9ICRleHRlbnNpb24tPnskbWV0aG9kIC4gJ18nIC4gJHR5cGV9Ow0KCQkJCQkJLy8gc2hvdyB0aGF0IHRoZSBtZXRob2QgaXMgYWN0aXZlDQoJCQkJCQkkdGhpcy0+eyRmbGlnaHQgLiAnQWN0aXZlJ30gPSB0cnVlOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9DQoNCgkJJHRoaXMtPmV4dGVuc2lvbiA9ICRleHRlbnNpb247DQoJfQ0KDQoJLyoqDQoJICogZ2V0IGluc3RhbGwgc2NyaXB0DQoJICoNCgkgKiBAcmV0dXJuICBzdHJpbmcNCgkgKiBAc2luY2UgMy4xLjUNCgkgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0KCk6IHN0cmluZw0KCXsNCgkJLy8gcmV0dXJuIHRoZSBjbGFzcw0KCQlyZXR1cm4gJHRoaXMtPmJ1aWxkKCk7DQoJfQ0KDQoJLyoqDQoJICogYnVpbGQgdGhlIGluc3RhbGwgY2xhc3MNCgkgKg0KCSAqIEByZXR1cm4gIHN0cmluZw0KCSAqIEBzaW5jZSAzLjEuNQ0KCSAqLw0KCXByb3RlY3RlZCBmdW5jdGlvbiBidWlsZCgpOiBzdHJpbmcNCgl7DQoJCS8vIHN0YXJ0IGJ1aWxkDQoJCSRzY3JpcHQgPSAkdGhpcy0+aGVhZCgpOw0KDQoJCS8vIGxvYWQgY29uc3RydWN0b3IgaWYgc2V0DQoJCSRzY3JpcHQgLj0gJHRoaXMtPmNvbnN0cnVjdCgpOw0KDQoJCS8vIGxvYWQgaW5zdGFsbCBtZXRob2QgaWYgc2V0DQoJCSRzY3JpcHQgLj0gJHRoaXMtPm1haW4oJ2luc3RhbGwnKTsNCg0KCQkvLyBsb2FkIHVwZGF0ZSBtZXRob2QgaWYgc2V0DQoJCSRzY3JpcHQgLj0gJHRoaXMtPm1haW4oJ3VwZGF0ZScpOw0KDQoJCS8vIGxvYWQgdW5pbnN0YWxsIG1ldGhvZCBpZiBzZXQNCgkJJHNjcmlwdCAuPSAkdGhpcy0+bWFpbigndW5pbnN0YWxsJyk7DQoNCgkJLy8gbG9hZCBwcmVmbGlnaHQgbWV0aG9kIGlmIHNldA0KCQkkc2NyaXB0IC49ICR0aGlzLT5mbGlnaHQoJ3ByZWZsaWdodCcpOw0KDQoJCS8vIGxvYWQgcG9zdGZsaWdodCBtZXRob2QgaWYgc2V0DQoJCSRzY3JpcHQgLj0gJHRoaXMtPmZsaWdodCgncG9zdGZsaWdodCcpOw0KDQoJCS8vIGNsb3NlIHRoZSBjbGFzcw0KCQkkc2NyaXB0IC49IFBIUF9FT0wgLiAnfScgLiBQSFBfRU9MOw0KDQoJCXJldHVybiAkc2NyaXB0Ow0KCX0NCg0KCS8qKg0KCSAqIGdldCBpbnN0YWxsIHNjcmlwdCBoZWFkDQoJICoNCgkgKiBAcmV0dXJuICBzdHJpbmcNCgkgKiBAc2luY2UgMy4xLjUNCgkgKi8NCglwcm90ZWN0ZWQgZnVuY3Rpb24gaGVhZCgpOiBzdHJpbmcNCgl7DQoJCS8vIGdldCB0aGUgZXh0ZW5zaW9uDQoJCSRleHRlbnNpb24gPSAkdGhpcy0+ZXh0ZW5zaW9uOw0KCQkvLyBzdGFydCBidWlsZA0KCQkkc2NyaXB0ID0gUEhQX0VPTCAuICcvKionOw0KCQkkc2NyaXB0IC49IFBIUF9FT0wgLiAnICogJyAuICRleHRlbnNpb24tPm9mZmljaWFsX25hbWUNCgkJCS4gJyBzY3JpcHQgZmlsZS4nOw0KCQkkc2NyaXB0IC49IFBIUF9FT0wgLiAnIConOw0KCQkkc2NyaXB0IC49IFBIUF9FT0wgLiAnICogQHBhY2thZ2UgJyAuICRleHRlbnNpb24tPmNsYXNzX25hbWU7DQoJCSRzY3JpcHQgLj0gUEhQX0VPTCAuICcgKi8nOw0KCQkkc2NyaXB0IC49IFBIUF9FT0wgLiAnY2xhc3MgJyAuICRleHRlbnNpb24tPmluc3RhbGxlcl9jbGFzc19uYW1lOw0KCQkkc2NyaXB0IC49IFBIUF9FT0wgLiAneyc7DQoNCgkJcmV0dXJuICRzY3JpcHQ7DQoJfQ0KDQoJLyoqDQoJICogZ2V0IGNvbnN0cnVjdG9yDQoJICoNCgkgKiBAcmV0dXJuICBzdHJpbmcNCgkgKiBAc2luY2UgMy4xLjUNCgkgKi8NCglwcm90ZWN0ZWQgZnVuY3Rpb24gY29uc3RydWN0KCk6IHN0cmluZw0KCXsNCgkJLy8gcmV0dXJuIGVtcHR5IHN0cmluZyBpZiBub3Qgc2V0DQoJCWlmICghQXJyYXlIZWxwZXI6OmNoZWNrKCR0aGlzLT5jb25zdHJ1Y3QpKQ0KCQl7DQoJCQlyZXR1cm4gJyc7DQoJCX0NCg0KCQkvLyB0aGUgX19jb25zdHJ1Y3Qgc2NyaXB0DQoJCSRzY3JpcHQgPSBQSFBfRU9MIC4gUEhQX0VPTCAuICR0aGlzLT5fdCgxKSAuICcvKionOw0KCQkkc2NyaXB0IC49IFBIUF9FT0wgLiAkdGhpcy0+X3QoMSkgLiAnICogQ29uc3RydWN0b3InOw0KCQkkc2NyaXB0IC49IFBIUF9FT0wgLiAkdGhpcy0+X3QoMSkgLiAnIConOw0KCQkkc2NyaXB0IC49IFBIUF9FT0wgLiAkdGhpcy0+X3QoMSkNCgkJCS4gJyAqIEBwYXJhbSAgIEpvb21sYVxDTVNcSW5zdGFsbGVyXEluc3RhbGxlckFkYXB0ZXIgICRhZGFwdGVyICBUaGUgb2JqZWN0IHJlc3BvbnNpYmxlIGZvciBydW5uaW5nIHRoaXMgc2NyaXB0JzsNCgkJJHNjcmlwdCAuPSBQSFBfRU9MIC4gJHRoaXMtPl90KDEpIC4gJyAqLyc7DQoJCSRzY3JpcHQgLj0gUEhQX0VPTCAuICR0aGlzLT5fdCgxKQ0KCQkJLiAncHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRhZGFwdGVyKSc7DQoJCSRzY3JpcHQgLj0gUEhQX0VPTCAuICR0aGlzLT5fdCgxKSAuICd7JzsNCgkJJHNjcmlwdCAuPSBQSFBfRU9MIC4gaW1wbG9kZShQSFBfRU9MIC4gUEhQX0VPTCwgJHRoaXMtPmNvbnN0cnVjdCk7DQoJCS8vIGNsb3NlIHRoZSBmdW5jdGlvbg0KCQkkc2NyaXB0IC49IFBIUF9FT0wgLiAkdGhpcy0+X3QoMSkgLiAnfSc7DQoNCgkJcmV0dXJuICRzY3JpcHQ7DQoJfQ0KDQoJLyoqDQoJICogYnVpbGQgbWFpbiBtZXRob2RzDQoJICoNCgkgKiBAcGFyYW0gICBzdHJpbmcgICRuYW1lICAgdGhlIG1ldGhvZCBiZWluZyBjYWxsZWQNCgkgKg0KCSAqIEByZXR1cm4gIHN0cmluZw0KCSAqIEBzaW5jZSAzLjEuNQ0KCSAqLw0KCXByb3RlY3RlZCBmdW5jdGlvbiBtYWluKHN0cmluZyAkbmFtZSk6IHN0cmluZw0KCXsNCgkJLy8gcmV0dXJuIGVtcHR5IHN0cmluZyBpZiBub3Qgc2V0DQoJCWlmICghQXJyYXlIZWxwZXI6OmNoZWNrKCR0aGlzLT57JG5hbWV9KSkNCgkJew0KCQkJcmV0dXJuICcnOw0KCQl9DQoJCS8vIGxvYWQgdGhlIGluc3RhbGwgbWV0aG9kDQoJCSRzY3JpcHQgPSBQSFBfRU9MIC4gUEhQX0VPTCAuICR0aGlzLT5fdCgxKSAuICcvKionOw0KCQkkc2NyaXB0IC49IFBIUF9FT0wgLiAkdGhpcy0+X3QoMSkgLiAiICogQ2FsbGVkIG9uICRuYW1lIjsNCgkJJHNjcmlwdCAuPSBQSFBfRU9MIC4gJHRoaXMtPl90KDEpIC4gJyAqJzsNCgkJJHNjcmlwdCAuPSBQSFBfRU9MIC4gJHRoaXMtPl90KDEpDQoJCQkuICcgKiBAcGFyYW0gICBKb29tbGFcQ01TXEluc3RhbGxlclxJbnN0YWxsZXJBZGFwdGVyICAkYWRhcHRlciAgVGhlIG9iamVjdCByZXNwb25zaWJsZSBmb3IgcnVubmluZyB0aGlzIHNjcmlwdCc7DQoJCSRzY3JpcHQgLj0gUEhQX0VPTCAuICR0aGlzLT5fdCgxKSAuICcgKic7DQoJCSRzY3JpcHQgLj0gUEhQX0VPTCAuICR0aGlzLT5fdCgxKQ0KCQkJLiAnICogQHJldHVybiAgYm9vbGVhbiAgVHJ1ZSBvbiBzdWNjZXNzJzsNCgkJJHNjcmlwdCAuPSBQSFBfRU9MIC4gJHRoaXMtPl90KDEpIC4gJyAqLyc7DQoJCSRzY3JpcHQgLj0gUEhQX0VPTCAuICR0aGlzLT5fdCgxKSAuICdwdWJsaWMgZnVuY3Rpb24gJw0KCQkJLiAkbmFtZSAuICcoJGFkYXB0ZXIpJzsNCgkJJHNjcmlwdCAuPSBQSFBfRU9MIC4gJHRoaXMtPl90KDEpIC4gJ3snOw0KCQkkc2NyaXB0IC49IFBIUF9FT0wgLiBpbXBsb2RlKFBIUF9FT0wgLiBQSFBfRU9MLCAkdGhpcy0+eyRuYW1lfSk7DQoJCS8vIHJldHVybiB0cnVlDQoJCWlmICgndW5pbnN0YWxsJyAhPT0gJG5hbWUpDQoJCXsNCgkJCSRzY3JpcHQgLj0gUEhQX0VPTCAuICR0aGlzLT5fdCgyKSAuICdyZXR1cm4gdHJ1ZTsnOw0KCQl9DQoJCS8vIGNsb3NlIHRoZSBmdW5jdGlvbg0KCQkkc2NyaXB0IC49IFBIUF9FT0wgLiAkdGhpcy0+X3QoMSkgLiAnfSc7DQoNCgkJcmV0dXJuICRzY3JpcHQ7DQoJfQ0KDQoJLyoqDQoJICogYnVpbGQgZmxpZ2h0IG1ldGhvZHMNCgkgKg0KCSAqIEBwYXJhbSAgIHN0cmluZyAgJG5hbWUgICB0aGUgbWV0aG9kIGJlaW5nIGNhbGxlZA0KCSAqDQoJICogQHJldHVybiAgc3RyaW5nDQoJICogQHNpbmNlIDMuMS41DQoJICovDQoJcHJvdGVjdGVkIGZ1bmN0aW9uIGZsaWdodChzdHJpbmcgJG5hbWUpOiBzdHJpbmcNCgl7DQoJCS8vIHJldHVybiBlbXB0eSBzdHJpbmcgaWYgbm90IHNldA0KCQlpZiAoZW1wdHkoJHRoaXMtPnskbmFtZSAuICdBY3RpdmUnfSkpDQoJCXsNCgkJCXJldHVybiAnJzsNCgkJfQ0KDQoJCS8vIHRoZSBwcmUvcG9zdCBmdW5jdGlvbiB0eXBlcw0KCQkkc2NyaXB0ID0gUEhQX0VPTCAuIFBIUF9FT0wgLiAkdGhpcy0+X3QoMSkgLiAnLyoqJzsNCgkJJHNjcmlwdCAuPSBQSFBfRU9MIC4gJHRoaXMtPl90KDEpDQoJCQkuICcgKiBDYWxsZWQgYmVmb3JlIGFueSB0eXBlIG9mIGFjdGlvbic7DQoJCSRzY3JpcHQgLj0gUEhQX0VPTCAuICR0aGlzLT5fdCgxKSAuICcgKic7DQoJCSRzY3JpcHQgLj0gUEhQX0VPTCAuICR0aGlzLT5fdCgxKQ0KCQkJLiAnICogQHBhcmFtICAgc3RyaW5nICAkcm91dGUgIFdoaWNoIGFjdGlvbiBpcyBoYXBwZW5pbmcgKGluc3RhbGx8dW5pbnN0YWxsfGRpc2NvdmVyX2luc3RhbGx8dXBkYXRlKSc7DQoJCSRzY3JpcHQgLj0gUEhQX0VPTCAuICR0aGlzLT5fdCgxKQ0KCQkJLiAnICogQHBhcmFtICAgSm9vbWxhXENNU1xJbnN0YWxsZXJcSW5zdGFsbGVyQWRhcHRlciAgJGFkYXB0ZXIgIFRoZSBvYmplY3QgcmVzcG9uc2libGUgZm9yIHJ1bm5pbmcgdGhpcyBzY3JpcHQnOw0KCQkkc2NyaXB0IC49IFBIUF9FT0wgLiAkdGhpcy0+X3QoMSkgLiAnIConOw0KCQkkc2NyaXB0IC49IFBIUF9FT0wgLiAkdGhpcy0+X3QoMSkNCgkJCS4gJyAqIEByZXR1cm4gIGJvb2xlYW4gIFRydWUgb24gc3VjY2Vzcyc7DQoJCSRzY3JpcHQgLj0gUEhQX0VPTCAuICR0aGlzLT5fdCgxKSAuICcgKi8nOw0KCQkkc2NyaXB0IC49IFBIUF9FT0wgLiAkdGhpcy0+X3QoMSkgLiAncHVibGljIGZ1bmN0aW9uICcNCgkJCS4gJG5hbWUgLiAnKCRyb3V0ZSwgJGFkYXB0ZXIpJzsNCgkJJHNjcmlwdCAuPSBQSFBfRU9MIC4gJHRoaXMtPl90KDEpIC4gJ3snOw0KCQkkc2NyaXB0IC49IFBIUF9FT0wgLiAkdGhpcy0+X3QoMikgLiAnLy8nIC4gJHRoaXMtPnNldExpbmUoDQoJCQkJX19MSU5FX18NCgkJCSkgLiAnIGdldCBhcHBsaWNhdGlvbic7DQoJCSRzY3JpcHQgLj0gUEhQX0VPTCAuICR0aGlzLT5fdCgyKQ0KCQkJLiAnJGFwcCA9IEpGYWN0b3J5OjpnZXRBcHBsaWNhdGlvbigpOycgLiBQSFBfRU9MOw0KDQoJCS8vIGFkZCB0aGUgZGVmYXVsdCB2ZXJzaW9uIGNoZWNrIChUT0RPKSBtdXN0IG1ha2UgdGhpcyBkeW5hbWljDQoJCWlmICgncHJlZmxpZ2h0JyA9PT0gJG5hbWUpDQoJCXsNCgkJCSRzY3JpcHQgLj0gUEhQX0VPTCAuICR0aGlzLT5fdCgyKSAuICcvLycgLiAkdGhpcy0+c2V0TGluZSgNCgkJCQkJX19MSU5FX18NCgkJCQkpIC4gJyB0aGUgZGVmYXVsdCBmb3IgYm90aCBpbnN0YWxsIGFuZCB1cGRhdGUnOw0KCQkJJHNjcmlwdCAuPSBQSFBfRU9MIC4gJHRoaXMtPl90KDIpDQoJCQkJLiAnJGp2ZXJzaW9uID0gbmV3IEpWZXJzaW9uKCk7JzsNCgkJCSRzY3JpcHQgLj0gUEhQX0VPTCAuICR0aGlzLT5fdCgyKQ0KCQkJCS4gImlmICghXCRqdmVyc2lvbi0+aXNDb21wYXRpYmxlKCczLjguMCcpKSI7DQoJCQkkc2NyaXB0IC49IFBIUF9FT0wgLiAkdGhpcy0+X3QoMikgLiAneyc7DQoJCQkkc2NyaXB0IC49IFBIUF9FT0wgLiAkdGhpcy0+X3QoMykNCgkJCQkuICJcJGFwcC0+ZW5xdWV1ZU1lc3NhZ2UoJ1BsZWFzZSB1cGdyYWRlIHRvIGF0IGxlYXN0IEpvb21sYSEgMy44LjAgYmVmb3JlIGNvbnRpbnVpbmchJywgJ2Vycm9yJyk7IjsNCgkJCSRzY3JpcHQgLj0gUEhQX0VPTCAuICR0aGlzLT5fdCgzKSAuICdyZXR1cm4gZmFsc2U7JzsNCgkJCSRzY3JpcHQgLj0gUEhQX0VPTCAuICR0aGlzLT5fdCgyKSAuICd9JyAuIFBIUF9FT0w7DQoJCX0NCg0KCQkvLyBub3cgYWRkIHRoZSBzY3JpcHRzDQoJCWZvcmVhY2ggKCR0aGlzLT57JG5hbWUgLiAnQnVja2V0J30gYXMgJHJvdXRlID0+ICRfc2NyaXB0KQ0KCQl7DQoJCQlpZiAoQXJyYXlIZWxwZXI6OmNoZWNrKCRfc2NyaXB0KSkNCgkJCXsNCgkJCQkvLyBzZXQgdGhlIGlmIGFuZCBzY3JpcHQNCgkJCQkkc2NyaXB0IC49IFBIUF9FT0wgLiAkdGhpcy0+X3QoMikgLiAiaWYgKCciIC4gJHJvdXRlDQoJCQkJCS4gIicgPT09IFwkcm91dGUpIjsNCgkJCQkkc2NyaXB0IC49IFBIUF9FT0wgLiAkdGhpcy0+X3QoMikgLiAneyc7DQoJCQkJJHNjcmlwdCAuPSBQSFBfRU9MIC4gaW1wbG9kZSgNCgkJCQkJCVBIUF9FT0wgLiBQSFBfRU9MLCAkX3NjcmlwdA0KCQkJCQkpOw0KCQkJCSRzY3JpcHQgLj0gUEhQX0VPTCAuICR0aGlzLT5fdCgyKSAuICd9JyAuIFBIUF9FT0w7DQoJCQl9DQoJCX0NCg0KCQkvLyByZXR1cm4gdHJ1ZQ0KCQkkc2NyaXB0IC49IFBIUF9FT0wgLiAkdGhpcy0+X3QoMikgLiAncmV0dXJuIHRydWU7JzsNCgkJLy8gY2xvc2UgdGhlIGZ1bmN0aW9uDQoJCSRzY3JpcHQgLj0gUEhQX0VPTCAuICR0aGlzLT5fdCgxKSAuICd9JzsNCg0KCQlyZXR1cm4gJHNjcmlwdDsNCgl9', '{}', 'InstallScript', 'VDM\\Joomla\\Componentbuilder.Extension.InstallScript', '1.0.0', '{}', 'Componentbuilder.Extension.Install', 'class', '{\"use_selection0\":{\"use\":\"0a59c65c-9daf-4bc9-baf4-e063ff9e6a8a\",\"as\":\"default\"},\"use_selection1\":{\"use\":\"1f28cb53-60d9-4db1-b517-3c7dc6b429ef\",\"as\":\"default\"},\"use_selection2\":{\"use\":\"4e6ff11d-bebf-42f5-8fd7-b2f882857222\",\"as\":\"default\"},\"use_selection3\":{\"use\":\"a68c010b-e92e-47d5-8a44-d23cfddeb6c6\",\"as\":\"default\"}}', '', 1, '2022-08-20 13:45:05', '2022-08-20 15:47:55', 10, 14), +(32, '', 'Adds Tabs\r\n\r\n@since 3.1.5', '', '', 'a68c010b-e92e-47d5-8a44-d23cfddeb6c6', '', '', '', '{}', 'CS8qKg0KCSAqIFRhYi9zcGFjZXIgYnVja2V0ICh0byBzcGVlZC11cCB0aGUgYnVpbGQpDQoJICogDQoJICogQHZhciAgIGFycmF5DQoJICogQHNpbmNlIDMuMS41DQoJICovDQoJcHJvdGVjdGVkICR0YWJTcGFjZXJCdWNrZXQgPSBhcnJheSgpOw0KDQoJLyoqDQoJICogU2V0IHRhYi9zcGFjZXINCgkgKiANCgkgKiBAdmFyICAgc3RyaW5nDQoJICogQHNpbmNlIDMuMS41DQoJICovDQoJcHJvdGVjdGVkICR0YWJTcGFjZXIgPSAiXHQiOw0KDQoJLyoqDQoJICogU2V0IHRoZSB0YWIvc3BhY2UNCgkgKiANCgkgKiBAcGFyYW0gICBpbnQgICAkbnIgIFRoZSBudW1iZXIgb2YgdGFnL3NwYWNlDQoJICogDQoJICogQHJldHVybiAgc3RyaW5nDQoJICogQHNpbmNlIDMuMS41DQoJICovDQoJcHVibGljIGZ1bmN0aW9uIF90KGludCAkbnIpIDogc3RyaW5nDQoJew0KCQkvLyBjaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIHN0cmluZw0KCQlpZiAoIWlzc2V0KCR0aGlzLT50YWJTcGFjZXJCdWNrZXRbJG5yXSkpDQoJCXsNCgkJCS8vIGdldCB0aGUgc3RyaW5nDQoJCQkkdGhpcy0+dGFiU3BhY2VyQnVja2V0WyRucl0gPSBzdHJfcmVwZWF0KCR0aGlzLT50YWJTcGFjZXIsIChpbnQpICRucik7DQoJCX0NCgkJLy8gcmV0dXJuIHN0b3JlZCBzdHJpbmcNCgkJcmV0dXJuICR0aGlzLT50YWJTcGFjZXJCdWNrZXRbJG5yXTsNCgl9', '{}', 'Tab', 'VDM\\Joomla\\Componentbuilder.Tab', '1.0.0', '{}', 'Componentbuilder.Tab', 'trait', '{}', '', 1, '2022-08-20 13:55:50', '2022-08-20 15:26:46', 5, 15), +(33, '', 'Add line comment\r\n\r\n@since 3.1.5', '', '', '4e6ff11d-bebf-42f5-8fd7-b2f882857222', '', '', '', '{}', 'CS8qKg0KCSAqIFNldCB0aGUgbGluZSBudW1iZXIgaW4gY29tbWVudHMNCgkgKg0KCSAqIEBwYXJhbSAgIGludCAgJG5yICBUaGUgbGluZSBudW1iZXINCgkgKg0KCSAqIEByZXR1cm4gIHN0cmluZw0KCSAqIEBzaW5jZSAzLjEuNQ0KCSAqLw0KCXByaXZhdGUgZnVuY3Rpb24gc2V0TGluZShpbnQgJG5yKTogc3RyaW5nDQoJew0KCQlpZiAoJHRoaXMtPmRlYnVnKQ0KCQl7DQoJCQlyZXR1cm4gJyBbJyAuIGdldF9jYWxsZWRfY2xhc3MoKSAuICcgJyAuICRuciAuICddJzsNCgkJfQ0KDQoJCXJldHVybiAnJzsNCgl9', '{}', 'Line', 'VDM\\Joomla\\Componentbuilder.Line', '1.0.0', '{}', 'Componentbuilder.Line', 'trait', '{}', '', 1, '2022-08-20 14:02:09', '2022-08-20 15:26:56', 4, 15); -- -- Dumping data for table `#__componentbuilder_admin_view` diff --git a/componentbuilder.xml b/componentbuilder.xml index 46eecc7b9..0f9ee68f5 100644 --- a/componentbuilder.xml +++ b/componentbuilder.xml @@ -1,15 +1,15 @@ COM_COMPONENTBUILDER - 9th July, 2022 + 20th August, 2022 Llewellyn van der Merwe joomla@vdm.io https://dev.vdm.io Copyright (C) 2015 Vast Development Method. All rights reserved. GNU General Public License version 2 or later; see LICENSE.txt - 3.1.4 + 3.1.5 Component Builder (v.3.1.4) +

Component Builder (v.3.1.5)

The Component Builder for [Joomla](https://extensions.joomla.org/extension/component-builder/) is highly advanced tool that is truly able to build extremely complex components in a fraction of the time. diff --git a/componentbuilder_update_server.xml b/componentbuilder_update_server.xml index 2cd47afe7..afff5d7f6 100644 --- a/componentbuilder_update_server.xml +++ b/componentbuilder_update_server.xml @@ -1079,10 +1079,10 @@ pkg_component_builder package site - 3.1.4 + 3.1.5 https://dev.vdm.io - https://git.vdm.dev/api/v1/repos/joomla/pkg-component-builder/archive/v3.1.4.zip + https://git.vdm.dev/api/v1/repos/joomla/pkg-component-builder/archive/v3.1.5.zip stable diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Extension/InstallScript.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Extension/InstallScript.php new file mode 100644 index 000000000..0c72523fd --- /dev/null +++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Extension/InstallScript.php @@ -0,0 +1,388 @@ + + * @git Joomla Component Builder + * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved. + * @license GNU General Public License version 2 or later; see LICENSE.txt + */ + +namespace VDM\Joomla\Componentbuilder\Extension; + + +use VDM\Joomla\Utilities\ArrayHelper; +use VDM\Joomla\Utilities\StringHelper; +use VDM\Joomla\Componentbuilder\Line; +use VDM\Joomla\Componentbuilder\Tab; + + +/** + * Loading the Extension Installation Script Class + * + * @since 3.1.5 + */ +class InstallScript +{ + /** + * The Line numbering Methods + * + * @since 3.1.5 + */ + use Line; + + /** + * The Tab Adding Method + * + * @since 3.1.5 + */ + use Tab; + + /** + * The extension + * + * @var object + * @since 3.1.5 + */ + protected object $extension; + + /** + * The methods + * + * @var array + * @since 3.1.5 + */ + protected array $methods = ['php_script', 'php_preflight', 'php_postflight', 'php_method']; + + /** + * The types + * + * @var array + * @since 3.1.5 + */ + protected array $types = ['construct', 'install', 'update', 'uninstall', 'discover_install']; + + /** + * The construct bucket + * + * @var array + * @since 3.1.5 + */ + protected array $construct = []; + + /** + * The install bucket + * + * @var array + * @since 3.1.5 + */ + protected array $install = []; + + /** + * The update bucket + * + * @var array + * @since 3.1.5 + */ + protected array $update = []; + + /** + * The uninstall bucket + * + * @var array + * @since 3.1.5 + */ + protected array $uninstall = []; + + /** + * The preflight switch + * + * @var bool + * @since 3.1.5 + */ + protected bool $preflightActive = false; + + /** + * The preflight bucket + * + * @var array + * @since 3.1.5 + */ + protected array $preflightBucket = ['install' => [], 'uninstall' => [], 'discover_install' => [], 'update' => []]; + + /** + * The postflight switch + * + * @var bool + * @since 3.1.5 + */ + protected bool $postflightActive = false; + + /** + * The postflight bucket + * + * @var array + * @since 3.1.5 + */ + protected array $postflightBucket = ['install' => [], 'uninstall' => [], 'discover_install' => [], 'update' => []]; + + /** + * Constructor + * @since 3.1.5 + */ + public function __construct(object $extension) + { + // loop over methods and types + foreach ($this->methods as $method) + { + foreach ($this->types as $type) + { + if (isset($extension->{'add_' . $method . '_' . $type}) + && $extension->{'add_' . $method . '_' . $type} == 1 + && StringHelper::check( + $extension->{$method . '_' . $type} + )) + { + // add to the main methods + if ('php_method' === $method || 'php_script' === $method) + { + $this->{$type}[] = $extension->{$method . '_' . $type}; + } + else + { + // get the flight key + $flight = str_replace('php_', '', $method); + // load the script to our bucket + $this->{$flight . 'Bucket'}[$type][] = $extension->{$method . '_' . $type}; + // show that the method is active + $this->{$flight . 'Active'} = true; + } + } + } + } + + $this->extension = $extension; + } + + /** + * get install script + * + * @return string + * @since 3.1.5 + */ + public function get(): string + { + // return the class + return $this->build(); + } + + /** + * build the install class + * + * @return string + * @since 3.1.5 + */ + protected function build(): string + { + // start build + $script = $this->head(); + + // load constructor if set + $script .= $this->construct(); + + // load install method if set + $script .= $this->main('install'); + + // load update method if set + $script .= $this->main('update'); + + // load uninstall method if set + $script .= $this->main('uninstall'); + + // load preflight method if set + $script .= $this->flight('preflight'); + + // load postflight method if set + $script .= $this->flight('postflight'); + + // close the class + $script .= PHP_EOL . '}' . PHP_EOL; + + return $script; + } + + /** + * get install script head + * + * @return string + * @since 3.1.5 + */ + protected function head(): string + { + // get the extension + $extension = $this->extension; + // start build + $script = PHP_EOL . '/**'; + $script .= PHP_EOL . ' * ' . $extension->official_name + . ' script file.'; + $script .= PHP_EOL . ' *'; + $script .= PHP_EOL . ' * @package ' . $extension->class_name; + $script .= PHP_EOL . ' */'; + $script .= PHP_EOL . 'class ' . $extension->installer_class_name; + $script .= PHP_EOL . '{'; + + return $script; + } + + /** + * get constructor + * + * @return string + * @since 3.1.5 + */ + protected function construct(): string + { + // return empty string if not set + if (!ArrayHelper::check($this->construct)) + { + return ''; + } + + // the __construct script + $script = PHP_EOL . PHP_EOL . $this->_t(1) . '/**'; + $script .= PHP_EOL . $this->_t(1) . ' * Constructor'; + $script .= PHP_EOL . $this->_t(1) . ' *'; + $script .= PHP_EOL . $this->_t(1) + . ' * @param Joomla\CMS\Installer\InstallerAdapter $adapter The object responsible for running this script'; + $script .= PHP_EOL . $this->_t(1) . ' */'; + $script .= PHP_EOL . $this->_t(1) + . 'public function __construct($adapter)'; + $script .= PHP_EOL . $this->_t(1) . '{'; + $script .= PHP_EOL . implode(PHP_EOL . PHP_EOL, $this->construct); + // close the function + $script .= PHP_EOL . $this->_t(1) . '}'; + + return $script; + } + + /** + * build main methods + * + * @param string $name the method being called + * + * @return string + * @since 3.1.5 + */ + protected function main(string $name): string + { + // return empty string if not set + if (!ArrayHelper::check($this->{$name})) + { + return ''; + } + // load the install method + $script = PHP_EOL . PHP_EOL . $this->_t(1) . '/**'; + $script .= PHP_EOL . $this->_t(1) . " * Called on $name"; + $script .= PHP_EOL . $this->_t(1) . ' *'; + $script .= PHP_EOL . $this->_t(1) + . ' * @param Joomla\CMS\Installer\InstallerAdapter $adapter The object responsible for running this script'; + $script .= PHP_EOL . $this->_t(1) . ' *'; + $script .= PHP_EOL . $this->_t(1) + . ' * @return boolean True on success'; + $script .= PHP_EOL . $this->_t(1) . ' */'; + $script .= PHP_EOL . $this->_t(1) . 'public function ' + . $name . '($adapter)'; + $script .= PHP_EOL . $this->_t(1) . '{'; + $script .= PHP_EOL . implode(PHP_EOL . PHP_EOL, $this->{$name}); + // return true + if ('uninstall' !== $name) + { + $script .= PHP_EOL . $this->_t(2) . 'return true;'; + } + // close the function + $script .= PHP_EOL . $this->_t(1) . '}'; + + return $script; + } + + /** + * build flight methods + * + * @param string $name the method being called + * + * @return string + * @since 3.1.5 + */ + protected function flight(string $name): string + { + // return empty string if not set + if (empty($this->{$name . 'Active'})) + { + return ''; + } + + // the pre/post function types + $script = PHP_EOL . PHP_EOL . $this->_t(1) . '/**'; + $script .= PHP_EOL . $this->_t(1) + . ' * Called before any type of action'; + $script .= PHP_EOL . $this->_t(1) . ' *'; + $script .= PHP_EOL . $this->_t(1) + . ' * @param string $route Which action is happening (install|uninstall|discover_install|update)'; + $script .= PHP_EOL . $this->_t(1) + . ' * @param Joomla\CMS\Installer\InstallerAdapter $adapter The object responsible for running this script'; + $script .= PHP_EOL . $this->_t(1) . ' *'; + $script .= PHP_EOL . $this->_t(1) + . ' * @return boolean True on success'; + $script .= PHP_EOL . $this->_t(1) . ' */'; + $script .= PHP_EOL . $this->_t(1) . 'public function ' + . $name . '($route, $adapter)'; + $script .= PHP_EOL . $this->_t(1) . '{'; + $script .= PHP_EOL . $this->_t(2) . '//' . $this->setLine( + __LINE__ + ) . ' get application'; + $script .= PHP_EOL . $this->_t(2) + . '$app = JFactory::getApplication();' . PHP_EOL; + + // add the default version check (TODO) must make this dynamic + if ('preflight' === $name) + { + $script .= PHP_EOL . $this->_t(2) . '//' . $this->setLine( + __LINE__ + ) . ' the default for both install and update'; + $script .= PHP_EOL . $this->_t(2) + . '$jversion = new JVersion();'; + $script .= PHP_EOL . $this->_t(2) + . "if (!\$jversion->isCompatible('3.8.0'))"; + $script .= PHP_EOL . $this->_t(2) . '{'; + $script .= PHP_EOL . $this->_t(3) + . "\$app->enqueueMessage('Please upgrade to at least Joomla! 3.8.0 before continuing!', 'error');"; + $script .= PHP_EOL . $this->_t(3) . 'return false;'; + $script .= PHP_EOL . $this->_t(2) . '}' . PHP_EOL; + } + + // now add the scripts + foreach ($this->{$name . 'Bucket'} as $route => $_script) + { + if (ArrayHelper::check($_script)) + { + // set the if and script + $script .= PHP_EOL . $this->_t(2) . "if ('" . $route + . "' === \$route)"; + $script .= PHP_EOL . $this->_t(2) . '{'; + $script .= PHP_EOL . implode( + PHP_EOL . PHP_EOL, $_script + ); + $script .= PHP_EOL . $this->_t(2) . '}' . PHP_EOL; + } + } + + // return true + $script .= PHP_EOL . $this->_t(2) . 'return true;'; + // close the function + $script .= PHP_EOL . $this->_t(1) . '}'; + + return $script; + } +} + diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Extension/index.html b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Extension/index.html new file mode 100644 index 000000000..fa6d84e80 --- /dev/null +++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Extension/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Line.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Line.php new file mode 100644 index 000000000..97b53b5e7 --- /dev/null +++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Line.php @@ -0,0 +1,40 @@ + + * @git Joomla Component Builder + * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved. + * @license GNU General Public License version 2 or later; see LICENSE.txt + */ + +namespace VDM\Joomla\Componentbuilder; + + +/** + * Add line comment + * + * @since 3.1.5 + */ +trait Line +{ + /** + * Set the line number in comments + * + * @param int $nr The line number + * + * @return string + * @since 3.1.5 + */ + private function setLine(int $nr): string + { + if ($this->debug) + { + return ' [' . get_called_class() . ' ' . $nr . ']'; + } + + return ''; + } +} + diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Tab.php b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Tab.php new file mode 100644 index 000000000..070435503 --- /dev/null +++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/Tab.php @@ -0,0 +1,58 @@ + + * @git Joomla Component Builder + * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved. + * @license GNU General Public License version 2 or later; see LICENSE.txt + */ + +namespace VDM\Joomla\Componentbuilder; + + +/** + * Adds Tabs + * + * @since 3.1.5 + */ +trait Tab +{ + /** + * Tab/spacer bucket (to speed-up the build) + * + * @var array + * @since 3.1.5 + */ + protected $tabSpacerBucket = array(); + + /** + * Set tab/spacer + * + * @var string + * @since 3.1.5 + */ + protected $tabSpacer = "\t"; + + /** + * Set the tab/space + * + * @param int $nr The number of tag/space + * + * @return string + * @since 3.1.5 + */ + public function _t(int $nr) : string + { + // check if we already have the string + if (!isset($this->tabSpacerBucket[$nr])) + { + // get the string + $this->tabSpacerBucket[$nr] = str_repeat($this->tabSpacer, (int) $nr); + } + // return stored string + return $this->tabSpacerBucket[$nr]; + } +} + diff --git a/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/index.html b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/index.html new file mode 100644 index 000000000..fa6d84e80 --- /dev/null +++ b/libraries/jcb_powers/VDM.Joomla/src/Componentbuilder/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/script.php b/script.php index 26557c517..a6b8b4cb2 100644 --- a/script.php +++ b/script.php @@ -9422,7 +9422,7 @@ class com_componentbuilderInstallerScript echo ' -

Upgrade to Version 3.1.4 Was Successful! Let us know if anything is not working as expected.

'; +

Upgrade to Version 3.1.5 Was Successful! Let us know if anything is not working as expected.

'; // Set db if not set already. if (!isset($db))