Skip to content

Commit

Permalink
SDK v7.4.1
Browse files Browse the repository at this point in the history
* commit 'bcbc4f3c1914c115826363609b91781f518c7d7a':
  SDK v7.4.1
  Merge pull request #593 in MOBILE-SDK/app_mobile-sdk-ios from MS-4435_PurposeConsent_Empty to develop
  made podspec changes
  Merge pull request #590 in MOBILE-SDK/app_mobile-sdk-ios from MS-4406_API_Violation_Crash_TestCaseSuite to develop
  • Loading branch information
asharmaa committed Jul 14, 2020
2 parents c52bc92 + bcbc4f3 commit 0b1b6cc
Show file tree
Hide file tree
Showing 9 changed files with 247 additions and 28 deletions.
4 changes: 2 additions & 2 deletions AppNexusSDK.podspec
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Pod::Spec.new do |s|

s.name = "AppNexusSDK"
s.version = "7.4"
s.version = "7.4.1"
s.platform = :ios, "9.0"

s.summary = "AppNexus iOS Mobile Advertising SDK"
Expand Down Expand Up @@ -47,7 +47,7 @@ DESC
subspec.dependency 'AppNexusSDK/AppNexusSDK', "#{s.version}"
subspec.dependency 'FBAudienceNetwork', '5.9.0'
subspec.source_files = "csr/Facebook/*.{h,m}"
subspec.public_header_files = "csr/Facebook/ANFBSettings.h"
subspec.public_header_files = "csr/Facebook/*.h"
subspec.xcconfig = { 'FRAMEWORK_SEARCH_PATHS' => '${PODS_ROOT}/FBAudienceNetwork/**' }
end

Expand Down
6 changes: 6 additions & 0 deletions RELEASE-NOTES.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
## 7.4.1

### Improvements/Bug Fixes
+ MS-4435: Fixed crash when using TCF 2.0 purpose consent strings
+ MS-4437: Fixed cocoapods build for Facebook CSR Adapter

## 7.4
### New Feature
+ MS-4214: Added support for loading the Ad lazily (Lazy Load) [https://wiki.xandr.com/x/VJFlBg]
Expand Down
8 changes: 4 additions & 4 deletions sdk/AppNexusSDK.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -1513,7 +1513,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LIBRARY_SEARCH_PATHS = "";
MARKETING_VERSION = 7.4;
MARKETING_VERSION = 7.4.1;
MTL_ENABLE_DEBUG_INFO = YES;
PRODUCT_BUNDLE_IDENTIFIER = "corp.appnexus.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
Expand Down Expand Up @@ -1549,7 +1549,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LIBRARY_SEARCH_PATHS = "";
MARKETING_VERSION = 7.4;
MARKETING_VERSION = 7.4.1;
MTL_ENABLE_DEBUG_INFO = NO;
PRODUCT_BUNDLE_IDENTIFIER = "corp.appnexus.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
Expand Down Expand Up @@ -1701,7 +1701,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LIBRARY_SEARCH_PATHS = "";
MARKETING_VERSION = 7.4;
MARKETING_VERSION = 7.4.1;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.appnexus.AppNexusNativeSDK;
Expand Down Expand Up @@ -1746,7 +1746,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LIBRARY_SEARCH_PATHS = "";
MARKETING_VERSION = 7.4;
MARKETING_VERSION = 7.4.1;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.appnexus.AppNexusNativeSDK;
Expand Down
2 changes: 1 addition & 1 deletion sdk/sourcefiles/internal/ANGlobal.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
#define AN_ERROR_TABLE @"errors"

#define AN_DEFAULT_PLACEMENT_ID @"default_placement_id"
#define AN_SDK_VERSION @"7.4"
#define AN_SDK_VERSION @"7.4.1"


#define APPNEXUS_BANNER_SIZE CGSizeMake(320, 50)
Expand Down
2 changes: 1 addition & 1 deletion sdk/sourcefiles/internal/config/ANGDPRSettings.m
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ + (NSString *) getDeviceAccessConsent {
if(purposeConsents.length <= 0){
purposeConsents = [[NSUserDefaults standardUserDefaults] objectForKey:ANIABTCF_PurposeConsents];
}
if(purposeConsents > 0){
if(purposeConsents != nil && purposeConsents.length > 0){
return [purposeConsents substringToIndex:1];
}
return nil;
Expand Down
4 changes: 4 additions & 0 deletions tests/UnitTestApp/UnitTestApp.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -392,6 +392,7 @@
0EEFE1F8220098BD002B5F5F /* ANMockMediationAdapterLoadThenFail.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EEFE1F7220098BD002B5F5F /* ANMockMediationAdapterLoadThenFail.m */; };
0EEFE1FB220098C9002B5F5F /* ANMockMediationAdapterLoadAndHitOtherCallbacks.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EEFE1FA220098C9002B5F5F /* ANMockMediationAdapterLoadAndHitOtherCallbacks.m */; };
0EEFE1FD22009CDB002B5F5F /* OMID_TestResponse.json in Resources */ = {isa = PBXBuildFile; fileRef = 0EEFE1FC22009CDB002B5F5F /* OMID_TestResponse.json */; };
38F0224A24B8561500CE4CE0 /* ANGDPRSettingsTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 38F0224924B8561500CE4CE0 /* ANGDPRSettingsTestCase.m */; };
4F11628B238749A200101DC1 /* MARHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4FE4DB05237B40F8005B5BCF /* MARHelper.m */; };
4F3B837E2481E866005EE88C /* LazyWebview_Basic.json in Resources */ = {isa = PBXBuildFile; fileRef = 4F3B837B2481E865005EE88C /* LazyWebview_Basic.json */; };
4F3B837F2481E866005EE88C /* LazyWebview_MRAID.json in Resources */ = {isa = PBXBuildFile; fileRef = 4F3B837D2481E865005EE88C /* LazyWebview_MRAID.json */; };
Expand Down Expand Up @@ -953,6 +954,7 @@
0EEFE1F9220098C9002B5F5F /* ANMockMediationAdapterLoadAndHitOtherCallbacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANMockMediationAdapterLoadAndHitOtherCallbacks.h; sourceTree = "<group>"; };
0EEFE1FA220098C9002B5F5F /* ANMockMediationAdapterLoadAndHitOtherCallbacks.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANMockMediationAdapterLoadAndHitOtherCallbacks.m; sourceTree = "<group>"; };
0EEFE1FC22009CDB002B5F5F /* OMID_TestResponse.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = OMID_TestResponse.json; sourceTree = "<group>"; };
38F0224924B8561500CE4CE0 /* ANGDPRSettingsTestCase.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ANGDPRSettingsTestCase.m; sourceTree = "<group>"; };
4F3B837B2481E865005EE88C /* LazyWebview_Basic.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = LazyWebview_Basic.json; sourceTree = "<group>"; };
4F3B837D2481E865005EE88C /* LazyWebview_MRAID.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = LazyWebview_MRAID.json; sourceTree = "<group>"; };
4F59A7A42379CC6B002E0482 /* MARGeneralTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MARGeneralTests.m; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1630,6 +1632,7 @@
4F9CED4723CC9E7700BE3443 /* PrivateAPI.m */,
0E8C982C21FF4191005D1F0E /* UIViewConstraintsTestCase.m */,
0EC17C5121F72EA300F0F6AF /* UnitTests.m */,
38F0224924B8561500CE4CE0 /* ANGDPRSettingsTestCase.m */,
);
path = UnitTests;
sourceTree = "<group>";
Expand Down Expand Up @@ -2487,6 +2490,7 @@
0E8C984121FF42F1005D1F0E /* ANMockMediationAdapterBannerNeverCalled.m in Sources */,
0EEFE114220055C4002B5F5F /* ANMockMediationAdapterSuccessfulBanner.m in Sources */,
4FE5D816248A21AD00B86BDA /* ANNativeAdRequest+ANTest.m in Sources */,
38F0224A24B8561500CE4CE0 /* ANGDPRSettingsTestCase.m in Sources */,
0E6612C322CA736300DDC5CD /* ANNativeAdView.m in Sources */,
0E8C982B21FF417C005D1F0E /* ANNativeStandardAdResponseTestCase.m in Sources */,
60F8A7FF23280BF10030D53D /* ANReachability+ANTest.h in Sources */,
Expand Down
212 changes: 212 additions & 0 deletions tests/UnitTestApp/UnitTests/ANGDPRSettingsTestCase.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,212 @@
/* Copyright 2020 APPNEXUS INC
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

#import <XCTest/XCTest.h>
#import "ANGDPRSettings.h"

NSString * const ANGDPR_ConsentString = @"ANGDPR_ConsentString";
NSString * const ANGDPR_ConsentRequired = @"ANGDPR_ConsentRequired";
NSString * const ANGDPR_PurposeConsents = @"ANGDPR_PurposeConsents";

//TCF 2.0 variables
NSString * const ANIABTCF_ConsentString = @"IABTCF_TCString";
NSString * const ANIABTCF_SubjectToGDPR = @"IABTCF_gdprApplies";
NSString * const ANIABTCF_PurposeConsents = @"IABTCF_PurposeConsents";

//TCF 1.1 variables
NSString * const ANIABConsent_ConsentString = @"IABConsent_ConsentString";
NSString * const ANIABConsent_SubjectToGDPR = @"IABConsent_SubjectToGDPR";

@interface ANGDPRSettingsTestCase : XCTestCase

@end

@implementation ANGDPRSettingsTestCase

- (void)setUp {
// Put setup code here. This method is called before the invocation of each test method in the class.
}

- (void)tearDown {
[ANGDPRSettings reset];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:ANIABTCF_ConsentString];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:ANIABConsent_ConsentString];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:ANIABTCF_SubjectToGDPR];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:ANIABConsent_SubjectToGDPR];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:ANIABTCF_PurposeConsents];
}

- (void)testGDPRConsentString
{
[ANGDPRSettings setConsentString:@"BOMyQRvOMyQRvABABBAAABAAAAAAEA"];
XCTAssertTrue([[ANGDPRSettings getConsentString] isEqualToString:@"BOMyQRvOMyQRvABABBAAABAAAAAAEA"]);
}

- (void)testGDPRConsentStringWithEmpty
{
[ANGDPRSettings setConsentString:@""];
XCTAssertTrue([[ANGDPRSettings getConsentString] isEqualToString:@""]);
}

- (void)testIABTCFConsentString
{
[[NSUserDefaults standardUserDefaults] setObject:@"BOMyQRvOMyQRvABABBAAABAAAAAAEA" forKey:ANIABTCF_ConsentString];
XCTAssertTrue([[ANGDPRSettings getConsentString] isEqualToString:@"BOMyQRvOMyQRvABABBAAABAAAAAAEA"]);
}

- (void)testIABTCFConsentStringWithEmpty
{
[[NSUserDefaults standardUserDefaults] setObject:@"" forKey:ANIABTCF_ConsentString];
XCTAssertTrue([[ANGDPRSettings getConsentString] isEqualToString:@""]);
}

- (void)testIABConsentString
{
[[NSUserDefaults standardUserDefaults] setObject:@"BOMyQRvOMyQRvABABBAAABAAAAAAEA" forKey:ANIABConsent_ConsentString];
XCTAssertTrue([[ANGDPRSettings getConsentString] isEqualToString:@"BOMyQRvOMyQRvABABBAAABAAAAAAEA"]);
}

- (void)testIABConsentStringWithEmpty
{
[[NSUserDefaults standardUserDefaults] setObject:@"" forKey:ANIABConsent_ConsentString];
XCTAssertTrue([[ANGDPRSettings getConsentString] isEqualToString:@""]);
}

- (void)testGDPRConsentRequiredTrue
{
[ANGDPRSettings setConsentRequired:[NSNumber numberWithInt:1]];
XCTAssertTrue([[ANGDPRSettings getConsentRequired] boolValue] == true);
}

- (void)testGDPRConsentRequiredFalse
{
[ANGDPRSettings setConsentRequired:[NSNumber numberWithInt:0]];
XCTAssertTrue([[ANGDPRSettings getConsentRequired] boolValue] == false);
}

- (void)testIABTCFConsentRequiredTrue
{
[[NSUserDefaults standardUserDefaults] setValue:[NSNumber numberWithInt:1] forKey:ANIABTCF_SubjectToGDPR];
XCTAssertTrue([[ANGDPRSettings getConsentRequired] boolValue] == true);
}

- (void)testIABTCFConsentRequiredFalse
{
[[NSUserDefaults standardUserDefaults] setValue:[NSNumber numberWithInt:0] forKey:ANIABTCF_SubjectToGDPR];
XCTAssertTrue([[ANGDPRSettings getConsentRequired] boolValue] == false);
}

- (void)testIABConsentRequiredTrue
{
[[NSUserDefaults standardUserDefaults] setValue:[NSNumber numberWithInt:1] forKey:ANIABConsent_SubjectToGDPR];
XCTAssertTrue([[ANGDPRSettings getConsentRequired] boolValue] == true);
}

- (void)testIABConsentRequiredFalse
{
[[NSUserDefaults standardUserDefaults] setValue:[NSNumber numberWithInt:0] forKey:ANIABConsent_SubjectToGDPR];
XCTAssertTrue([[ANGDPRSettings getConsentRequired] boolValue] == false);
}

- (void)testGDPRPurposeConsents
{
[ANGDPRSettings setPurposeConsents:@"10101001"];
XCTAssertTrue([[ANGDPRSettings getDeviceAccessConsent] isEqualToString:@"1"]);
}

- (void)testGDPRPurposeConsentsEmpty
{
[ANGDPRSettings setPurposeConsents:@""];
XCTAssertTrue([ANGDPRSettings getDeviceAccessConsent] == nil);
}

- (void)testIABTCFPurposeConsents
{
[[NSUserDefaults standardUserDefaults] setObject:@"10101001" forKey:ANIABTCF_PurposeConsents];
XCTAssertTrue([[ANGDPRSettings getDeviceAccessConsent] isEqualToString:@"1"]);
}

- (void)testIABTCFPurposeConsentsEmpty
{
[[NSUserDefaults standardUserDefaults] setObject:@"" forKey:ANIABTCF_PurposeConsents];
XCTAssertTrue([ANGDPRSettings getDeviceAccessConsent] == nil);
}

- (void)testAccessDeviceData_PurposeConsentsEmpty_ConsentRequiredEmpty
{
XCTAssertTrue([ANGDPRSettings canAccessDeviceData] == true);
}

- (void)testAccessDeviceData_PurposeConsentsEmpty_ConsentRequiredFalse
{
[ANGDPRSettings setConsentRequired:[NSNumber numberWithInt:0]];
XCTAssertTrue([ANGDPRSettings canAccessDeviceData] == true);
}

- (void)testAccessDeviceData_PurposeConsentsEmpty_IABTCFConsentRequiredFalse
{
[[NSUserDefaults standardUserDefaults] setValue:[NSNumber numberWithInt:0] forKey:ANIABTCF_SubjectToGDPR];
XCTAssertTrue([ANGDPRSettings canAccessDeviceData] == true);
}

- (void)testAccessDeviceData_PurposeConsentsEmpty_IABConsentRequiredFalse
{
[[NSUserDefaults standardUserDefaults] setValue:[NSNumber numberWithInt:0] forKey:ANIABConsent_SubjectToGDPR];
XCTAssertTrue([ANGDPRSettings canAccessDeviceData] == true);
}

- (void)testAccessDeviceData_PurposeConsentsEmpty_ConsentRequiredTrue
{
[ANGDPRSettings setConsentRequired:[NSNumber numberWithInt:1]];
XCTAssertTrue([ANGDPRSettings canAccessDeviceData] == false);
}

- (void)testAccessDeviceData_PurposeConsentsEmpty_IABTCFConsentRequiredTrue
{
[[NSUserDefaults standardUserDefaults] setValue:[NSNumber numberWithInt:1] forKey:ANIABTCF_SubjectToGDPR];
XCTAssertTrue([ANGDPRSettings canAccessDeviceData] == false);
}

- (void)testAccessDeviceData_PurposeConsentsEmpty_IABConsentRequiredTrue
{
[[NSUserDefaults standardUserDefaults] setValue:[NSNumber numberWithInt:1] forKey:ANIABConsent_SubjectToGDPR];
XCTAssertTrue([ANGDPRSettings canAccessDeviceData] == false);
}

- (void)testAccessDeviceData_GDPR_PurposeConsents_True
{
[ANGDPRSettings setPurposeConsents:@"10101001"];
XCTAssertTrue([ANGDPRSettings canAccessDeviceData] == true);
}

- (void)testAccessDeviceData_IABTCF_PurposeConsents_True
{
[[NSUserDefaults standardUserDefaults] setObject:@"10101001" forKey:ANIABTCF_PurposeConsents];
XCTAssertTrue([ANGDPRSettings canAccessDeviceData] == true);
}

- (void)testAccessDeviceData_GDPR_PurposeConsents_False
{
[ANGDPRSettings setPurposeConsents:@"01010110"];
XCTAssertTrue([ANGDPRSettings canAccessDeviceData] == false);
}

- (void)testAccessDeviceData_IABTCF_PurposeConsents_False
{
[[NSUserDefaults standardUserDefaults] setObject:@"01010110" forKey:ANIABTCF_PurposeConsents];
XCTAssertTrue([ANGDPRSettings canAccessDeviceData] == false);
}

@end
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ - (void)testUTRequestWithPurpose1SetTrueAndConsentSetFalse
dispatch_queue_t backgroundQueue = dispatch_queue_create("QUEUE FOR testUTRequest.", DISPATCH_QUEUE_SERIAL);

XCTestExpectation *expectation = [self expectationWithDescription:[NSString stringWithFormat:@"%s", __PRETTY_FUNCTION__]];
[ANGDPRSettings setConsentRequired:FALSE];
[ANGDPRSettings setConsentRequired:[NSNumber numberWithInt:0]];
[ANGDPRSettings setPurposeConsents:@"1010"];

//
Expand Down Expand Up @@ -367,10 +367,7 @@ - (void)testUTRequestWithoutPurpose1ConsentTrue

// Device Id Start
NSDictionary *deviceId = device[@"device_id"];
XCTAssertNotNil(deviceId);
NSString *idfa = deviceId[@"idfa"];
XCTAssertNotNil(idfa);
XCTAssertEqualObjects(idfa, @"00000000-0000-0000-0000-000000000000");
XCTAssertNil(deviceId);
//
[expectation fulfill];
});
Expand All @@ -386,7 +383,7 @@ - (void)testUTRequestWithoutPurpose1ConsentFalse

XCTestExpectation *expectation = [self expectationWithDescription:[NSString stringWithFormat:@"%s", __PRETTY_FUNCTION__]];

[ANGDPRSettings setConsentRequired:FALSE];
[ANGDPRSettings setConsentRequired:[NSNumber numberWithInt:0]];

//
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), backgroundQueue,
Expand Down
28 changes: 14 additions & 14 deletions tests/UnitTestApp/UnitTests/LazyLoadFeatureTests.m
Original file line number Diff line number Diff line change
Expand Up @@ -112,20 +112,6 @@ - (void)setUp
[ANInstreamVideoAd setDoNotResetAdUnitUUID:YES];


//
self.expectationLazyAdDidReceiveAd = nil;
self.expectationAdDidReceiveAd = nil;
self.expectationAdDidReceiveNativeAd = nil;
self.expectationMultiAdRequestSuccess = nil;
self.expectationRequestFailedWithError = nil;

self.expectationAdResponseInfoIsDefined = nil;
self.expectationAdResponseInfoIsDefinedAndDifferent = nil;
self.expectationTryToLoadWebviewSecondTimeForLazyAdUnit = nil;
self.expectationAutoRefreshTimerIsSetProperly = nil;
self.expectationFindANAdResponseInfoOnLazyFailure = nil;
self.expectationRunLoadAdASecondTimeWithoutCallingLoadLazyAd = nil;

//
self.rootVC = [UIApplication sharedApplication].keyWindow.rootViewController;

Expand All @@ -141,6 +127,20 @@ - (void)tearDown
{
[[ANHTTPStubbingManager sharedStubbingManager] removeAllStubs];
[[ANHTTPStubbingManager sharedStubbingManager] disable];

//
self.expectationLazyAdDidReceiveAd = nil;
self.expectationAdDidReceiveAd = nil;
self.expectationAdDidReceiveNativeAd = nil;
self.expectationMultiAdRequestSuccess = nil;
self.expectationRequestFailedWithError = nil;

self.expectationAdResponseInfoIsDefined = nil;
self.expectationAdResponseInfoIsDefinedAndDifferent = nil;
self.expectationTryToLoadWebviewSecondTimeForLazyAdUnit = nil;
self.expectationAutoRefreshTimerIsSetProperly = nil;
self.expectationFindANAdResponseInfoOnLazyFailure = nil;
self.expectationRunLoadAdASecondTimeWithoutCallingLoadLazyAd = nil;
}

- (void)createAdUnits
Expand Down

0 comments on commit 0b1b6cc

Please sign in to comment.