public function testValidateLifeCycleExists()
 {
     $lifeCycle = new LifeCycleModel($this->_data);
     LifeCycleMapper::getInstance()->insert($lifeCycle);
     $this->_LifeCycleIdToDelete = $lifeCycle->getId();
     $this->assertNotNull($lifeCycle->getId());
     $result = $this->_validator->isValid($lifeCycle->getId());
     $this->assertTrue($result);
 }
 public function setUp()
 {
     parent::setUp();
     $this->_spMapper = \Application\Model\Mapper\ServicePackMapper::getInstance();
     $this->_lfMapper = \Application\Model\Mapper\LifeCycleMapper::getInstance();
     $this->_restMapper = \Application\Model\Mapper\RestrictionMapper::getInstance();
     $this->_tflcMapper = \Application\Model\Mapper\TariffPlanLifeCycleMapper::getInstance();
     $this->_tfservMapper = \Application\Model\Mapper\TariffPlanServicesMapper::getInstance();
     $this->_servicePackData = array("name" => "SPTesting" . "-" . microtime(true), "description" => "A service pack for integration test", "currency" => self::CURRENCY, "changeCost" => 3000, "whiteList" => array("34696*", "34697*", "34695777888"), "blackList" => array("34666*", "34677*", "34655777888"), "roamingList" => array("34666*", "34677*", "34655777888"), "listsLocked" => true);
     $this->_lifeCycleData = array("name" => "LifeCycle" . "-" . microtime(true), "description" => "LifeCycle for integration tests", "status" => array(array('status' => LifeCycleModel::STATUS_INACTIVE_NEW, 'timer' => 100, 'transitions' => array(array('destinationStatus' => LifeCycleModel::STATUS_TEST, 'manual' => true, 'automatic' => false), array('destinationStatus' => LifeCycleModel::STATUS_SUSPENDED, 'manual' => true, 'automatic' => true, 'automaticInfo' => array('timerCause' => true, 'firstUseCause' => false, 'voucherCause' => false)))), array('status' => LifeCycleModel::STATUS_TEST, 'vouchers' => array('voice' => array('home' => 234)), 'transitions' => array(array('destinationStatus' => LifeCycleModel::STATUS_ACTIVATION_READY, 'manual' => true, 'automatic' => true, 'automaticInfo' => array('timerCause' => false, 'firstUseCause' => false, 'voucherCause' => true, 'voucherCauseInfo' => array('type' => Model\LifeCycle\VoucherCauseInfoModel::CAUSE_TYPE_ANY, 'vouchers' => array(Model\LifeCycle\VoucherCauseInfoModel::VOUCHER_TYPE_VOICE_HOME)))), array('destinationStatus' => LifeCycleModel::STATUS_SUSPENDED, 'manual' => true, 'automatic' => false))), array('status' => LifeCycleModel::STATUS_ACTIVATION_READY, 'transitions' => array(array('destinationStatus' => LifeCycleModel::STATUS_ACTIVE, 'manual' => false, 'automatic' => true, 'automaticInfo' => array('timerCause' => false, 'firstUseCause' => true, 'voucherCause' => false)), array('destinationStatus' => LifeCycleModel::STATUS_SUSPENDED, 'manual' => true, 'automatic' => false))), array('status' => LifeCycleModel::STATUS_ACTIVE, 'transitions' => array(array('destinationStatus' => LifeCycleModel::STATUS_DEACTIVATED, 'manual' => true, 'automatic' => false), array('destinationStatus' => LifeCycleModel::STATUS_SUSPENDED, 'manual' => true, 'automatic' => false))), array('status' => LifeCycleModel::STATUS_DEACTIVATED, 'transitions' => array(array('destinationStatus' => LifeCycleModel::STATUS_ACTIVE, 'manual' => true, 'automatic' => false), array('destinationStatus' => LifeCycleModel::STATUS_SUSPENDED, 'manual' => true, 'automatic' => false))), array('status' => LifeCycleModel::STATUS_SUSPENDED, 'transitions' => array(array('destinationStatus' => LifeCycleModel::STATUS_DEACTIVATED, 'manual' => true, 'automatic' => false), array('destinationStatus' => LifeCycleModel::STATUS_ACTIVE, 'manual' => true, 'automatic' => false), array('destinationStatus' => LifeCycleModel::STATUS_ACTIVATION_READY, 'manual' => true, 'automatic' => false), array('destinationStatus' => LifeCycleModel::STATUS_TEST, 'manual' => true, 'automatic' => false), array('destinationStatus' => LifeCycleModel::STATUS_INACTIVE_NEW, 'manual' => true, 'automatic' => false), array('destinationStatus' => LifeCycleModel::STATUS_RETIRED, 'manual' => true, 'automatic' => false))), array('status' => LifeCycleModel::STATUS_RETIRED)));
     $this->_restrictionsData = array('name' => "RestTest" . "-" . microtime(true), 'description' => "Restrinctions for integration test", 'operator' => array(self::OPERATOR), 'voice' => array('mo' => array('home' => true, 'roaming' => true, 'international' => true), 'mt' => array('home' => true, 'roaming' => true, 'international' => true)), 'sms' => array('mo' => array('home' => true, 'roaming' => true, 'international' => true), 'mt' => array('home' => true, 'roaming' => true, 'international' => true)), 'data' => array('home' => false, 'roaming' => false));
     $this->_lifeCycleTariffPlanData = array('name' => "LCTPlantesting" . "-" . microtime(true), 'description' => "LifeCycle TariffPlan for integration tests", 'status' => array(array('status' => LifeCycleModel::STATUS_ACTIVE, 'cost' => 20), array('status' => LifeCycleModel::STATUS_DEACTIVATED, 'cost' => 120)), 'transitions' => array(array('statusStart' => LifeCycleModel::STATUS_INACTIVE_NEW, 'statusFinal' => LifeCycleModel::STATUS_ACTIVATION_READY, 'cost' => 12), array('statusStart' => LifeCycleModel::STATUS_INACTIVE_NEW, 'statusFinal' => LifeCycleModel::STATUS_TEST, 'cost' => 12), array('statusStart' => LifeCycleModel::STATUS_INACTIVE_NEW, 'statusFinal' => LifeCycleModel::STATUS_ACTIVATION_PENDANT, 'cost' => 12), array('statusStart' => LifeCycleModel::STATUS_DEACTIVATED, 'statusFinal' => LifeCycleModel::STATUS_ACTIVE, 'cost' => 12), array('statusStart' => LifeCycleModel::STATUS_SUSPENDED, 'statusFinal' => LifeCycleModel::STATUS_RETIRED, 'cost' => 12)));
     $this->_servicesTariffPlanData = array('name' => "STPlanTesting" . "-" . microtime(true), 'description' => "Services TariffPlan for integration tests", 'defaultData' => array("t2N" => 7, "t2Q" => 8, 'pool' => true), 'data' => array(array('zoneId' => self::ZONE_ID_2, 'destinationId' => self::DESTINATION_ID_2, 'n1' => 1, "n2" => 2, "n3" => 3, "n4" => 4, "n5" => 5, "q1" => 6, "t2N" => 7, "t2Q" => 8, "t4N" => 9, "t4Q" => 10, "t6N" => 11, "t6Q" => 12, 'pool' => true)), 'defaultOrigVoice' => array("t2N" => 7, "t2Q" => 8, 'pool' => true), 'origVoice' => array(array('zoneId' => self::ZONE_ID_2, 'destinationId' => self::DESTINATION_ID_2, "t2N" => 7, "t2Q" => 8, 'pool' => true)), 'defaultTermVoice' => array("t2N" => 7, "t2Q" => 8, 'pool' => true), 'termVoice' => array(array('zoneId' => self::ZONE_ID_1, 'destinationId' => self::DESTINATION_ID_1, "t2N" => 7, "t2Q" => 8, 'pool' => true)), 'defaultSms' => array("t2N" => 1, "t2Q" => 2, 'pool' => true), 'sms' => array(array('zoneId' => self::ZONE_ID_2, 'destinationId' => self::DESTINATION_ID_2, "t2N" => 7, "t2Q" => 8, 'pool' => true)));
 }
 public function changeLifeCycleState($state, $data, $isPublishRollback = null)
 {
     $this->getCache()->clean();
     $methodName = self::METHOD_NAME_ASYNC_CHANGE_LIFE_CYCLE;
     $watcher = $this->_constructWatcherToTransaction();
     $watcher->params->action = "simChangeLifeCycleStatus";
     $watcher->params->newLifeCycleStatus = $state;
     /**
      * @var $proto \Application\Proto\Inventory\ChangeLCState proto
      */
     $proto = $this->_createSubscriptionsProto($methodName, $data, SubscriptionId\IdType::ID, $watcher);
     $proto->setNewState(LifeCycleMapper::getInstance()->mapLifeCycleStatusToEricsson($state));
     if (isset($isPublishRollback)) {
         $proto->setIsPublishRollback($isPublishRollback);
     }
     // Return the transaction ID
     return $this->_sendAsyncRequest($methodName, $proto, $data, array(), $watcher);
 }
 protected function _mapBusinessRuleToEricsson(array $businessRule)
 {
     if (isset($businessRule['type'])) {
         $businessRule['businessRuleType'] = $this->_mapBusinessRuleTypeToEricsson($businessRule['type']);
         unset($businessRule['type']);
     }
     if (isset($businessRule['nextLifeCycleStatus'])) {
         $businessRule['nextLifecycleState'] = LifeCycleMapper::getInstance()->mapLifeCycleStatusToEricsson($businessRule['nextLifeCycleStatus']);
         unset($businessRule['nextLifeCycleStatus']);
     }
     return $businessRule;
 }
 public function getLifeCycleStateCost($oldState, $newState, $simId, $idType = SubscriptionId\IdType::ID)
 {
     $methodName = self::METHOD_NAME_CHANGE_LIFE_CYCLE_COST_SYNC;
     /**
      * @var $proto \Application\Proto\Subscription\ChangeLCState proto
      */
     $proto = $this->_createProto($methodName);
     $subsId = new SubscriptionId();
     $subsId->setId($simId);
     $subsId->setType($idType);
     $proto->setSubscriptionId($subsId);
     $proto->setOldState(LifeCycleMapper::getInstance()->mapLifeCycleStatusToEricsson($oldState));
     $proto->setNewState(LifeCycleMapper::getInstance()->mapLifeCycleStatusToEricsson($newState));
     $response = $this->_sendRequest($methodName, array('protoMessage' => $proto));
     if ($this->_checkPutResponse($response)) {
         $data = $response->serialize(new Codec\PhpArray());
         if (isset($data['cost'])) {
             return $data['cost'];
         }
     }
     return null;
 }
 public function mapChargesDetail($protoData, $fieldPrefix = '')
 {
     if ($protoData instanceof \DrSlump\Protobuf\Message) {
         $protoType = $data = $protoData->serialize(new \DrSlump\Protobuf\Codec\PhpArray());
     }
     $data = $this->_filterFieldNames(new \App_Filter_UnderscoreToCamelCase(), $data);
     $commonFields = array('entity', 'amount', 'timestamp', 'currency', 'msisdn', 'icc', 'imsi', 'subscriptionState', 'isPool', 'billingCycleStart', 'billingAccountName', 'commercialPlan', 'networkOperatorName', 'commercialGroupName', 'aggregatorName');
     $fields = array_keys($data);
     foreach ($fields as $field) {
         if (!in_array($field, $commonFields)) {
             $data[$fieldPrefix . '_' . $field] = $data[$field];
             unset($data[$field]);
         }
     }
     if (isset($data['subscriptionState'])) {
         $data['subscriptionState'] = LifeCycleMapper::getInstance()->mapLifeCycleStatusFromEricsson($data['subscriptionState']);
     }
     if (isset($data['entity'])) {
         switch ($data['entity']['entityType']) {
             case PbReport\ChargesDetailReport\ChargedEntity\EntityType::SUBSCRIPTION:
                 switch ($data['entity']['subscriptionId']['id']) {
                     case Proto\SubscriptionId\IdType::ICC:
                         $subType = 'icc';
                         break;
                     case Proto\SubscriptionId\IdType::IMSI:
                         $subType = 'imsi';
                         break;
                     case Proto\SubscriptionId\IdType::MSISDN:
                         $subType = 'msisdn';
                         break;
                 }
                 $data['entity'] = $data['entity']['subscriptionId']['id'];
                 $data['entityType'] = 'Subscription';
                 if (isset($subType)) {
                     $data['entityType'] .= "({$subType})";
                 }
                 break;
             case PbReport\ChargesDetailReport\ChargedEntity\EntityType::COMMERCIAL_GROUP:
                 $data['entity'] = $data['entity']['commercialGroup']['name'];
                 $data['entityType'] = 'Commercial Group';
                 break;
             case PbReport\ChargesDetailReport\ChargedEntity\EntityType::CUSTOMER:
                 $data['entity'] = $data['entity']['customer']['name'];
                 $data['entityType'] = 'Customer';
                 break;
         }
     }
     //map common fields
     if ($protoData instanceof \Application\Proto\Report\ChargesDetailReport\VoiceDetail || $protoData instanceof \Application\Proto\Report\ChargesDetailReport\VoiceTerminatedDetail) {
         $data['voiceDetail_duration'] = $data[$fieldPrefix . '_duration'];
         $data['voiceDetail_durationRounded'] = $data[$fieldPrefix . '_durationRounded'];
         $data['voiceDetail_zone'] = $data[$fieldPrefix . '_originZone'];
     }
     //map specific fields
     if ($protoData instanceof \Application\Proto\Report\ChargesDetailReport\VoiceDetail) {
         $data['voiceDetail_typeOfCall'] = 'MO';
         $data['voiceDetail_calledOrCalling'] = $data[$fieldPrefix . '_numberCalled'];
         $data['voiceDetail_typeOfDestination'] = $data[$fieldPrefix . '_destinationZone'];
         //unset other type
     } else {
         if ($protoData instanceof \Application\Proto\Report\ChargesDetailReport\VoiceTerminatedDetail) {
             $data['voiceDetail_typeOfCall'] = 'MT';
             $data['voiceDetail_calledOrCalling'] = $data[$fieldPrefix . '_numberCalling'];
         }
     }
     return $data;
 }
 public function setUp()
 {
     $this->lifecycleMapper = LifeCycleMapper::getInstance();
     $this->_user = $this->_createAuthUser(array('userName' => 'LifeCycleUserTest', 'organizationId' => self::PROVIDER_COMMERCIAL_ORG_ID));
     $this->testArray = array('name' => 'commercial', 'description' => 'commercial', 'data' => array('states' => array(array('state' => \Application\Proto\LifeCycleState::INACTIVE_NEW, 'transitions' => array(array('manualTransition' => true, 'automaticTransition' => array('timerCause' => false, 'firstUseCause' => false), 'destinationState' => \Application\Proto\LifeCycleState::TEST), array('manualTransition' => true, 'automaticTransition' => array('timerCause' => false, 'firstUseCause' => false), 'destinationState' => \Application\Proto\LifeCycleState::ACTIVATION_READY), array('manualTransition' => true, 'automaticTransition' => array('timerCause' => false, 'firstUseCause' => false), 'destinationState' => \Application\Proto\LifeCycleState::ACTIVATION_PENDANT))), array('state' => \Application\Proto\LifeCycleState::TEST, 'transitions' => array(array('manualTransition' => true, 'automaticTransition' => array('timerCause' => false, 'firstUseCause' => false), 'destinationState' => \Application\Proto\LifeCycleState::ACTIVATION_READY), array('manualTransition' => true, 'automaticTransition' => array('timerCause' => false, 'firstUseCause' => false), 'destinationState' => \Application\Proto\LifeCycleState::ACTIVATION_PENDANT), array('manualTransition' => false, 'automaticTransition' => array('timerCause' => true, 'firstUseCause' => false), 'destinationState' => \Application\Proto\LifeCycleState::ACTIVATION_READY), array('manualTransition' => false, 'automaticTransition' => array('timerCause' => true, 'firstUseCause' => false), 'destinationState' => \Application\Proto\LifeCycleState::ACTIVATION_PENDANT)), array('state' => \Application\Proto\LifeCycleState::ACTIVATION_READY, 'transitions' => array(array('manualTransition' => false, 'automaticTransition' => array('timerCause' => false, 'firstUseCause' => true), 'destinationState' => \Application\Proto\LifeCycleState::ACTIVE))), array('state' => \Application\Proto\LifeCycleState::ACTIVATION_PENDANT, 'transitions' => array(array('manualTransition' => false, 'automaticTransition' => array('timerCause' => false, 'firstUseCause' => true), 'destinationState' => \Application\Proto\LifeCycleState::ACTIVE))), array('state' => \Application\Proto\LifeCycleState::ACTIVE, 'transitions' => array(array('manualTransition' => true, 'automaticTransition' => array('timerCause' => false, 'firstUseCause' => false), 'destinationState' => \Application\Proto\LifeCycleState::DEACTIVATED))), array('state' => \Application\Proto\LifeCycleState::DEACTIVATED), array('state' => \Application\Proto\LifeCycleState::SUSPENDED), array('state' => \Application\Proto\LifeCycleState::RETIRED)))));
 }
 protected function _mapLifeCycleHistoryFilterValue(\App_ListFilter_Interface $filter, \App_ListFilter $filterList)
 {
     $result = array();
     foreach ($filterList->getFilters() as $filter) {
         switch ($filter->getFieldName()) {
             case SimFilterFields::LIFE_CYCLE_HISTORY_START_STATE:
                 $result['start_state'] = \Application\Model\Mapper\LifeCycleMapper::getInstance()->mapLifeCycleStatusToEricsson($filter->getValue());
                 break;
             case SimFilterFields::LIFE_CYCLE_HISTORY_END_STATE:
                 $result['end_state'] = \Application\Model\Mapper\LifeCycleMapper::getInstance()->mapLifeCycleStatusToEricsson($filter->getValue());
                 break;
             case SimFilterFields::LIFE_CYCLE_HISTORY_INTERVAL:
                 if ($filter instanceof \App_ListFilter_BetweenFilter) {
                     if (!$filter->getMin() && !$filter->getMax()) {
                         $result['interval'] = array();
                     } else {
                         $result['interval'] = array('start_date' => $filter->getMin(), 'end_date' => $filter->getMax());
                     }
                 } elseif ($filter instanceof \App_ListFilter_GreaterThanFilter) {
                     $result['interval'] = array('start_date' => $filter->getValue());
                 } elseif ($filter instanceof \App_ListFilter_LessThanFilter) {
                     $result['interval'] = array('end_date' => $filter->getValue());
                 }
                 break;
         }
     }
     return $result;
 }
 protected function _mapModelToEricssonModel(array $data)
 {
     $data['data'] = array();
     if (isset($data['status'])) {
         $data['data']['states'] = $data['status'];
         unset($data['status']);
         foreach ($data['data']['states'] as $key => $state) {
             $data['data']['states'][$key]['state'] = LifeCycleMapper::getInstance()->mapLifeCycleStatusToEricsson($state['status']);
             unset($data['data']['states'][$key]['status']);
             if ($data['published'] !== ServicePackModel::STATUS_NOT_PUBLISHED && isset($data['data']['states'][$key]['cost'])) {
                 $data['data']['states'][$key]['cost_modified'] = $data['data']['states'][$key]['cost'];
                 unset($data['data']['states'][$key]['cost']);
             }
         }
     }
     if (isset($data['transitions'])) {
         $data['data']['transitions'] = $data['transitions'];
         unset($data['transitions']);
         foreach ($data['data']['transitions'] as $key => $transition) {
             $data['data']['transitions'][$key]['stateStart'] = LifeCycleMapper::getInstance()->mapLifeCycleStatusToEricsson($transition['statusStart']);
             $data['data']['transitions'][$key]['stateFinal'] = LifeCycleMapper::getInstance()->mapLifeCycleStatusToEricsson($transition['statusFinal']);
             if ($data['published'] !== ServicePackModel::STATUS_NOT_PUBLISHED && isset($data['data']['transitions'][$key]['cost'])) {
                 $data['data']['transitions'][$key]['cost_modified'] = $data['data']['transitions'][$key]['cost'];
                 unset($data['data']['transitions'][$key]['cost']);
             }
         }
     }
     $data = parent::_mapModelToEricssonModel($data);
     return $data;
 }
 /**
  * Recieve the CORE async responses
  */
 public function postAction()
 {
     \App::log()->debug("CORE notification of response of a async operation.");
     $message = new Request();
     if (!$this->_request->isPost()) {
         throw new \Application\Exceptions\UnexpectedException("Post request expected");
     }
     // Parse the first level of proto buffer
     $message->parse($this->getRequest()->getRawBody());
     // Verify the transactionId
     if (!$message->hasToken()) {
         throw new \Application\Exceptions\InvalidArgumentException("Missing transactionId.");
     }
     // Verify the proto
     if (!$message->hasProto()) {
         throw new \Application\Exceptions\InvalidArgumentException("Missing proto type.");
     }
     $event = new EventModel();
     $event->namespace = 'connectivity';
     $event->entityType = 'transaction';
     $event->entityId = $message->getToken();
     $event->created = time();
     $event->pushEventData = true;
     $protoType = $message->getProto();
     $event->hiddenData = array('protoType' => $protoType);
     \App::log()->info('Start CORE notification of response of type ' . $protoType . ' from the async operation ' . $event->entityId ?: 'empty');
     // Message decode
     $internalMessage = $this->_decodeMessage($protoType, $message->getMessage());
     // Obtaining a PHP Array from proto
     $parser = new \DrSlump\Protobuf\Codec\PhpArray();
     $data = $message->serialize($parser);
     $messageData = $internalMessage->serialize($parser);
     \App::log()->debug("Async message: " . Zend_Json::encode($messageData));
     \App_Util_Array::filterKeyNames(new \App_Filter_UnderscoreToCamelCase(), $messageData);
     \App::log()->debug("Async message (filtered): " . Zend_Json::encode($messageData));
     if (isset($data['proto'])) {
         unset($data['proto']);
     }
     if (isset($data['token'])) {
         unset($data['token']);
     }
     if (isset($messageData['result'])) {
         $data['result'] = $messageData['result'];
         unset($messageData['result']);
     }
     if (!empty($messageData['failed']) || @$data['result']['code'] != 0) {
         $data['hasFailures'] = true;
     } else {
         $data['hasFailures'] = false;
     }
     \App::log()->debug("Async message (after all): " . Zend_Json::encode($messageData));
     $data['message'] = $messageData;
     $retries = 0;
     // Map data
     switch (true) {
         case $internalMessage instanceof AsyncNotification\Service\BusinessRuleResponse:
             $event->entityType = 'businessRule';
             $event->pushEventData = false;
             $arMapper = \Application\Model\Mapper\AlarmRuleMapper::getInstance();
             // Map alarm rule condition
             $value =& $data['message']['alarmRuleCondition'];
             $value = $arMapper->mapConditionFromEricsson($value);
             // Map business rule type
             $value =& $data['message']['businessRule']['businessRuleType'];
             $value = $arMapper->mapBusinessRuleTypeToModel($value);
             // Map life cycle state (optional)
             if (isset($data['message']['businessRule']['nextLifecycleState'])) {
                 $value =& $data['message']['businessRule']['nextLifecycleState'];
                 $lcMapper = \Application\Model\Mapper\LifeCycleMapper::getInstance();
                 $value = $lcMapper->mapLifeCycleStatusFromEricsson($value);
             }
             //Workaround: organization must include orgType
             if (isset($data['message']['organizationId'])) {
                 $data['organizationId'] = OrgCustomerMapper::buildOrgId($data['message']['organizationId']);
             }
             break;
         case $internalMessage instanceof \Application\Proto\SupDiagnosisAsync\DiagnosisNotification:
             $event->entityType = 'diagnosis';
             $retries = \App::config('watcher.event_retries.diagnosis', 10);
             break;
         case $internalMessage instanceof AsyncNotification\Service\ReportResponse:
             $event->entityType = 'report';
             break;
         case $internalMessage instanceof AsyncNotification\Service\TariffSwitchResponse:
             $event->entityType = 'tariffSwitch';
             $event->entityId = OrgServiceProviderMapper::buildOrgId($internalMessage->getServiceProviderId());
             break;
     }
     $event->eventData = $data;
     $compressor = new AsyncResponseCompressorEvent();
     $compressor->compress($event);
     \App::log()->debug('The content of the CORE notification of response of type ' . $protoType . ' from the async operation ' . ($event->entityId ?: 'empty') . ' is ' . \Zend_Json::encode($data));
     // Invoke the service
     $result = AsyncService::getInstance()->publish($event, $retries);
     \App::log()->info('End CORE notification of response of type' . $protoType . ' from the async operation ' . $event->entityId ?: 'empty');
     $this->_helper->output('proto');
     $this->view->setClass('Application\\Proto\\AsyncNotification\\Service\\Response');
     $this->view->code = Application\Proto\AsyncNotification\Service\Response\Code::OK;
     $this->view->reason = "Successful operation.";
 }