|
POST
|
demet akyol, Sorry I've been away... Your external GPS device needs to be supported by Apple (MFi program) and the manufacturer should provide the so called protocol string(s) which needs to be included in your app's info.plist, as Joe pointed out. Then once the device is peered up with an iPhone or iPad using Blue tooth or a cable, your app using Apple ExternalAccesory framework should be able to connect to the GPS device and receive NMEA string data from it. Please refer to the code I posted in this thread previously. NMEA sentence is a comma delimited string data. I only studied and parsed the GGA, GSA and RMC sentences for location data. The following is the GGA sentence as an example. Hope it helps. Shimin import Foundation public class GgaSentence: NmeaSentence { var rawSentence: [String] /// GGA is defined as following: /// ``` /// $GPGGA,012506.50,3342.49540,S,15055.45495,E,1,06,1.53,68.9,M, 19.7,M, , *7A /// $GPGGA,hhmmss.ss,llll.lllll,a,yyyyy.yyyyy,a,x,xx,x.xx,x.xx,M, xx.x,M, x.x,xxxx*hh /// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 /// ``` /// /// 0 TYPE: The type of NMEA data, e.g. $GPRMC, $GPGGA, $GPGSA, $GPGSV /// 1 TIME: The time of the NMEA data (UTC) /// 2 LATITUDE: The latitude /// 3 LATITUDEDIR: The latitude direction N or S /// 4 LONGITUDE: The longitude /// 5 LONGITUDEDIR: The longitude direction E or W /// 6 GPSFIXQUALITY: GPS fix quality: 0=fix not available, 1=GPS fix, 2=DGPS fix, 3=PPS fix, 4=RTK, 5=Float RTK, 6=estimated /// 7=Manual inputmode, 8=Simulation mode /// 7 NUMBEROFSATELLITEINVIEW: Number of satellites in view 00 - 12 /// 8 HDOP: Horizontal dilution of precision /// 9 ALTITUDE: Altitude above/below mean-sea-leval (geoid) /// 10 ALTITUDEUNIT: Altitude unit, meters /// 11 GEOIDALSEPARATION: The difference between the WGS-84 earth ellipsoid and mean sea level (geoid), "-" means mean sea level /// below ellipsoid. The height of geoid above WGS84 earth ellipsoid. /// 12 GEOIDALSEPARATIONUNIT: Units of geoidal separation, meters /// 13 TIMESINCELASTDGPSUPDATE: Time in seconds since last differential GPS update from differential reference station /// 14 DIFFERENTIALREFERENCESTATIONID: the differential reference station id. /// 15 CHECKSUM: a checksum enum Param: Int { case TYPE = 0 case TIME = 1 case LATITUDE = 2 case LATITUDEDIR = 3 case LONGITUDE = 4 case LONGITUDEDIR = 5 case FIXTYPE = 6 case NUMBEROFSATELLITESINVIEW = 7 case HDOP = 8 case ALTITUDE = 9 case ALTITUDEUNIT = 10 case GEOIDALSEPARATION = 11 case GEOIDALSEPARATIONUNIT = 12 case TIMESINCELASTDGPSUPDATE = 13 case DIFFERENTIALREFERENCESTATIONID = 14 //the id is with the checksum } required public init(rawSentence: [String]) { self.rawSentence = rawSentence } func type() -> String { return "$GPGGA" } func parse() -> AnyObject? { let splittedString = self.rawSentence //the original $GPGGA string might be segmented therefore have to treat it differently. Not sure why... //the full sentence should have 15 items but found there are cases of 10 and 11 items. var rawType: String! var rawTime: String! var rawLatitude: String! var rawLatitudeDir: String! var rawLongitude: String! var rawLongitudeDir: String! var rawFixType: String! var rawNumberOfSatelliesInView: String! var rawHDOP: String! var rawAltitude: String! var rawAltitudeUnit: String! var rawGeoidalSeparation: String! var rawGeoidalSeparationUnit: String! var rawTimeSinceLastDGPSUpdate: String! var rawDifferentialReferenceStationID: String! let count = splittedString.count //print(count) if count == 10 { rawType = splittedString[GgaSentence.Param.TYPE.rawValue] rawTime = splittedString[GgaSentence.Param.TIME.rawValue] rawLatitude = splittedString[GgaSentence.Param.LATITUDE.rawValue] rawLatitudeDir = splittedString[GgaSentence.Param.LATITUDEDIR.rawValue] rawLongitude = splittedString[GgaSentence.Param.LONGITUDE.rawValue] rawLongitudeDir = splittedString[GgaSentence.Param.LONGITUDEDIR.rawValue] rawFixType = splittedString[GgaSentence.Param.FIXTYPE.rawValue] rawNumberOfSatelliesInView = splittedString[GgaSentence.Param.NUMBEROFSATELLITESINVIEW.rawValue] rawHDOP = splittedString[GgaSentence.Param.HDOP.rawValue] rawAltitude = splittedString[GgaSentence.Param.ALTITUDE.rawValue] } else if count == 11 { rawType = splittedString[GgaSentence.Param.TYPE.rawValue] rawTime = splittedString[GgaSentence.Param.TIME.rawValue] rawLatitude = splittedString[GgaSentence.Param.LATITUDE.rawValue] rawLatitudeDir = splittedString[GgaSentence.Param.LATITUDEDIR.rawValue] rawLongitude = splittedString[GgaSentence.Param.LONGITUDE.rawValue] rawLongitudeDir = splittedString[GgaSentence.Param.LONGITUDEDIR.rawValue] rawFixType = splittedString[GgaSentence.Param.FIXTYPE.rawValue] rawNumberOfSatelliesInView = splittedString[GgaSentence.Param.NUMBEROFSATELLITESINVIEW.rawValue] rawHDOP = splittedString[GgaSentence.Param.HDOP.rawValue] rawAltitude = splittedString[GgaSentence.Param.ALTITUDE.rawValue] rawAltitudeUnit = splittedString[GgaSentence.Param.ALTITUDEUNIT.rawValue] } else if count == 15 { rawType = splittedString[GgaSentence.Param.TYPE.rawValue] rawTime = splittedString[GgaSentence.Param.TIME.rawValue] rawLatitude = splittedString[GgaSentence.Param.LATITUDE.rawValue] rawLatitudeDir = splittedString[GgaSentence.Param.LATITUDEDIR.rawValue] rawLongitude = splittedString[GgaSentence.Param.LONGITUDE.rawValue] rawLongitudeDir = splittedString[GgaSentence.Param.LONGITUDEDIR.rawValue] rawFixType = splittedString[GgaSentence.Param.FIXTYPE.rawValue] rawNumberOfSatelliesInView = splittedString[GgaSentence.Param.NUMBEROFSATELLITESINVIEW.rawValue] rawHDOP = splittedString[GgaSentence.Param.HDOP.rawValue] rawAltitude = splittedString[GgaSentence.Param.ALTITUDE.rawValue] rawAltitudeUnit = splittedString[GgaSentence.Param.ALTITUDEUNIT.rawValue] rawGeoidalSeparation = splittedString[GgaSentence.Param.GEOIDALSEPARATION.rawValue] rawGeoidalSeparationUnit = splittedString[GgaSentence.Param.GEOIDALSEPARATIONUNIT.rawValue] rawTimeSinceLastDGPSUpdate = splittedString[GgaSentence.Param.TIMESINCELASTDGPSUPDATE.rawValue] rawDifferentialReferenceStationID = splittedString[GgaSentence.Param.DIFFERENTIALREFERENCESTATIONID.rawValue] } else { return nil //invalid $GPGGA string } if rawLatitude == nil || rawLatitude.isEmpty || rawLongitude == nil || rawLongitude.isEmpty { return nil //no locaiton info } let ggaData = GgaData() ggaData.type = rawType let dateFormatter = DateFormatter() //dateFormatter.timeZone = TimeZone(identifier: "GMT") dateFormatter.dateFormat = "hhmmss.SSS" if let tempTime = dateFormatter.date(from: rawTime) { ggaData.time = tempTime } ggaData.latitude = rawLatitude ggaData.latitudeDir = rawLatitudeDir ggaData.longitude = rawLongitude ggaData.longitudeDir = rawLongitudeDir if rawFixType != nil && !rawFixType.isEmpty, let fixType = Int(rawFixType) { switch fixType { case 0: ggaData.fixType = "Fix Not Available" break case 1: ggaData.fixType = "GPS Fix" break case 2: ggaData.fixType = "DGPS Fix" break case 3: ggaData.fixType = "PPS Fix" break case 4: ggaData.fixType = "RTK" break case 5: ggaData.fixType = "Float RTK" break case 6: ggaData.fixType = "Estimated" break case 7: ggaData.fixType = "Manual Input Mode" break case 8: ggaData.fixType = "Simulation Mode" break default: break } } ggaData.numberOfSatellitesInView = rawNumberOfSatelliesInView ggaData.hdop = rawHDOP ggaData.altitude = rawAltitude ggaData.altitudeUnit = rawAltitudeUnit ggaData.altitudeUnit = rawAltitudeUnit ggaData.geoidalSeparation = rawGeoidalSeparation ggaData.geoidalSeparationUnit = rawGeoidalSeparationUnit ggaData.timeSinceLastDGPSUpdate = rawTimeSinceLastDGPSUpdate if rawDifferentialReferenceStationID != nil && !rawDifferentialReferenceStationID.isEmpty { let starIndex = rawDifferentialReferenceStationID.index(of: "*") if starIndex != nil { ggaData.differentialReferenceStationID = String(rawDifferentialReferenceStationID.prefix(upTo: starIndex!)) } } return ggaData } }
... View more
04-01-2020
02:51 PM
|
0
|
0
|
1377
|
|
POST
|
Thanks Michael. I did not publish the service. Have passed on the info but haven't got anything back yet. We are also suspecting it might be caused by some data problems...
... View more
03-23-2020
01:51 PM
|
0
|
0
|
1051
|
|
POST
|
Hi Michael, There are point, line and polygon layers in the feature service. I didn't publish the service but I believe it was published using ArcMap 10.6 or above. The ArcGIS Server is 10.4.1. Thanks, Shimin
... View more
03-18-2020
08:15 PM
|
0
|
2
|
1051
|
|
POST
|
Hi there, Any idea what has caused this error while generating an offline geodatabase from a feature service? In the sdk guide the code 3003 is Geodatabase Bad XML exception. Thanks, Shimin
... View more
03-15-2020
07:39 PM
|
0
|
4
|
1172
|
|
POST
|
Thanks Nick. Looks like ArcGIS Server 10.4.1 does not support subtypes...
... View more
11-06-2019
02:50 PM
|
0
|
0
|
708
|
|
POST
|
Sorry Nick I was looking at the wrong server. Here is correct service json {"currentVersion":10.41,"serviceDescription":"Service for HFD CIFOA supervision and Audit","hasVersionedData":false,"supportsDisconnectedEditing":false,"syncEnabled":true,"syncCapabilities":{"supportsRegisteringExistingData":true,"supportsSyncDirectionControl":true,"supportsPerLayerSync":true,"supportsPerReplicaSync":false,"supportsRollbackOnFailure":false,"supportsAsync":true,"supportsAttachmentsSyncDirection":true,"supportsSyncModelNone":true},"supportedQueryFormats":"JSON, AMF","maxRecordCount":10000,"capabilities":"Create,Delete,Extract,Query,Sync,Update,Uploads,Editing","description":"","copyrightText":"RobK","spatialReference":{"wkid":3308,"latestWkid":3308},"initialExtent":{"xmin":9405747.734332878,"ymin":4235472.443658285,"xmax":9409041.803421017,"ymax":4236913.102789603,"spatialReference":{"wkid":3308,"latestWkid":3308}},"fullExtent":{"xmin":0,"ymin":-3622637.5840000007,"xmax":1.03139531981E7,"ymax":5858939.346900001,"spatialReference":{"wkid":3308,"latestWkid":3308}},"allowGeometryUpdates":true,"supportsApplyEditsWithGlobalIds":true,"units":"esriMeters","documentInfo":{"Title":"","Author":"","Comments":"Testing FC for IFOA builds","Subject":"Test Build For mobile IFOA edit feature","Category":"","Keywords":"FCNSW IFOA HFD"},"layers":[{"id":0,"name":"CIFOAPlanPoly"},{"id":1,"name":"MassMovementMapping"},{"id":2,"name":"HFDHarvestPlanAreaGross"},{"id":3,"name":"HFDWildlifeHabitatClump"},{"id":4,"name":"HFDTreeRetentionClump"},{"id":5,"name":"HFDHarvestPlanBNA"},{"id":6,"name":"HFDHarvestPoly"},{"id":7,"name":"HFDPatch"},{"id":8,"name":"HFDHabitatCoastal"},{"id":9,"name":"HFD_OSA"},{"id":10,"name":"HFDTreesCoastal"},{"id":11,"name":"HFDHarvestBA"},{"id":12,"name":"HFDTraverse"},{"id":13,"name":"CIFOAPlanLines"},{"id":14,"name":"CIFOAPlanPoints"},{"id":15,"name":"HFDCrossing"},{"id":16,"name":"HFD_Dump"},{"id":17,"name":"HFD_IncidentalFF"},{"id":18,"name":"HFDContractorNote"},{"id":19,"name":"QAATree"},{"id":20,"name":"QAADump"},{"id":21,"name":"QAASnigDrainage"},{"id":22,"name":"QAASnigCrossing"},{"id":23,"name":"QAAPoint"},{"id":24,"name":"QAAIncursion"},{"id":25,"name":"QAAEvent"},{"id":26,"name":"QAABoundaryTransect"},{"id":27,"name":"CIFOACompliance"},{"id":28,"name":"HFDNote"},{"id":29,"name":"Hazard"}],"tables":[],"enableZDefaults":false}
... View more
11-06-2019
02:17 PM
|
1
|
2
|
708
|
|
POST
|
Hi Nick, Layer 6 has subtype and here is the json: {"currentVersion":10.41,"id":6,"name":"HFDHarvestPoly","type":"Feature Layer","description":"","copyrightText":"","defaultVisibility":false,"editFieldsInfo":{"creationDateField":"created_date","editDateField":"last_edited_date"},"ownershipBasedAccessControlForFeatures":null,"syncCanReturnChanges":true,"relationships":[],"isDataVersioned":false,"supportsRollbackOnFailureParameter":true,"supportsStatistics":true,"supportsAdvancedQueries":true,"supportsValidateSQL":true,"supportsCalculate":false,"advancedQueryCapabilities":{"supportsPagination":true,"supportsQueryWithDistance":true,"supportsReturningQueryExtent":true,"supportsStatistics":true,"supportsOrderBy":true,"supportsDistinct":true},"geometryType":"esriGeometryPolygon","minScale":200000,"maxScale":0,"extent":{"xmin":746841.3055000007,"ymin":4034351.2918999996,"xmax":9901071.460900001,"ymax":5858939.346900001,"spatialReference":{"wkid":3308,"latestWkid":3308}},"drawingInfo":{"renderer":{"type":"uniqueValue","field1":"PointType","field2":null,"field3":null,"fieldDelimiter":", ","defaultSymbol":null,"defaultLabel":null,"uniqueValueInfos":[{"symbol":{"type":"esriSFS","style":"esriSFSSolid","color":[0,0,0,0],"outline":{"type":"esriSLS","style":"esriSLSSolid","color":[255,170,0,255],"width":4}},"value":"3","label":"UnClassified","description":""},{"symbol":{"type":"esriSFS","style":"esriSFSSolid","color":[0,0,0,0],"outline":{"type":"esriSLS","style":"esriSLSSolid","color":[255,0,197,255],"width":4}},"value":"1","label":"NonHarvestPoly","description":""},{"symbol":{"type":"esriSFS","style":"esriSFSSolid","color":[0,0,0,0],"outline":{"type":"esriSLS","style":"esriSLSSolid","color":[78,78,78,255],"width":4}},"value":"0","label":"HarvestedPoly","description":""}]},"transparency":0,"labelingInfo":null},"hasM":false,"hasZ":false,"allowGeometryUpdates":true,"hasAttachments":false,"supportsApplyEditsWithGlobalIds":true,"htmlPopupType":"esriServerHTMLPopupTypeAsHTMLText","objectIdField":"OBJECTID","globalIdField":"GlobalID","displayField":"Notes","typeIdField":"PointType","fields":[{"name":"PointType","type":"esriFieldTypeInteger","alias":"PoinType","domain":null,"editable":true,"nullable":true},{"name":"HarvestDetails","type":"esriFieldTypeInteger","alias":"HarvestDetails","domain":null,"editable":true,"nullable":true},{"name":"Notes","type":"esriFieldTypeString","alias":"Notes","domain":null,"editable":true,"nullable":true,"length":500},{"name":"GlobalID","type":"esriFieldTypeGlobalID","alias":"GlobalID","domain":null,"editable":false,"nullable":false,"length":38},{"name":"created_user","type":"esriFieldTypeString","alias":"created_user","domain":null,"editable":true,"nullable":true,"length":255},{"name":"created_date","type":"esriFieldTypeDate","alias":"created_date","domain":null,"editable":false,"nullable":true,"length":8},{"name":"last_edited_user","type":"esriFieldTypeString","alias":"last_edited_user","domain":null,"editable":true,"nullable":true,"length":255},{"name":"last_edited_date","type":"esriFieldTypeDate","alias":"last_edited_date","domain":null,"editable":false,"nullable":true,"length":8},{"name":"OBJECTID","type":"esriFieldTypeOID","alias":"OBJECTID","domain":null,"editable":false,"nullable":false},{"name":"PlanID","type":"esriFieldTypeString","alias":"SHAPE.STArea())","domain":null,"editable":false,"nullable":true,"length":50},{"name":"PlanName","type":"esriFieldTypeString","alias":"PlanName","domain":null,"editable":true,"nullable":true,"length":150}],"indexes":[{"name":"UUID_282","fields":"GlobalID","isAscending":true,"isUnique":true,"description":""},{"name":"gdb_ct3_282","fields":"OBJECTID","isAscending":true,"isUnique":false,"description":""},{"name":"S159_idx","fields":"SHAPE","isAscending":true,"isUnique":true,"description":""}],"dateFieldsTimeReference":{"timeZone":"UTC","respectsDaylightSaving":false},"types":[{"id":3,"name":"UnClassified","domains":{},"templates":[{"name":"UnClassified","description":"","prototype":{"attributes":{"PointType":3,"HarvestDetails":null,"Notes":null,"PlanName":null,"created_user":null,"last_edited_user":null}},"drawingTool":"esriFeatureEditToolPolygon"}]},{"id":1,"name":"NonHarvestPoly","domains":{"HarvestDetails":{"type":"codedValue","name":"DmHFDNoHarvest","codedValues":[{"name":"BA Offset","code":21},{"name":"Topo Inaccessible","code":22},{"name":"Steep","code":23},{"name":"Uneconomic","code":24},{"name":"Env Protection","code":25},{"name":"Pre-Merch","code":26},{"name":"Unlogged Missed","code":27},{"name":"Unlogged Other","code":28},{"name":"Alternate Coupe","code":29},{"name":"Unknown","code":31},{"name":"Other - see notes","code":8}]}},"templates":[{"name":"NonHarvestPoly","description":"","prototype":{"attributes":{"PointType":1,"HarvestDetails":null,"Notes":null,"PlanName":null,"created_user":null,"last_edited_user":null}},"drawingTool":"esriFeatureEditToolPolygon"}]},{"id":0,"name":"HarvestedPoly","domains":{"HarvestDetails":{"type":"codedValue","name":"DmHFDSiviculture","codedValues":[{"name":"STS Light","code":1},{"name":"STS Medium","code":2},{"name":"STS Heavy","code":3},{"name":"STS Regen","code":4},{"name":"AGS","code":5},{"name":"Thinning","code":6},{"name":"Other - see notes","code":8},{"name":"Clearfell","code":9},{"name":"STS Release","code":7},{"name":"Early Thinning","code":10},{"name":"Alternate Coupe","code":11}]}},"templates":[{"name":"HarvestedPoly","description":"","prototype":{"attributes":{"PointType":0,"HarvestDetails":2,"Notes":null,"PlanName":null,"created_user":null,"last_edited_user":null}},"drawingTool":"esriFeatureEditToolPolygon"}]}],"templates":[],"maxRecordCount":10000,"supportedQueryFormats":"JSON, AMF, geoJSON","capabilities":"Create,Delete,Extract,Query,Sync,Update,Uploads,Editing","useStandardizedQueries":true}
I noticed a layer id discrepancy between the layer json and the service json: the layer id in the service json is 5 but 6 in the service json. Not sure why...
The layer list in the service directory:
Thanks,
Shimin
... View more
11-06-2019
02:11 PM
|
0
|
3
|
1873
|
|
POST
|
Hi Nick, Here is the feature service json: {"currentVersion":10.41,"serviceDescription":"HFDSUper","hasVersionedData":false,"supportsDisconnectedEditing":false,"syncEnabled":true,"syncCapabilities":{"supportsRegisteringExistingData":true,"supportsSyncDirectionControl":true,"supportsPerLayerSync":true,"supportsPerReplicaSync":false,"supportsRollbackOnFailure":false,"supportsAsync":true,"supportsAttachmentsSyncDirection":true,"supportsSyncModelNone":true},"supportedQueryFormats":"JSON, AMF","maxRecordCount":100000,"capabilities":"Create,Delete,Extract,Query,Sync,Update,Uploads,Editing","description":"","copyrightText":"robk","spatialReference":{"wkid":3308,"latestWkid":3308},"initialExtent":{"xmin":9860167.134816462,"ymin":4946953.487653883,"xmax":9860835.390870487,"ymax":4947364.722148668,"spatialReference":{"wkid":3308,"latestWkid":3308}},"fullExtent":{"xmin":0,"ymin":-3622637.5840000007,"xmax":1.03139531981E7,"ymax":5858939.346900001,"spatialReference":{"wkid":3308,"latestWkid":3308}},"allowGeometryUpdates":true,"supportsApplyEditsWithGlobalIds":true,"units":"esriMeters","documentInfo":{"Title":"","Author":"","Comments":"HFDSUper","Subject":"HFDSUper","Category":"","Keywords":"HFD"},"layers":[{"id":0,"name":"HFD_Planpolys"},{"id":1,"name":"HFD_Planlines"},{"id":2,"name":"HFDHarvestLine"},{"id":3,"name":"HFD_KoalaStarLine"},{"id":4,"name":"HFD_KoalaStarTree"},{"id":5,"name":"HFDHarvestPoly"},{"id":6,"name":"HFDHarvestPoint"},{"id":7,"name":"HFD_Planpoints"},{"id":8,"name":"HFD_Trees"},{"id":9,"name":"HFDCrossing"},{"id":10,"name":"HFDContractorTree"},{"id":11,"name":"HFDNonCompliance"},{"id":12,"name":"HFD_Dump"},{"id":13,"name":"HFD_IncidentalFF"},{"id":14,"name":"HFDNote"},{"id":15,"name":"Hazard"},{"id":16,"name":"TempNoGoZone"}],"tables":[],"enableZDefaults":false} Thanks, Shimin
... View more
11-06-2019
01:50 PM
|
1
|
5
|
1873
|
|
POST
|
I replied to that DM with the feature service json.
... View more
11-06-2019
01:28 PM
|
0
|
6
|
1873
|
|
POST
|
Hi Nick, It's is ArcGIS Enterprise 10.4.1. Thanks, Shimin
... View more
11-06-2019
01:00 PM
|
0
|
8
|
1873
|
|
POST
|
Hi Nick, Thanks a lot for your reply. I tried your suggestions but the subtypeField and featureSubtypes are all empty. Loading the geodatabase: I know the HFDHarvestPoly layer has subtype defined but as you can see the subtypeField and featureSubtypes are empty: What am I doing wrong? Would you have any idea of how to implement subtype support? Thanks, Shimin
... View more
11-05-2019
05:19 PM
|
1
|
10
|
1873
|
|
POST
|
Hi there, How can I tell if a layer has subtype? Thanks, Shimin
... View more
11-04-2019
09:48 PM
|
0
|
12
|
2676
|
|
POST
|
Hi Joe, I'm using Apple ExternalAccessory framework to detect external bluetooth connected devices. Recently we found an external gps unit connected with a USB cable can also be picked up by our app without modifying any code. Cheers, Shimin
... View more
08-20-2019
04:12 PM
|
1
|
3
|
2319
|
|
POST
|
We have been having the same issue since the beginning working with the ESRI Runtime SDK (v2.3.2)... We have had to force our apps to restart or ask users to restart the apps once a new database file is downloaded. We think the SDK caches the database file in memory and keeps using it...
... View more
08-09-2018
03:48 PM
|
1
|
1
|
1527
|
| Title | Kudos | Posted |
|---|---|---|
| 1 | 11-08-2022 01:10 PM | |
| 1 | 09-19-2022 09:21 PM | |
| 1 | 05-23-2022 06:49 PM | |
| 1 | 03-24-2022 05:49 PM | |
| 1 | 10-31-2021 03:16 PM |
| Online Status |
Offline
|
| Date Last Visited |
2 weeks ago
|