[
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "content": "### Your JSON dictionary:\n\n```json\n{\n  \"name\": \"ObjectMapper\",\n  \"url\": \"https://github.com/Hearst-DD/ObjectMapper\"\n}\n```\n\n### Your model:\n\n```swift\nstruct Repo: Mappable {\n  var name: String!\n  var url: URL!\n\n  init(_ map: Map) {\n    name <- map[\"name\"]\n    url <- map[\"url\"]\n  }\n}\n```\n\n### What you did:\n\n```swift\nlet repo = Mapper<Repo>().map(myJSONDictionary)\n```\n\n### What you expected:\n\nI exepected something like:\n\n```swift\nRepo(name: \"ObjectMapper\", url: \"https://github.com/Hearst-DD/ObjectMapper\")\n```\n\n### What you got:\n\n```swift\nRepo(name: \"ObjectMapper\", url: nil)  // expected the url is mapped correctly\n```\n\n"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "## Why <!-- Describe why you are making the change -->\n\n\n\n## What <!-- Describe what changed -->"
  },
  {
    "path": ".gitignore",
    "content": "# Xcode\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata\n*.xccheckout\n*.moved-aside\nDerivedData\n*.xcuserstate\n# AppCode etc.\n.idea/\n# Desktop Servies\n.DS_Store\n\n# Carthage\nCarthage/Build\n\n# Swift package manager\n.build/\nPackages/\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: objective-c\nosx_image: xcode11.3\n\nenv:\n  global:\n    - LANG=en_US.UTF-8\n    - LC_ALL=en_US.UTF-8\n    - WORKSPACE=\"ObjectMapper.xcworkspace\"\n    - IOS_FRAMEWORK_SCHEME=\"ObjectMapper-iOS\"\n    - OSX_FRAMEWORK_SCHEME=\"ObjectMapper-Mac\"\n    - TVOS_FRAMEWORK_SCHEME=\"ObjectMapper-tvOS\"\n    - WATCHOS_FRAMEWORK_SCHEME=\"ObjectMapper-watchOS\"\n  matrix:\n    #iOS\n    - DESTINATION=\"OS=11.4,name=iPhone X\"            SCHEME=\"$IOS_FRAMEWORK_SCHEME\"      RUN_TESTS=\"YES\"\n    - DESTINATION=\"OS=10.3.1,name=iPhone 7 Plus\"     SCHEME=\"$IOS_FRAMEWORK_SCHEME\"      RUN_TESTS=\"YES\"\n    #macOS\n    - DESTINATION=\"arch=x86_64\"                      SCHEME=\"$OSX_FRAMEWORK_SCHEME\"      RUN_TESTS=\"YES\"\n    #tvOS\n    - DESTINATION=\"OS=11.4,name=Apple TV 4K\"         SCHEME=\"$TVOS_FRAMEWORK_SCHEME\"     RUN_TESTS=\"YES\"\n\nbefore_install:\n  - gem install xcpretty --no-document --quiet\n\nscript:\n  - set -o pipefail\n  - xcodebuild -version\n  - xcodebuild -showsdks\n\n  # Build Framework in Debug and Run Tests if specified\n  - if [ $RUN_TESTS == \"YES\" ]; then\n      travis_retry xcodebuild -workspace \"$WORKSPACE\" -scheme \"$SCHEME\" -destination \"$DESTINATION\" -configuration Debug ONLY_ACTIVE_ARCH=NO test | xcpretty -c;\n    else\n      travis_retry xcodebuild -workspace \"$WORKSPACE\" -scheme \"$SCHEME\" -destination \"$DESTINATION\" -configuration Debug ONLY_ACTIVE_ARCH=NO build | xcpretty -c;\n    fi\n\n  # Build Framework in Release and Run Tests if specified\n  - if [ $RUN_TESTS == \"YES\" ]; then\n      travis_retry xcodebuild -workspace \"$WORKSPACE\" -scheme \"$SCHEME\" -destination \"$DESTINATION\" -configuration Release ONLY_ACTIVE_ARCH=NO test | xcpretty -c;\n    else\n      travis_retry xcodebuild -workspace \"$WORKSPACE\" -scheme \"$SCHEME\" -destination \"$DESTINATION\" -configuration Release ONLY_ACTIVE_ARCH=NO build | xcpretty -c;\n    fi\n\nnotifications:\n  email: false\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\nCopyright (c) 2014 Hearst\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "ObjectMapper.podspec",
    "content": "Pod::Spec.new do |s|\n  s.name = 'ObjectMapper'\n  s.version = '4.4.2'\n  s.license = 'MIT'\n  # Ensure developers won't hit CocoaPods/CocoaPods#11402 with the resource\n  # bundle for the privacy manifest.\n  s.cocoapods_version = '>= 1.12.0'\n  s.summary = 'JSON Object mapping written in Swift'\n  s.homepage = 'https://github.com/tristanhimmelman/ObjectMapper'\n  s.authors = { 'Tristan Himmelman' => 'tristanhimmelman@gmail.com' }\n  s.source = { :git => 'https://github.com/tristanhimmelman/ObjectMapper.git', :tag => s.version.to_s }\n  s.resource_bundle = {\n    \"Privacy\" => \"Sources/Resources/PrivacyInfo.xcprivacy\"\n  }\n  s.watchos.deployment_target = '2.0'\n  s.ios.deployment_target = '13.0'\n  s.osx.deployment_target = '12.0'\n  s.tvos.deployment_target = '9.0'\n\n  s.swift_version = '5.0'\n\n  s.requires_arc = true\n  s.source_files = 'Sources/**/*.swift'\nend\n"
  },
  {
    "path": "ObjectMapper.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t030114AD1D951A5300FBFD4F /* ImmutableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 030114AA1D95197100FBFD4F /* ImmutableTests.swift */; };\n\t\t030114AE1D951A5600FBFD4F /* ImmutableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 030114AA1D95197100FBFD4F /* ImmutableTests.swift */; };\n\t\t030114AF1D951A6C00FBFD4F /* ImmutableMappable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 030114A81D95187600FBFD4F /* ImmutableMappable.swift */; };\n\t\t030114B01D951A7100FBFD4F /* ImmutableMappable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 030114A81D95187600FBFD4F /* ImmutableMappable.swift */; };\n\t\t030114B11D951A7500FBFD4F /* ImmutableMappable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 030114A81D95187600FBFD4F /* ImmutableMappable.swift */; };\n\t\t030E75F51E588BF30027D94A /* IntegerOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 038F0A021E55FE2400613148 /* IntegerOperators.swift */; };\n\t\t030E75F61E588BF80027D94A /* IntegerOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 038F0A021E55FE2400613148 /* IntegerOperators.swift */; };\n\t\t030E75F71E588BFC0027D94A /* IntegerOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 038F0A021E55FE2400613148 /* IntegerOperators.swift */; };\n\t\t038F0A031E55FE2400613148 /* IntegerOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 038F0A021E55FE2400613148 /* IntegerOperators.swift */; };\n\t\t1865416F1E972FA800F95A19 /* URLTransformTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1865416E1E972FA800F95A19 /* URLTransformTests.swift */; };\n\t\t37AFD9B91AAD191C00AB59B5 /* CustomDateFormatTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37AFD9B81AAD191C00AB59B5 /* CustomDateFormatTransform.swift */; };\n\t\t3BAD2C0C1BDDB10D00E6B203 /* Mappable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BAD2C0B1BDDB10D00E6B203 /* Mappable.swift */; };\n\t\t3BAD2C0D1BDDB10D00E6B203 /* Mappable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BAD2C0B1BDDB10D00E6B203 /* Mappable.swift */; };\n\t\t3BAD2C0E1BDDB10D00E6B203 /* Mappable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BAD2C0B1BDDB10D00E6B203 /* Mappable.swift */; };\n\t\t3BAD2C101BDDC0B000E6B203 /* MappableExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BAD2C0F1BDDC0B000E6B203 /* MappableExtensionsTests.swift */; };\n\t\t3BAD2C111BDDC0B000E6B203 /* MappableExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BAD2C0F1BDDC0B000E6B203 /* MappableExtensionsTests.swift */; };\n\t\t491D7995216FB8B2006DB931 /* CodableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 491D7994216FB8B2006DB931 /* CodableTests.swift */; };\n\t\t491D7996216FB8B2006DB931 /* CodableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 491D7994216FB8B2006DB931 /* CodableTests.swift */; };\n\t\t491D7997216FB8B2006DB931 /* CodableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 491D7994216FB8B2006DB931 /* CodableTests.swift */; };\n\t\t491D799C216FBA9A006DB931 /* CodableTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 491D7998216FBA93006DB931 /* CodableTransform.swift */; };\n\t\t491D799D216FBA9A006DB931 /* CodableTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 491D7998216FBA93006DB931 /* CodableTransform.swift */; };\n\t\t491D799E216FBA9B006DB931 /* CodableTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 491D7998216FBA93006DB931 /* CodableTransform.swift */; };\n\t\t491D799F216FBA9B006DB931 /* CodableTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 491D7998216FBA93006DB931 /* CodableTransform.swift */; };\n\t\t6100B1C01BD76A030011114A /* NestedArrayTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6100B1BF1BD76A020011114A /* NestedArrayTests.swift */; };\n\t\t6A05B7B01BE274BE00F19B53 /* ObjectMapper.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6A05B7A61BE274BE00F19B53 /* ObjectMapper.framework */; };\n\t\t6A05B7BD1BE274E800F19B53 /* ObjectMapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 6AAC8F7B19F03C2900E7A677 /* ObjectMapper.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t6A0BF1FF1C0B53470083D1AF /* ToObjectTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A0BF1FE1C0B53470083D1AF /* ToObjectTests.swift */; };\n\t\t6A0BF2001C0B53470083D1AF /* ToObjectTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A0BF1FE1C0B53470083D1AF /* ToObjectTests.swift */; };\n\t\t6A0BF2011C0B53470083D1AF /* ToObjectTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A0BF1FE1C0B53470083D1AF /* ToObjectTests.swift */; };\n\t\t6A2AD0451B2C786C0097E150 /* Mapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8FC419F048FE00E7A677 /* Mapper.swift */; };\n\t\t6A2AD0461B2C786C0097E150 /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8FC519F048FE00E7A677 /* Operators.swift */; };\n\t\t6A2AD0471B2C786C0097E150 /* FromJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8FC319F048FE00E7A677 /* FromJSON.swift */; };\n\t\t6A2AD0481B2C786C0097E150 /* ToJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8FC719F048FE00E7A677 /* ToJSON.swift */; };\n\t\t6A2AD0491B2C786C0097E150 /* DateTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8FCB19F048FE00E7A677 /* DateTransform.swift */; };\n\t\t6A2AD04A1B2C786C0097E150 /* DateFormatterTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A51372B1AADDE2700B82516 /* DateFormatterTransform.swift */; };\n\t\t6A2AD04B1B2C786C0097E150 /* ISO8601DateTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = D86BDEA31A51E5AC00120819 /* ISO8601DateTransform.swift */; };\n\t\t6A2AD04C1B2C786C0097E150 /* CustomDateFormatTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37AFD9B81AAD191C00AB59B5 /* CustomDateFormatTransform.swift */; };\n\t\t6A2AD04D1B2C786C0097E150 /* TransformOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD71C8C01A7218AD009D4161 /* TransformOf.swift */; };\n\t\t6A2AD04E1B2C786C0097E150 /* TransformType.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD50B6FC1A82518300744312 /* TransformType.swift */; };\n\t\t6A2AD04F1B2C786C0097E150 /* URLTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A6C54CF19FE8DB600239454 /* URLTransform.swift */; };\n\t\t6A2AD0501B2C786C0097E150 /* EnumTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC1E7F361ABC44C000F9B1CF /* EnumTransform.swift */; };\n\t\t6A3774341A31427F00CC0AB5 /* BasicTypesTestsToJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A3774331A31427F00CC0AB5 /* BasicTypesTestsToJSON.swift */; };\n\t\t6A412A171BAC770C001C3F67 /* ClassClusterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A412A161BAC770C001C3F67 /* ClassClusterTests.swift */; };\n\t\t6A412A181BAC830B001C3F67 /* ClassClusterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A412A161BAC770C001C3F67 /* ClassClusterTests.swift */; };\n\t\t6A412A241BB0DA26001C3F67 /* PerformanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A412A231BB0DA26001C3F67 /* PerformanceTests.swift */; };\n\t\t6A412A251BB0DA26001C3F67 /* PerformanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A412A231BB0DA26001C3F67 /* PerformanceTests.swift */; };\n\t\t6A442CA11CE251F100AB4F1F /* MapContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A442CA01CE251F100AB4F1F /* MapContextTests.swift */; };\n\t\t6A442CA21CE251F100AB4F1F /* MapContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A442CA01CE251F100AB4F1F /* MapContextTests.swift */; };\n\t\t6A442CA31CE251F100AB4F1F /* MapContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A442CA01CE251F100AB4F1F /* MapContextTests.swift */; };\n\t\t6A51372C1AADDE2700B82516 /* DateFormatterTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A51372B1AADDE2700B82516 /* DateFormatterTransform.swift */; };\n\t\t6A51372F1AADE12C00B82516 /* CustomTransformTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A51372E1AADE12C00B82516 /* CustomTransformTests.swift */; };\n\t\t6A6AEB961A93874F002573D3 /* BasicTypesTestsFromJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A6AEB951A93874F002573D3 /* BasicTypesTestsFromJSON.swift */; };\n\t\t6A6AEB981A9387D0002573D3 /* BasicTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A6AEB971A9387D0002573D3 /* BasicTypes.swift */; };\n\t\t6A6C54D019FE8DB600239454 /* URLTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A6C54CF19FE8DB600239454 /* URLTransform.swift */; };\n\t\t6A715C4A1D05B1FA0054AD62 /* IgnoreNilTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A715C491D05B1FA0054AD62 /* IgnoreNilTests.swift */; };\n\t\t6A715C4B1D05B1FA0054AD62 /* IgnoreNilTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A715C491D05B1FA0054AD62 /* IgnoreNilTests.swift */; };\n\t\t6A715C4C1D05B1FA0054AD62 /* IgnoreNilTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A715C491D05B1FA0054AD62 /* IgnoreNilTests.swift */; };\n\t\t6AA1F66B1BE94687006EF513 /* ClassClusterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A412A161BAC770C001C3F67 /* ClassClusterTests.swift */; };\n\t\t6AA1F66C1BE94687006EF513 /* PerformanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A412A231BB0DA26001C3F67 /* PerformanceTests.swift */; };\n\t\t6AA1F66D1BE9468D006EF513 /* NestedArrayTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6100B1BF1BD76A020011114A /* NestedArrayTests.swift */; };\n\t\t6AA1F66E1BE991FF006EF513 /* Mappable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BAD2C0B1BDDB10D00E6B203 /* Mappable.swift */; };\n\t\t6AA1F66F1BE9921C006EF513 /* MappableExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BAD2C0F1BDDC0B000E6B203 /* MappableExtensionsTests.swift */; };\n\t\t6AAC8F7C19F03C2900E7A677 /* ObjectMapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 6AAC8F7B19F03C2900E7A677 /* ObjectMapper.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t6AAC8F8619F03C2900E7A677 /* ObjectMapperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8F8519F03C2900E7A677 /* ObjectMapperTests.swift */; };\n\t\t6AAC8FCD19F048FE00E7A677 /* FromJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8FC319F048FE00E7A677 /* FromJSON.swift */; };\n\t\t6AAC8FCE19F048FE00E7A677 /* Mapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8FC419F048FE00E7A677 /* Mapper.swift */; };\n\t\t6AAC8FCF19F048FE00E7A677 /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8FC519F048FE00E7A677 /* Operators.swift */; };\n\t\t6AAC8FD119F048FE00E7A677 /* ToJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8FC719F048FE00E7A677 /* ToJSON.swift */; };\n\t\t6AAC8FD319F048FE00E7A677 /* DateTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8FCB19F048FE00E7A677 /* DateTransform.swift */; };\n\t\t6AAE6A431ACED93500FBC899 /* ObjectMapper.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = CD1602FF1AC023D5000CD69A /* ObjectMapper.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t6AC458191BA350CF00054758 /* ObjectMapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 6AAC8F7B19F03C2900E7A677 /* ObjectMapper.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t6AC53CAB1F031B85008BDDCD /* ImmutableMappable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 030114A81D95187600FBFD4F /* ImmutableMappable.swift */; };\n\t\t6AC53CAC1F03FA1B008BDDCD /* ImmutableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 030114AA1D95197100FBFD4F /* ImmutableTests.swift */; };\n\t\t6AC692341BE3FD3A004C119A /* Map.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6ACB15D11BC7F1D0006C029C /* Map.swift */; };\n\t\t6AC692351BE3FD3A004C119A /* Mapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8FC419F048FE00E7A677 /* Mapper.swift */; };\n\t\t6AC692361BE3FD3A004C119A /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8FC519F048FE00E7A677 /* Operators.swift */; };\n\t\t6AC692371BE3FD3A004C119A /* FromJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8FC319F048FE00E7A677 /* FromJSON.swift */; };\n\t\t6AC692381BE3FD3A004C119A /* ToJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8FC719F048FE00E7A677 /* ToJSON.swift */; };\n\t\t6AC692391BE3FD3A004C119A /* DateTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8FCB19F048FE00E7A677 /* DateTransform.swift */; };\n\t\t6AC6923A1BE3FD3A004C119A /* DateFormatterTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A51372B1AADDE2700B82516 /* DateFormatterTransform.swift */; };\n\t\t6AC6923B1BE3FD3A004C119A /* ISO8601DateTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = D86BDEA31A51E5AC00120819 /* ISO8601DateTransform.swift */; };\n\t\t6AC6923C1BE3FD3A004C119A /* CustomDateFormatTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37AFD9B81AAD191C00AB59B5 /* CustomDateFormatTransform.swift */; };\n\t\t6AC6923D1BE3FD3A004C119A /* TransformOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD71C8C01A7218AD009D4161 /* TransformOf.swift */; };\n\t\t6AC6923E1BE3FD3A004C119A /* TransformType.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD50B6FC1A82518300744312 /* TransformType.swift */; };\n\t\t6AC6923F1BE3FD3A004C119A /* URLTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A6C54CF19FE8DB600239454 /* URLTransform.swift */; };\n\t\t6AC692401BE3FD3A004C119A /* EnumTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC1E7F361ABC44C000F9B1CF /* EnumTransform.swift */; };\n\t\t6AC692411BE3FD45004C119A /* BasicTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A6AEB971A9387D0002573D3 /* BasicTypes.swift */; };\n\t\t6AC692421BE3FD45004C119A /* BasicTypesTestsFromJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A6AEB951A93874F002573D3 /* BasicTypesTestsFromJSON.swift */; };\n\t\t6AC692431BE3FD45004C119A /* BasicTypesTestsToJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A3774331A31427F00CC0AB5 /* BasicTypesTestsToJSON.swift */; };\n\t\t6AC692441BE3FD45004C119A /* CustomTransformTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A51372E1AADE12C00B82516 /* CustomTransformTests.swift */; };\n\t\t6AC692451BE3FD45004C119A /* NestedKeysTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD44374C1AAE9C1100A271BA /* NestedKeysTests.swift */; };\n\t\t6AC692461BE3FD45004C119A /* NestedArrayTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6100B1BF1BD76A020011114A /* NestedArrayTests.swift */; };\n\t\t6AC692471BE3FD45004C119A /* ObjectMapperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8F8519F03C2900E7A677 /* ObjectMapperTests.swift */; };\n\t\t6ACB15D21BC7F1D0006C029C /* Map.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6ACB15D11BC7F1D0006C029C /* Map.swift */; };\n\t\t6ACB15D31BC7F1D0006C029C /* Map.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6ACB15D11BC7F1D0006C029C /* Map.swift */; };\n\t\t6ACB15D41BC7F1D0006C029C /* Map.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6ACB15D11BC7F1D0006C029C /* Map.swift */; };\n\t\t6AECC9E61D79E29100222E7A /* DictionaryTransformTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AECC9E51D79E29100222E7A /* DictionaryTransformTests.swift */; };\n\t\t6AECC9E71D79E29100222E7A /* DictionaryTransformTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AECC9E51D79E29100222E7A /* DictionaryTransformTests.swift */; };\n\t\t6AECC9E81D79E29100222E7A /* DictionaryTransformTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AECC9E51D79E29100222E7A /* DictionaryTransformTests.swift */; };\n\t\t6AF148841D999E31002BEA2C /* GenericObjectsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AF148831D999E31002BEA2C /* GenericObjectsTests.swift */; };\n\t\t6AF148851D999E31002BEA2C /* GenericObjectsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AF148831D999E31002BEA2C /* GenericObjectsTests.swift */; };\n\t\t6AF148861D999E31002BEA2C /* GenericObjectsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AF148831D999E31002BEA2C /* GenericObjectsTests.swift */; };\n\t\t6AF148881D99A25B002BEA2C /* MapError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AF148871D99A25B002BEA2C /* MapError.swift */; };\n\t\t6AF148891D99A25B002BEA2C /* MapError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AF148871D99A25B002BEA2C /* MapError.swift */; };\n\t\t6AF1488A1D99A25B002BEA2C /* MapError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AF148871D99A25B002BEA2C /* MapError.swift */; };\n\t\t6AF1488B1D99A25B002BEA2C /* MapError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AF148871D99A25B002BEA2C /* MapError.swift */; };\n\t\t6AF1488D1D99A7A6002BEA2C /* TransformOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AF1488C1D99A7A6002BEA2C /* TransformOperators.swift */; };\n\t\t6AF1488E1D99A7A6002BEA2C /* TransformOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AF1488C1D99A7A6002BEA2C /* TransformOperators.swift */; };\n\t\t6AF1488F1D99A7A6002BEA2C /* TransformOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AF1488C1D99A7A6002BEA2C /* TransformOperators.swift */; };\n\t\t6AF148901D99A7A6002BEA2C /* TransformOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AF1488C1D99A7A6002BEA2C /* TransformOperators.swift */; };\n\t\t6AF148921D99A7CA002BEA2C /* EnumOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AF148911D99A7CA002BEA2C /* EnumOperators.swift */; };\n\t\t6AF148931D99A7CA002BEA2C /* EnumOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AF148911D99A7CA002BEA2C /* EnumOperators.swift */; };\n\t\t6AF148941D99A7CA002BEA2C /* EnumOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AF148911D99A7CA002BEA2C /* EnumOperators.swift */; };\n\t\t6AF148951D99A7CA002BEA2C /* EnumOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AF148911D99A7CA002BEA2C /* EnumOperators.swift */; };\n\t\t797FEDCE1DAB855F00E31F75 /* HexColorTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79E591C61DAB7FED008E2EEF /* HexColorTransform.swift */; };\n\t\t797FEDCF1DAB855F00E31F75 /* HexColorTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79E591C61DAB7FED008E2EEF /* HexColorTransform.swift */; };\n\t\t797FEDD01DAB856000E31F75 /* HexColorTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79E591C61DAB7FED008E2EEF /* HexColorTransform.swift */; };\n\t\t79E591C71DAB7FED008E2EEF /* HexColorTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79E591C61DAB7FED008E2EEF /* HexColorTransform.swift */; };\n\t\t84D4F8521CC3B643008B0FB6 /* NSDecimalNumberTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D4F8511CC3B643008B0FB6 /* NSDecimalNumberTransform.swift */; };\n\t\t84D4F8531CC3B643008B0FB6 /* NSDecimalNumberTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D4F8511CC3B643008B0FB6 /* NSDecimalNumberTransform.swift */; };\n\t\t84D4F8541CC3B643008B0FB6 /* NSDecimalNumberTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D4F8511CC3B643008B0FB6 /* NSDecimalNumberTransform.swift */; };\n\t\t84D4F8551CC3B643008B0FB6 /* NSDecimalNumberTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D4F8511CC3B643008B0FB6 /* NSDecimalNumberTransform.swift */; };\n\t\t84D4F8571CC3B71B008B0FB6 /* NSDecimalNumberTransformTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D4F8561CC3B71B008B0FB6 /* NSDecimalNumberTransformTests.swift */; };\n\t\t84D4F8581CC3B71B008B0FB6 /* NSDecimalNumberTransformTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D4F8561CC3B71B008B0FB6 /* NSDecimalNumberTransformTests.swift */; };\n\t\t84D4F8591CC3B71B008B0FB6 /* NSDecimalNumberTransformTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D4F8561CC3B71B008B0FB6 /* NSDecimalNumberTransformTests.swift */; };\n\t\t891804CD1C122AF000E5C3EE /* MappableTypesWithTransformsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 891804CC1C122AF000E5C3EE /* MappableTypesWithTransformsTests.swift */; };\n\t\t891804CE1C122AF000E5C3EE /* MappableTypesWithTransformsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 891804CC1C122AF000E5C3EE /* MappableTypesWithTransformsTests.swift */; };\n\t\t891804CF1C122AF000E5C3EE /* MappableTypesWithTransformsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 891804CC1C122AF000E5C3EE /* MappableTypesWithTransformsTests.swift */; };\n\t\t997B4A471D3FA20D005E3F31 /* DictionaryTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 997B4A461D3FA20D005E3F31 /* DictionaryTransform.swift */; };\n\t\t997B4A481D3FA20D005E3F31 /* DictionaryTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 997B4A461D3FA20D005E3F31 /* DictionaryTransform.swift */; };\n\t\t997B4A491D3FA20D005E3F31 /* DictionaryTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 997B4A461D3FA20D005E3F31 /* DictionaryTransform.swift */; };\n\t\t997B4A4A1D3FA20D005E3F31 /* DictionaryTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 997B4A461D3FA20D005E3F31 /* DictionaryTransform.swift */; };\n\t\tBA9D143C246BF0930037233E /* URLTransformTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1865416E1E972FA800F95A19 /* URLTransformTests.swift */; };\n\t\tBA9D143D246BF0940037233E /* URLTransformTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1865416E1E972FA800F95A19 /* URLTransformTests.swift */; };\n\t\tBC1E7F371ABC44C000F9B1CF /* EnumTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC1E7F361ABC44C000F9B1CF /* EnumTransform.swift */; };\n\t\tC135CAB41D762F6900BA9338 /* DataTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = C135CAB31D762F6900BA9338 /* DataTransform.swift */; };\n\t\tC135CAB71D76303E00BA9338 /* DataTransformTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C135CAB61D76303E00BA9338 /* DataTransformTests.swift */; };\n\t\tC135CAB81D76303E00BA9338 /* DataTransformTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C135CAB61D76303E00BA9338 /* DataTransformTests.swift */; };\n\t\tC135CAB91D76303E00BA9338 /* DataTransformTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C135CAB61D76303E00BA9338 /* DataTransformTests.swift */; };\n\t\tC135CABA1D7631DB00BA9338 /* DataTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = C135CAB31D762F6900BA9338 /* DataTransform.swift */; };\n\t\tC135CABB1D7631DB00BA9338 /* DataTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = C135CAB31D762F6900BA9338 /* DataTransform.swift */; };\n\t\tC135CABC1D7631DC00BA9338 /* DataTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = C135CAB31D762F6900BA9338 /* DataTransform.swift */; };\n\t\tCD16030A1AC023D6000CD69A /* ObjectMapper.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CD1602FF1AC023D5000CD69A /* ObjectMapper.framework */; };\n\t\tCD1603181AC02437000CD69A /* ObjectMapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 6AAC8F7B19F03C2900E7A677 /* ObjectMapper.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tCD1603191AC02451000CD69A /* Mapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8FC419F048FE00E7A677 /* Mapper.swift */; };\n\t\tCD16031A1AC02451000CD69A /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8FC519F048FE00E7A677 /* Operators.swift */; };\n\t\tCD16031B1AC02451000CD69A /* FromJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8FC319F048FE00E7A677 /* FromJSON.swift */; };\n\t\tCD16031C1AC02451000CD69A /* ToJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8FC719F048FE00E7A677 /* ToJSON.swift */; };\n\t\tCD16031D1AC02461000CD69A /* DateTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8FCB19F048FE00E7A677 /* DateTransform.swift */; };\n\t\tCD16031E1AC02461000CD69A /* DateFormatterTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A51372B1AADDE2700B82516 /* DateFormatterTransform.swift */; };\n\t\tCD16031F1AC02461000CD69A /* ISO8601DateTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = D86BDEA31A51E5AC00120819 /* ISO8601DateTransform.swift */; };\n\t\tCD1603201AC02461000CD69A /* CustomDateFormatTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37AFD9B81AAD191C00AB59B5 /* CustomDateFormatTransform.swift */; };\n\t\tCD1603211AC02472000CD69A /* TransformOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD71C8C01A7218AD009D4161 /* TransformOf.swift */; };\n\t\tCD1603221AC02472000CD69A /* TransformType.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD50B6FC1A82518300744312 /* TransformType.swift */; };\n\t\tCD1603231AC02472000CD69A /* URLTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A6C54CF19FE8DB600239454 /* URLTransform.swift */; };\n\t\tCD1603241AC02472000CD69A /* EnumTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC1E7F361ABC44C000F9B1CF /* EnumTransform.swift */; };\n\t\tCD1603251AC02480000CD69A /* BasicTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A6AEB971A9387D0002573D3 /* BasicTypes.swift */; };\n\t\tCD1603261AC02480000CD69A /* BasicTypesTestsFromJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A6AEB951A93874F002573D3 /* BasicTypesTestsFromJSON.swift */; };\n\t\tCD1603271AC02480000CD69A /* BasicTypesTestsToJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A3774331A31427F00CC0AB5 /* BasicTypesTestsToJSON.swift */; };\n\t\tCD1603281AC02480000CD69A /* CustomTransformTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A51372E1AADE12C00B82516 /* CustomTransformTests.swift */; };\n\t\tCD1603291AC02480000CD69A /* NestedKeysTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD44374C1AAE9C1100A271BA /* NestedKeysTests.swift */; };\n\t\tCD16032A1AC02480000CD69A /* ObjectMapperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8F8519F03C2900E7A677 /* ObjectMapperTests.swift */; };\n\t\tCD4437491AAD692B00A271BA /* ObjectMapper.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6AAC8F7619F03C2900E7A677 /* ObjectMapper.framework */; };\n\t\tCD44374B1AAD698400A271BA /* ObjectMapper.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 6AAC8F7619F03C2900E7A677 /* ObjectMapper.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\tCD44374D1AAE9C1100A271BA /* NestedKeysTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD44374C1AAE9C1100A271BA /* NestedKeysTests.swift */; };\n\t\tCD50B6FD1A82518300744312 /* TransformType.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD50B6FC1A82518300744312 /* TransformType.swift */; };\n\t\tCD71C8C11A7218AD009D4161 /* TransformOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD71C8C01A7218AD009D4161 /* TransformOf.swift */; };\n\t\tD86BDEA41A51E5AD00120819 /* ISO8601DateTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = D86BDEA31A51E5AC00120819 /* ISO8601DateTransform.swift */; };\n\t\tDBB9B4232142A2D800078E5A /* Map.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6ACB15D11BC7F1D0006C029C /* Map.swift */; };\n\t\tDBB9B4242142A2E100078E5A /* MapError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AF148871D99A25B002BEA2C /* MapError.swift */; };\n\t\tDBB9B4252142A2E100078E5A /* Mappable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BAD2C0B1BDDB10D00E6B203 /* Mappable.swift */; };\n\t\tDBB9B4262142A2E100078E5A /* ImmutableMappable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 030114A81D95187600FBFD4F /* ImmutableMappable.swift */; };\n\t\tDBB9B4272142A2E100078E5A /* Mapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8FC419F048FE00E7A677 /* Mapper.swift */; };\n\t\tDBB9B4282142A2E600078E5A /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8FC519F048FE00E7A677 /* Operators.swift */; };\n\t\tDBB9B4292142A2E600078E5A /* EnumOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AF148911D99A7CA002BEA2C /* EnumOperators.swift */; };\n\t\tDBB9B42A2142A2E600078E5A /* TransformOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AF1488C1D99A7A6002BEA2C /* TransformOperators.swift */; };\n\t\tDBB9B42B2142A2E600078E5A /* IntegerOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 038F0A021E55FE2400613148 /* IntegerOperators.swift */; };\n\t\tDBB9B42C2142A2E600078E5A /* FromJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8FC319F048FE00E7A677 /* FromJSON.swift */; };\n\t\tDBB9B42D2142A2E600078E5A /* ToJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8FC719F048FE00E7A677 /* ToJSON.swift */; };\n\t\tDBB9B42E2142A2ED00078E5A /* TransformOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD71C8C01A7218AD009D4161 /* TransformOf.swift */; };\n\t\tDBB9B42F2142A2ED00078E5A /* TransformType.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD50B6FC1A82518300744312 /* TransformType.swift */; };\n\t\tDBB9B4302142A2ED00078E5A /* URLTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A6C54CF19FE8DB600239454 /* URLTransform.swift */; };\n\t\tDBB9B4312142A2ED00078E5A /* EnumTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC1E7F361ABC44C000F9B1CF /* EnumTransform.swift */; };\n\t\tDBB9B4322142A2ED00078E5A /* NSDecimalNumberTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D4F8511CC3B643008B0FB6 /* NSDecimalNumberTransform.swift */; };\n\t\tDBB9B4332142A2ED00078E5A /* DictionaryTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 997B4A461D3FA20D005E3F31 /* DictionaryTransform.swift */; };\n\t\tDBB9B4342142A2ED00078E5A /* DataTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = C135CAB31D762F6900BA9338 /* DataTransform.swift */; };\n\t\tDBB9B4352142A2ED00078E5A /* HexColorTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79E591C61DAB7FED008E2EEF /* HexColorTransform.swift */; };\n\t\tDBB9B4362142A2F200078E5A /* DateTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AAC8FCB19F048FE00E7A677 /* DateTransform.swift */; };\n\t\tDBB9B4372142A2F200078E5A /* DateFormatterTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A51372B1AADDE2700B82516 /* DateFormatterTransform.swift */; };\n\t\tDBB9B4382142A2F200078E5A /* ISO8601DateTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = D86BDEA31A51E5AC00120819 /* ISO8601DateTransform.swift */; };\n\t\tDBB9B4392142A2F200078E5A /* CustomDateFormatTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37AFD9B81AAD191C00AB59B5 /* CustomDateFormatTransform.swift */; };\n\t\tDC99C8CC1CA261A8005C788C /* NullableKeysFromJSONTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC99C8CB1CA261A8005C788C /* NullableKeysFromJSONTests.swift */; };\n\t\tDC99C8CD1CA261AD005C788C /* NullableKeysFromJSONTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC99C8CB1CA261A8005C788C /* NullableKeysFromJSONTests.swift */; };\n\t\tDC99C8CE1CA261AE005C788C /* NullableKeysFromJSONTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC99C8CB1CA261A8005C788C /* NullableKeysFromJSONTests.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t6A05B7B11BE274BE00F19B53 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 6AAC8F6D19F03C2900E7A677 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 6A05B7A51BE274BE00F19B53;\n\t\t\tremoteInfo = \"ObjectMapper-tvOS\";\n\t\t};\n\t\t6AAC8FD519F04A5600E7A677 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 6AAC8F6D19F03C2900E7A677 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 6AAC8F7519F03C2900E7A677;\n\t\t\tremoteInfo = ObjectMapper;\n\t\t};\n\t\tCD16030B1AC023D6000CD69A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 6AAC8F6D19F03C2900E7A677 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = CD1602FE1AC023D5000CD69A;\n\t\t\tremoteInfo = \"ObjectMapper-Mac\";\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t6AAE6A421ACED92700FBC899 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t6AAE6A431ACED93500FBC899 /* ObjectMapper.framework in CopyFiles */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCD44374A1AAD696B00A271BA /* Copy Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\tCD44374B1AAD698400A271BA /* ObjectMapper.framework in Copy Frameworks */,\n\t\t\t);\n\t\t\tname = \"Copy Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t030114A81D95187600FBFD4F /* ImmutableMappable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImmutableMappable.swift; sourceTree = \"<group>\"; };\n\t\t030114AA1D95197100FBFD4F /* ImmutableTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ImmutableTests.swift; path = ObjectMapperTests/ImmutableTests.swift; sourceTree = \"<group>\"; };\n\t\t038F0A021E55FE2400613148 /* IntegerOperators.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IntegerOperators.swift; sourceTree = \"<group>\"; };\n\t\t1865416E1E972FA800F95A19 /* URLTransformTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = URLTransformTests.swift; path = ObjectMapperTests/URLTransformTests.swift; sourceTree = \"<group>\"; };\n\t\t37AFD9B81AAD191C00AB59B5 /* CustomDateFormatTransform.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomDateFormatTransform.swift; sourceTree = \"<group>\"; };\n\t\t3BAD2C0B1BDDB10D00E6B203 /* Mappable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = Mappable.swift; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };\n\t\t3BAD2C0F1BDDC0B000E6B203 /* MappableExtensionsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MappableExtensionsTests.swift; path = ObjectMapperTests/MappableExtensionsTests.swift; sourceTree = \"<group>\"; };\n\t\t491D7994216FB8B2006DB931 /* CodableTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = CodableTests.swift; path = ObjectMapperTests/CodableTests.swift; sourceTree = \"<group>\"; };\n\t\t491D7998216FBA93006DB931 /* CodableTransform.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CodableTransform.swift; sourceTree = \"<group>\"; };\n\t\t6100B1BF1BD76A020011114A /* NestedArrayTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = NestedArrayTests.swift; path = ObjectMapperTests/NestedArrayTests.swift; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };\n\t\t6A05B7A61BE274BE00F19B53 /* ObjectMapper.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ObjectMapper.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t6A05B7AF1BE274BE00F19B53 /* ObjectMapper-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = \"ObjectMapper-tvOSTests.xctest\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t6A0BF1FE1C0B53470083D1AF /* ToObjectTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ToObjectTests.swift; path = ObjectMapperTests/ToObjectTests.swift; sourceTree = \"<group>\"; };\n\t\t6A2AD03D1B2C78540097E150 /* ObjectMapper.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ObjectMapper.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t6A3774331A31427F00CC0AB5 /* BasicTypesTestsToJSON.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = BasicTypesTestsToJSON.swift; path = ObjectMapperTests/BasicTypesTestsToJSON.swift; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };\n\t\t6A412A161BAC770C001C3F67 /* ClassClusterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ClassClusterTests.swift; path = ObjectMapperTests/ClassClusterTests.swift; sourceTree = \"<group>\"; };\n\t\t6A412A231BB0DA26001C3F67 /* PerformanceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = PerformanceTests.swift; path = ObjectMapperTests/PerformanceTests.swift; sourceTree = \"<group>\"; };\n\t\t6A442CA01CE251F100AB4F1F /* MapContextTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = MapContextTests.swift; path = ObjectMapperTests/MapContextTests.swift; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };\n\t\t6A51372B1AADDE2700B82516 /* DateFormatterTransform.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DateFormatterTransform.swift; sourceTree = \"<group>\"; };\n\t\t6A51372E1AADE12C00B82516 /* CustomTransformTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = CustomTransformTests.swift; path = ObjectMapperTests/CustomTransformTests.swift; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };\n\t\t6A6AEB951A93874F002573D3 /* BasicTypesTestsFromJSON.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BasicTypesTestsFromJSON.swift; path = ObjectMapperTests/BasicTypesTestsFromJSON.swift; sourceTree = \"<group>\"; };\n\t\t6A6AEB971A9387D0002573D3 /* BasicTypes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = BasicTypes.swift; path = ObjectMapperTests/BasicTypes.swift; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };\n\t\t6A6C54CF19FE8DB600239454 /* URLTransform.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URLTransform.swift; sourceTree = \"<group>\"; };\n\t\t6A715C491D05B1FA0054AD62 /* IgnoreNilTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = IgnoreNilTests.swift; path = ObjectMapperTests/IgnoreNilTests.swift; sourceTree = \"<group>\"; };\n\t\t6A9EEBD41AC5BFA30011F22C /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; lineEnding = 0; path = README.md; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.markdown; };\n\t\t6AAC8F7619F03C2900E7A677 /* ObjectMapper.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ObjectMapper.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t6AAC8F7A19F03C2900E7A677 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t6AAC8F7B19F03C2900E7A677 /* ObjectMapper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ObjectMapper.h; sourceTree = \"<group>\"; };\n\t\t6AAC8F8119F03C2900E7A677 /* ObjectMapper-iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = \"ObjectMapper-iOSTests.xctest\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t6AAC8F8419F03C2900E7A677 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t6AAC8F8519F03C2900E7A677 /* ObjectMapperTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = ObjectMapperTests.swift; path = ObjectMapperTests/ObjectMapperTests.swift; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };\n\t\t6AAC8FC319F048FE00E7A677 /* FromJSON.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = FromJSON.swift; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };\n\t\t6AAC8FC419F048FE00E7A677 /* Mapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = Mapper.swift; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };\n\t\t6AAC8FC519F048FE00E7A677 /* Operators.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = Operators.swift; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };\n\t\t6AAC8FC719F048FE00E7A677 /* ToJSON.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = ToJSON.swift; sourceTree = \"<group>\"; };\n\t\t6AAC8FCB19F048FE00E7A677 /* DateTransform.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DateTransform.swift; sourceTree = \"<group>\"; };\n\t\t6ACB15D11BC7F1D0006C029C /* Map.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Map.swift; sourceTree = \"<group>\"; };\n\t\t6AECC9E51D79E29100222E7A /* DictionaryTransformTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DictionaryTransformTests.swift; path = ObjectMapperTests/DictionaryTransformTests.swift; sourceTree = \"<group>\"; };\n\t\t6AF148831D999E31002BEA2C /* GenericObjectsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = GenericObjectsTests.swift; path = ObjectMapperTests/GenericObjectsTests.swift; sourceTree = \"<group>\"; };\n\t\t6AF148871D99A25B002BEA2C /* MapError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MapError.swift; sourceTree = \"<group>\"; };\n\t\t6AF1488C1D99A7A6002BEA2C /* TransformOperators.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = TransformOperators.swift; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };\n\t\t6AF148911D99A7CA002BEA2C /* EnumOperators.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = EnumOperators.swift; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };\n\t\t79E591C61DAB7FED008E2EEF /* HexColorTransform.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HexColorTransform.swift; sourceTree = \"<group>\"; };\n\t\t84D4F8511CC3B643008B0FB6 /* NSDecimalNumberTransform.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSDecimalNumberTransform.swift; sourceTree = \"<group>\"; };\n\t\t84D4F8561CC3B71B008B0FB6 /* NSDecimalNumberTransformTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NSDecimalNumberTransformTests.swift; path = ObjectMapperTests/NSDecimalNumberTransformTests.swift; sourceTree = \"<group>\"; };\n\t\t891804CC1C122AF000E5C3EE /* MappableTypesWithTransformsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MappableTypesWithTransformsTests.swift; path = ObjectMapperTests/MappableTypesWithTransformsTests.swift; sourceTree = \"<group>\"; };\n\t\t997B4A461D3FA20D005E3F31 /* DictionaryTransform.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DictionaryTransform.swift; sourceTree = \"<group>\"; };\n\t\tBC1E7F361ABC44C000F9B1CF /* EnumTransform.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnumTransform.swift; sourceTree = \"<group>\"; };\n\t\tC135CAB31D762F6900BA9338 /* DataTransform.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataTransform.swift; sourceTree = \"<group>\"; };\n\t\tC135CAB61D76303E00BA9338 /* DataTransformTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DataTransformTests.swift; path = ObjectMapperTests/DataTransformTests.swift; sourceTree = \"<group>\"; };\n\t\tCD1602FF1AC023D5000CD69A /* ObjectMapper.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ObjectMapper.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tCD1603091AC023D6000CD69A /* ObjectMapper-macOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = \"ObjectMapper-macOSTests.xctest\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tCD44374C1AAE9C1100A271BA /* NestedKeysTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = NestedKeysTests.swift; path = ObjectMapperTests/NestedKeysTests.swift; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };\n\t\tCD50B6FC1A82518300744312 /* TransformType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransformType.swift; sourceTree = \"<group>\"; };\n\t\tCD71C8C01A7218AD009D4161 /* TransformOf.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = TransformOf.swift; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };\n\t\tD86BDEA31A51E5AC00120819 /* ISO8601DateTransform.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ISO8601DateTransform.swift; sourceTree = \"<group>\"; };\n\t\tDBB9B41F2142A25100078E5A /* libObjectMapper.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libObjectMapper.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tDC99C8CB1CA261A8005C788C /* NullableKeysFromJSONTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NullableKeysFromJSONTests.swift; path = ObjectMapperTests/NullableKeysFromJSONTests.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t6A05B7A21BE274BE00F19B53 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t6A05B7AC1BE274BE00F19B53 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t6A05B7B01BE274BE00F19B53 /* ObjectMapper.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t6A2AD0391B2C78540097E150 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t6AAC8F7219F03C2900E7A677 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t6AAC8F7E19F03C2900E7A677 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tCD4437491AAD692B00A271BA /* ObjectMapper.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCD1602FB1AC023D5000CD69A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCD1603061AC023D6000CD69A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tCD16030A1AC023D6000CD69A /* ObjectMapper.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tDBB9B41C2142A25100078E5A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t6A51372D1AADDEE400B82516 /* Date */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6AAC8FCB19F048FE00E7A677 /* DateTransform.swift */,\n\t\t\t\t6A51372B1AADDE2700B82516 /* DateFormatterTransform.swift */,\n\t\t\t\tD86BDEA31A51E5AC00120819 /* ISO8601DateTransform.swift */,\n\t\t\t\t37AFD9B81AAD191C00AB59B5 /* CustomDateFormatTransform.swift */,\n\t\t\t);\n\t\t\tname = Date;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6AAC8F6C19F03C2900E7A677 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6A9EEBD41AC5BFA30011F22C /* README.md */,\n\t\t\t\t6AAC8F7819F03C2900E7A677 /* ObjectMapper */,\n\t\t\t\t6AAC8F8219F03C2900E7A677 /* ObjectMapperTests */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t\tusesTabs = 1;\n\t\t};\n\t\t6AAC8F7719F03C2900E7A677 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6AAC8F7619F03C2900E7A677 /* ObjectMapper.framework */,\n\t\t\t\t6AAC8F8119F03C2900E7A677 /* ObjectMapper-iOSTests.xctest */,\n\t\t\t\tCD1602FF1AC023D5000CD69A /* ObjectMapper.framework */,\n\t\t\t\tCD1603091AC023D6000CD69A /* ObjectMapper-macOSTests.xctest */,\n\t\t\t\t6A2AD03D1B2C78540097E150 /* ObjectMapper.framework */,\n\t\t\t\t6A05B7A61BE274BE00F19B53 /* ObjectMapper.framework */,\n\t\t\t\t6A05B7AF1BE274BE00F19B53 /* ObjectMapper-tvOSTests.xctest */,\n\t\t\t\tDBB9B41F2142A25100078E5A /* libObjectMapper.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tpath = ..;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6AAC8F7819F03C2900E7A677 /* ObjectMapper */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6AAC8F7B19F03C2900E7A677 /* ObjectMapper.h */,\n\t\t\t\t6AAC8FC219F048FE00E7A677 /* Core */,\n\t\t\t\t6AAC8FCA19F048FE00E7A677 /* Transforms */,\n\t\t\t\t6AAC8F7919F03C2900E7A677 /* Supporting Files */,\n\t\t\t);\n\t\t\tname = ObjectMapper;\n\t\t\tpath = Sources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6AAC8F7919F03C2900E7A677 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6AAC8F7A19F03C2900E7A677 /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6AAC8F8219F03C2900E7A677 /* ObjectMapperTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t491D7994216FB8B2006DB931 /* CodableTests.swift */,\n\t\t\t\t6A6AEB971A9387D0002573D3 /* BasicTypes.swift */,\n\t\t\t\t6A3774331A31427F00CC0AB5 /* BasicTypesTestsToJSON.swift */,\n\t\t\t\t6A6AEB951A93874F002573D3 /* BasicTypesTestsFromJSON.swift */,\n\t\t\t\t6A412A161BAC770C001C3F67 /* ClassClusterTests.swift */,\n\t\t\t\t6A51372E1AADE12C00B82516 /* CustomTransformTests.swift */,\n\t\t\t\tC135CAB61D76303E00BA9338 /* DataTransformTests.swift */,\n\t\t\t\t6AECC9E51D79E29100222E7A /* DictionaryTransformTests.swift */,\n\t\t\t\t6AF148831D999E31002BEA2C /* GenericObjectsTests.swift */,\n\t\t\t\t6A715C491D05B1FA0054AD62 /* IgnoreNilTests.swift */,\n\t\t\t\t030114AA1D95197100FBFD4F /* ImmutableTests.swift */,\n\t\t\t\t6A442CA01CE251F100AB4F1F /* MapContextTests.swift */,\n\t\t\t\t3BAD2C0F1BDDC0B000E6B203 /* MappableExtensionsTests.swift */,\n\t\t\t\t891804CC1C122AF000E5C3EE /* MappableTypesWithTransformsTests.swift */,\n\t\t\t\t6100B1BF1BD76A020011114A /* NestedArrayTests.swift */,\n\t\t\t\tCD44374C1AAE9C1100A271BA /* NestedKeysTests.swift */,\n\t\t\t\t84D4F8561CC3B71B008B0FB6 /* NSDecimalNumberTransformTests.swift */,\n\t\t\t\tDC99C8CB1CA261A8005C788C /* NullableKeysFromJSONTests.swift */,\n\t\t\t\t6AAC8F8519F03C2900E7A677 /* ObjectMapperTests.swift */,\n\t\t\t\t6A412A231BB0DA26001C3F67 /* PerformanceTests.swift */,\n\t\t\t\t6A0BF1FE1C0B53470083D1AF /* ToObjectTests.swift */,\n\t\t\t\t1865416E1E972FA800F95A19 /* URLTransformTests.swift */,\n\t\t\t\t6AAC8F7719F03C2900E7A677 /* Products */,\n\t\t\t\t6AAC8F8319F03C2900E7A677 /* Supporting Files */,\n\t\t\t);\n\t\t\tname = ObjectMapperTests;\n\t\t\tpath = Tests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6AAC8F8319F03C2900E7A677 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6AAC8F8419F03C2900E7A677 /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6AAC8FC219F048FE00E7A677 /* Core */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6ACB15D11BC7F1D0006C029C /* Map.swift */,\n\t\t\t\t6AF148871D99A25B002BEA2C /* MapError.swift */,\n\t\t\t\t3BAD2C0B1BDDB10D00E6B203 /* Mappable.swift */,\n\t\t\t\t030114A81D95187600FBFD4F /* ImmutableMappable.swift */,\n\t\t\t\t6AAC8FC419F048FE00E7A677 /* Mapper.swift */,\n\t\t\t\t6AF148961D99A912002BEA2C /* Operators */,\n\t\t\t\t6AAC8FC319F048FE00E7A677 /* FromJSON.swift */,\n\t\t\t\t6AAC8FC719F048FE00E7A677 /* ToJSON.swift */,\n\t\t\t);\n\t\t\tname = Core;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6AAC8FCA19F048FE00E7A677 /* Transforms */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6A51372D1AADDEE400B82516 /* Date */,\n\t\t\t\tCD71C8C01A7218AD009D4161 /* TransformOf.swift */,\n\t\t\t\tCD50B6FC1A82518300744312 /* TransformType.swift */,\n\t\t\t\t6A6C54CF19FE8DB600239454 /* URLTransform.swift */,\n\t\t\t\tBC1E7F361ABC44C000F9B1CF /* EnumTransform.swift */,\n\t\t\t\t84D4F8511CC3B643008B0FB6 /* NSDecimalNumberTransform.swift */,\n\t\t\t\t997B4A461D3FA20D005E3F31 /* DictionaryTransform.swift */,\n\t\t\t\tC135CAB31D762F6900BA9338 /* DataTransform.swift */,\n\t\t\t\t79E591C61DAB7FED008E2EEF /* HexColorTransform.swift */,\n\t\t\t\t491D7998216FBA93006DB931 /* CodableTransform.swift */,\n\t\t\t);\n\t\t\tname = Transforms;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6AF148961D99A912002BEA2C /* Operators */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6AAC8FC519F048FE00E7A677 /* Operators.swift */,\n\t\t\t\t6AF148911D99A7CA002BEA2C /* EnumOperators.swift */,\n\t\t\t\t6AF1488C1D99A7A6002BEA2C /* TransformOperators.swift */,\n\t\t\t\t038F0A021E55FE2400613148 /* IntegerOperators.swift */,\n\t\t\t);\n\t\t\tname = Operators;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t6A05B7A31BE274BE00F19B53 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t6A05B7BD1BE274E800F19B53 /* ObjectMapper.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t6A2AD03A1B2C78540097E150 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t6AC458191BA350CF00054758 /* ObjectMapper.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t6AAC8F7319F03C2900E7A677 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t6AAC8F7C19F03C2900E7A677 /* ObjectMapper.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCD1602FC1AC023D5000CD69A /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tCD1603181AC02437000CD69A /* ObjectMapper.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tDBB9B41D2142A25100078E5A /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t6A05B7A51BE274BE00F19B53 /* ObjectMapper-tvOS */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 6A05B7BB1BE274BE00F19B53 /* Build configuration list for PBXNativeTarget \"ObjectMapper-tvOS\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t6A05B7A11BE274BE00F19B53 /* Sources */,\n\t\t\t\t6A05B7A21BE274BE00F19B53 /* Frameworks */,\n\t\t\t\t6A05B7A31BE274BE00F19B53 /* Headers */,\n\t\t\t\t6A05B7A41BE274BE00F19B53 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"ObjectMapper-tvOS\";\n\t\t\tproductName = \"ObjectMapper-tvOS\";\n\t\t\tproductReference = 6A05B7A61BE274BE00F19B53 /* ObjectMapper.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t6A05B7AE1BE274BE00F19B53 /* ObjectMapper-tvOSTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 6A05B7BC1BE274BE00F19B53 /* Build configuration list for PBXNativeTarget \"ObjectMapper-tvOSTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t6A05B7AB1BE274BE00F19B53 /* Sources */,\n\t\t\t\t6A05B7AC1BE274BE00F19B53 /* Frameworks */,\n\t\t\t\t6A05B7AD1BE274BE00F19B53 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t6A05B7B21BE274BE00F19B53 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"ObjectMapper-tvOSTests\";\n\t\t\tproductName = \"ObjectMapper-tvOSTests\";\n\t\t\tproductReference = 6A05B7AF1BE274BE00F19B53 /* ObjectMapper-tvOSTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\t6A2AD03C1B2C78540097E150 /* ObjectMapper-watchOS */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 6A2AD0441B2C78540097E150 /* Build configuration list for PBXNativeTarget \"ObjectMapper-watchOS\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t6A2AD0381B2C78540097E150 /* Sources */,\n\t\t\t\t6A2AD0391B2C78540097E150 /* Frameworks */,\n\t\t\t\t6A2AD03A1B2C78540097E150 /* Headers */,\n\t\t\t\t6A2AD03B1B2C78540097E150 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"ObjectMapper-watchOS\";\n\t\t\tproductName = \"ObjectMapper-watchOS\";\n\t\t\tproductReference = 6A2AD03D1B2C78540097E150 /* ObjectMapper.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t6AAC8F7519F03C2900E7A677 /* ObjectMapper-iOS */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 6AAC8F8919F03C2900E7A677 /* Build configuration list for PBXNativeTarget \"ObjectMapper-iOS\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t6AAC8F7119F03C2900E7A677 /* Sources */,\n\t\t\t\t6AAC8F7219F03C2900E7A677 /* Frameworks */,\n\t\t\t\t6AAC8F7319F03C2900E7A677 /* Headers */,\n\t\t\t\t6AAC8F7419F03C2900E7A677 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"ObjectMapper-iOS\";\n\t\t\tproductName = ObjectMapper;\n\t\t\tproductReference = 6AAC8F7619F03C2900E7A677 /* ObjectMapper.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t6AAC8F8019F03C2900E7A677 /* ObjectMapper-iOSTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 6AAC8F8C19F03C2900E7A677 /* Build configuration list for PBXNativeTarget \"ObjectMapper-iOSTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t6AAC8F7D19F03C2900E7A677 /* Sources */,\n\t\t\t\t6AAC8F7E19F03C2900E7A677 /* Frameworks */,\n\t\t\t\t6AAC8F7F19F03C2900E7A677 /* Resources */,\n\t\t\t\tCD44374A1AAD696B00A271BA /* Copy Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t6AAC8FD619F04A5600E7A677 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"ObjectMapper-iOSTests\";\n\t\t\tproductName = ObjectMapperTests;\n\t\t\tproductReference = 6AAC8F8119F03C2900E7A677 /* ObjectMapper-iOSTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\tCD1602FE1AC023D5000CD69A /* ObjectMapper-macOS */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = CD1603161AC023D6000CD69A /* Build configuration list for PBXNativeTarget \"ObjectMapper-macOS\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tCD1602FA1AC023D5000CD69A /* Sources */,\n\t\t\t\tCD1602FB1AC023D5000CD69A /* Frameworks */,\n\t\t\t\tCD1602FC1AC023D5000CD69A /* Headers */,\n\t\t\t\tCD1602FD1AC023D5000CD69A /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"ObjectMapper-macOS\";\n\t\t\tproductName = \"ObjectMapper-Mac\";\n\t\t\tproductReference = CD1602FF1AC023D5000CD69A /* ObjectMapper.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\tCD1603081AC023D6000CD69A /* ObjectMapper-macOSTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = CD1603171AC023D6000CD69A /* Build configuration list for PBXNativeTarget \"ObjectMapper-macOSTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tCD1603051AC023D6000CD69A /* Sources */,\n\t\t\t\tCD1603061AC023D6000CD69A /* Frameworks */,\n\t\t\t\tCD1603071AC023D6000CD69A /* Resources */,\n\t\t\t\t6AAE6A421ACED92700FBC899 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tCD16030C1AC023D6000CD69A /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"ObjectMapper-macOSTests\";\n\t\t\tproductName = \"ObjectMapper-MacTests\";\n\t\t\tproductReference = CD1603091AC023D6000CD69A /* ObjectMapper-macOSTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\tDBB9B41E2142A25100078E5A /* ObjectMapper-Mac-Static */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = DBB9B4222142A25100078E5A /* Build configuration list for PBXNativeTarget \"ObjectMapper-Mac-Static\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tDBB9B41B2142A25100078E5A /* Sources */,\n\t\t\t\tDBB9B41C2142A25100078E5A /* Frameworks */,\n\t\t\t\tDBB9B41D2142A25100078E5A /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"ObjectMapper-Mac-Static\";\n\t\t\tproductName = ObjectMapper;\n\t\t\tproductReference = DBB9B41F2142A25100078E5A /* libObjectMapper.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t6AAC8F6D19F03C2900E7A677 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0710;\n\t\t\t\tLastUpgradeCheck = 1020;\n\t\t\t\tORGANIZATIONNAME = hearst;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t6A05B7A51BE274BE00F19B53 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.1;\n\t\t\t\t\t\tLastSwiftMigration = 1010;\n\t\t\t\t\t};\n\t\t\t\t\t6A05B7AE1BE274BE00F19B53 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.1;\n\t\t\t\t\t\tLastSwiftMigration = 1010;\n\t\t\t\t\t\tProvisioningStyle = Manual;\n\t\t\t\t\t};\n\t\t\t\t\t6A2AD03C1B2C78540097E150 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.0;\n\t\t\t\t\t\tLastSwiftMigration = 1010;\n\t\t\t\t\t};\n\t\t\t\t\t6AAC8F7519F03C2900E7A677 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.0.1;\n\t\t\t\t\t\tLastSwiftMigration = 0900;\n\t\t\t\t\t};\n\t\t\t\t\t6AAC8F8019F03C2900E7A677 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.0.1;\n\t\t\t\t\t\tLastSwiftMigration = 0900;\n\t\t\t\t\t};\n\t\t\t\t\tCD1602FE1AC023D5000CD69A = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.2;\n\t\t\t\t\t\tLastSwiftMigration = 1010;\n\t\t\t\t\t};\n\t\t\t\t\tCD1603081AC023D6000CD69A = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.2;\n\t\t\t\t\t\tLastSwiftMigration = 1010;\n\t\t\t\t\t};\n\t\t\t\t\tDBB9B41E2142A25100078E5A = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 9.4.1;\n\t\t\t\t\t\tLastSwiftMigration = 1010;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 6AAC8F7019F03C2900E7A677 /* Build configuration list for PBXProject \"ObjectMapper\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\tEnglish,\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 6AAC8F6C19F03C2900E7A677;\n\t\t\tproductRefGroup = 6AAC8F7719F03C2900E7A677 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t6AAC8F7519F03C2900E7A677 /* ObjectMapper-iOS */,\n\t\t\t\tCD1602FE1AC023D5000CD69A /* ObjectMapper-macOS */,\n\t\t\t\t6A2AD03C1B2C78540097E150 /* ObjectMapper-watchOS */,\n\t\t\t\t6A05B7A51BE274BE00F19B53 /* ObjectMapper-tvOS */,\n\t\t\t\t6AAC8F8019F03C2900E7A677 /* ObjectMapper-iOSTests */,\n\t\t\t\tCD1603081AC023D6000CD69A /* ObjectMapper-macOSTests */,\n\t\t\t\t6A05B7AE1BE274BE00F19B53 /* ObjectMapper-tvOSTests */,\n\t\t\t\tDBB9B41E2142A25100078E5A /* ObjectMapper-Mac-Static */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t6A05B7A41BE274BE00F19B53 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t6A05B7AD1BE274BE00F19B53 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t6A2AD03B1B2C78540097E150 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t6AAC8F7419F03C2900E7A677 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t6AAC8F7F19F03C2900E7A677 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCD1602FD1AC023D5000CD69A /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCD1603071AC023D6000CD69A /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t6A05B7A11BE274BE00F19B53 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t030E75F71E588BFC0027D94A /* IntegerOperators.swift in Sources */,\n\t\t\t\t6AA1F66E1BE991FF006EF513 /* Mappable.swift in Sources */,\n\t\t\t\t6AC692341BE3FD3A004C119A /* Map.swift in Sources */,\n\t\t\t\t6AF148901D99A7A6002BEA2C /* TransformOperators.swift in Sources */,\n\t\t\t\t6AC692351BE3FD3A004C119A /* Mapper.swift in Sources */,\n\t\t\t\t6AC692361BE3FD3A004C119A /* Operators.swift in Sources */,\n\t\t\t\t84D4F8551CC3B643008B0FB6 /* NSDecimalNumberTransform.swift in Sources */,\n\t\t\t\t6AC692371BE3FD3A004C119A /* FromJSON.swift in Sources */,\n\t\t\t\t6AF148951D99A7CA002BEA2C /* EnumOperators.swift in Sources */,\n\t\t\t\t997B4A4A1D3FA20D005E3F31 /* DictionaryTransform.swift in Sources */,\n\t\t\t\t6AC692381BE3FD3A004C119A /* ToJSON.swift in Sources */,\n\t\t\t\t6AC692391BE3FD3A004C119A /* DateTransform.swift in Sources */,\n\t\t\t\t6AC6923A1BE3FD3A004C119A /* DateFormatterTransform.swift in Sources */,\n\t\t\t\t6AC6923B1BE3FD3A004C119A /* ISO8601DateTransform.swift in Sources */,\n\t\t\t\t6AC6923C1BE3FD3A004C119A /* CustomDateFormatTransform.swift in Sources */,\n\t\t\t\t491D799F216FBA9B006DB931 /* CodableTransform.swift in Sources */,\n\t\t\t\t6AC6923D1BE3FD3A004C119A /* TransformOf.swift in Sources */,\n\t\t\t\t6AC6923E1BE3FD3A004C119A /* TransformType.swift in Sources */,\n\t\t\t\t6AC6923F1BE3FD3A004C119A /* URLTransform.swift in Sources */,\n\t\t\t\t6AC692401BE3FD3A004C119A /* EnumTransform.swift in Sources */,\n\t\t\t\t797FEDD01DAB856000E31F75 /* HexColorTransform.swift in Sources */,\n\t\t\t\t6AF1488B1D99A25B002BEA2C /* MapError.swift in Sources */,\n\t\t\t\tC135CABC1D7631DC00BA9338 /* DataTransform.swift in Sources */,\n\t\t\t\t030114B11D951A7500FBFD4F /* ImmutableMappable.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t6A05B7AB1BE274BE00F19B53 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t6AA1F66F1BE9921C006EF513 /* MappableExtensionsTests.swift in Sources */,\n\t\t\t\t891804CF1C122AF000E5C3EE /* MappableTypesWithTransformsTests.swift in Sources */,\n\t\t\t\t6AF148861D999E31002BEA2C /* GenericObjectsTests.swift in Sources */,\n\t\t\t\tC135CAB91D76303E00BA9338 /* DataTransformTests.swift in Sources */,\n\t\t\t\t6A442CA31CE251F100AB4F1F /* MapContextTests.swift in Sources */,\n\t\t\t\t6AA1F66B1BE94687006EF513 /* ClassClusterTests.swift in Sources */,\n\t\t\t\t6AECC9E81D79E29100222E7A /* DictionaryTransformTests.swift in Sources */,\n\t\t\t\t6AA1F66C1BE94687006EF513 /* PerformanceTests.swift in Sources */,\n\t\t\t\t491D7997216FB8B2006DB931 /* CodableTests.swift in Sources */,\n\t\t\t\t6AC692411BE3FD45004C119A /* BasicTypes.swift in Sources */,\n\t\t\t\tBA9D143D246BF0940037233E /* URLTransformTests.swift in Sources */,\n\t\t\t\t6A0BF2011C0B53470083D1AF /* ToObjectTests.swift in Sources */,\n\t\t\t\t84D4F8591CC3B71B008B0FB6 /* NSDecimalNumberTransformTests.swift in Sources */,\n\t\t\t\t6AC692421BE3FD45004C119A /* BasicTypesTestsFromJSON.swift in Sources */,\n\t\t\t\t6A715C4C1D05B1FA0054AD62 /* IgnoreNilTests.swift in Sources */,\n\t\t\t\t6AC692431BE3FD45004C119A /* BasicTypesTestsToJSON.swift in Sources */,\n\t\t\t\t6AC692441BE3FD45004C119A /* CustomTransformTests.swift in Sources */,\n\t\t\t\t6AC692451BE3FD45004C119A /* NestedKeysTests.swift in Sources */,\n\t\t\t\t6AC692461BE3FD45004C119A /* NestedArrayTests.swift in Sources */,\n\t\t\t\tDC99C8CE1CA261AE005C788C /* NullableKeysFromJSONTests.swift in Sources */,\n\t\t\t\t6AC692471BE3FD45004C119A /* ObjectMapperTests.swift in Sources */,\n\t\t\t\t030114AE1D951A5600FBFD4F /* ImmutableTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t6A2AD0381B2C78540097E150 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t030E75F61E588BF80027D94A /* IntegerOperators.swift in Sources */,\n\t\t\t\t6A2AD0451B2C786C0097E150 /* Mapper.swift in Sources */,\n\t\t\t\t3BAD2C0E1BDDB10D00E6B203 /* Mappable.swift in Sources */,\n\t\t\t\t6AF1488F1D99A7A6002BEA2C /* TransformOperators.swift in Sources */,\n\t\t\t\t6A2AD0461B2C786C0097E150 /* Operators.swift in Sources */,\n\t\t\t\t6ACB15D41BC7F1D0006C029C /* Map.swift in Sources */,\n\t\t\t\t84D4F8541CC3B643008B0FB6 /* NSDecimalNumberTransform.swift in Sources */,\n\t\t\t\t6A2AD0471B2C786C0097E150 /* FromJSON.swift in Sources */,\n\t\t\t\t6AF148941D99A7CA002BEA2C /* EnumOperators.swift in Sources */,\n\t\t\t\t997B4A491D3FA20D005E3F31 /* DictionaryTransform.swift in Sources */,\n\t\t\t\t6A2AD0481B2C786C0097E150 /* ToJSON.swift in Sources */,\n\t\t\t\t6A2AD0491B2C786C0097E150 /* DateTransform.swift in Sources */,\n\t\t\t\t6A2AD04A1B2C786C0097E150 /* DateFormatterTransform.swift in Sources */,\n\t\t\t\t6A2AD04B1B2C786C0097E150 /* ISO8601DateTransform.swift in Sources */,\n\t\t\t\t6A2AD04C1B2C786C0097E150 /* CustomDateFormatTransform.swift in Sources */,\n\t\t\t\t491D799E216FBA9B006DB931 /* CodableTransform.swift in Sources */,\n\t\t\t\t6A2AD04D1B2C786C0097E150 /* TransformOf.swift in Sources */,\n\t\t\t\t6A2AD04E1B2C786C0097E150 /* TransformType.swift in Sources */,\n\t\t\t\t6A2AD04F1B2C786C0097E150 /* URLTransform.swift in Sources */,\n\t\t\t\t6A2AD0501B2C786C0097E150 /* EnumTransform.swift in Sources */,\n\t\t\t\t797FEDCF1DAB855F00E31F75 /* HexColorTransform.swift in Sources */,\n\t\t\t\t6AF1488A1D99A25B002BEA2C /* MapError.swift in Sources */,\n\t\t\t\tC135CABB1D7631DB00BA9338 /* DataTransform.swift in Sources */,\n\t\t\t\t030114B01D951A7100FBFD4F /* ImmutableMappable.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t6AAC8F7119F03C2900E7A677 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t6AC53CAB1F031B85008BDDCD /* ImmutableMappable.swift in Sources */,\n\t\t\t\t37AFD9B91AAD191C00AB59B5 /* CustomDateFormatTransform.swift in Sources */,\n\t\t\t\t3BAD2C0C1BDDB10D00E6B203 /* Mappable.swift in Sources */,\n\t\t\t\t6AF1488D1D99A7A6002BEA2C /* TransformOperators.swift in Sources */,\n\t\t\t\tCD50B6FD1A82518300744312 /* TransformType.swift in Sources */,\n\t\t\t\t6ACB15D21BC7F1D0006C029C /* Map.swift in Sources */,\n\t\t\t\t84D4F8521CC3B643008B0FB6 /* NSDecimalNumberTransform.swift in Sources */,\n\t\t\t\t6AAC8FD319F048FE00E7A677 /* DateTransform.swift in Sources */,\n\t\t\t\t6AF148921D99A7CA002BEA2C /* EnumOperators.swift in Sources */,\n\t\t\t\t997B4A471D3FA20D005E3F31 /* DictionaryTransform.swift in Sources */,\n\t\t\t\tBC1E7F371ABC44C000F9B1CF /* EnumTransform.swift in Sources */,\n\t\t\t\tD86BDEA41A51E5AD00120819 /* ISO8601DateTransform.swift in Sources */,\n\t\t\t\tCD71C8C11A7218AD009D4161 /* TransformOf.swift in Sources */,\n\t\t\t\t6A6C54D019FE8DB600239454 /* URLTransform.swift in Sources */,\n\t\t\t\t038F0A031E55FE2400613148 /* IntegerOperators.swift in Sources */,\n\t\t\t\t491D799C216FBA9A006DB931 /* CodableTransform.swift in Sources */,\n\t\t\t\t6A51372C1AADDE2700B82516 /* DateFormatterTransform.swift in Sources */,\n\t\t\t\t6AAC8FCE19F048FE00E7A677 /* Mapper.swift in Sources */,\n\t\t\t\t6AAC8FCD19F048FE00E7A677 /* FromJSON.swift in Sources */,\n\t\t\t\t6AAC8FD119F048FE00E7A677 /* ToJSON.swift in Sources */,\n\t\t\t\t79E591C71DAB7FED008E2EEF /* HexColorTransform.swift in Sources */,\n\t\t\t\t6AF148881D99A25B002BEA2C /* MapError.swift in Sources */,\n\t\t\t\tC135CAB41D762F6900BA9338 /* DataTransform.swift in Sources */,\n\t\t\t\t6AAC8FCF19F048FE00E7A677 /* Operators.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t6AAC8F7D19F03C2900E7A677 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t3BAD2C101BDDC0B000E6B203 /* MappableExtensionsTests.swift in Sources */,\n\t\t\t\t891804CD1C122AF000E5C3EE /* MappableTypesWithTransformsTests.swift in Sources */,\n\t\t\t\t6AF148841D999E31002BEA2C /* GenericObjectsTests.swift in Sources */,\n\t\t\t\tC135CAB71D76303E00BA9338 /* DataTransformTests.swift in Sources */,\n\t\t\t\t6A442CA11CE251F100AB4F1F /* MapContextTests.swift in Sources */,\n\t\t\t\t6A6AEB961A93874F002573D3 /* BasicTypesTestsFromJSON.swift in Sources */,\n\t\t\t\t1865416F1E972FA800F95A19 /* URLTransformTests.swift in Sources */,\n\t\t\t\t6AECC9E61D79E29100222E7A /* DictionaryTransformTests.swift in Sources */,\n\t\t\t\t6A0BF1FF1C0B53470083D1AF /* ToObjectTests.swift in Sources */,\n\t\t\t\tCD44374D1AAE9C1100A271BA /* NestedKeysTests.swift in Sources */,\n\t\t\t\t491D7995216FB8B2006DB931 /* CodableTests.swift in Sources */,\n\t\t\t\t6A3774341A31427F00CC0AB5 /* BasicTypesTestsToJSON.swift in Sources */,\n\t\t\t\t84D4F8571CC3B71B008B0FB6 /* NSDecimalNumberTransformTests.swift in Sources */,\n\t\t\t\t6A412A171BAC770C001C3F67 /* ClassClusterTests.swift in Sources */,\n\t\t\t\t6A715C4A1D05B1FA0054AD62 /* IgnoreNilTests.swift in Sources */,\n\t\t\t\t6A51372F1AADE12C00B82516 /* CustomTransformTests.swift in Sources */,\n\t\t\t\t6A6AEB981A9387D0002573D3 /* BasicTypes.swift in Sources */,\n\t\t\t\t6A412A241BB0DA26001C3F67 /* PerformanceTests.swift in Sources */,\n\t\t\t\t6AAC8F8619F03C2900E7A677 /* ObjectMapperTests.swift in Sources */,\n\t\t\t\tDC99C8CC1CA261A8005C788C /* NullableKeysFromJSONTests.swift in Sources */,\n\t\t\t\t6100B1C01BD76A030011114A /* NestedArrayTests.swift in Sources */,\n\t\t\t\t6AC53CAC1F03FA1B008BDDCD /* ImmutableTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCD1602FA1AC023D5000CD69A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t030E75F51E588BF30027D94A /* IntegerOperators.swift in Sources */,\n\t\t\t\tCD1603221AC02472000CD69A /* TransformType.swift in Sources */,\n\t\t\t\t3BAD2C0D1BDDB10D00E6B203 /* Mappable.swift in Sources */,\n\t\t\t\t6AF1488E1D99A7A6002BEA2C /* TransformOperators.swift in Sources */,\n\t\t\t\t030114AF1D951A6C00FBFD4F /* ImmutableMappable.swift in Sources */,\n\t\t\t\tCD1603201AC02461000CD69A /* CustomDateFormatTransform.swift in Sources */,\n\t\t\t\tCD16031E1AC02461000CD69A /* DateFormatterTransform.swift in Sources */,\n\t\t\t\t84D4F8531CC3B643008B0FB6 /* NSDecimalNumberTransform.swift in Sources */,\n\t\t\t\t6AF148931D99A7CA002BEA2C /* EnumOperators.swift in Sources */,\n\t\t\t\t6ACB15D31BC7F1D0006C029C /* Map.swift in Sources */,\n\t\t\t\t997B4A481D3FA20D005E3F31 /* DictionaryTransform.swift in Sources */,\n\t\t\t\tCD1603241AC02472000CD69A /* EnumTransform.swift in Sources */,\n\t\t\t\tCD16031F1AC02461000CD69A /* ISO8601DateTransform.swift in Sources */,\n\t\t\t\tCD1603211AC02472000CD69A /* TransformOf.swift in Sources */,\n\t\t\t\tCD1603231AC02472000CD69A /* URLTransform.swift in Sources */,\n\t\t\t\t491D799D216FBA9A006DB931 /* CodableTransform.swift in Sources */,\n\t\t\t\tCD16031C1AC02451000CD69A /* ToJSON.swift in Sources */,\n\t\t\t\tCD16031D1AC02461000CD69A /* DateTransform.swift in Sources */,\n\t\t\t\tCD1603191AC02451000CD69A /* Mapper.swift in Sources */,\n\t\t\t\tCD16031A1AC02451000CD69A /* Operators.swift in Sources */,\n\t\t\t\t797FEDCE1DAB855F00E31F75 /* HexColorTransform.swift in Sources */,\n\t\t\t\t6AF148891D99A25B002BEA2C /* MapError.swift in Sources */,\n\t\t\t\tCD16031B1AC02451000CD69A /* FromJSON.swift in Sources */,\n\t\t\t\tC135CABA1D7631DB00BA9338 /* DataTransform.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCD1603051AC023D6000CD69A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t3BAD2C111BDDC0B000E6B203 /* MappableExtensionsTests.swift in Sources */,\n\t\t\t\t891804CE1C122AF000E5C3EE /* MappableTypesWithTransformsTests.swift in Sources */,\n\t\t\t\t6AF148851D999E31002BEA2C /* GenericObjectsTests.swift in Sources */,\n\t\t\t\tC135CAB81D76303E00BA9338 /* DataTransformTests.swift in Sources */,\n\t\t\t\t6A442CA21CE251F100AB4F1F /* MapContextTests.swift in Sources */,\n\t\t\t\t6AA1F66D1BE9468D006EF513 /* NestedArrayTests.swift in Sources */,\n\t\t\t\t6AECC9E71D79E29100222E7A /* DictionaryTransformTests.swift in Sources */,\n\t\t\t\t6A412A181BAC830B001C3F67 /* ClassClusterTests.swift in Sources */,\n\t\t\t\t491D7996216FB8B2006DB931 /* CodableTests.swift in Sources */,\n\t\t\t\tCD1603261AC02480000CD69A /* BasicTypesTestsFromJSON.swift in Sources */,\n\t\t\t\tBA9D143C246BF0930037233E /* URLTransformTests.swift in Sources */,\n\t\t\t\t6A0BF2001C0B53470083D1AF /* ToObjectTests.swift in Sources */,\n\t\t\t\t84D4F8581CC3B71B008B0FB6 /* NSDecimalNumberTransformTests.swift in Sources */,\n\t\t\t\tCD1603291AC02480000CD69A /* NestedKeysTests.swift in Sources */,\n\t\t\t\t6A715C4B1D05B1FA0054AD62 /* IgnoreNilTests.swift in Sources */,\n\t\t\t\tCD1603251AC02480000CD69A /* BasicTypes.swift in Sources */,\n\t\t\t\tCD16032A1AC02480000CD69A /* ObjectMapperTests.swift in Sources */,\n\t\t\t\tCD1603271AC02480000CD69A /* BasicTypesTestsToJSON.swift in Sources */,\n\t\t\t\t6A412A251BB0DA26001C3F67 /* PerformanceTests.swift in Sources */,\n\t\t\t\tDC99C8CD1CA261AD005C788C /* NullableKeysFromJSONTests.swift in Sources */,\n\t\t\t\tCD1603281AC02480000CD69A /* CustomTransformTests.swift in Sources */,\n\t\t\t\t030114AD1D951A5300FBFD4F /* ImmutableTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tDBB9B41B2142A25100078E5A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tDBB9B4332142A2ED00078E5A /* DictionaryTransform.swift in Sources */,\n\t\t\t\tDBB9B4312142A2ED00078E5A /* EnumTransform.swift in Sources */,\n\t\t\t\tDBB9B4292142A2E600078E5A /* EnumOperators.swift in Sources */,\n\t\t\t\tDBB9B42B2142A2E600078E5A /* IntegerOperators.swift in Sources */,\n\t\t\t\tDBB9B4302142A2ED00078E5A /* URLTransform.swift in Sources */,\n\t\t\t\tDBB9B4262142A2E100078E5A /* ImmutableMappable.swift in Sources */,\n\t\t\t\tDBB9B42F2142A2ED00078E5A /* TransformType.swift in Sources */,\n\t\t\t\tDBB9B42D2142A2E600078E5A /* ToJSON.swift in Sources */,\n\t\t\t\tDBB9B4232142A2D800078E5A /* Map.swift in Sources */,\n\t\t\t\tDBB9B4252142A2E100078E5A /* Mappable.swift in Sources */,\n\t\t\t\tDBB9B42C2142A2E600078E5A /* FromJSON.swift in Sources */,\n\t\t\t\tDBB9B4372142A2F200078E5A /* DateFormatterTransform.swift in Sources */,\n\t\t\t\tDBB9B4242142A2E100078E5A /* MapError.swift in Sources */,\n\t\t\t\tDBB9B4392142A2F200078E5A /* CustomDateFormatTransform.swift in Sources */,\n\t\t\t\tDBB9B4272142A2E100078E5A /* Mapper.swift in Sources */,\n\t\t\t\tDBB9B42E2142A2ED00078E5A /* TransformOf.swift in Sources */,\n\t\t\t\tDBB9B4352142A2ED00078E5A /* HexColorTransform.swift in Sources */,\n\t\t\t\tDBB9B42A2142A2E600078E5A /* TransformOperators.swift in Sources */,\n\t\t\t\tDBB9B4382142A2F200078E5A /* ISO8601DateTransform.swift in Sources */,\n\t\t\t\tDBB9B4362142A2F200078E5A /* DateTransform.swift in Sources */,\n\t\t\t\tDBB9B4322142A2ED00078E5A /* NSDecimalNumberTransform.swift in Sources */,\n\t\t\t\tDBB9B4342142A2ED00078E5A /* DataTransform.swift in Sources */,\n\t\t\t\tDBB9B4282142A2E600078E5A /* Operators.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t6A05B7B21BE274BE00F19B53 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 6A05B7A51BE274BE00F19B53 /* ObjectMapper-tvOS */;\n\t\t\ttargetProxy = 6A05B7B11BE274BE00F19B53 /* PBXContainerItemProxy */;\n\t\t};\n\t\t6AAC8FD619F04A5600E7A677 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 6AAC8F7519F03C2900E7A677 /* ObjectMapper-iOS */;\n\t\t\ttargetProxy = 6AAC8FD519F04A5600E7A677 /* PBXContainerItemProxy */;\n\t\t};\n\t\tCD16030C1AC023D6000CD69A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = CD1602FE1AC023D5000CD69A /* ObjectMapper-macOS */;\n\t\t\ttargetProxy = CD16030B1AC023D6000CD69A /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\t6A05B7B71BE274BE00F19B53 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tBITCODE_GENERATION_MODE = marker;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_BITCODE = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = Sources/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.tristanhimmelman.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(PROJECT_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 3;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 2.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t6A05B7B81BE274BE00F19B53 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tBITCODE_GENERATION_MODE = bitcode;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Distribution\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_BITCODE = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = Sources/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.tristanhimmelman.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(PROJECT_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 3;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 2.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t6A05B7B91BE274BE00F19B53 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.tristanhimmelman.ObjectMapper-tvOSTests\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t6A05B7BA1BE274BE00F19B53 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.tristanhimmelman.ObjectMapper-tvOSTests\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t6A2AD0421B2C78540097E150 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tBITCODE_GENERATION_MODE = marker;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_BITCODE = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = Sources/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.tristanhimmelman.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(PROJECT_NAME)\";\n\t\t\t\tSDKROOT = watchos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 4;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 2.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t6A2AD0431B2C78540097E150 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tBITCODE_GENERATION_MODE = bitcode;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_BITCODE = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = Sources/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.tristanhimmelman.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(PROJECT_NAME)\";\n\t\t\t\tSDKROOT = watchos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 4;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 2.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t6AAC8F8719F03C2900E7A677 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.9;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t6AAC8F8819F03C2900E7A677 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.9;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t6AAC8F8A19F03C2900E7A677 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tBITCODE_GENERATION_MODE = marker;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINFOPLIST_FILE = Sources/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.tristanhimmelman.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(PROJECT_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 2.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t6AAC8F8B19F03C2900E7A677 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tBITCODE_GENERATION_MODE = bitcode;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINFOPLIST_FILE = Sources/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.tristanhimmelman.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(PROJECT_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 2.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t6AAC8F8D19F03C2900E7A677 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.heart.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t6AAC8F8E19F03C2900E7A677 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.heart.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tCD1603121AC023D6000CD69A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tBITCODE_GENERATION_MODE = marker;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"Mac Developer\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tFRAMEWORK_VERSION = A;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Sources/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.tristanhimmelman.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(PROJECT_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 2.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tCD1603131AC023D6000CD69A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tBITCODE_GENERATION_MODE = bitcode;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"3rd Party Mac Developer Application\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tFRAMEWORK_VERSION = A;\n\t\t\t\tINFOPLIST_FILE = Sources/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.tristanhimmelman.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(PROJECT_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 2.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tCD1603141AC023D6000CD69A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.heart.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tCD1603151AC023D6000CD69A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.heart.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tDBB9B4202142A25100078E5A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tEXECUTABLE_PREFIX = lib;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.13;\n\t\t\t\tPRODUCT_NAME = ObjectMapper;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tDBB9B4212142A25100078E5A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tEXECUTABLE_PREFIX = lib;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.13;\n\t\t\t\tPRODUCT_NAME = ObjectMapper;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t6A05B7BB1BE274BE00F19B53 /* Build configuration list for PBXNativeTarget \"ObjectMapper-tvOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t6A05B7B71BE274BE00F19B53 /* Debug */,\n\t\t\t\t6A05B7B81BE274BE00F19B53 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t6A05B7BC1BE274BE00F19B53 /* Build configuration list for PBXNativeTarget \"ObjectMapper-tvOSTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t6A05B7B91BE274BE00F19B53 /* Debug */,\n\t\t\t\t6A05B7BA1BE274BE00F19B53 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t6A2AD0441B2C78540097E150 /* Build configuration list for PBXNativeTarget \"ObjectMapper-watchOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t6A2AD0421B2C78540097E150 /* Debug */,\n\t\t\t\t6A2AD0431B2C78540097E150 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t6AAC8F7019F03C2900E7A677 /* Build configuration list for PBXProject \"ObjectMapper\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t6AAC8F8719F03C2900E7A677 /* Debug */,\n\t\t\t\t6AAC8F8819F03C2900E7A677 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t6AAC8F8919F03C2900E7A677 /* Build configuration list for PBXNativeTarget \"ObjectMapper-iOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t6AAC8F8A19F03C2900E7A677 /* Debug */,\n\t\t\t\t6AAC8F8B19F03C2900E7A677 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t6AAC8F8C19F03C2900E7A677 /* Build configuration list for PBXNativeTarget \"ObjectMapper-iOSTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t6AAC8F8D19F03C2900E7A677 /* Debug */,\n\t\t\t\t6AAC8F8E19F03C2900E7A677 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tCD1603161AC023D6000CD69A /* Build configuration list for PBXNativeTarget \"ObjectMapper-macOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tCD1603121AC023D6000CD69A /* Debug */,\n\t\t\t\tCD1603131AC023D6000CD69A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tCD1603171AC023D6000CD69A /* Build configuration list for PBXNativeTarget \"ObjectMapper-macOSTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tCD1603141AC023D6000CD69A /* Debug */,\n\t\t\t\tCD1603151AC023D6000CD69A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tDBB9B4222142A25100078E5A /* Build configuration list for PBXNativeTarget \"ObjectMapper-Mac-Static\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tDBB9B4202142A25100078E5A /* Debug */,\n\t\t\t\tDBB9B4212142A25100078E5A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 6AAC8F6D19F03C2900E7A677 /* Project object */;\n}\n"
  },
  {
    "path": "ObjectMapper.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:ObjectMapper.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "ObjectMapper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "ObjectMapper.xcodeproj/xcshareddata/xcschemes/ObjectMapper-Mac.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1020\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"CD1602FE1AC023D5000CD69A\"\n               BuildableName = \"ObjectMapper.framework\"\n               BlueprintName = \"ObjectMapper-macOS\"\n               ReferencedContainer = \"container:ObjectMapper.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"NO\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"CD1603081AC023D6000CD69A\"\n               BuildableName = \"ObjectMapper-macOSTests.xctest\"\n               BlueprintName = \"ObjectMapper-macOSTests\"\n               ReferencedContainer = \"container:ObjectMapper.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Release\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"CD1602FE1AC023D5000CD69A\"\n            BuildableName = \"ObjectMapper.framework\"\n            BlueprintName = \"ObjectMapper-macOS\"\n            ReferencedContainer = \"container:ObjectMapper.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"CD1603081AC023D6000CD69A\"\n               BuildableName = \"ObjectMapper-macOSTests.xctest\"\n               BlueprintName = \"ObjectMapper-macOSTests\"\n               ReferencedContainer = \"container:ObjectMapper.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"CD1602FE1AC023D5000CD69A\"\n            BuildableName = \"ObjectMapper.framework\"\n            BlueprintName = \"ObjectMapper-macOS\"\n            ReferencedContainer = \"container:ObjectMapper.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"CD1602FE1AC023D5000CD69A\"\n            BuildableName = \"ObjectMapper.framework\"\n            BlueprintName = \"ObjectMapper-macOS\"\n            ReferencedContainer = \"container:ObjectMapper.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "ObjectMapper.xcodeproj/xcshareddata/xcschemes/ObjectMapper-iOS.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1020\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"6AAC8F7519F03C2900E7A677\"\n               BuildableName = \"ObjectMapper.framework\"\n               BlueprintName = \"ObjectMapper-iOS\"\n               ReferencedContainer = \"container:ObjectMapper.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"NO\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"6AAC8F8019F03C2900E7A677\"\n               BuildableName = \"ObjectMapper-iOSTests.xctest\"\n               BlueprintName = \"ObjectMapper-iOSTests\"\n               ReferencedContainer = \"container:ObjectMapper.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Release\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"6AAC8F7519F03C2900E7A677\"\n            BuildableName = \"ObjectMapper.framework\"\n            BlueprintName = \"ObjectMapper-iOS\"\n            ReferencedContainer = \"container:ObjectMapper.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"6AAC8F8019F03C2900E7A677\"\n               BuildableName = \"ObjectMapper-iOSTests.xctest\"\n               BlueprintName = \"ObjectMapper-iOSTests\"\n               ReferencedContainer = \"container:ObjectMapper.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"6AAC8F7519F03C2900E7A677\"\n            BuildableName = \"ObjectMapper.framework\"\n            BlueprintName = \"ObjectMapper-iOS\"\n            ReferencedContainer = \"container:ObjectMapper.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"6AAC8F7519F03C2900E7A677\"\n            BuildableName = \"ObjectMapper.framework\"\n            BlueprintName = \"ObjectMapper-iOS\"\n            ReferencedContainer = \"container:ObjectMapper.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "ObjectMapper.xcodeproj/xcshareddata/xcschemes/ObjectMapper-tvOS.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1020\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"6A05B7A51BE274BE00F19B53\"\n               BuildableName = \"ObjectMapper.framework\"\n               BlueprintName = \"ObjectMapper-tvOS\"\n               ReferencedContainer = \"container:ObjectMapper.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"6A05B7A51BE274BE00F19B53\"\n            BuildableName = \"ObjectMapper.framework\"\n            BlueprintName = \"ObjectMapper-tvOS\"\n            ReferencedContainer = \"container:ObjectMapper.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"6A05B7AE1BE274BE00F19B53\"\n               BuildableName = \"ObjectMapper-tvOSTests.xctest\"\n               BlueprintName = \"ObjectMapper-tvOSTests\"\n               ReferencedContainer = \"container:ObjectMapper.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"6A05B7A51BE274BE00F19B53\"\n            BuildableName = \"ObjectMapper.framework\"\n            BlueprintName = \"ObjectMapper-tvOS\"\n            ReferencedContainer = \"container:ObjectMapper.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"6A05B7A51BE274BE00F19B53\"\n            BuildableName = \"ObjectMapper.framework\"\n            BlueprintName = \"ObjectMapper-tvOS\"\n            ReferencedContainer = \"container:ObjectMapper.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "ObjectMapper.xcodeproj/xcshareddata/xcschemes/ObjectMapper-watchOS.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1020\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"6A2AD03C1B2C78540097E150\"\n               BuildableName = \"ObjectMapper.framework\"\n               BlueprintName = \"ObjectMapper-watchOS\"\n               ReferencedContainer = \"container:ObjectMapper.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"6A2AD03C1B2C78540097E150\"\n            BuildableName = \"ObjectMapper.framework\"\n            BlueprintName = \"ObjectMapper-watchOS\"\n            ReferencedContainer = \"container:ObjectMapper.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"6A2098072193AA00009AB4DF\"\n               BuildableName = \"ObjectMapper-watchOSTests.xctest\"\n               BlueprintName = \"ObjectMapper-watchOSTests\"\n               ReferencedContainer = \"container:ObjectMapper.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"6A2AD03C1B2C78540097E150\"\n            BuildableName = \"ObjectMapper.framework\"\n            BlueprintName = \"ObjectMapper-watchOS\"\n            ReferencedContainer = \"container:ObjectMapper.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"6A2AD03C1B2C78540097E150\"\n            BuildableName = \"ObjectMapper.framework\"\n            BlueprintName = \"ObjectMapper-watchOS\"\n            ReferencedContainer = \"container:ObjectMapper.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "ObjectMapper.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:ObjectMapper.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "ObjectMapper.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "ObjectMapper.xcworkspace/xcshareddata/ObjectMapper.xcscmblueprint",
    "content": "{\n  \"DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey\" : \"58AAB0051E2B4EEDF1845A552012E6D0EBAD9127\",\n  \"DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey\" : {\n\n  },\n  \"DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey\" : {\n    \"58AAB0051E2B4EEDF1845A552012E6D0EBAD9127\" : 0,\n    \"95438028B10BBB846574013D29F154A00556A9D1\" : 0\n  },\n  \"DVTSourceControlWorkspaceBlueprintIdentifierKey\" : \"A42BB54B-7EE9-41B5-B851-0FC3BB5A9811\",\n  \"DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey\" : {\n    \"58AAB0051E2B4EEDF1845A552012E6D0EBAD9127\" : \"ObjectMapper\\/\",\n    \"95438028B10BBB846574013D29F154A00556A9D1\" : \"ObjectMapperCarthage\\/Checkouts\\/Nimble\"\n  },\n  \"DVTSourceControlWorkspaceBlueprintNameKey\" : \"ObjectMapper\",\n  \"DVTSourceControlWorkspaceBlueprintVersion\" : 204,\n  \"DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey\" : \"ObjectMapper.xcworkspace\",\n  \"DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey\" : [\n    {\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey\" : \"https:\\/\\/github.com\\/Hearst-DD\\/ObjectMapper.git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey\" : \"com.apple.dt.Xcode.sourcecontrol.Git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey\" : \"58AAB0051E2B4EEDF1845A552012E6D0EBAD9127\"\n    },\n    {\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey\" : \"https:\\/\\/github.com\\/Quick\\/Nimble.git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey\" : \"com.apple.dt.Xcode.sourcecontrol.Git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey\" : \"95438028B10BBB846574013D29F154A00556A9D1\"\n    }\n  ]\n}"
  },
  {
    "path": "Package.swift",
    "content": "// swift-tools-version:5.5\n\nimport PackageDescription\n\nlet package = Package(name: \"ObjectMapper\",\n                      platforms: [.macOS(.v12),\n                                  .iOS(.v13),\n                                  .tvOS(.v9),\n                                  .watchOS(.v2)],\n                      products: [.library(name: \"ObjectMapper\",\n                                          targets: [\"ObjectMapper\"])],\n                      targets: [.target(name: \"ObjectMapper\",\n                                        path: \"Sources\"),\n                                .testTarget(name: \"ObjectMapperTests\",\n                                            dependencies: [\"ObjectMapper\"],\n                                            path: \"Tests\")],\n                      swiftLanguageVersions: [.v5])\n"
  },
  {
    "path": "Package@swift-4.2.swift",
    "content": "// swift-tools-version:4.2\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"ObjectMapper\",\n    products: [\n        .library(name: \"ObjectMapper\", targets: [\"ObjectMapper\"]),\n    ],\n    targets: [\n        .target(\n            name: \"ObjectMapper\", \n            path: \"Sources\"\n        )\n    ],\n    swiftLanguageVersions: [.v3, .v4, .v4_2]\n)\n"
  },
  {
    "path": "Package@swift-4.swift",
    "content": "// swift-tools-version:4.0\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"ObjectMapper\",\n    products: [\n        .library(name: \"ObjectMapper\", targets: [\"ObjectMapper\"]),\n    ],\n    targets: [\n        .target(\n            name: \"ObjectMapper\", \n            path: \"Sources\"\n        )\n    ],\n    swiftLanguageVersions = [3, 4]\n)\n"
  },
  {
    "path": "README-CN.md",
    "content": "# ObjectMapper-CN-Guide\n> 文档由Swift老司机活动中心负责翻译，欢迎关注[@SwiftOldDriver](http://weibo.com/6062089411)。翻译有问题可以到 [ObjectMapper-CN-Guide](https://github.com/SwiftOldDriver/ObjectMapper-CN-Guide) 提 PR。\n\n[ObjectMapper](https://github.com/Hearst-DD/ObjectMapper) 是一个使用 Swift 编写的用于 model 对象（类和结构体）和 JSON  之间转换的框架。\n\n- [特性](#特性)\n- [基础使用方法](#基础使用方法)\n- [映射嵌套对象](#映射嵌套对象)\n- [自定义转换规则](#自定义转换规则)\n- [继承](#继承)\n- [泛型对象](#泛型对象)\n- [映射时的上下文对象](#映射时的上下文对象)\n- [ObjectMapper + Alamofire](#objectmapper--alamofire) \n- [ObjectMapper + Realm](#objectmapper--realm)\n- [待完成](#待完成)\n- [安装](#安装)\n\n# 特性:\n- 把 JSON 映射成对象 \n- 把对象映射 JSON\n- 支持嵌套对象 (单独的成员变量、在数组或字典中都可以)\n- 在转换过程支持自定义规则\n- 支持结构体（ Struct ）\n- [Immutable support](#immutablemappable-protocol-beta) (目前还在 beta )\n\n# 基础使用方法\n为了支持映射，类或者结构体只需要实现```Mappable```协议。这个协议包含以下方法：\n```swift\ninit?(map: Map)\nmutating func mapping(map: Map)\n```\nObjectMapper使用自定义的```<-``` 运算符来声明成员变量和 JSON 的映射关系。\n```swift\nclass User: Mappable {\n    var username: String?\n    var age: Int?\n    var weight: Double!\n    var array: [AnyObject]?\n    var dictionary: [String : AnyObject] = [:]\n    var bestFriend: User?                       // 嵌套的 User 对象\n    var friends: [User]?                        // Users 的数组\n    var birthday: NSDate?\n\n    required init?(map: Map) {\n\n    }\n\n    // Mappable\n    func mapping(map: Map) {\n        username    <- map[\"username\"]\n        age         <- map[\"age\"]\n        weight      <- map[\"weight\"]\n        array       <- map[\"arr\"]\n        dictionary  <- map[\"dict\"]\n        bestFriend  <- map[\"best_friend\"]\n        friends     <- map[\"friends\"]\n        birthday    <- (map[\"birthday\"], DateTransform())\n    }\n}\n\nstruct Temperature: Mappable {\n    var celsius: Double?\n    var fahrenheit: Double?\n\n    init?(map: Map) {\n\n    }\n\n    mutating func mapping(map: Map) {\n        celsius \t<- map[\"celsius\"]\n        fahrenheit \t<- map[\"fahrenheit\"]\n    }\n}\n```\n\n一旦你的对象实现了 `Mappable`, ObjectMapper就可以让你轻松的实现和 JSON 之间的转换。\n\n把 JSON 字符串转成 model 对象：\n\n```swift\nlet user = User(JSONString: JSONString)\n```\n\n把一个 model 转成 JSON 字符串：\n\n```swift\nlet JSONString = user.toJSONString(prettyPrint: true)\n```\n\n也可以使用`Mapper.swift`类来完成转换（这个类还额外提供了一些函数来处理一些特殊的情况：\n\n```swift\n// 把 JSON 字符串转成 Model\nlet user = Mapper<User>().map(JSONString: JSONString)\n// 根据 Model 生成 JSON 字符串\nlet JSONString = Mapper().toJSONString(user, prettyPrint: true)\n```\n\nObjectMapper支持以下的类型映射到对象中：\n\n- `Int`\n- `Bool`\n- `Double`\n- `Float`\n- `String`\n- `RawRepresentable` (枚举)\n- `Array<AnyObject>`\n- `Dictionary<String, AnyObject>`\n- `Object<T: Mappable>`\n- `Array<T: Mappable>`\n- `Array<Array<T: Mappable>>`\n- `Set<T: Mappable>` \n- `Dictionary<String, T: Mappable>`\n- `Dictionary<String, Array<T: Mappable>>`\n- 以上所有的 Optional 类型\n- 以上所有的隐式强制解包类型（Implicitly Unwrapped Optional）\n\n## `Mappable` 协议\n\n#### `mutating func mapping(map: Map)` \n所有的映射最后都会调用到这个函数。当解析 JSON 时，这个函数会在对象创建成功后被执行。当生成 JSON 时就只有这个函数会被对象调用。\n\n#### `init?(map: Map)` \n这个可失败的初始化函数是 ObjectMapper 创建对象的时候使用的。开发者可以通过这个函数在映射前校验 JSON 。如果在这个方法里返回 nil 就不会执行 `mapping` 函数。可以通过传入的保存着 JSON 的  `Map` 对象进行校验：\n\n```swift\nrequired init?(map: Map){\n\t// 检查 JSON 里是否有一定要有的 \"name\" 属性\n\tif map.JSONDictionary[\"name\"] == nil {\n\t\treturn nil\n\t}\n}\n```\n\n## `StaticMappable` 协议\n`StaticMappable` 是 `Mappable` 之外的另一种选择。 这个协议可以让开发者通过一个静态函数初始化对象而不是通过 `init?(map: Map)`。\n\n注意: `StaticMappable` 和 `Mappable` 都继承了 `BaseMappable` 协议。 `BaseMappable` 协议声明了 `mapping(map: Map)` 函数。\n\n#### `static func objectForMapping(map: Map) -> BaseMappable?` \nObjectMapper 使用这个函数获取对象后进行映射。开发者需要在这个函数里返回一个实现 `BaseMappable` 对象的实例。这个函数也可以用于：\n\n- 在对象进行映射前校验 JSON \n- 提供一个缓存过的对象用于映射\n- 返回另外一种类型的对象（当然是必须实现了 BaseMappable）用于映射。比如你可能通过检查 JSON 推断出用于映射的对象 ([看这个例子](https://github.com/Hearst-DD/ObjectMapper/blob/master/ObjectMapperTests/ClassClusterTests.swift#L62))。\n\n如果你需要在 extension 里实现 ObjectMapper，你需要选择这个协议而不是 `Mappable` 。\n\n## `ImmutableMappable` Protocol\n\n使用 `ImmutableMappable` 可以映射不可变的属性。下面的表格展示了 `ImmutableMappable` 和 `Mappable` 的不同：\n\n<table>\n  <tr>\n    <th>ImmutableMappable</th>\n    <th>Mappable</th>\n  </tr>\n  <tr>\n    <th colspan=\"2\">Properties</th>\n  </tr>\n  <tr>\n    <td>\n<pre>\n<strong>let</strong> id: Int\n<strong>let</strong> name: String?\n</pre>\n  </td>\n    <td>\n<pre>\nvar id: Int!\nvar name: String?\n</pre>\n    </td>\n  </tr>\n  <tr>\n    <th colspan=\"2\">JSON -> Model</th>\n  </tr>\n  <tr>\n    <td>\n<pre>\ninit(map: Map) <strong>throws</strong> {\n  id   = <strong>try</strong> map.value(\"id\")\n  name = <strong>try?</strong> map.value(\"name\")\n}\n</pre>\n  </td>\n    <td>\n<pre>\nmutating func mapping(map: Map) {\n  id   <- map[\"id\"]\n  name <- map[\"name\"]\n}\n</pre>\n    </td>\n  </tr>\n  <tr>\n    <th colspan=\"2\">Model -> JSON</th>\n  </tr>\n  <tr>\n    <td>\n<pre>\nmutating func mapping(map: Map) {\n  id   <strong>>>></strong> map[\"id\"]\n  name <strong>>>></strong> map[\"name\"]\n}\n</pre>\n    </td>\n    <td>\n<pre>\nmutating func mapping(map: Map) {\n  id   <- map[\"id\"]\n  name <- map[\"name\"]\n}\n</pre>\n    </td>\n  </tr>\n  <tr>\n    <th colspan=\"2\">Initializing</th>\n  </tr>\n  <tr>\n    <td>\n<pre>\n<strong>try</strong> User(JSONString: JSONString)\n</pre>\n    </td>\n    <td>\n<pre>\nUser(JSONString: JSONString)\n</pre>\n    </td>\n  </tr>\n</table>\n\n#### `init(map: Map) throws`\n\n这个可能抛出异常的初始化函数用于在提供的 `Map` 里映射不可变属性。每个不可变的初始化属性都要在这个初始化函数里初始化。\n\n当发生下列情况时初始化函数会抛出一个错误：\n\n- `Map` 根据提供的键名获取不到对应值\n- `Map` 使用 `Transform` 后没有得到值 \n\n`ImmutableMappable` 使用 `Map.value(_:using:)` 方法从  `Map` 中获取值。因为可能抛出异常，这个方法在使用时需要使用  `try` 关键字。 `Optional` 的属性可以简单的用  `try?` 处理。\n\n```swift\ninit(map: Map) throws {\n    name      = try map.value(\"name\") // throws an error when it fails\n    createdAt = try map.value(\"createdAt\", using: DateTransform()) // throws an error when it fails\n    updatedAt = try? map.value(\"updatedAt\", using: DateTransform()) // optional\n    posts     = (try? map.value(\"posts\")) ?? [] // optional + default value\n}\n```\n\n#### `mutating func mapping(map: Map)`\n\n这个方法是在 Model 转回 JSON 时调用的。因为不可变的属性不能被 `<-` 映射，所以映射回来时需要使用 `>>>` 。\n\n```swift\nmutating func mapping(map: Map) {\n    name      >>> map[\"name\"]\n    createdAt >>> (map[\"createdAt\"], DateTransform())\n    updatedAt >>> (map[\"updatedAt\"], DateTransform())\n    posts     >>> map[\"posts\"]\n}\n```\n# 轻松映射嵌套对象\n\nObjectMapper 支持使用点语法来轻松实现嵌套对象的映射。比如有如下的 JSON 字符串：\n\n```json\n\"distance\" : {\n     \"text\" : \"102 ft\",\n     \"value\" : 31\n}\n```\n你可以通过这种写法直接访问到嵌套对象：\n\n```swift\nfunc mapping(map: Map) {\n    distance <- map[\"distance.value\"]\n}\n```\n嵌套的键名也支持访问数组中的值。如果有一个返回的 JSON 是一个包含 distance 的数组，可以通过这种写法访问：\n\n```\ndistance <- map[\"distances.0.value\"]\n```\n如果你的键名刚好含有 `.` 符号，你需要特别声明关闭上面提到的获取嵌套对象功能：\n\n```swift\nfunc mapping(map: Map) {\n    identifier <- map[\"app.identifier\", nested: false]\n}\n```\n如果刚好有嵌套的对象的键名还有 `.` ,可以在中间加入一个自定义的分割符（[#629](https://github.com/Hearst-DD/ObjectMapper/pull/629)）:\n```swift\nfunc mapping(map: Map) {\n    appName <- map[\"com.myapp.info->com.myapp.name\", delimiter: \"->\"]\n}\n```\n这种情况的 JSON 是这样的：\n\n```json\n\"com.myapp.info\" : {\n     \"com.myapp.name\" : \"SwiftOldDriver\"\n}\n```\n\n# 自定义转换规则\nObjectMapper 也支持在映射时自定义转换规则。如果要使用自定义转换，创建一个 tuple（元祖）包含 ```map[\"field_name\"]``` 和你要使用的变换放在 ```<-``` 的右边：\n\n```swift\nbirthday <- (map[\"birthday\"], DateTransform())\n```\n当解析 JSON 时上面的转换会把 JSON 里面的 Int 值转成一个 NSDate ，如果是对象转为 JSON 时，则会把 NSDate 对象转成 Int 值。\n\n只要实现```TransformType``` 协议就可以轻松的创建自定义的转换规则：\n\n```swift\npublic protocol TransformType {\n    associatedtype Object\n    associatedtype JSON\n\n    func transformFromJSON(_ value: Any?) -> Object?\n    func transformToJSON(_ value: Object?) -> JSON?\n}\n```\n\n### TransformOf\n大多数情况下你都可以使用框架提供的转换类 ```TransformOf``` 来快速的实现一个期望的转换。 ```TransformOf``` 的初始化需要两个类型和两个闭包。两个类型声明了转换的目标类型和源类型，闭包则实现具体转换逻辑。\n\n举个例子，如果你想要把一个 JSON 字符串转成 Int ，你可以像这样使用 ```TransformOf``` ：\n\n```swift\nlet transform = TransformOf<Int, String>(fromJSON: { (value: String?) -> Int? in \n    // 把值从 String? 转成 Int?\n    return Int(value!)\n}, toJSON: { (value: Int?) -> String? in\n    // 把值从 Int? 转成 String?\n    if let value = value {\n        return String(value)\n    }\n    return nil\n})\n\nid <- (map[\"id\"], transform)\n```\n这是一种更省略的写法：\n\n```swift\nid <- (map[\"id\"], TransformOf<Int, String>(fromJSON: { Int($0!) }, toJSON: { $0.map { String($0) } }))\n```\n# 继承\n\n实现了  ```Mappable``` 协议的类可以容易的被继承。当继承一个 mappable 的类时，使用这样的结构：\n\n```swift\nclass Base: Mappable {\n\tvar base: String?\n\t\n\trequired init?(map: Map) {\n\n\t}\n\n\tfunc mapping(map: Map) {\n\t\tbase <- map[\"base\"]\n\t}\n}\n\nclass Subclass: Base {\n\tvar sub: String?\n\n\trequired init?(map: Map) {\n\t\tsuper.init(map)\n\t}\n\n\toverride func mapping(map: Map) {\n\t\tsuper.mapping(map)\n\t\t\n\t\tsub <- map[\"sub\"]\n\t}\n}\n```\n\n注意确认子类中的实现调用了父类中正确的初始化器和映射函数。\n\n# 泛型对象\n\nObjectMapper 可以处理泛型只要这个泛型也实现了`Mappable`协议。看这个例子：\n\n```swift\nclass Result<T: Mappable>: Mappable {\n    var result: T?\n\n    required init?(map: Map){\n\n    }\n\n    func mapping(map: Map) {\n        result <- map[\"result\"]\n    }\n}\n\nlet result = Mapper<Result<User>>().map(JSON)\n```\n# 映射时的上下文对象\n\n`Map` 是在映射时传入的对象，带有一个 optional  `MapContext` 对象，开发者可以通过使用这个对象在映射时传入一些信息。\n\n为了使用这个特性，需要先创建一个对象实现了 `MapContext` 协议（这个协议是空的），然后在初始化时传入 `Mapper` 中。\n\n```swift\nstruct Context: MapContext {\n\tvar importantMappingInfo = \"映射时需要知道的额外信息\"\n}\n\nclass User: Mappable {\n\tvar name: String?\n\t\n\trequired init?(map: Map){\n\t\n\t}\n\t\n\tfunc mapping(map: Map){\n\t\tif let context = map.context as? Context {\n\t\t\t// 获取到额外的信息\n\t\t}\n\t}\n}\n\nlet context = Context()\nlet user = Mapper<User>(context: context).map(JSONString)\n```\n\n# ObjectMapper + Alamofire\n\n如果网络层你使用的是  [Alamofire](https://github.com/Alamofire/Alamofire) ，并且你希望把返回的结果转换成 Swift 对象，你可以使用 [AlamofireObjectMapper](https://github.com/tristanhimmelman/AlamofireObjectMapper) 。这是一个使用 ObjectMapper 实现的把返回的 JSON 自动转成 Swift 对象的 Alamofire 的扩展。 \n\n\n# ObjectMapper + Realm\n\nObjectMapper 可以和 Realm 一起配合使用。使用下面的声明结构就可以使用 ObjectMapper 生成 Realm 对象：\n\n```swift\nclass Model: Object, Mappable {\n\tdynamic var name = \"\"\n\n\trequired convenience init?(map: Map) {\n\t\tself.init()\n\t}\n\n\tfunc mapping(map: Map) {\n\t\tname <- map[\"name\"]\n\t}\n}\n```\n\n如果你想要序列化相关联的 RealmObject，你可以使用 [ObjectMapper+Realm](https://github.com/jakenberg/ObjectMapper-Realm)。这是一个简单的 Realm 扩展，用于把任意的 JSON 序列化成 Realm 的类（ealm's List class。）\n\n注意：使用 ObjectMappers 的 `toJSON` 函数来生成 JSON 字符串只在 Realm 的写事务中有效（write transaction）。这是因为 ObjectMapper 在解析和生成时在映射函数（ `<-` ）中使用  `inout` 作为标记（ flag ）。Realm 会检测到标记并且强制要求 `toJSON` 函数只能在一个写的事务中调用，即使这个对象并没有被修改。\n\n# 待完成\n- 改善错误的处理。可能使用 `throws` 来处理。\n- 相关类的文档完善\n\n# 安装\n### Cocoapods\n如果你的项目使用 [CocoaPods 0.36 及以上](http://blog.cocoapods.org/Pod-Authors-Guide-to-CocoaPods-Frameworks/) 的版本，你可以把下面内容添加到在 `Podfile` 中，将 ObjectMapper 添加到你的项目中:\n\n```ruby\npod 'ObjectMapper', '~> 2.2'\n```\n\n### Carthage\n如果你的项目使用  [Carthage](https://github.com/Carthage/Carthage) ，你可以把下面的内容添加到 `Cartfile` 中，将 ObjectMapper 的依赖到你的项目中：\n\n```\ngithub \"Hearst-DD/ObjectMapper\" ~> 2.2\n```\n\n### Swift Package Manager\n如果你的项目使用  [Swift Package Manager](https://swift.org/package-manager/) ，那么你可以把下面内容添加到 `Package.swift` 中的 `dependencies` 数组中，将 ObjectMapper 的依赖到你的项目中：\n\n```swift\n.Package(url: \"https://github.com/Hearst-DD/ObjectMapper.git\", majorVersion: 2, minor: 2),\n```\n\n\n### Submodule\n此外，ObjectMapper 也可以作为一个 submodule 添加到项目中：\n\n1. 打开终端，使用 `cd` 命令进入项目文件的根目录下，然后在终端中输入 `git submodule add https://github.com/Hearst-DD/ObjectMapper.git` ，把 ObjectMapper 作为项目的一个 [submodule](http://git-scm.com/docs/git-submodule) 添加进来。\n2. 打开 `ObjectMapper` 文件，并将 `ObjectMapper.xcodeproj` 拖进你 app 项目的文件导航中。\n3. 在 Xcode 中，文件导航中点击蓝色项目图标进入到 target 配置界面，在侧边栏的 \"TARGETS\" 下选择主工程对应的target。\n4. 确保 `ObjectMapper.framework` 的部署版本( deployment target )和主工程的部署版本保持一致。\n5. 在配置界面的顶部选项栏中，打开 \"Build Phases\" 面板。\n6. 展开 \"Target Dependencies\" 组，并添加 `ObjectMapper.framework` 。\n7. 点击面板左上角的 `+` 按钮,选择 \"New Copy Files Phase\"。将这个阶段重命名为 \"Copy Frameworks\"，设置  \"Destination\" 为 \"Frameworks\"，最后添加 `ObjectMapper.framework` 。  \n\n\n"
  },
  {
    "path": "README.md",
    "content": "ObjectMapper\n============\n[![CocoaPods](https://img.shields.io/cocoapods/v/ObjectMapper.svg)](https://github.com/tristanhimmelman/ObjectMapper)\n[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)\n[![Swift Package Manager](https://rawgit.com/jlyonsmith/artwork/master/SwiftPackageManager/swiftpackagemanager-compatible.svg)](https://swift.org/package-manager/)\n[![Build Status](https://travis-ci.org/tristanhimmelman/ObjectMapper.svg?branch=master)](https://travis-ci.org/tristanhimmelman/ObjectMapper)\n\nObjectMapper is a framework written in Swift that makes it easy for you to convert your model objects (classes and structs) to and from JSON. \n\n- [Features](#features)\n- [The Basics](#the-basics)\n- [Mapping Nested Objects](#easy-mapping-of-nested-objects)\n- [Custom Transformations](#custom-transforms)\n- [Subclassing](#subclasses)\n- [Generic Objects](#generic-objects)\n- [Mapping Context](#mapping-context)\n- [ObjectMapper + Alamofire](#objectmapper--alamofire) \n- [ObjectMapper + Realm](#objectmapper--realm)\n- [Projects using ObjectMapper](#projects-using-objectmapper)\n- [To Do](#to-do)\n- [Contributing](#contributing)\n- [Installation](#installation)\n\n# Features:\n- Mapping JSON to objects\n- Mapping objects to JSON\n- Nested Objects (stand alone, in arrays or in dictionaries)\n- Custom transformations during mapping\n- Struct support\n- [Immutable support](#immutablemappable-protocol)\n\n# The Basics\nTo support mapping, a class or struct just needs to implement the ```Mappable``` protocol which includes the following functions:\n```swift\ninit?(map: Map)\nmutating func mapping(map: Map)\n```\nObjectMapper uses the ```<-``` operator to define how each member variable maps to and from JSON.\n\n```swift\nclass User: Mappable {\n    var username: String?\n    var age: Int?\n    var weight: Double!\n    var array: [Any]?\n    var dictionary: [String : Any] = [:]\n    var bestFriend: User?                       // Nested User object\n    var friends: [User]?                        // Array of Users\n    var birthday: Date?\n\n    required init?(map: Map) {\n\n    }\n\n    // Mappable\n    func mapping(map: Map) {\n        username    <- map[\"username\"]\n        age         <- map[\"age\"]\n        weight      <- map[\"weight\"]\n        array       <- map[\"arr\"]\n        dictionary  <- map[\"dict\"]\n        bestFriend  <- map[\"best_friend\"]\n        friends     <- map[\"friends\"]\n        birthday    <- (map[\"birthday\"], DateTransform())\n    }\n}\n\nstruct Temperature: Mappable {\n    var celsius: Double?\n    var fahrenheit: Double?\n\n    init?(map: Map) {\n\n    }\n\n    mutating func mapping(map: Map) {\n        celsius \t<- map[\"celsius\"]\n        fahrenheit \t<- map[\"fahrenheit\"]\n    }\n}\n```\n\nOnce your class implements `Mappable`, ObjectMapper allows you to easily convert to and from JSON. \n\nConvert a JSON string to a model object:\n```swift\nlet user = User(JSONString: JSONString)\n```\n\nConvert a model object to a JSON string:\n```swift\nlet JSONString = user.toJSONString(prettyPrint: true)\n```\n\nAlternatively, the `Mapper.swift` class can also be used to accomplish the above (it also provides extra functionality for other situations):\n```swift\n// Convert JSON String to Model\nlet user = Mapper<User>().map(JSONString: JSONString)\n// Create JSON String from Model\nlet JSONString = Mapper().toJSONString(user, prettyPrint: true)\n```\n\nObjectMapper can map classes composed of the following types:\n- `Int`\n- `Bool`\n- `Double`\n- `Float`\n- `String`\n- `RawRepresentable` (Enums)\n- `Array<Any>`\n- `Dictionary<String, Any>`\n- `Object<T: Mappable>`\n- `Array<T: Mappable>`\n- `Array<Array<T: Mappable>>`\n- `Set<T: Mappable>` \n- `Dictionary<String, T: Mappable>`\n- `Dictionary<String, Array<T: Mappable>>`\n- Optionals of all the above\n- Implicitly Unwrapped Optionals of the above\n\n## `Mappable` Protocol\n\n#### `mutating func mapping(map: Map)` \nThis function is where all mapping definitions should go. When parsing JSON, this function is executed after successful object creation. When generating JSON, it is the only function that is called on the object.\n\n#### `init?(map: Map)` \nThis failable initializer is used by ObjectMapper for object creation. It can be used by developers to validate JSON prior to object serialization. Returning nil within the function will prevent the mapping from occuring. You can inspect the JSON stored within the `Map` object to do your validation:\n```swift\nrequired init?(map: Map){\n\t// check if a required \"name\" property exists within the JSON.\n\tif map.JSON[\"name\"] == nil {\n\t\treturn nil\n\t}\n}\n```\n\n## `StaticMappable` Protocol\n`StaticMappable` is an alternative to `Mappable`. It provides developers with a static function that is used by ObjectMapper for object initialization instead of `init?(map: Map)`. \n\nNote: `StaticMappable`, like `Mappable`, is a sub protocol of `BaseMappable` which is where the `mapping(map: Map)` function is defined.\n\n#### `static func objectForMapping(map: Map) -> BaseMappable?` \nObjectMapper uses this function to get objects to use for mapping. Developers should return an instance of an object that conforms to `BaseMappable` in this function. This function can also be used to:\n- validate JSON prior to object serialization\n- provide an existing cached object to be used for mapping\n- return an object of another type (which also conforms to `BaseMappable`) to be used for mapping. For instance, you may inspect the JSON to infer the type of object that should be used for mapping ([see examples in ClassClusterTests.swift](https://github.com/Hearst-DD/ObjectMapper/blob/master/Tests/ObjectMapperTests/ClassClusterTests.swift#L67))\n\nIf you need to implement ObjectMapper in an extension, you will need to adopt this protocol instead of `Mappable`. \n\n## `ImmutableMappable` Protocol\n\n`ImmutableMappable` provides the ability to map immutable properties. This is how `ImmutableMappable` differs from `Mappable`:\n\n<table>\n  <tr>\n    <th>ImmutableMappable</th>\n    <th>Mappable</th>\n  </tr>\n  <tr>\n    <th colspan=\"2\">Properties</th>\n  </tr>\n  <tr>\n    <td>\n<pre>\n<strong>let</strong> id: Int\n<strong>let</strong> name: String?\n</pre>\n  </td>\n    <td>\n<pre>\nvar id: Int!\nvar name: String?\n</pre>\n    </td>\n  </tr>\n  <tr>\n    <th colspan=\"2\">JSON -> Model</th>\n  </tr>\n  <tr>\n    <td>\n<pre>\ninit(map: Map) <strong>throws</strong> {\n  id   = <strong>try</strong> map.value(\"id\")\n  name = <strong>try?</strong> map.value(\"name\")\n}\n</pre>\n  </td>\n    <td>\n<pre>\nmutating func mapping(map: Map) {\n  id   <- map[\"id\"]\n  name <- map[\"name\"]\n}\n</pre>\n    </td>\n  </tr>\n  <tr>\n    <th colspan=\"2\">Model -> JSON</th>\n  </tr>\n  <tr>\n    <td>\n<pre>\nfunc mapping(map: Map) {\n  id   <strong>>>></strong> map[\"id\"]\n  name <strong>>>></strong> map[\"name\"]\n}\n</pre>\n    </td>\n    <td>\n<pre>\nmutating func mapping(map: Map) {\n  id   <- map[\"id\"]\n  name <- map[\"name\"]\n}\n</pre>\n    </td>\n  </tr>\n  <tr>\n    <th colspan=\"2\">Initializing</th>\n  </tr>\n  <tr>\n    <td>\n<pre>\n<strong>try</strong> User(JSONString: JSONString)\n</pre>\n    </td>\n    <td>\n<pre>\nUser(JSONString: JSONString)\n</pre>\n    </td>\n  </tr>\n</table>\n\n#### `init(map: Map) throws`\n\nThis throwable initializer is used to map immutable properties from the given `Map`. Every immutable property should be initialized in this initializer.\n\nThis initializer throws an error when:\n- `Map` fails to get a value for the given key\n- `Map` fails to transform a value using `Transform`\n\n`ImmutableMappable` uses `Map.value(_:using:)` method to get values from the `Map`. This method should be used with the `try` keyword as it is throwable. `Optional` properties can easily be handled using `try?`.\n\n```swift\ninit(map: Map) throws {\n    name      = try map.value(\"name\") // throws an error when it fails\n    createdAt = try map.value(\"createdAt\", using: DateTransform()) // throws an error when it fails\n    updatedAt = try? map.value(\"updatedAt\", using: DateTransform()) // optional\n    posts     = (try? map.value(\"posts\")) ?? [] // optional + default value\n    surname    = try? map.value(\"surname\", default: \"DefaultSurname\") // optional + default value as an argument\n}\n```\n\n#### `mutating func mapping(map: Map)`\n\nThis method is where the reverse transform is performed (model to JSON). Since immutable properties cannot be mapped with the `<-` operator, developers have to define the reverse transform using the `>>>` operator.\n\n```swift\nmutating func mapping(map: Map) {\n    name      >>> map[\"name\"]\n    createdAt >>> (map[\"createdAt\"], DateTransform())\n    updatedAt >>> (map[\"updatedAt\"], DateTransform())\n    posts     >>> map[\"posts\"]\n}\n```\n\n# Easy Mapping of Nested Objects\nObjectMapper supports dot notation within keys for easy mapping of nested objects. Given the following JSON String:\n```json\n\"distance\" : {\n     \"text\" : \"102 ft\",\n     \"value\" : 31\n}\n```\nYou can access the nested objects as follows:\n```swift\nfunc mapping(map: Map) {\n    distance <- map[\"distance.value\"]\n}\n```\nNested keys also support accessing values from an array. Given a JSON response with an array of distances, the value could be accessed as follows:\n```swift\ndistance <- map[\"distances.0.value\"]\n```\nIf you have a key that contains `.`, you can individually disable the above feature as follows:\n```swift\nfunc mapping(map: Map) {\n    identifier <- map[\"app.identifier\", nested: false]\n}\n```\nWhen you have nested keys which contain `.`, you can pass the custom nested key delimiter as follows ([#629](https://github.com/tristanhimmelman/ObjectMapper/pull/629)):\n```swift\nfunc mapping(map: Map) {\n    appName <- map[\"com.myapp.info->com.myapp.name\", delimiter: \"->\"]\n}\n```\n\n# Custom Transforms\nObjectMapper also supports custom transforms that convert values during the mapping process. To use a transform, simply create a tuple with `map[\"field_name\"]` and the transform of your choice on the right side of the `<-` operator:\n```swift\nbirthday <- (map[\"birthday\"], DateTransform())\n```\nThe above transform will convert the JSON Int value to an Date when reading JSON and will convert the Date to an Int when converting objects to JSON.\n\nYou can easily create your own custom transforms by adopting and implementing the methods in the `TransformType` protocol:\n```swift\npublic protocol TransformType {\n    associatedtype Object\n    associatedtype JSON\n\n    func transformFromJSON(_ value: Any?) -> Object?\n    func transformToJSON(_ value: Object?) -> JSON?\n}\n```\n\n### TransformOf\nIn a lot of situations you can use the built-in transform class `TransformOf` to quickly perform a desired transformation. `TransformOf` is initialized with two types and two closures. The types define what the transform is converting to and from and the closures perform the actual transformation. \n\nFor example, if you want to transform a JSON `String` value to an `Int` you could use `TransformOf` as follows:\n```swift\nlet transform = TransformOf<Int, String>(fromJSON: { (value: String?) -> Int? in \n    // transform value from String? to Int?\n    return Int(value!)\n}, toJSON: { (value: Int?) -> String? in\n    // transform value from Int? to String?\n    if let value = value {\n        return String(value)\n    }\n    return nil\n})\n\nid <- (map[\"id\"], transform)\n```\nHere is a more condensed version of the above:\n```swift\nid <- (map[\"id\"], TransformOf<Int, String>(fromJSON: { Int($0!) }, toJSON: { $0.map { String($0) } }))\n```\n\n# Subclasses\n\nClasses that implement the `Mappable` protocol can easily be subclassed. When subclassing mappable classes, follow the structure below:\n\n```swift\nclass Base: Mappable {\n    var base: String?\n    \n    required init?(map: Map) {\n\n    }\n\n    func mapping(map: Map) {\n        base <- map[\"base\"]\n    }\n}\n\nclass Subclass: Base {\n    var sub: String?\n\n    required init?(map: Map) {\n        super.init(map)\n    }\n\n    override func mapping(map: Map) {\n        super.mapping(map)\n        \n        sub <- map[\"sub\"]\n    }\n}\n```\n\nMake sure your subclass implementation calls the right initializers and mapping functions to also apply the mappings from your superclass.\n\n# Generic Objects\n\nObjectMapper can handle classes with generic types as long as the generic type also conforms to `Mappable`. See the following example:\n```swift\nclass Result<T: Mappable>: Mappable {\n    var result: T?\n\n    required init?(map: Map){\n\n    }\n\n    func mapping(map: Map) {\n        result <- map[\"result\"]\n    }\n}\n\nlet result = Mapper<Result<User>>().map(JSON)\n```\n\n# Mapping Context\n\nThe `Map` object which is passed around during mapping, has an optional `MapContext` object that is available for developers to use if they need to pass information around during mapping. \n\nTo take advantage of this feature, simply create an object that implements `MapContext` (which is an empty protocol) and pass it into `Mapper` during initialization. \n```swift\nstruct Context: MapContext {\n\tvar importantMappingInfo = \"Info that I need during mapping\"\n}\n\nclass User: Mappable {\n\tvar name: String?\n\t\n\trequired init?(map: Map){\n\t\n\t}\n\t\n\tfunc mapping(map: Map){\n\t\tif let context = map.context as? Context {\n\t\t\t// use context to make decisions about mapping\n\t\t}\n\t}\n}\n\nlet context = Context()\nlet user = Mapper<User>(context: context).map(JSONString)\n```\n\n# ObjectMapper + Alamofire\n\nIf you are using [Alamofire](https://github.com/Alamofire/Alamofire) for networking and you want to convert your responses to Swift objects, you can use [AlamofireObjectMapper](https://github.com/tristanhimmelman/AlamofireObjectMapper). It is a simple Alamofire extension that uses ObjectMapper to automatically map JSON response data to Swift objects.\n\n\n# ObjectMapper + Realm\n\nObjectMapper and Realm can be used together. Simply follow the class structure below and you will be able to use ObjectMapper to generate your Realm models:\n\n```swift\nclass Model: Object, Mappable {\n    dynamic var name = \"\"\n\n    required convenience init?(map: Map) {\n        self.init()\n    }\n\n    func mapping(map: Map) {\n        name <- map[\"name\"]\n    }\n}\n```\n\nIf you want to serialize associated RealmObjects, you can use [ObjectMapper+Realm](https://github.com/jakenberg/ObjectMapper-Realm). It is a simple Realm extension that serializes arbitrary JSON into Realm's `List` class.\n\nTo serialize Swift `String`, `Int`, `Double` and `Bool` arrays you can use [ObjectMapperAdditions/Realm](https://github.com/APUtils/ObjectMapperAdditions#realm-features). It'll wrap Swift types into RealmValues that can be stored in Realm's `List` class.\n\nNote: Generating a JSON string of a Realm Object using ObjectMappers' `toJSON` function only works within a Realm write transaction. This is because ObjectMapper uses the `inout` flag in its mapping functions (`<-`) which are used both for serializing and deserializing. Realm detects the flag and forces the `toJSON` function to be called within a write block even though the objects are not being modified.\n\n# Projects Using ObjectMapper\n- [Xcode Plugin for generating `Mappable` and `ImmutableMappable` code](https://github.com/liyanhuadev/ObjectMapper-Plugin)\n\n- [Json4Swift - Supports generating `ImmutableMappable` structs online (no plugins needed)](http://www.json4swift.com)\n\n- [JSON to Model - Template based MacOS app which generates structs with customisation.](https://github.com/chanonly123/Json-Model-Generator)  [⬇️Download App](https://github.com/chanonly123/Json-Model-Generator/raw/master/JsonToModel.zip)\n\nIf you have a project that utilizes, extends or provides tooling for ObjectMapper, please submit a PR with a link to your project in this section of the README.\n\n# To Do\n- Improve error handling. Perhaps using `throws`\n- Class cluster documentation\n\n# Contributing\n\nContributions are very welcome 👍😃. \n\nBefore submitting any pull request, please ensure you have run the included tests and they have passed. If you are including new functionality, please write test cases for it as well.\n\n# Installation\n### Cocoapods\nObjectMapper can be added to your project using [CocoaPods 0.36 or later](http://blog.cocoapods.org/Pod-Authors-Guide-to-CocoaPods-Frameworks/) by adding the following line to your `Podfile`:\n\n```ruby\npod 'ObjectMapper', '~> 3.5' (check releases to make sure this is the latest version)\n```\n\n### Carthage\nIf you're using [Carthage](https://github.com/Carthage/Carthage) you can add a dependency on ObjectMapper by adding it to your `Cartfile`:\n\n```\ngithub \"tristanhimmelman/ObjectMapper\" ~> 3.5 (check releases to make sure this is the latest version)\n```\n\n### Swift Package Manager\nTo add ObjectMapper to a [Swift Package Manager](https://swift.org/package-manager/) based project, add:\n\n```swift\n.package(url: \"https://github.com/tristanhimmelman/ObjectMapper.git\", .upToNextMajor(from: \"4.1.0\")),\n```\nto your `Package.swift` files `dependencies` array.\n\n### Submodule\nOtherwise, ObjectMapper can be added as a submodule:\n\n1. Add ObjectMapper as a [submodule](http://git-scm.com/docs/git-submodule) by opening the terminal, `cd`-ing into your top-level project directory, and entering the command `git submodule add https://github.com/tristanhimmelman/ObjectMapper.git`\n2. Open the `ObjectMapper` folder, and drag `ObjectMapper.xcodeproj` into the file navigator of your app project.\n3. In Xcode, navigate to the target configuration window by clicking on the blue project icon, and selecting the application target under the \"Targets\" heading in the sidebar.\n4. Ensure that the deployment target of `ObjectMapper.framework` matches that of the application target.\n5. In the tab bar at the top of that window, open the \"Build Phases\" panel.\n6. Expand the \"Target Dependencies\" group, and add `ObjectMapper.framework`.\n7. Click on the `+` button at the top left of the panel and select \"New Copy Files Phase\". Rename this new phase to \"Copy Frameworks\", set the \"Destination\" to \"Frameworks\", and add `ObjectMapper.framework`.\n"
  },
  {
    "path": "Sources/CodableTransform.swift",
    "content": "//\n//  CodableTransform.swift\n//  ObjectMapper\n//\n//  Created by Jari Kalinainen on 10/10/2018.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\n/// Transforms JSON dictionary to Codable type T and back\nopen class CodableTransform<T: Codable>: TransformType {\n\n    public typealias Object = T\n    public typealias JSON = Any\n\n    public init() {}\n\n    open func transformFromJSON(_ value: Any?) -> Object? {\n\t\t\t\tvar _data: Data? = nil\n\t\t\t\tswitch value {\n\t\t\t\tcase let dict as [String : Any]:\n\t\t\t\t\t_data = try? JSONSerialization.data(withJSONObject: dict, options: [])\n\t\t\t\tcase let array as [[String : Any]]:\n\t\t\t\t\t_data = try? JSONSerialization.data(withJSONObject: array, options: [])\n\t\t\t\tdefault:\n\t\t\t\t\t_data = nil\n\t\t\t\t}\n\t\t\t\tguard let data = _data else { return nil }\n\t\t\t\t\n        do {\n            let decoder = JSONDecoder()\n            let item = try decoder.decode(T.self, from: data)\n            return item\n        } catch {\n            return nil\n        }\n    }\n\n    open func transformToJSON(_ value: T?) -> JSON? {\n        guard let item = value else {\n            return nil\n        }\n        do {\n            let encoder = JSONEncoder()\n            let data = try encoder.encode(item)\n            let dictionary = try JSONSerialization.jsonObject(with: data, options: .allowFragments)\n            return dictionary\n        } catch {\n            return nil\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/CustomDateFormatTransform.swift",
    "content": "//\n//  CustomDateFormatTransform.swift\n//  ObjectMapper\n//\n//  Created by Dan McCracken on 3/8/15.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\nopen class CustomDateFormatTransform: DateFormatterTransform {\n\t\n    public init(formatString: String) {\n\t\tlet formatter = DateFormatter()\n\t\tformatter.locale = Locale(identifier: \"en_US_POSIX\")\n\t\tformatter.dateFormat = formatString\n\t\t\n\t\tsuper.init(dateFormatter: formatter)\n    }\n}\n"
  },
  {
    "path": "Sources/DataTransform.swift",
    "content": "//\n//  DataTransform.swift\n//  ObjectMapper\n//\n//  Created by Yagrushkin, Evgeny on 8/30/16.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\nopen class DataTransform: TransformType {\n\tpublic typealias Object = Data\n\tpublic typealias JSON = String\n\t\n\tpublic init() {}\n\t\n\topen func transformFromJSON(_ value: Any?) -> Data? {\n\t\tguard let string = value as? String else{\n\t\t\treturn nil\n\t\t}\n\t\treturn Data(base64Encoded: string)\n\t}\n\t\n\topen func transformToJSON(_ value: Data?) -> String? {\n\t\tguard let data = value else{\n\t\t\treturn nil\n\t\t}\n\t\treturn data.base64EncodedString()\n\t}\n}\n"
  },
  {
    "path": "Sources/DateFormatterTransform.swift",
    "content": "//\n//  DateFormatterTransform.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2015-03-09.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\nopen class DateFormatterTransform: TransformType {\n\tpublic typealias Object = Date\n\tpublic typealias JSON = String\n\t\n\tpublic let dateFormatter: DateFormatter\n\t\n\tpublic init(dateFormatter: DateFormatter) {\n\t\tself.dateFormatter = dateFormatter\n\t}\n\t\n\topen func transformFromJSON(_ value: Any?) -> Date? {\n\t\tif let dateString = value as? String {\n\t\t\treturn dateFormatter.date(from: dateString)\n\t\t}\n\t\treturn nil\n\t}\n\t\n\topen func transformToJSON(_ value: Date?) -> String? {\n\t\tif let date = value {\n\t\t\treturn dateFormatter.string(from: date)\n\t\t}\n\t\treturn nil\n\t}\n}\n"
  },
  {
    "path": "Sources/DateTransform.swift",
    "content": "//\n//  DateTransform.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2014-10-13.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\nopen class DateTransform: TransformType {\n\tpublic typealias Object = Date\n\tpublic typealias JSON = Double\n\n\tpublic enum Unit: TimeInterval {\n\t\tcase seconds = 1\n\t\tcase milliseconds = 1_000\n\t\t\n\t\tfunc addScale(to interval: TimeInterval) -> TimeInterval {\n\t\t\treturn interval * rawValue\n\t\t}\n\t\t\n\t\tfunc removeScale(from interval: TimeInterval) -> TimeInterval {\n\t\t\treturn interval / rawValue\n\t\t}\n\t}\n\t\n\tprivate let unit: Unit\n\t\n\tpublic init(unit: Unit = .seconds) {\n\t\tself.unit = unit\n\t}\n\n\topen func transformFromJSON(_ value: Any?) -> Date? {\n\t\tvar timeInterval: TimeInterval?\n\t\tif let timeInt = value as? Double {\n\t\t\ttimeInterval = TimeInterval(timeInt)\n\t\t}\n\t\t\n\t\tif let timeStr = value as? String {\n\t\t\ttimeInterval = TimeInterval(atof(timeStr))\n\t\t}\n\t\t\n\t\treturn timeInterval.flatMap {\n\t\t\treturn Date(timeIntervalSince1970: unit.removeScale(from: $0))\n\t\t}\n\t}\n\n\topen func transformToJSON(_ value: Date?) -> Double? {\n\t\tif let date = value {\n\t\t\treturn Double(unit.addScale(to: date.timeIntervalSince1970))\n\t\t}\n\t\treturn nil\n\t}\n}\n"
  },
  {
    "path": "Sources/DictionaryTransform.swift",
    "content": "//\n//  DictionaryTransform.swift\n//  ObjectMapper\n//\n//  Created by Milen Halachev on 7/20/16.\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\n///Transforms [String: AnyObject] <-> [Key: Value] where Key is RawRepresentable as String, Value is Mappable\npublic struct DictionaryTransform<Key, Value>: TransformType where Key: Hashable, Key: RawRepresentable, Key.RawValue == String, Value: Mappable {\n\t\n\tpublic init() {\n\t\t\n\t}\n\t\n\tpublic func transformFromJSON(_ value: Any?) -> [Key: Value]? {\n\t\t\n\t\tguard let json = value as? [String: Any] else {\n\t\t\t\n\t\t\treturn nil\n\t\t}\n\t\t\n\t\tlet result = json.reduce([:]) { (result, element) -> [Key: Value] in\n\t\t\t\n\t\t\tguard\n\t\t\tlet key = Key(rawValue: element.0),\n\t\t\tlet valueJSON = element.1 as? [String: Any],\n\t\t\tlet value = Value(JSON: valueJSON)\n\t\t\telse {\n\t\t\t\t\n\t\t\t\treturn result\n\t\t\t}\n\t\t\t\n\t\t\tvar result = result\n\t\t\tresult[key] = value\n\t\t\treturn result\n\t\t}\n\t\t\n\t\treturn result\n\t}\n\t\n\tpublic func transformToJSON(_ value: [Key: Value]?) -> Any? {\n\t\t\n\t\tlet result = value?.reduce([:]) { (result, element) -> [String: Any] in\n\t\t\t\n\t\t\tlet key = element.0.rawValue\n\t\t\tlet value = element.1.toJSON()\n\t\t\t\n\t\t\tvar result = result\n\t\t\tresult[key] = value\n\t\t\treturn result\n\t\t}\n\t\t\n\t\treturn result\n\t}\n}\n"
  },
  {
    "path": "Sources/EnumOperators.swift",
    "content": "//\n//  EnumOperators.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2016-09-26.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\n\n// MARK:- Raw Representable types\n\n/// Object of Raw Representable type\npublic func <- <T: RawRepresentable>(left: inout T, right: Map) {\n\tleft <- (right, EnumTransform())\n}\n\npublic func >>> <T: RawRepresentable>(left: T, right: Map) {\n\tleft >>> (right, EnumTransform())\n}\n\n\n/// Optional Object of Raw Representable type\npublic func <- <T: RawRepresentable>(left: inout T?, right: Map) {\n\tleft <- (right, EnumTransform())\n}\n\npublic func >>> <T: RawRepresentable>(left: T?, right: Map) {\n\tleft >>> (right, EnumTransform())\n}\n\n\n// Code targeting the Swift 4.1 compiler and below.\n#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n/// Implicitly Unwrapped Optional Object of Raw Representable type\npublic func <- <T: RawRepresentable>(left: inout T!, right: Map) {\n\tleft <- (right, EnumTransform())\n}\n#endif\n\n// MARK:- Arrays of Raw Representable type\n\n/// Array of Raw Representable object\npublic func <- <T: RawRepresentable>(left: inout [T], right: Map) {\n\tleft <- (right, EnumTransform())\n}\n\npublic func >>> <T: RawRepresentable>(left: [T], right: Map) {\n\tleft >>> (right, EnumTransform())\n}\n\n\n/// Array of Raw Representable object\npublic func <- <T: RawRepresentable>(left: inout [T]?, right: Map) {\n\tleft <- (right, EnumTransform())\n}\n\npublic func >>> <T: RawRepresentable>(left: [T]?, right: Map) {\n\tleft >>> (right, EnumTransform())\n}\n\n\n// Code targeting the Swift 4.1 compiler and below.\n#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n/// Array of Raw Representable object\npublic func <- <T: RawRepresentable>(left: inout [T]!, right: Map) {\n\tleft <- (right, EnumTransform())\n}\n#endif\n\n// MARK:- Dictionaries of Raw Representable type\n\n/// Dictionary of Raw Representable object\npublic func <- <T: RawRepresentable>(left: inout [String: T], right: Map) {\n\tleft <- (right, EnumTransform())\n}\n\npublic func >>> <T: RawRepresentable>(left: [String: T], right: Map) {\n\tleft >>> (right, EnumTransform())\n}\n\n\n/// Dictionary of Raw Representable object\npublic func <- <T: RawRepresentable>(left: inout [String: T]?, right: Map) {\n\tleft <- (right, EnumTransform())\n}\n\npublic func >>> <T: RawRepresentable>(left: [String: T]?, right: Map) {\n\tleft >>> (right, EnumTransform())\n}\n\n\n// Code targeting the Swift 4.1 compiler and below.\n#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n/// Dictionary of Raw Representable object\npublic func <- <T: RawRepresentable>(left: inout [String: T]!, right: Map) {\n\tleft <- (right, EnumTransform())\n}\n#endif\n"
  },
  {
    "path": "Sources/EnumTransform.swift",
    "content": "//\n//  EnumTransform.swift\n//  ObjectMapper\n//\n//  Created by Kaan Dedeoglu on 3/20/15.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\nopen class EnumTransform<T: RawRepresentable>: TransformType {\n\tpublic typealias Object = T\n\tpublic typealias JSON = T.RawValue\n\t\n\tpublic init() {}\n\t\n\topen func transformFromJSON(_ value: Any?) -> T? {\n\t\tif let raw = value as? T.RawValue {\n\t\t\treturn T(rawValue: raw)\n\t\t}\n\t\treturn nil\n\t}\n\t\n\topen func transformToJSON(_ value: T?) -> T.RawValue? {\n\t\tif let obj = value {\n\t\t\treturn obj.rawValue\n\t\t}\n\t\treturn nil\n\t}\n}\n"
  },
  {
    "path": "Sources/FromJSON.swift",
    "content": "//\n//  FromJSON.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2014-10-09.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2016 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\ninternal final class FromJSON {\n\t\n\t/// Basic type\n\tclass func basicType<FieldType>(_ field: inout FieldType, object: FieldType?) {\n\t\tif let value = object {\n\t\t\tfield = value\n\t\t}\n\t}\n\t\n\t/// optional basic type\n\tclass func optionalBasicType<FieldType>(_ field: inout FieldType?, object: FieldType?) {\n\t\tfield = object\n\t}\n\t\n\t// Code targeting the Swift 4.1 compiler and below.\n\t#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n\t/// Implicitly unwrapped optional basic type\n\tclass func optionalBasicType<FieldType>(_ field: inout FieldType!, object: FieldType?) {\n\t\tfield = object\n\t}\n\t#endif\n\t\n\t/// Mappable object\n\tclass func object<N: BaseMappable>(_ field: inout N, map: Map) {\n\t\tif map.toObject {\n\t\t\tfield = Mapper(context: map.context).map(JSONObject: map.currentValue, toObject: field)\n\t\t} else if let value: N = Mapper(context: map.context).map(JSONObject: map.currentValue) {\n\t\t\tfield = value\n\t\t}\n\t}\n\t\n\t/// Optional Mappable Object\n\n\tclass func optionalObject<N: BaseMappable>(_ field: inout N?, map: Map) {\n\t\tif let f = field , map.toObject && map.currentValue != nil {\n\t\t\t field = Mapper(context: map.context).map(JSONObject: map.currentValue, toObject: f)\n\t\t} else {\n\t\t\tfield = Mapper(context: map.context).map(JSONObject: map.currentValue)\n\t\t}\n\t}\n\t\n\t// Code targeting the Swift 4.1 compiler and below.\n\t#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n\t/// Implicitly unwrapped Optional Mappable Object\n\tclass func optionalObject<N: BaseMappable>(_ field: inout N!, map: Map) {\n\t\tif let f = field , map.toObject && map.currentValue != nil {\n\t\t\tfield = Mapper(context: map.context).map(JSONObject: map.currentValue, toObject: f)\n\t\t} else {\n\t\t\tfield = Mapper(context: map.context).map(JSONObject: map.currentValue)\n\t\t}\n\t}\n\t#endif\n\t\n\t/// mappable object array\n\tclass func objectArray<N: BaseMappable>(_ field: inout Array<N>, map: Map) {\n\t\tif let objects = Mapper<N>(context: map.context).mapArray(JSONObject: map.currentValue) {\n\t\t\tfield = objects\n\t\t}\n\t}\n\t\n\t/// optional mappable object array\n\n\tclass func optionalObjectArray<N: BaseMappable>(_ field: inout Array<N>?, map: Map) {\n\t\tif let objects: Array<N> = Mapper(context: map.context).mapArray(JSONObject: map.currentValue) {\n\t\t\tfield = objects\n\t\t} else {\n\t\t\tfield = nil\n\t\t}\n\t}\n\t\n\t// Code targeting the Swift 4.1 compiler and below.\n\t#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n\t/// Implicitly unwrapped optional mappable object array\n\tclass func optionalObjectArray<N: BaseMappable>(_ field: inout Array<N>!, map: Map) {\n\t\tif let objects: Array<N> = Mapper(context: map.context).mapArray(JSONObject: map.currentValue) {\n\t\t\tfield = objects\n\t\t} else {\n\t\t\tfield = nil\n\t\t}\n\t}\n\t#endif\n\t\n\t/// mappable object array\n\tclass func twoDimensionalObjectArray<N: BaseMappable>(_ field: inout Array<Array<N>>, map: Map) {\n\t\tif let objects = Mapper<N>(context: map.context).mapArrayOfArrays(JSONObject: map.currentValue) {\n\t\t\tfield = objects\n\t\t}\n\t}\n\t\n\t/// optional mappable 2 dimentional object array\n\tclass func optionalTwoDimensionalObjectArray<N: BaseMappable>(_ field: inout Array<Array<N>>?, map: Map) {\n\t\tfield = Mapper(context: map.context).mapArrayOfArrays(JSONObject: map.currentValue)\n\t}\n\t\n\t// Code targeting the Swift 4.1 compiler and below.\n\t#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n\t/// Implicitly unwrapped optional 2 dimentional mappable object array\n\tclass func optionalTwoDimensionalObjectArray<N: BaseMappable>(_ field: inout Array<Array<N>>!, map: Map) {\n\t\tfield = Mapper(context: map.context).mapArrayOfArrays(JSONObject: map.currentValue)\n\t}\n\t#endif\n\t\n\t/// Dctionary containing Mappable objects\n\tclass func objectDictionary<N: BaseMappable>(_ field: inout Dictionary<String, N>, map: Map) {\n\t\tif map.toObject {\n\t\t\tfield = Mapper<N>(context: map.context).mapDictionary(JSONObject: map.currentValue, toDictionary: field)\n\t\t} else {\n\t\t\tif let objects = Mapper<N>(context: map.context).mapDictionary(JSONObject: map.currentValue) {\n\t\t\t\tfield = objects\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/// Optional dictionary containing Mappable objects\n\tclass func optionalObjectDictionary<N: BaseMappable>(_ field: inout Dictionary<String, N>?, map: Map) {\n\t\tif let f = field , map.toObject && map.currentValue != nil {\n\t\t\tfield = Mapper(context: map.context).mapDictionary(JSONObject: map.currentValue, toDictionary: f)\n\t\t} else {\n\t\t\tfield = Mapper(context: map.context).mapDictionary(JSONObject: map.currentValue)\n\t\t}\n\t}\n\t\n\t// Code targeting the Swift 4.1 compiler and below.\n\t#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n\t/// Implicitly unwrapped Dictionary containing Mappable objects\n\tclass func optionalObjectDictionary<N: BaseMappable>(_ field: inout Dictionary<String, N>!, map: Map) {\n\t\tif let f = field , map.toObject && map.currentValue != nil {\n\t\t\tfield = Mapper(context: map.context).mapDictionary(JSONObject: map.currentValue, toDictionary: f)\n\t\t} else {\n\t\t\tfield = Mapper(context: map.context).mapDictionary(JSONObject: map.currentValue)\n\t\t}\n\t}\n\t#endif\n\t\n\t/// Dictionary containing Array of Mappable objects\n\tclass func objectDictionaryOfArrays<N: BaseMappable>(_ field: inout Dictionary<String, [N]>, map: Map) {\n\t\tif let objects = Mapper<N>(context: map.context).mapDictionaryOfArrays(JSONObject: map.currentValue) {\n\t\t\tfield = objects\n\t\t}\n\t}\n\t\n\t/// Optional Dictionary containing Array of Mappable objects\n\tclass func optionalObjectDictionaryOfArrays<N: BaseMappable>(_ field: inout Dictionary<String, [N]>?, map: Map) {\n\t\tfield = Mapper<N>(context: map.context).mapDictionaryOfArrays(JSONObject: map.currentValue)\n\t}\n\t\n\t// Code targeting the Swift 4.1 compiler and below.\n\t#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n\t/// Implicitly unwrapped Dictionary containing Array of Mappable objects\n\tclass func optionalObjectDictionaryOfArrays<N: BaseMappable>(_ field: inout Dictionary<String, [N]>!, map: Map) {\n\t\tfield = Mapper<N>(context: map.context).mapDictionaryOfArrays(JSONObject: map.currentValue)\n\t}\n\t#endif\n\t\n\t/// mappable object Set\n\tclass func objectSet<N: BaseMappable>(_ field: inout Set<N>, map: Map) {\n\t\tif let objects = Mapper<N>(context: map.context).mapSet(JSONObject: map.currentValue) {\n\t\t\tfield = objects\n\t\t}\n\t}\n\t\n\t/// optional mappable object array\n\tclass func optionalObjectSet<N: BaseMappable>(_ field: inout Set<N>?, map: Map) {\n\t\tfield = Mapper(context: map.context).mapSet(JSONObject: map.currentValue)\n\t}\n\t\n\t// Code targeting the Swift 4.1 compiler and below.\n\t#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n\t/// Implicitly unwrapped optional mappable object array\n\tclass func optionalObjectSet<N: BaseMappable>(_ field: inout Set<N>!, map: Map) {\n\t\tfield = Mapper(context: map.context).mapSet(JSONObject: map.currentValue)\n\t}\n\t#endif\n}\n"
  },
  {
    "path": "Sources/HexColorTransform.swift",
    "content": "//\n//  HexColorTransform.swift\n//  ObjectMapper\n//\n//  Created by Vitaliy Kuzmenko on 10/10/16.\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS) || os(watchOS)\nimport UIKit\n#elseif os(macOS)\nimport Cocoa\n#endif\n\n#if os(iOS) || os(tvOS) || os(watchOS) || os(macOS)\nopen class HexColorTransform: TransformType {\n\t\n\t#if os(iOS) || os(tvOS) || os(watchOS)\n\tpublic typealias Object = UIColor\n\t#else\n\tpublic typealias Object = NSColor\n\t#endif\n\t\n\tpublic typealias JSON = String\n\t\n\tvar prefix: Bool = false\n\t\n\tvar alpha: Bool = false\n\t\n\tpublic init(prefixToJSON: Bool = false, alphaToJSON: Bool = false) {\n\t\talpha = alphaToJSON\n\t\tprefix = prefixToJSON\n\t}\n\t\n\topen func transformFromJSON(_ value: Any?) -> Object? {\n\t\tif let rgba = value as? String {\n\t\t\tif rgba.hasPrefix(\"#\") {\n\t\t\t\tlet index = rgba.index(rgba.startIndex, offsetBy: 1)\n\t\t\t\tlet hex = String(rgba[index...])\n\t\t\t\treturn getColor(hex: hex)\n\t\t\t} else {\n\t\t\t\treturn getColor(hex: rgba)\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\t\n\topen func transformToJSON(_ value: Object?) -> JSON? {\n\t\tif let value = value {\n\t\t\treturn hexString(color: value)\n\t\t}\n\t\treturn nil\n\t}\n\t\n\tfileprivate func hexString(color: Object) -> String {\n\t\tlet comps = color.cgColor.components!\n\t\tlet compsCount = color.cgColor.numberOfComponents\n\t\tlet r: Int\n\t\tlet g: Int\n\t\tvar b: Int\n\t\tlet a = Int(comps[compsCount - 1] * 255)\n\t\tif compsCount == 4 { // RGBA\n\t\t\tr = Int(comps[0] * 255)\n\t\t\tg = Int(comps[1] * 255)\n\t\t\tb = Int(comps[2] * 255)\n\t\t} else { // Grayscale\n\t\t\tr = Int(comps[0] * 255)\n\t\t\tg = Int(comps[0] * 255)\n\t\t\tb = Int(comps[0] * 255)\n\t\t}\n\t\tvar hexString: String = \"\"\n\t\tif prefix {\n\t\t\thexString = \"#\"\n\t\t}\n\t\thexString += String(format: \"%02X%02X%02X\", r, g, b)\n\t\t\n\t\tif alpha {\n\t\t\thexString += String(format: \"%02X\", a)\n\t\t}\n\t\treturn hexString\n\t}\n\t\n\tfileprivate func getColor(hex: String) -> Object? {\n\t\tvar red: CGFloat   = 0.0\n\t\tvar green: CGFloat = 0.0\n\t\tvar blue: CGFloat  = 0.0\n\t\tvar alpha: CGFloat = 1.0\n\t\t\n\t\tlet scanner = Scanner(string: hex)\n\t\tvar hexValue: CUnsignedLongLong = 0\n\t\tif scanner.scanHexInt64(&hexValue) {\n\t\t\tswitch (hex.count) {\n\t\t\tcase 3:\n\t\t\t\tred   = CGFloat((hexValue & 0xF00) >> 8)       / 15.0\n\t\t\t\tgreen = CGFloat((hexValue & 0x0F0) >> 4)       / 15.0\n\t\t\t\tblue  = CGFloat(hexValue & 0x00F)              / 15.0\n\t\t\tcase 4:\n\t\t\t\tred   = CGFloat((hexValue & 0xF000) >> 12)     / 15.0\n\t\t\t\tgreen = CGFloat((hexValue & 0x0F00) >> 8)      / 15.0\n\t\t\t\tblue  = CGFloat((hexValue & 0x00F0) >> 4)      / 15.0\n\t\t\t\talpha = CGFloat(hexValue & 0x000F)             / 15.0\n\t\t\tcase 6:\n\t\t\t\tred   = CGFloat((hexValue & 0xFF0000) >> 16)   / 255.0\n\t\t\t\tgreen = CGFloat((hexValue & 0x00FF00) >> 8)    / 255.0\n\t\t\t\tblue  = CGFloat(hexValue & 0x0000FF)           / 255.0\n\t\t\tcase 8:\n\t\t\t\tred   = CGFloat((hexValue & 0xFF000000) >> 24) / 255.0\n\t\t\t\tgreen = CGFloat((hexValue & 0x00FF0000) >> 16) / 255.0\n\t\t\t\tblue  = CGFloat((hexValue & 0x0000FF00) >> 8)  / 255.0\n\t\t\t\talpha = CGFloat(hexValue & 0x000000FF)         / 255.0\n\t\t\tdefault:\n\t\t\t\t// Invalid RGB string, number of characters after '#' should be either 3, 4, 6 or 8\n\t\t\t\treturn nil\n\t\t\t}\n\t\t} else {\n\t\t\t// \"Scan hex error\n\t\t\treturn nil\n\t\t}\n\t\t#if os(iOS) || os(tvOS) || os(watchOS)\n\t\t\treturn UIColor(red: red, green: green, blue: blue, alpha: alpha)\n\t\t#else\n\t\t\treturn NSColor(red: red, green: green, blue: blue, alpha: alpha)\n\t\t#endif\n\t}\n}\n#endif\n"
  },
  {
    "path": "Sources/ISO8601DateTransform.swift",
    "content": "//\n//  ISO8601DateTransform.swift\n//  ObjectMapper\n//\n//  Created by Jean-Pierre Mouilleseaux on 21 Nov 2014.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\npublic extension DateFormatter {\n\tconvenience init(withFormat format : String, locale : String) {\n\t\tself.init()\n\t\tself.locale = Locale(identifier: locale)\n\t\tdateFormat = format\n\t}\n}\n\nopen class ISO8601DateTransform: DateFormatterTransform {\n\t\n\tstatic let reusableISODateFormatter = DateFormatter(withFormat: \"yyyy-MM-dd'T'HH:mm:ssZZZZZ\", locale: \"en_US_POSIX\")\n\n\tpublic init() {\n\t\tsuper.init(dateFormatter: ISO8601DateTransform.reusableISODateFormatter)\n\t}\n}\n\n"
  },
  {
    "path": "Sources/ImmutableMappable.swift",
    "content": "//\n//  ImmutableMappble.swift\n//  ObjectMapper\n//\n//  Created by Suyeol Jeon on 23/09/2016.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\npublic protocol ImmutableMappable: BaseMappable {\n\tinit(map: Map) throws\n}\n\npublic extension ImmutableMappable {\n\t\n\t/// Implement this method to support object -> JSON transform.\n\tfunc mapping(map: Map) {}\n\t\n\t/// Initializes object from a JSON String\n\tinit(JSONString: String, context: MapContext? = nil) throws {\n\t\tself = try Mapper(context: context).map(JSONString: JSONString)\n\t}\n\t\n\t/// Initializes object from a JSON Dictionary\n\tinit(JSON: [String: Any], context: MapContext? = nil) throws {\n\t\tself = try Mapper(context: context).map(JSON: JSON)\n\t}\n\t\n\t/// Initializes object from a JSONObject\n\tinit(JSONObject: Any, context: MapContext? = nil) throws {\n\t\tself = try Mapper(context: context).map(JSONObject: JSONObject)\n\t}\n\t\n}\n\npublic extension Map {\n\n\tfileprivate func currentValue(for key: String, nested: Bool? = nil, delimiter: String = \".\") -> Any? {\n\t\tlet isNested = nested ?? key.contains(delimiter)\n\t\treturn self[key, nested: isNested, delimiter: delimiter].currentValue\n\t}\n\t\n\t// MARK: Basic\n\n\t/// Returns a value or throws an error.\n\tfunc value<T>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> T {\n\t\tlet currentValue = self.currentValue(for: key, nested: nested, delimiter: delimiter)\n\t\tguard let value = currentValue as? T else {\n\t\t\tthrow MapError(key: key, currentValue: currentValue, reason: \"Cannot cast to '\\(T.self)'\", file: file, function: function, line: line)\n\t\t}\n\t\treturn value\n\t}\n\n\t/// Returns a transformed value or throws an error.\n\tfunc value<Transform: TransformType>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", using transform: Transform, file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> Transform.Object {\n\t\tlet currentValue = self.currentValue(for: key, nested: nested, delimiter: delimiter)\n\t\tguard let value = transform.transformFromJSON(currentValue) else {\n\t\t\tthrow MapError(key: key, currentValue: currentValue, reason: \"Cannot transform to '\\(Transform.Object.self)' using \\(transform)\", file: file, function: function, line: line)\n\t\t}\n\t\treturn value\n\t}\n\t\n\t/// Returns a RawRepresentable type or throws an error.\n\tfunc value<T: RawRepresentable>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> T {\n\t\treturn try self.value(key, nested: nested, delimiter: delimiter, using: EnumTransform(), file: file, function: function, line: line)\n\t}\n\t\n\t/// Returns a RawRepresentable type or throws an error.\n\tfunc value<T: RawRepresentable>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> T? {\n\t\treturn try self.value(key, nested: nested, delimiter: delimiter, using: EnumTransform(), file: file, function: function, line: line)\n\t}\n\n\t/// Returns a `[RawRepresentable]` type or throws an error.\n\tfunc value<T: RawRepresentable>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> [T] {\n\t\treturn try self.value(key, nested: nested, delimiter: delimiter, using: EnumTransform(), file: file, function: function, line: line)\n\t}\n\n\t/// Returns a `[RawRepresentable]` type or throws an error.\n\tfunc value<T: RawRepresentable>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> [T]? {\n\t\treturn try self.value(key, nested: nested, delimiter: delimiter, using: EnumTransform(), file: file, function: function, line: line)\n\t}\n\n\t// MARK: BaseMappable\n\n\t/// Returns a `BaseMappable` object or throws an error.\n\tfunc value<T: BaseMappable>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> T {\n\t\tlet currentValue = self.currentValue(for: key, nested: nested, delimiter: delimiter)\n\t\tguard let JSONObject = currentValue else {\n\t\t\tthrow MapError(key: key, currentValue: currentValue, reason: \"Found unexpected nil value\", file: file, function: function, line: line)\n\t\t}\n\t\treturn try Mapper<T>(context: context).mapOrFail(JSONObject: JSONObject)\n\t}\n\t\n\t/// Returns a `BaseMappable` object boxed in `Optional` or throws an error.\n\tfunc value<T: BaseMappable>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> T? {\n\t\tlet currentValue = self.currentValue(for: key, nested: nested, delimiter: delimiter)\n\t\tguard let JSONObject = currentValue else {\n\t\t\tthrow MapError(key: key, currentValue: currentValue, reason: \"Found unexpected nil value\", file: file, function: function, line: line)\n\t\t}\n\t\treturn try Mapper<T>(context: context).mapOrFail(JSONObject: JSONObject)\n\t}\n\n\t// MARK: [BaseMappable]\n\n\t/// Returns a `[BaseMappable]` or throws an error.\n\tfunc value<T: BaseMappable>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> [T] {\n\t\tlet currentValue = self.currentValue(for: key, nested: nested, delimiter: delimiter)\n\t\tguard let jsonArray = currentValue as? [Any] else {\n\t\t\tthrow MapError(key: key, currentValue: currentValue, reason: \"Cannot cast to '[Any]'\", file: file, function: function, line: line)\n\t\t}\n\t\t\n\t\treturn try jsonArray.map { JSONObject -> T in\n\t\t\treturn try Mapper<T>(context: context).mapOrFail(JSONObject: JSONObject)\n\t\t}\n\t}\n\t\n\t/// Returns a `[BaseMappable]` boxed in `Optional` or throws an error.\n\tfunc value<T: BaseMappable>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> [T]? {\n\t\tlet currentValue = self.currentValue(for: key, nested: nested, delimiter: delimiter)\n\t\tguard let jsonArray = currentValue as? [Any] else {\n\t\t\tthrow MapError(key: key, currentValue: currentValue, reason: \"Cannot cast to '[Any]'\", file: file, function: function, line: line)\n\t\t}\n\t\t\n\t\treturn try jsonArray.map { JSONObject -> T in\n\t\t\treturn try Mapper<T>(context: context).mapOrFail(JSONObject: JSONObject)\n\t\t}\n\t}\n\n\t/// Returns a `[BaseMappable]` using transform or throws an error.\n\tfunc value<Transform: TransformType>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", using transform: Transform, file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> [Transform.Object] {\n\t\tlet currentValue = self.currentValue(for: key, nested: nested, delimiter: delimiter)\n\t\tguard let jsonArray = currentValue as? [Any] else {\n\t\t\tthrow MapError(key: key, currentValue: currentValue, reason: \"Cannot cast to '[Any]'\", file: file, function: function, line: line)\n\t\t}\n\t\t\n\t\treturn try jsonArray.map { json -> Transform.Object in\n\t\t\tguard let object = transform.transformFromJSON(json) else {\n\t\t\t\tthrow MapError(key: \"\\(key)\", currentValue: json, reason: \"Cannot transform to '\\(Transform.Object.self)' using \\(transform)\", file: file, function: function, line: line)\n\t\t\t}\n\t\t\treturn object\n\t\t}\n\t}\n\n\t// MARK: [String: BaseMappable]\n\n\t/// Returns a `[String: BaseMappable]` or throws an error.\n\tfunc value<T: BaseMappable>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> [String: T] {\n\t\t\n\t\tlet currentValue = self.currentValue(for: key, nested: nested, delimiter: delimiter)\n\t\tguard let jsonDictionary = currentValue as? [String: Any] else {\n\t\t\tthrow MapError(key: key, currentValue: currentValue, reason: \"Cannot cast to '[String: Any]'\", file: file, function: function, line: line)\n\t\t}\n\t\treturn try jsonDictionary.mapValues { json in\n\t\t\treturn try Mapper<T>(context: context).mapOrFail(JSONObject: json)\n\t\t}\n\t}\n\n\t/// Returns a `[String: BaseMappable]` boxed in `Optional` or throws an error.\n\tfunc value<T: BaseMappable>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> [String: T]? {\n\t\t\n\t\tlet currentValue = self.currentValue(for: key, nested: nested, delimiter: delimiter)\n\t\tguard let jsonDictionary = currentValue as? [String: Any] else {\n\t\t\tthrow MapError(key: key, currentValue: currentValue, reason: \"Cannot cast to '[String: Any]'\", file: file, function: function, line: line)\n\t\t}\n\t\tvar value: [String: T] = [:]\n\t\tfor (key, json) in jsonDictionary {\n\t\t\tvalue[key] = try Mapper<T>(context: context).mapOrFail(JSONObject: json)\n\t\t}\n\t\treturn value\n\t}\n\n\t/// Returns a `[String: BaseMappable]` using transform or throws an error.\n\tfunc value<Transform: TransformType>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", using transform: Transform, file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> [String: Transform.Object] {\n\t\t\n\t\tlet currentValue = self.currentValue(for: key, nested: nested, delimiter: delimiter)\n\t\tguard let jsonDictionary = currentValue as? [String: Any] else {\n\t\t\tthrow MapError(key: key, currentValue: currentValue, reason: \"Cannot cast to '[String: Any]'\", file: file, function: function, line: line)\n\t\t}\n\t\treturn try jsonDictionary.mapValues { json in\n\t\t\tguard let object = transform.transformFromJSON(json) else {\n\t\t\t\tthrow MapError(key: key, currentValue: json, reason: \"Cannot transform to '\\(Transform.Object.self)' using \\(transform)\", file: file, function: function, line: line)\n\t\t\t}\n\t\t\treturn object\n\t\t}\n\t}\n\t\n\t/// Returns a `[String: BaseMappable]` using transform or throws an error.\n\tfunc value<T: BaseMappable>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> [[T]]? {\n\t\t\n\t\tlet currentValue = self.currentValue(for: key, nested: nested, delimiter: delimiter)\n\t\tguard let json2DArray = currentValue as? [[Any]] else {\n\t\t\tthrow MapError(key: key, currentValue: currentValue, reason: \"Cannot cast to '[[Any]]'\", file: file, function: function, line: line)\n\t\t}\n\t\treturn try json2DArray.map { jsonArray in\n\t\t\ttry jsonArray.map { jsonObject -> T in\n\t\t\t\treturn try Mapper<T>(context: context).mapOrFail(JSONObject: jsonObject)\n\t\t\t}\n\t\t}\n\t}\n\t\n\t// MARK: [[BaseMappable]]\n\t/// Returns a `[[BaseMappable]]` or throws an error.\n\tfunc value<T: BaseMappable>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> [[T]] {\n\t\t\n\t\tlet currentValue = self.currentValue(for: key, nested: nested, delimiter: delimiter)\n\t\tguard let json2DArray = currentValue as? [[Any]] else {\n\t\t\tthrow MapError(key: key, currentValue: currentValue, reason: \"Cannot cast to '[[Any]]'\", file: file, function: function, line: line)\n\t\t}\n\t\treturn try json2DArray.map { jsonArray in\n\t\t\ttry jsonArray.map { jsonObject -> T in\n\t\t\t\treturn try Mapper<T>(context: context).mapOrFail(JSONObject: jsonObject)\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/// Returns a `[[BaseMappable]]` using transform or throws an error.\n\tfunc value<Transform: TransformType>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", using transform: Transform, file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> [[Transform.Object]] {\n\t\t\n\t\tlet currentValue = self.currentValue(for: key, nested: nested, delimiter: delimiter)\n\t\tguard let json2DArray = currentValue as? [[Any]] else {\n\t\t\tthrow MapError(key: key, currentValue: currentValue, reason: \"Cannot cast to '[[Any]]'\",\n\t\t\t               file: file, function: function, line: line)\n\t\t}\n\t\t\n\t\treturn try json2DArray.map { jsonArray in\n\t\t\ttry jsonArray.map { json -> Transform.Object in\n\t\t\t\tguard let object = transform.transformFromJSON(json) else {\n\t\t\t\t\tthrow MapError(key: \"\\(key)\", currentValue: json, reason: \"Cannot transform to '\\(Transform.Object.self)' using \\(transform)\", file: file, function: function, line: line)\n\t\t\t\t}\n\t\t\t\treturn object\n\t\t\t}\n\t\t}\n\t}\n}\n\npublic extension Mapper where N: ImmutableMappable {\n\t\n\tfunc map(JSON: [String: Any]) throws -> N {\n\t\treturn try self.mapOrFail(JSON: JSON)\n\t}\n\t\n\tfunc map(JSONString: String) throws -> N {\n\t\treturn try mapOrFail(JSONString: JSONString)\n\t}\n\t\n\tfunc map(JSONObject: Any) throws -> N {\n\t\treturn try mapOrFail(JSONObject: JSONObject)\n\t}\n\t\n\t// MARK: Array mapping functions\n\t\n\tfunc mapArray(JSONArray: [[String: Any]]) throws -> [N] {\n\t\t#if swift(>=4.1)\n\t\treturn try JSONArray.compactMap(mapOrFail)\n\t\t#else\n\t\treturn try JSONArray.flatMap(mapOrFail)\n\t\t#endif\n\t}\n\t\n\tfunc mapArray(JSONString: String) throws -> [N] {\n\t\tguard let JSONObject = Mapper.parseJSONString(JSONString: JSONString) else {\n\t\t\tthrow MapError(key: nil, currentValue: JSONString, reason: \"Cannot convert string into Any'\")\n\t\t}\n\t\t\n\t\treturn try mapArray(JSONObject: JSONObject)\n\t}\n\t\n\tfunc mapArray(JSONObject: Any) throws -> [N] {\n\t\tguard let JSONArray = JSONObject as? [[String: Any]] else {\n\t\t\tthrow MapError(key: nil, currentValue: JSONObject, reason: \"Cannot cast to '[[String: Any]]'\")\n\t\t}\n\t\t\n\t\treturn try mapArray(JSONArray: JSONArray)\n\t}\n\n\t// MARK: Dictionary mapping functions\n\n\tfunc mapDictionary(JSONString: String) throws -> [String: N] {\n\t\tguard let JSONObject = Mapper.parseJSONString(JSONString: JSONString) else {\n\t\t\tthrow MapError(key: nil, currentValue: JSONString, reason: \"Cannot convert string into Any'\")\n\t\t}\n\n\t\treturn try mapDictionary(JSONObject: JSONObject)\n\t}\n\n\tfunc mapDictionary(JSONObject: Any?) throws -> [String: N] {\n\t\tguard let JSON = JSONObject as? [String: [String: Any]] else {\n\t\t\tthrow MapError(key: nil, currentValue: JSONObject, reason: \"Cannot cast to '[String: [String: Any]]''\")\n\t\t}\n\n\t\treturn try mapDictionary(JSON: JSON)\n\t}\n\n\tfunc mapDictionary(JSON: [String: [String: Any]]) throws -> [String: N] {\n\t\treturn try JSON.filterMap(mapOrFail)\n\t}\n\n\t// MARK: Dictinoary of arrays mapping functions\n\n\tfunc mapDictionaryOfArrays(JSONObject: Any?) throws -> [String: [N]] {\n\t\tguard let JSON = JSONObject as? [String: [[String: Any]]] else {\n\t\t\tthrow MapError(key: nil, currentValue: JSONObject, reason: \"Cannot cast to '[String: [String: Any]]''\")\n\t\t}\n\t\treturn try mapDictionaryOfArrays(JSON: JSON)\n\t}\n\n\tfunc mapDictionaryOfArrays(JSON: [String: [[String: Any]]]) throws -> [String: [N]] {\n\t\treturn try JSON.filterMap { array -> [N] in\n\t\t\ttry mapArray(JSONArray: array)\n\t\t}\n\t}\n\n\t// MARK: 2 dimentional array mapping functions\n\n\tfunc mapArrayOfArrays(JSONObject: Any?) throws -> [[N]] {\n\t\tguard let JSONArray = JSONObject as? [[[String: Any]]] else {\n\t\t\tthrow MapError(key: nil, currentValue: JSONObject, reason: \"Cannot cast to '[[[String: Any]]]''\")\n\t\t}\n\t\treturn try JSONArray.map(mapArray)\n\t}\n\n}\n\ninternal extension Mapper {\n\n\tfunc mapOrFail(JSON: [String: Any]) throws -> N {\n\t\tlet map = Map(mappingType: .fromJSON, JSON: JSON, context: context, shouldIncludeNilValues: shouldIncludeNilValues)\n\t\t\n\t\t// Check if object is ImmutableMappable, if so use ImmutableMappable protocol for mapping\n\t\tif let klass = N.self as? ImmutableMappable.Type,\n\t\t\tvar object = try klass.init(map: map) as? N {\n\t\t\tobject.mapping(map: map)\n\t\t\treturn object\n\t\t}\n\t\t\n\t\t// If not, map the object the standard way\n\t\tguard let value = self.map(JSON: JSON) else {\n\t\t\tthrow MapError(key: nil, currentValue: JSON, reason: \"Cannot map to '\\(N.self)'\")\n\t\t}\n\t\treturn value\n\t}\n\n\tfunc mapOrFail(JSONString: String) throws -> N {\n\t\tguard let JSON = Mapper.parseJSONStringIntoDictionary(JSONString: JSONString) else {\n\t\t\tthrow MapError(key: nil, currentValue: JSONString, reason: \"Cannot parse into '[String: Any]'\")\n\t\t}\n\t\treturn try mapOrFail(JSON: JSON)\n\t}\n\n\tfunc mapOrFail(JSONObject: Any) throws -> N {\n\t\tguard let JSON = JSONObject as? [String: Any] else {\n\t\t\tthrow MapError(key: nil, currentValue: JSONObject, reason: \"Cannot cast to '[String: Any]'\")\n\t\t}\n\t\treturn try mapOrFail(JSON: JSON)\n\t}\n\n}\n"
  },
  {
    "path": "Sources/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>0.14</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(CURRENT_PROJECT_VERSION)</string>\n\t<key>NSPrincipalClass</key>\n\t<string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sources/IntegerOperators.swift",
    "content": "//\n//  IntegerOperators.swift\n//  ObjectMapper\n//\n//  Created by Suyeol Jeon on 17/02/2017.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\n// MARK: - Signed Integer\n\n/// SignedInteger mapping\npublic func <- <T: SignedInteger>(left: inout T, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tlet value: T = toSignedInteger(right.currentValue) ?? 0\n\t\tFromJSON.basicType(&left, object: value)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\n/// Optional SignedInteger mapping\npublic func <- <T: SignedInteger>(left: inout T?, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tlet value: T? = toSignedInteger(right.currentValue)\n\t\tFromJSON.basicType(&left, object: value)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\n// Code targeting the Swift 4.1 compiler and below.\n#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n/// ImplicitlyUnwrappedOptional SignedInteger mapping\npublic func <- <T: SignedInteger>(left: inout T!, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tlet value: T! = toSignedInteger(right.currentValue)\n\t\tFromJSON.basicType(&left, object: value)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n#endif\n\n\n// MARK: - Unsigned Integer\n\n/// UnsignedInteger mapping\npublic func <- <T: UnsignedInteger>(left: inout T, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tlet value: T = toUnsignedInteger(right.currentValue) ?? 0\n\t\tFromJSON.basicType(&left, object: value)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\n\n/// Optional UnsignedInteger mapping\npublic func <- <T: UnsignedInteger>(left: inout T?, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tlet value: T? = toUnsignedInteger(right.currentValue)\n\t\tFromJSON.basicType(&left, object: value)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\n// Code targeting the Swift 4.1 compiler and below.\n#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n/// ImplicitlyUnwrappedOptional UnsignedInteger mapping\npublic func <- <T: UnsignedInteger>(left: inout T!, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tlet value: T! = toUnsignedInteger(right.currentValue)\n\t\tFromJSON.basicType(&left, object: value)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n#endif\n\n// MARK: - Casting Utils\n\n/// Convert any value to `SignedInteger`.\nprivate func toSignedInteger<T: SignedInteger>(_ value: Any?) -> T? {\n\tguard\n\t\tlet value = value,\n\t\tcase let number as NSNumber = value\n\telse {\n\t\treturn nil\n\t}\n\n\tif T.self ==   Int.self, let x = Int(exactly: number.int64Value) {\n\t\treturn T.init(x)\n\t}\n\tif T.self ==  Int8.self, let x = Int8(exactly: number.int64Value) {\n\t\treturn T.init(x)\n\t}\n\tif T.self == Int16.self, let x = Int16(exactly: number.int64Value) {\n\t\treturn T.init(x)\n\t}\n\tif T.self == Int32.self, let x = Int32(exactly: number.int64Value) {\n\t\treturn T.init(x)\n\t}\n\tif T.self == Int64.self, let x = Int64(exactly: number.int64Value) {\n\t\treturn T.init(x)\n\t}\n\n\treturn nil\n}\n\n/// Convert any value to `UnsignedInteger`.\nprivate func toUnsignedInteger<T: UnsignedInteger>(_ value: Any?) -> T? {\n\tguard\n\t\tlet value = value,\n\t\tcase let number as NSNumber = value\n\telse {\n\t\treturn nil\n\t}\n\n\tif T.self == UInt.self, let x = UInt(exactly: number.uint64Value) {\n\t\treturn T.init(x)\n\t}\n\tif T.self == UInt8.self, let x = UInt8(exactly: number.uint64Value) {\n\t\treturn T.init(x)\n\t}\n\tif T.self == UInt16.self, let x = UInt16(exactly: number.uint64Value) {\n\t\treturn T.init(x)\n\t}\n\tif T.self == UInt32.self, let x = UInt32(exactly: number.uint64Value) {\n\t\treturn T.init(x)\n\t}\n\tif T.self == UInt64.self, let x = UInt64(exactly: number.uint64Value) {\n\t\treturn T.init(x)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "Sources/Map.swift",
    "content": "//\n//  Map.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2015-10-09.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n\nimport Foundation\n\n/// MapContext is available for developers who wish to pass information around during the mapping process.\npublic protocol MapContext {\n\t\n}\n\n/// A class used for holding mapping data\npublic final class Map {\n\tpublic let mappingType: MappingType\n\t\n\tpublic internal(set) var JSON: [String: Any] = [:]\n\tpublic internal(set) var isKeyPresent = false\n\tpublic internal(set) var currentValue: Any?\n\tpublic internal(set) var currentKey: String?\n\tvar keyIsNested = false\n\tpublic internal(set) var nestedKeyDelimiter: String = \".\"\n\tpublic var context: MapContext?\n\tpublic var shouldIncludeNilValues = false  /// If this is set to true, toJSON output will include null values for any variables that are not set.\n\t\n\tpublic let toObject: Bool // indicates whether the mapping is being applied to an existing object\n\t\n\tpublic init(mappingType: MappingType, JSON: [String: Any], toObject: Bool = false, context: MapContext? = nil, shouldIncludeNilValues: Bool = false) {\n\t\t\n\t\tself.mappingType = mappingType\n\t\tself.JSON = JSON\n\t\tself.toObject = toObject\n\t\tself.context = context\n\t\tself.shouldIncludeNilValues = shouldIncludeNilValues\n\t}\n\t\n\t/// Sets the current mapper value and key.\n\t/// The Key paramater can be a period separated string (ex. \"distance.value\") to access sub objects.\n\tpublic subscript(key: String) -> Map {\n\t\t// save key and value associated to it\n\t\treturn self.subscript(key: key)\n\t}\n\t\n\tpublic subscript(key: String, delimiter delimiter: String) -> Map {\n\t\treturn self.subscript(key: key, delimiter: delimiter)\n\t}\n\t\n\tpublic subscript(key: String, nested nested: Bool) -> Map {\n\t\treturn self.subscript(key: key, nested: nested)\n\t}\n\t\n\tpublic subscript(key: String, nested nested: Bool, delimiter delimiter: String) -> Map {\n\t\treturn self.subscript(key: key, nested: nested, delimiter: delimiter)\n\t}\n\t\n\tpublic subscript(key: String, ignoreNil ignoreNil: Bool) -> Map {\n\t\treturn self.subscript(key: key, ignoreNil: ignoreNil)\n\t}\n\t\n\tpublic subscript(key: String, delimiter delimiter: String, ignoreNil ignoreNil: Bool) -> Map {\n\t\treturn self.subscript(key: key, delimiter: delimiter, ignoreNil: ignoreNil)\n\t}\n\t\n\tpublic subscript(key: String, nested nested: Bool, ignoreNil ignoreNil: Bool) -> Map {\n\t\treturn self.subscript(key: key, nested: nested, ignoreNil: ignoreNil)\n\t}\n\t\n\tpublic subscript(key: String, nested nested: Bool?, delimiter delimiter: String, ignoreNil ignoreNil: Bool) -> Map {\n\t\treturn self.subscript(key: key, nested: nested, delimiter: delimiter, ignoreNil: ignoreNil)\n\t}\n\t\n\tprivate func `subscript`(key: String, nested: Bool? = nil, delimiter: String = \".\", ignoreNil: Bool = false) -> Map {\n\t\t// save key and value associated to it\n\t\tcurrentKey = key\n\t\tkeyIsNested = nested ?? key.contains(delimiter)\n\t\tnestedKeyDelimiter = delimiter\n\t\t\n\t\tif mappingType == .fromJSON {\n\t\t\t// check if a value exists for the current key\n\t\t\t// do this pre-check for performance reasons\n\t\t\tif keyIsNested {\n\t\t\t\t// break down the components of the key that are separated by delimiter\n\t\t\t\t(isKeyPresent, currentValue) = valueFor(ArraySlice(key.components(separatedBy: delimiter)), dictionary: JSON)\n\t\t\t} else {\n\t\t\t\tlet object = JSON[key]\n\t\t\t\tlet isNSNull = object is NSNull\n\t\t\t\tisKeyPresent = isNSNull ? true : object != nil\n\t\t\t\tcurrentValue = isNSNull ? nil : object\n\t\t\t}\n\t\t\t\n\t\t\t// update isKeyPresent if ignoreNil is true\n\t\t\tif ignoreNil && currentValue == nil {\n\t\t\t\tisKeyPresent = false\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn self\n\t}\n\t\n\tpublic func value<T>() -> T? {\n\t\tlet value = currentValue as? T\n\t\t\n\t\t// Swift 4.1 breaks Float casting from `NSNumber`. So Added extra checks for `Float` `[Float]` and `[String:Float]`\n\t\tif value == nil && T.self == Float.self {\n\t\t\tif let v = currentValue as? NSNumber {\n\t\t\t\treturn v.floatValue as? T\n\t\t\t}\n\t\t} else if value == nil && T.self == [Float].self {\n\t\t\tif let v = currentValue as? [Double] {\n\t\t\t\t#if swift(>=4.1)\n\t\t\t\treturn v.compactMap{ Float($0) } as? T\n\t\t\t\t#else\n\t\t\t\treturn v.flatMap{ Float($0) } as? T\n\t\t\t\t#endif\n\t\t\t}\n\t\t} else if value == nil && T.self == [String:Float].self {\n\t\t\tif let v = currentValue as? [String:Double] {\n\t\t\t\treturn v.mapValues{ Float($0) } as? T\n\t\t\t}\n\t\t}\n\t\treturn value\n\t}\n}\n\n/// Fetch value from JSON dictionary, loop through keyPathComponents until we reach the desired object\nprivate func valueFor(_ keyPathComponents: ArraySlice<String>, dictionary: [String: Any]) -> (Bool, Any?) {\n\t// Implement it as a tail recursive function.\n\tif keyPathComponents.isEmpty {\n\t\treturn (false, nil)\n\t}\n\t\n\tif let keyPath = keyPathComponents.first {\n\t\tlet isTail = keyPathComponents.count == 1\n\t\tlet object = dictionary[keyPath]\n\t\tif object is NSNull {\n\t\t\treturn (isTail, nil)\n\t\t} else if keyPathComponents.count > 1, let dict = object as? [String: Any] {\n\t\t\tlet tail = keyPathComponents.dropFirst()\n\t\t\treturn valueFor(tail, dictionary: dict)\n\t\t} else if keyPathComponents.count > 1, let array = object as? [Any] {\n\t\t\tlet tail = keyPathComponents.dropFirst()\n\t\t\treturn valueFor(tail, array: array)\n\t\t} else {\n\t\t\treturn (isTail && object != nil, object)\n\t\t}\n\t}\n\t\n\treturn (false, nil)\n}\n\n/// Fetch value from JSON Array, loop through keyPathComponents them until we reach the desired object\nprivate func valueFor(_ keyPathComponents: ArraySlice<String>, array: [Any]) -> (Bool, Any?) {\n\t// Implement it as a tail recursive function.\n\t\n\tif keyPathComponents.isEmpty {\n\t\treturn (false, nil)\n\t}\n\t\n\t//Try to convert keypath to Int as index\n\tif let keyPath = keyPathComponents.first,\n\t\tlet index = Int(keyPath) , index >= 0 && index < array.count {\n\t\t\n\t\tlet isTail = keyPathComponents.count == 1\n\t\tlet object = array[index]\n\t\t\n\t\tif object is NSNull {\n\t\t\treturn (isTail, nil)\n\t\t} else if keyPathComponents.count > 1, let array = object as? [Any]  {\n\t\t\tlet tail = keyPathComponents.dropFirst()\n\t\t\treturn valueFor(tail, array: array)\n\t\t} else if  keyPathComponents.count > 1, let dict = object as? [String: Any] {\n\t\t\tlet tail = keyPathComponents.dropFirst()\n\t\t\treturn valueFor(tail, dictionary: dict)\n\t\t} else {\n\t\t\treturn (isTail, object)\n\t\t}\n\t}\n\t\n\treturn (false, nil)\n}\n\n// MARK: - Default Value\n\npublic extension Map {\n\n\t/// Returns `default` value if there is nothing to parse.\n  func value<T>(_ key: String, default: T.Object, using transform: T) throws -> T.Object where T: TransformType {\n    if let value: T.Object = try? self.value(key, using: transform) {\n      return value\n    } else {\n      return `default`\n    }\n  }\n\n\t/// Returns `default` value if there is nothing to parse.\n  func value<T>(_ key: String, default: T) throws -> T {\n    if let value: T = try? self.value(key) {\n      return value\n    } else {\n      return `default`\n    }\n  }\n\n\t/// Returns `default` value if there is nothing to parse.\n  func value<T: BaseMappable>(_ key: String, default: [T]) -> [T] {\n    do {\n      let value: [T] = try self.value(key)\n      return value\n    } catch {\n      return `default`\n    }\n  }\n\n\t/// Returns `default` value if there is nothing to parse.\n  func value<T>(_ key: String, default: T) throws -> T where T: BaseMappable {\n    if let value: T = try? self.value(key) as T {\n      return value\n    } else {\n      return `default`\n    }\n  }\n}\n"
  },
  {
    "path": "Sources/MapError.swift",
    "content": "//\n//  MapError.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2016-09-26.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\npublic struct MapError: Error {\n\tpublic var key: String?\n\tpublic var currentValue: Any?\n\tpublic var reason: String?\n\tpublic var file: StaticString?\n\tpublic var function: StaticString?\n\tpublic var line: UInt?\n\t\n\tpublic init(key: String?, currentValue: Any?, reason: String?, file: StaticString? = nil, function: StaticString? = nil, line: UInt? = nil) {\n\t\tself.key = key\n\t\tself.currentValue = currentValue\n\t\tself.reason = reason\n\t\tself.file = file\n\t\tself.function = function\n\t\tself.line = line\n\t}\n}\n\nextension MapError: CustomStringConvertible {\n\t\n\tprivate var location: String? {\n\t\tguard let file = file, let function = function, let line = line else { return nil }\n\t\tlet fileName = ((String(describing: file).components(separatedBy: \"/\").last ?? \"\").components(separatedBy: \".\").first ?? \"\")\n\t\treturn \"\\(fileName).\\(function):\\(line)\"\n\t}\n\t\n\tpublic var description: String {\n\t\tlet info: [(String, Any?)] = [\n\t\t\t(\"- reason\", reason),\n\t\t\t(\"- location\", location),\n\t\t\t(\"- key\", key),\n\t\t\t(\"- currentValue\", currentValue),\n\t\t\t]\n\t\tlet infoString = info.map { \"\\($0.0): \\($0.1 ?? \"nil\")\" }.joined(separator: \"\\n\")\n\t\treturn \"Got an error while mapping.\\n\\(infoString)\"\n\t}\n\t\n}\n"
  },
  {
    "path": "Sources/Mappable.swift",
    "content": "//\n//  Mappable.swift\n//  ObjectMapper\n//\n//  Created by Scott Hoyt on 10/25/15.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\n/// BaseMappable should not be implemented directly. Mappable or StaticMappable should be used instead\npublic protocol BaseMappable {\n\t/// This function is where all variable mappings should occur. It is executed by Mapper during the mapping (serialization and deserialization) process.\n\tmutating func mapping(map: Map)\n}\n\npublic protocol Mappable: BaseMappable {\n    /// This function can be used to validate JSON prior to mapping. Return nil to cancel mapping at this point\n    init?(map: Map)\n}\n\npublic protocol StaticMappable: BaseMappable {\n\t/// This is function that can be used to:\n\t///\t\t1) provide an existing cached object to be used for mapping\n\t///\t\t2) return an object of another class (which conforms to BaseMappable) to be used for mapping. For instance, you may inspect the JSON to infer the type of object that should be used for any given mapping\n\tstatic func objectForMapping(map: Map) -> BaseMappable?\n}\n\npublic extension Mappable {\n\t\n\t/// Initializes object from a JSON String\n\tinit?(JSONString: String, context: MapContext? = nil) {\n\t\tif let obj: Self = Mapper(context: context).map(JSONString: JSONString) {\n\t\t\tself = obj\n\t\t} else {\n\t\t\treturn nil\n\t\t}\n\t}\n\t\n\t/// Initializes object from a JSON Dictionary\n\tinit?(JSON: [String: Any], context: MapContext? = nil) {\n\t\tif let obj: Self = Mapper(context: context).map(JSON: JSON) {\n\t\t\tself = obj\n\t\t} else {\n\t\t\treturn nil\n\t\t}\n\t}\n}\n\npublic extension BaseMappable {\n\n\t/// Returns the JSON Dictionary for the object\n\tfunc toJSON() -> [String: Any] {\n\t\treturn Mapper().toJSON(self)\n\t}\n\n\t/// Returns the JSON String for the object\n\tfunc toJSONString(prettyPrint: Bool = false) -> String? {\n\t\treturn Mapper().toJSONString(self, prettyPrint: prettyPrint)\n\t}\n}\n\npublic extension Array where Element: BaseMappable {\n\t\n\t/// Initialize Array from a JSON String\n\tinit?(JSONString: String, context: MapContext? = nil) {\n\t\tif let obj: [Element] = Mapper(context: context).mapArray(JSONString: JSONString) {\n\t\t\tself = obj\n\t\t} else {\n\t\t\treturn nil\n\t\t}\n\t}\n\t\n\t/// Initialize Array from a JSON Array\n\tinit(JSONArray: [[String: Any]], context: MapContext? = nil) {\n\t\tlet obj: [Element] = Mapper(context: context).mapArray(JSONArray: JSONArray)\n\t\tself = obj\n\t}\n\t\n\t/// Returns the JSON Array\n\tfunc toJSON() -> [[String: Any]] {\n\t\treturn Mapper().toJSONArray(self)\n\t}\n\t\n\t/// Returns the JSON String for the object\n\tfunc toJSONString(prettyPrint: Bool = false) -> String? {\n\t\treturn Mapper().toJSONString(self, prettyPrint: prettyPrint)\n\t}\n}\n\npublic extension Set where Element: BaseMappable {\n\t\n\t/// Initializes a set from a JSON String\n\tinit?(JSONString: String, context: MapContext? = nil) {\n\t\tif let obj: Set<Element> = Mapper(context: context).mapSet(JSONString: JSONString) {\n\t\t\tself = obj\n\t\t} else {\n\t\t\treturn nil\n\t\t}\n\t}\n\t\n\t/// Initializes a set from JSON\n\tinit?(JSONArray: [[String: Any]], context: MapContext? = nil) {\n\t\tguard let obj = Mapper(context: context).mapSet(JSONArray: JSONArray) as Set<Element>? else {\n            return nil\n        }\n\t\tself = obj\n\t}\n\t\n\t/// Returns the JSON Set\n\tfunc toJSON() -> [[String: Any]] {\n\t\treturn Mapper().toJSONSet(self)\n\t}\n\t\n\t/// Returns the JSON String for the object\n\tfunc toJSONString(prettyPrint: Bool = false) -> String? {\n\t\treturn Mapper().toJSONString(self, prettyPrint: prettyPrint)\n\t}\n}\n"
  },
  {
    "path": "Sources/Mapper.swift",
    "content": "//\n//  Mapper.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2014-10-09.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\npublic enum MappingType {\n\tcase fromJSON\n\tcase toJSON\n}\n\n/// The Mapper class provides methods for converting Model objects to JSON and methods for converting JSON to Model objects\npublic final class Mapper<N: BaseMappable> {\n\t\n\tpublic var context: MapContext?\n\tpublic var shouldIncludeNilValues = false /// If this is set to true, toJSON output will include null values for any variables that are not set.\n\t\n\tpublic init(context: MapContext? = nil, shouldIncludeNilValues: Bool = false){\n\t\tself.context = context\n\t\tself.shouldIncludeNilValues = shouldIncludeNilValues\n\t}\n\t\n\t// MARK: Mapping functions that map to an existing object toObject\n\t\n\t/// Maps a JSON object to an existing Mappable object if it is a JSON dictionary, or returns the passed object as is\n\tpublic func map(JSONObject: Any?, toObject object: N) -> N {\n\t\tif let JSON = JSONObject as? [String: Any] {\n\t\t\treturn map(JSON: JSON, toObject: object)\n\t\t}\n\t\t\n\t\treturn object\n\t}\n\t\n\t/// Map a JSON string onto an existing object\n\tpublic func map(JSONString: String, toObject object: N) -> N {\n\t\tif let JSON = Mapper.parseJSONStringIntoDictionary(JSONString: JSONString) {\n\t\t\treturn map(JSON: JSON, toObject: object)\n\t\t}\n\t\treturn object\n\t}\n\t\n\t/// Maps a JSON dictionary to an existing object that conforms to Mappable.\n\t/// Usefull for those pesky objects that have crappy designated initializers like NSManagedObject\n\tpublic func map(JSON: [String: Any], toObject object: N) -> N {\n\t\tvar mutableObject = object\n\t\tlet map = Map(mappingType: .fromJSON, JSON: JSON, toObject: true, context: context, shouldIncludeNilValues: shouldIncludeNilValues)\n\t\tmutableObject.mapping(map: map)\n\t\treturn mutableObject\n\t}\n\n\t//MARK: Mapping functions that create an object\n\t\n\t/// Map a JSON string to an object that conforms to Mappable\n\tpublic func map(JSONString: String) -> N? {\n\t\tif let JSON = Mapper.parseJSONStringIntoDictionary(JSONString: JSONString) {\n\t\t\treturn map(JSON: JSON)\n\t\t}\n\t\t\n\t\treturn nil\n\t}\n\t\n\t/// Maps a JSON object to a Mappable object if it is a JSON dictionary or NSString, or returns nil.\n\tpublic func map(JSONObject: Any?) -> N? {\n\t\tif let JSON = JSONObject as? [String: Any] {\n\t\t\treturn map(JSON: JSON)\n\t\t}\n\n\t\treturn nil\n\t}\n\n\t/// Maps a JSON dictionary to an object that conforms to Mappable\n\tpublic func map(JSON: [String: Any]) -> N? {\n\t\tlet map = Map(mappingType: .fromJSON, JSON: JSON, context: context, shouldIncludeNilValues: shouldIncludeNilValues)\n\t\t\n\t\tif let klass = N.self as? StaticMappable.Type { // Check if object is StaticMappable\n\t\t\tif var object = klass.objectForMapping(map: map) as? N {\n\t\t\t\tobject.mapping(map: map)\n\t\t\t\treturn object\n\t\t\t}\n\t\t} else if let klass = N.self as? Mappable.Type { // Check if object is Mappable\n\t\t\tif var object = klass.init(map: map) as? N {\n\t\t\t\tobject.mapping(map: map)\n\t\t\t\treturn object\n\t\t\t}\n\t\t} else if let klass = N.self as? ImmutableMappable.Type { // Check if object is ImmutableMappable\n\t\t\tdo {\n\t\t\t\tif var object = try klass.init(map: map) as? N {\n\t\t\t\t\tobject.mapping(map: map)\n\t\t\t\t\treturn object\n\t\t\t\t}\n\t\t\t} catch let error {\n\t\t\t\t#if DEBUG\n\t\t\t\t#if !os(Linux)\n\t\t\t\tlet exception: NSException\n\t\t\t\tif let mapError = error as? MapError {\n\t\t\t\t\texception = NSException(name: .init(rawValue: \"MapError\"), reason: mapError.description, userInfo: nil)\n\t\t\t\t} else {\n\t\t\t\t\texception = NSException(name: .init(rawValue: \"ImmutableMappableError\"), reason: error.localizedDescription, userInfo: nil)\n\t\t\t\t}\n\t\t\t\texception.raise()\n\t\t\t\t#endif\n\t\t\t\t#endif\n\t\t\t}\n\t\t} else {\n\t\t\t// Ensure BaseMappable is not implemented directly\n\t\t\tassert(false, \"BaseMappable should not be implemented directly. Please implement Mappable, StaticMappable or ImmutableMappable\")\n\t\t}\n\t\t\n\t\treturn nil\n\t}\n\n\t// MARK: Mapping functions for Arrays and Dictionaries\n\t\n\t/// Maps a JSON array to an object that conforms to Mappable\n\tpublic func mapArray(JSONString: String) -> [N]? {\n\t\tlet parsedJSON: Any? = Mapper.parseJSONString(JSONString: JSONString)\n\n\t\tif let objectArray = mapArray(JSONObject: parsedJSON) {\n\t\t\treturn objectArray\n\t\t}\n\n\t\t// failed to parse JSON into array form\n\t\t// try to parse it into a dictionary and then wrap it in an array\n\t\tif let object = map(JSONObject: parsedJSON) {\n\t\t\treturn [object]\n\t\t}\n\n\t\treturn nil\n\t}\n\t\n\t/// Maps a JSON object to an array of Mappable objects if it is an array of JSON dictionary, or returns nil.\n\tpublic func mapArray(JSONObject: Any?) -> [N]? {\n\t\tif let JSONArray = JSONObject as? [[String: Any]] {\n\t\t\treturn mapArray(JSONArray: JSONArray)\n\t\t}\n\n\t\treturn nil\n\t}\n\t\n\t/// Maps an array of JSON dictionary to an array of Mappable objects\n\tpublic func mapArray(JSONArray: [[String: Any]]) -> [N] {\n\t\t// map every element in JSON array to type N\n\t\t#if swift(>=4.1)\n\t\tlet result = JSONArray.compactMap(map)\n\t\t#else\n\t\tlet result = JSONArray.flatMap(map)\n\t\t#endif\n\t\treturn result\n\t}\n\t\n\t/// Maps a JSON object to a dictionary of Mappable objects if it is a JSON dictionary of dictionaries, or returns nil.\n\tpublic func mapDictionary(JSONString: String) -> [String: N]? {\n\t\tlet parsedJSON: Any? = Mapper.parseJSONString(JSONString: JSONString)\n\t\treturn mapDictionary(JSONObject: parsedJSON)\n\t}\n\t\n\t/// Maps a JSON object to a dictionary of Mappable objects if it is a JSON dictionary of dictionaries, or returns nil.\n\tpublic func mapDictionary(JSONObject: Any?) -> [String: N]? {\n\t\tif let JSON = JSONObject as? [String: [String: Any]] {\n\t\t\treturn mapDictionary(JSON: JSON)\n\t\t}\n\n\t\treturn nil\n\t}\n\n\t/// Maps a JSON dictionary of dictionaries to a dictionary of Mappable objects\n\tpublic func mapDictionary(JSON: [String: [String: Any]]) -> [String: N]? {\n\t\t// map every value in dictionary to type N\n\t\tlet result = JSON.filterMap(map)\n\t\tif !result.isEmpty {\n\t\t\treturn result\n\t\t}\n\t\t\n\t\treturn nil\n\t}\n\t\n\t/// Maps a JSON object to a dictionary of Mappable objects if it is a JSON dictionary of dictionaries, or returns nil.\n\tpublic func mapDictionary(JSONObject: Any?, toDictionary dictionary: [String: N]) -> [String: N] {\n\t\tif let JSON = JSONObject as? [String : [String : Any]] {\n\t\t\treturn mapDictionary(JSON: JSON, toDictionary: dictionary)\n\t\t}\n\t\t\n\t\treturn dictionary\n\t}\n\t\n    /// Maps a JSON dictionary of dictionaries to an existing dictionary of Mappable objects\n    public func mapDictionary(JSON: [String: [String: Any]], toDictionary dictionary: [String: N]) -> [String: N] {\n\t\tvar mutableDictionary = dictionary\n        for (key, value) in JSON {\n            if let object = dictionary[key] {\n\t\t\t\t_ = map(JSON: value, toObject: object)\n            } else {\n\t\t\t\tmutableDictionary[key] = map(JSON: value)\n            }\n        }\n        \n        return mutableDictionary\n    }\n\t\n\t/// Maps a JSON object to a dictionary of arrays of Mappable objects\n\tpublic func mapDictionaryOfArrays(JSONObject: Any?) -> [String: [N]]? {\n\t\tif let JSON = JSONObject as? [String: [[String: Any]]] {\n\t\t\treturn mapDictionaryOfArrays(JSON: JSON)\n\t\t}\n\t\t\n\t\treturn nil\n\t}\n\t\n\t///Maps a JSON dictionary of arrays to a dictionary of arrays of Mappable objects\n\tpublic func mapDictionaryOfArrays(JSON: [String: [[String: Any]]]) -> [String: [N]]? {\n\t\t// map every value in dictionary to type N\n\t\tlet result = JSON.filterMap {\n\t\t\tmapArray(JSONArray: $0)\n        }\n        \n\t\tif !result.isEmpty {\n\t\t\treturn result\n\t\t}\n        \n\t\treturn nil\n\t}\n\t\n\t/// Maps an 2 dimentional array of JSON dictionaries to a 2 dimentional array of Mappable objects\n\tpublic func mapArrayOfArrays(JSONObject: Any?) -> [[N]]? {\n\t\tif let JSONArray = JSONObject as? [[[String: Any]]] {\n\t\t\tlet objectArray = JSONArray.map { innerJSONArray in\n\t\t\t\treturn mapArray(JSONArray: innerJSONArray)\n\t\t\t}\n\t\t\t\n\t\t\tif !objectArray.isEmpty {\n\t\t\t\treturn objectArray\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn nil\n\t}\n\n\t// MARK: Utility functions for converting strings to JSON objects\n\t\n\t/// Convert a JSON String into a Dictionary<String, Any> using NSJSONSerialization\n\tpublic static func parseJSONStringIntoDictionary(JSONString: String) -> [String: Any]? {\n\t\tlet parsedJSON: Any? = Mapper.parseJSONString(JSONString: JSONString)\n\t\treturn parsedJSON as? [String: Any]\n\t}\n\n\t/// Convert a JSON String into an Object using NSJSONSerialization\n\tpublic static func parseJSONString(JSONString: String) -> Any? {\n\t\tlet data = JSONString.data(using: String.Encoding.utf8, allowLossyConversion: true)\n\t\tif let data = data {\n\t\t\tlet parsedJSON: Any?\n\t\t\tdo {\n\t\t\t\tparsedJSON = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments)\n\t\t\t} catch let error {\n\t\t\t\tprint(error)\n\t\t\t\tparsedJSON = nil\n\t\t\t}\n\t\t\treturn parsedJSON\n\t\t}\n\n\t\treturn nil\n\t}\n}\n\nextension Mapper {\n\t// MARK: Functions that create model from JSON file\n\n\t/// JSON file to Mappable object\n\t/// - parameter JSONfile: Filename\n\t/// - Returns: Mappable object\n\tpublic func map(JSONfile: String) -> N? {\n\t\tif let path = Bundle.main.path(forResource: JSONfile, ofType: nil) {\n\t\t\tdo {\n\t\t\t\tlet JSONString = try String(contentsOfFile: path)\n\t\t\t\tdo {\n\t\t\t\t\treturn self.map(JSONString: JSONString)\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\n\t/// JSON file to Mappable object array\n\t/// - parameter JSONfile: Filename\n\t/// - Returns: Mappable object array\n\tpublic func mapArray(JSONfile: String) -> [N]? {\n\t\tif let path = Bundle.main.path(forResource: JSONfile, ofType: nil) {\n\t\t\tdo {\n\t\t\t\tlet JSONString = try String(contentsOfFile: path)\n\t\t\t\tdo {\n\t\t\t\t\treturn self.mapArray(JSONString: JSONString)\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n}\n\nextension Mapper {\n    \n\t// MARK: Functions that create JSON from objects\t\n\t\n\t///Maps an object that conforms to Mappable to a JSON dictionary <String, Any>\n\tpublic func toJSON(_ object: N) -> [String: Any] {\n\t\tvar mutableObject = object\n\t\tlet map = Map(mappingType: .toJSON, JSON: [:], context: context, shouldIncludeNilValues: shouldIncludeNilValues)\n\t\tmutableObject.mapping(map: map)\n\t\treturn map.JSON\n\t}\n\t\n\t///Maps an array of Objects to an array of JSON dictionaries [[String: Any]]\n\tpublic func toJSONArray(_ array: [N]) -> [[String: Any]] {\n\t\treturn array.map {\n\t\t\t// convert every element in array to JSON dictionary equivalent\n\t\t\tself.toJSON($0)\n\t\t}\n\t}\n\t\n\t///Maps a dictionary of Objects that conform to Mappable to a JSON dictionary of dictionaries.\n\tpublic func toJSONDictionary(_ dictionary: [String: N]) -> [String: [String: Any]] {\n\t\treturn dictionary.map { (arg: (key: String, value: N)) in\n\t\t\t// convert every value in dictionary to its JSON dictionary equivalent\n\t\t\treturn (arg.key, self.toJSON(arg.value))\n\t\t}\n\t}\n\t\n\t///Maps a dictionary of Objects that conform to Mappable to a JSON dictionary of dictionaries.\n\tpublic func toJSONDictionaryOfArrays(_ dictionary: [String: [N]]) -> [String: [[String: Any]]] {\n\t\treturn dictionary.map { (arg: (key: String, value: [N])) in\n\t\t\t// convert every value (array) in dictionary to its JSON dictionary equivalent\n\t\t\treturn (arg.key, self.toJSONArray(arg.value))\n\t\t}\n\t}\n\t\n\t/// Maps an Object to a JSON string with option of pretty formatting\n\tpublic func toJSONString(_ object: N, prettyPrint: Bool = false) -> String? {\n\t\tlet JSONDict = toJSON(object)\n\t\t\n        return Mapper.toJSONString(JSONDict as Any, prettyPrint: prettyPrint)\n\t}\n\n    /// Maps an array of Objects to a JSON string with option of pretty formatting\t\n    public func toJSONString(_ array: [N], prettyPrint: Bool = false) -> String? {\n        let JSONDict = toJSONArray(array)\n        \n        return Mapper.toJSONString(JSONDict as Any, prettyPrint: prettyPrint)\n    }\n\t\n\t/// Converts an Object to a JSON string with option of pretty formatting\n\tpublic static func toJSONString(_ JSONObject: Any, prettyPrint: Bool) -> String? {\n\t\tlet options: JSONSerialization.WritingOptions = prettyPrint ? .prettyPrinted : []\n\t\tif let JSON = Mapper.toJSONData(JSONObject, options: options) {\n\t\t\treturn String(data: JSON, encoding: String.Encoding.utf8)\n\t\t}\n\t\t\n\t\treturn nil\n\t}\n\t\n\t/// Converts an Object to JSON data with options\n\tpublic static func toJSONData(_ JSONObject: Any, options: JSONSerialization.WritingOptions) -> Data? {\n\t\tif JSONSerialization.isValidJSONObject(JSONObject) {\n\t\t\tlet JSONData: Data?\n\t\t\tdo {\n\t\t\t\tJSONData = try JSONSerialization.data(withJSONObject: JSONObject, options: options)\n\t\t\t} catch let error {\n\t\t\t\tprint(error)\n\t\t\t\tJSONData = nil\n\t\t\t}\n\t\t\t\n\t\t\treturn JSONData\n\t\t}\n\t\t\n\t\treturn nil\n\t}\n}\n\nextension Mapper where N: Hashable {\n\t\n\t/// Maps a JSON array to an object that conforms to Mappable\n\tpublic func mapSet(JSONString: String) -> Set<N>? {\n\t\tlet parsedJSON: Any? = Mapper.parseJSONString(JSONString: JSONString)\n\t\t\n\t\tif let objectArray = mapArray(JSONObject: parsedJSON) {\n\t\t\treturn Set(objectArray)\n\t\t}\n\t\t\n\t\t// failed to parse JSON into array form\n\t\t// try to parse it into a dictionary and then wrap it in an array\n\t\tif let object = map(JSONObject: parsedJSON) {\n\t\t\treturn Set([object])\n\t\t}\n\t\t\n\t\treturn nil\n\t}\n\t\n\t/// Maps a JSON object to an Set of Mappable objects if it is an array of JSON dictionary, or returns nil.\n\tpublic func mapSet(JSONObject: Any?) -> Set<N>? {\n\t\tif let JSONArray = JSONObject as? [[String: Any]] {\n\t\t\treturn mapSet(JSONArray: JSONArray)\n\t\t}\n\t\t\n\t\treturn nil\n\t}\n\t\n\t/// Maps an Set of JSON dictionary to an array of Mappable objects\n\tpublic func mapSet(JSONArray: [[String: Any]]) -> Set<N> {\n\t\t// map every element in JSON array to type N\n\t\t#if swift(>=4.1)\n\t\treturn Set(JSONArray.compactMap(map))\n\t\t#else\n\t\treturn Set(JSONArray.flatMap(map))\n\t\t#endif\n\t}\n\n\t///Maps a Set of Objects to a Set of JSON dictionaries [[String : Any]]\n\tpublic func toJSONSet(_ set: Set<N>) -> [[String: Any]] {\n\t\treturn set.map {\n\t\t\t// convert every element in set to JSON dictionary equivalent\n\t\t\tself.toJSON($0)\n\t\t}\n\t}\n\t\n\t/// Maps a set of Objects to a JSON string with option of pretty formatting\n\tpublic func toJSONString(_ set: Set<N>, prettyPrint: Bool = false) -> String? {\n\t\tlet JSONDict = toJSONSet(set)\n\t\t\n\t\treturn Mapper.toJSONString(JSONDict as Any, prettyPrint: prettyPrint)\n\t}\n}\n\nextension Dictionary {\n\tinternal func map<K, V>(_ f: (Element) throws -> (K, V)) rethrows -> [K: V] {\n\t\tvar mapped = [K: V]()\n\n\t\tfor element in self {\n\t\t\tlet newElement = try f(element)\n\t\t\tmapped[newElement.0] = newElement.1\n\t\t}\n\n\t\treturn mapped\n\t}\n\n\tinternal func map<K, V>(_ f: (Element) throws -> (K, [V])) rethrows -> [K: [V]] {\n\t\tvar mapped = [K: [V]]()\n\t\t\n\t\tfor element in self {\n\t\t\tlet newElement = try f(element)\n\t\t\tmapped[newElement.0] = newElement.1\n\t\t}\n\t\t\n\t\treturn mapped\n\t}\n\n\t\n\tinternal func filterMap<U>(_ f: (Value) throws -> U?) rethrows -> [Key: U] {\n\t\tvar mapped = [Key: U]()\n\n\t\tfor (key, value) in self {\n\t\t\tif let newValue = try f(value) {\n\t\t\t\tmapped[key] = newValue\n\t\t\t}\n\t\t}\n\n\t\treturn mapped\n\t}\n}\n"
  },
  {
    "path": "Sources/NSDecimalNumberTransform.swift",
    "content": "//\n//  TransformOf.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 8/22/16.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\nopen class NSDecimalNumberTransform: TransformType {\n    public typealias Object = NSDecimalNumber\n    public typealias JSON = String\n\n    public init() {}\n\n    open func transformFromJSON(_ value: Any?) -> NSDecimalNumber? {\n        if let string = value as? String {\n            return NSDecimalNumber(string: string)\n        } else if let number = value as? NSNumber {\n            return NSDecimalNumber(decimal: number.decimalValue)\n        } else if let double = value as? Double {\n            return NSDecimalNumber(floatLiteral: double)\n        }\n        return nil\n    }\n\n    open func transformToJSON(_ value: NSDecimalNumber?) -> String? {\n        guard let value = value else { return nil }\n        return value.description\n    }\n}\n"
  },
  {
    "path": "Sources/ObjectMapper.h",
    "content": "//\n//  ObjectMapper.h\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2014-10-16.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n\n#import <Foundation/Foundation.h>\n\n//! Project version number for ObjectMapper.\nFOUNDATION_EXPORT double ObjectMapperVersionNumber;\n\n//! Project version string for ObjectMapper.\nFOUNDATION_EXPORT const unsigned char ObjectMapperVersionString[];\n\n// In this header, you should import all the public headers of your framework using statements like #import <ObjectMapper/PublicHeader.h>\n\n\n"
  },
  {
    "path": "Sources/Operators.swift",
    "content": "//\n//  Operators.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2014-10-09.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n/**\n* This file defines a new operator which is used to create a mapping between an object and a JSON key value.\n* There is an overloaded operator definition for each type of object that is supported in ObjectMapper.\n* This provides a way to add custom logic to handle specific types of objects\n*/\n\n/// Operator used for defining mappings to and from JSON\ninfix operator <-\n\n/// Operator used to define mappings to JSON\ninfix operator >>> \n\n// MARK:- Objects with Basic types\n\n/// Object of Basic type\npublic func <- <T>(left: inout T, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.basicType(&left, object: right.value())\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <T>(left: T, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.basicType(left, map: right)\n\t}\n}\n\n\n/// Optional object of basic type\npublic func <- <T>(left: inout T?, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalBasicType(&left, object: right.value())\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <T>(left: T?, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.optionalBasicType(left, map: right)\n\t}\n}\n\n\n// Code targeting the Swift 4.1 compiler and below.\n#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n/// Implicitly unwrapped optional object of basic type\npublic func <- <T>(left: inout T!, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalBasicType(&left, object: right.value())\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n#endif\n\n// MARK:- Mappable Objects - <T: BaseMappable>\n\n/// Object conforming to Mappable\npublic func <- <T: BaseMappable>(left: inout T, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON:\n\t\tFromJSON.object(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\t}\n}\n\npublic func >>> <T: BaseMappable>(left: T, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.object(left, map: right)\n\t}\n}\n\n\n/// Optional Mappable objects\npublic func <- <T: BaseMappable>(left: inout T?, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalObject(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <T: BaseMappable>(left: T?, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.optionalObject(left, map: right)\n\t}\n}\n\n\n// Code targeting the Swift 4.1 compiler and below.\n#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n/// Implicitly unwrapped optional Mappable objects\npublic func <- <T: BaseMappable>(left: inout T!, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalObject(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n#endif\n\n// MARK:- Dictionary of Mappable objects - Dictionary<String, T: BaseMappable>\n\n/// Dictionary of Mappable objects <String, T: Mappable>\npublic func <- <T: BaseMappable>(left: inout Dictionary<String, T>, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.objectDictionary(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <T: BaseMappable>(left: Dictionary<String, T>, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.objectDictionary(left, map: right)\n\t}\n}\n\n\n/// Optional Dictionary of Mappable object <String, T: Mappable>\npublic func <- <T: BaseMappable>(left: inout Dictionary<String, T>?, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalObjectDictionary(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <T: BaseMappable>(left: Dictionary<String, T>?, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.optionalObjectDictionary(left, map: right)\n\t}\n}\n\n\n// Code targeting the Swift 4.1 compiler and below.\n#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n/// Implicitly unwrapped Optional Dictionary of Mappable object <String, T: Mappable>\npublic func <- <T: BaseMappable>(left: inout Dictionary<String, T>!, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalObjectDictionary(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n#endif\n\n/// Dictionary of Mappable objects <String, T: Mappable>\npublic func <- <T: BaseMappable>(left: inout Dictionary<String, [T]>, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.objectDictionaryOfArrays(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <T: BaseMappable>(left: Dictionary<String, [T]>, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.objectDictionaryOfArrays(left, map: right)\n\t}\n}\n\n/// Optional Dictionary of Mappable object <String, T: Mappable>\npublic func <- <T: BaseMappable>(left: inout Dictionary<String, [T]>?, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalObjectDictionaryOfArrays(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <T: BaseMappable>(left: Dictionary<String, [T]>?, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.optionalObjectDictionaryOfArrays(left, map: right)\n\t}\n}\n\n\n// Code targeting the Swift 4.1 compiler and below.\n#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n/// Implicitly unwrapped Optional Dictionary of Mappable object <String, T: Mappable>\npublic func <- <T: BaseMappable>(left: inout Dictionary<String, [T]>!, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalObjectDictionaryOfArrays(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n#endif\n\n// MARK:- Array of Mappable objects - Array<T: BaseMappable>\n\n/// Array of Mappable objects\npublic func <- <T: BaseMappable>(left: inout Array<T>, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.objectArray(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <T: BaseMappable>(left: Array<T>, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.objectArray(left, map: right)\n\t}\n}\n\n/// Optional array of Mappable objects\npublic func <- <T: BaseMappable>(left: inout Array<T>?, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalObjectArray(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <T: BaseMappable>(left: Array<T>?, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.optionalObjectArray(left, map: right)\n\t}\n}\n\n\n// Code targeting the Swift 4.1 compiler and below.\n#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n/// Implicitly unwrapped Optional array of Mappable objects\npublic func <- <T: BaseMappable>(left: inout Array<T>!, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalObjectArray(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n#endif\n\n// MARK:- Array of Array of Mappable objects - Array<Array<T: BaseMappable>>\n\n/// Array of Array Mappable objects\npublic func <- <T: BaseMappable>(left: inout Array<Array<T>>, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.twoDimensionalObjectArray(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <T: BaseMappable>(left: Array<Array<T>>, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.twoDimensionalObjectArray(left, map: right)\n\t}\n}\n\n\n/// Optional array of Mappable objects\npublic func <- <T: BaseMappable>(left:inout Array<Array<T>>?, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalTwoDimensionalObjectArray(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <T: BaseMappable>(left: Array<Array<T>>?, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.optionalTwoDimensionalObjectArray(left, map: right)\n\t}\n}\n\n\n// Code targeting the Swift 4.1 compiler and below.\n#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n/// Implicitly unwrapped Optional array of Mappable objects\npublic func <- <T: BaseMappable>(left: inout Array<Array<T>>!, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalTwoDimensionalObjectArray(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n#endif\n\n// MARK:- Set of Mappable objects - Set<T: BaseMappable>\n\n/// Set of Mappable objects\npublic func <- <T: BaseMappable>(left: inout Set<T>, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.objectSet(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <T: BaseMappable>(left: Set<T>, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.objectSet(left, map: right)\n\t}\n}\n\n\n/// Optional Set of Mappable objects\npublic func <- <T: BaseMappable>(left: inout Set<T>?, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalObjectSet(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <T: BaseMappable>(left: Set<T>?, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.optionalObjectSet(left, map: right)\n\t}\n}\n\n\n// Code targeting the Swift 4.1 compiler and below.\n#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n/// Implicitly unwrapped Optional Set of Mappable objects\npublic func <- <T: BaseMappable>(left: inout Set<T>!, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalObjectSet(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n#endif\n"
  },
  {
    "path": "Sources/Resources/PrivacyInfo.xcprivacy",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>NSPrivacyAccessedAPITypes</key>\n\t<array/>\n\t<key>NSPrivacyCollectedDataTypes</key>\n\t<array/>\n\t<key>NSPrivacyTracking</key>\n\t<false/>\n\t<key>NSPrivacyTrackingDomains</key>\n\t<array/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sources/ToJSON.swift",
    "content": "//\n//  ToJSON.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2014-10-13.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\nprivate func setValue(_ value: Any, map: Map) {\n\tsetValue(value, key: map.currentKey!, checkForNestedKeys: map.keyIsNested, delimiter: map.nestedKeyDelimiter, dictionary: &map.JSON)\n}\n\nprivate func setValue(_ value: Any, key: String, checkForNestedKeys: Bool, delimiter: String, dictionary: inout [String : Any]) {\n\tif checkForNestedKeys {\n\t\tlet keyComponents = ArraySlice(key.components(separatedBy: delimiter).filter { !$0.isEmpty }.map { $0 })\n\t\tsetValue(value, forKeyPathComponents: keyComponents, dictionary: &dictionary)\n\t} else {\n\t\tdictionary[key] = value\n\t}\n}\n\nprivate func setValue(_ value: Any, forKeyPathComponents components: ArraySlice<String>, dictionary: inout [String : Any]) {\n\tguard let head = components.first else {\n\t\treturn\n\t}\n\n\tlet headAsString = String(head)\n\tif components.count == 1 {\n\t\tdictionary[headAsString] = value\n\t} else {\n\t\tvar child = dictionary[headAsString] as? [String : Any] ?? [:]\n\t\t\n\t\tlet tail = components.dropFirst()\n\t\tsetValue(value, forKeyPathComponents: tail, dictionary: &child)\n\n\t\tdictionary[headAsString] = child\n\t}\n}\n\ninternal final class ToJSON {\n\t\n\tclass func basicType<N>(_ field: N, map: Map) {\n\t\tif let x = field as Any? , false\n\t\t\t|| x is NSNumber // Basic types\n\t\t\t|| x is Bool\n\t\t\t|| x is Int\n\t\t\t|| x is Double\n\t\t\t|| x is Float\n\t\t\t|| x is String\n\t\t\t|| x is NSNull\n\t\t\t|| x is Array<NSNumber> // Arrays\n\t\t\t|| x is Array<Bool>\n\t\t\t|| x is Array<Int>\n\t\t\t|| x is Array<Double>\n\t\t\t|| x is Array<Float>\n\t\t\t|| x is Array<String>\n\t\t\t|| x is Array<Any>\n\t\t\t|| x is Array<Dictionary<String, Any>>\n\t\t\t|| x is Dictionary<String, NSNumber> // Dictionaries\n\t\t\t|| x is Dictionary<String, Bool>\n\t\t\t|| x is Dictionary<String, Int>\n\t\t\t|| x is Dictionary<String, Double>\n\t\t\t|| x is Dictionary<String, Float>\n\t\t\t|| x is Dictionary<String, String>\n\t\t\t|| x is Dictionary<String, Any>\n\t\t{\n\t\t\tsetValue(x, map: map)\n\t\t}\n\t}\n\t\n\tclass func optionalBasicType<N>(_ field: N?, map: Map) {\n\t\tif let field = field {\n\t\t\tbasicType(field, map: map)\n\t\t} else if map.shouldIncludeNilValues {\n\t\t\tbasicType(NSNull(), map: map)  //If BasicType is nil, emit NSNull into the JSON output\n\t\t}\n\t}\n\n\tclass func object<N: BaseMappable>(_ field: N, map: Map) {\n\t\tif let result = Mapper(context: map.context, shouldIncludeNilValues: map.shouldIncludeNilValues).toJSON(field) as Any? {\n\t\t\tsetValue(result, map: map)\n\t\t}\n\t}\n\t\n\tclass func optionalObject<N: BaseMappable>(_ field: N?, map: Map) {\n\t\tif let field = field {\n\t\t\tobject(field, map: map)\n\t\t} else if map.shouldIncludeNilValues {\n\t\t\tbasicType(NSNull(), map: map)  //If field is nil, emit NSNull into the JSON output\n\t\t}\n\t}\n\n\tclass func objectArray<N: BaseMappable>(_ field: Array<N>, map: Map) {\n\t\tlet JSONObjects = Mapper(context: map.context, shouldIncludeNilValues: map.shouldIncludeNilValues).toJSONArray(field)\n\t\t\n\t\tsetValue(JSONObjects, map: map)\n\t}\n\t\n\tclass func optionalObjectArray<N: BaseMappable>(_ field: Array<N>?, map: Map) {\n\t\tif let field = field {\n\t\t\tobjectArray(field, map: map)\n\t\t}\n\t}\n\t\n\tclass func twoDimensionalObjectArray<N: BaseMappable>(_ field: Array<Array<N>>, map: Map) {\n\t\tvar array = [[[String: Any]]]()\n\t\tfor innerArray in field {\n\t\t\tlet JSONObjects = Mapper(context: map.context, shouldIncludeNilValues: map.shouldIncludeNilValues).toJSONArray(innerArray)\n\t\t\tarray.append(JSONObjects)\n\t\t}\n\t\tsetValue(array, map: map)\n\t}\n\t\n\tclass func optionalTwoDimensionalObjectArray<N: BaseMappable>(_ field: Array<Array<N>>?, map: Map) {\n\t\tif let field = field {\n\t\t\ttwoDimensionalObjectArray(field, map: map)\n\t\t}\n\t}\n\t\n\tclass func objectSet<N: BaseMappable>(_ field: Set<N>, map: Map) {\n\t\tlet JSONObjects = Mapper(context: map.context, shouldIncludeNilValues: map.shouldIncludeNilValues).toJSONSet(field)\n\t\t\n\t\tsetValue(JSONObjects, map: map)\n\t}\n\t\n\tclass func optionalObjectSet<N: BaseMappable>(_ field: Set<N>?, map: Map) {\n\t\tif let field = field {\n\t\t\tobjectSet(field, map: map)\n\t\t}\n\t}\n\t\n\tclass func objectDictionary<N: BaseMappable>(_ field: Dictionary<String, N>, map: Map) {\n\t\tlet JSONObjects = Mapper(context: map.context, shouldIncludeNilValues: map.shouldIncludeNilValues).toJSONDictionary(field)\n\t\t\n\t\tsetValue(JSONObjects, map: map)\n\t}\n\n\tclass func optionalObjectDictionary<N: BaseMappable>(_ field: Dictionary<String, N>?, map: Map) {\n\t\tif let field = field {\n\t\t\tobjectDictionary(field, map: map)\n\t\t}\n\t}\n\n\tclass func objectDictionaryOfArrays<N: BaseMappable>(_ field: Dictionary<String, [N]>, map: Map) {\n\t\tlet JSONObjects = Mapper(context: map.context, shouldIncludeNilValues: map.shouldIncludeNilValues).toJSONDictionaryOfArrays(field)\n\n\t\tsetValue(JSONObjects, map: map)\n\t}\n\t\n\tclass func optionalObjectDictionaryOfArrays<N: BaseMappable>(_ field: Dictionary<String, [N]>?, map: Map) {\n\t\tif let field = field {\n\t\t\tobjectDictionaryOfArrays(field, map: map)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Sources/TransformOf.swift",
    "content": "//\n//  TransformOf.swift\n//  ObjectMapper\n//\n//  Created by Syo Ikeda on 1/23/15.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nopen class TransformOf<ObjectType, JSONType>: TransformType {\n\tpublic typealias Object = ObjectType\n\tpublic typealias JSON = JSONType\n\n\tprivate let fromJSON: (JSONType?) -> ObjectType?\n\tprivate let toJSON: (ObjectType?) -> JSONType?\n\n\tpublic init(fromJSON: @escaping(JSONType?) -> ObjectType?, toJSON: @escaping(ObjectType?) -> JSONType?) {\n\t\tself.fromJSON = fromJSON\n\t\tself.toJSON = toJSON\n\t}\n\n\topen func transformFromJSON(_ value: Any?) -> ObjectType? {\n\t\treturn fromJSON(value as? JSONType)\n\t}\n\n\topen func transformToJSON(_ value: ObjectType?) -> JSONType? {\n\t\treturn toJSON(value)\n\t}\n}\n"
  },
  {
    "path": "Sources/TransformOperators.swift",
    "content": "//\n//  TransformOperators.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2016-09-26.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\n// MARK:- Transforms\n\n/// Object of Basic type with Transform\npublic func <- <Transform: TransformType>(left: inout Transform.Object, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet value = transform.transformFromJSON(map.currentValue)\n\t\tFromJSON.basicType(&left, object: value)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: Transform.Object, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON {\n\t\tlet value: Transform.JSON? = transform.transformToJSON(left)\n\t\tToJSON.optionalBasicType(value, map: map)\n\t}\n}\n\n\n/// Optional object of basic type with Transform\npublic func <- <Transform: TransformType>(left: inout Transform.Object?, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet value = transform.transformFromJSON(map.currentValue)\n\t\tFromJSON.optionalBasicType(&left, object: value)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: Transform.Object?, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON {\n\t\tlet value: Transform.JSON? = transform.transformToJSON(left)\n\t\tToJSON.optionalBasicType(value, map: map)\n\t}\n}\n\n\n// Code targeting the Swift 4.1 compiler and below.\n#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n/// Implicitly unwrapped optional object of basic type with Transform\npublic func <- <Transform: TransformType>(left: inout Transform.Object!, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet value = transform.transformFromJSON(map.currentValue)\n\t\tFromJSON.optionalBasicType(&left, object: value)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n#endif\n\n/// Array of Basic type with Transform\npublic func <- <Transform: TransformType>(left: inout [Transform.Object], right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet values = fromJSONArrayWithTransform(map.currentValue, transform: transform)\n\t\tFromJSON.basicType(&left, object: values)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: [Transform.Object], right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON{\n\t\tlet values = toJSONArrayWithTransform(left, transform: transform)\n\t\tToJSON.optionalBasicType(values, map: map)\n\t}\n}\n\n\n/// Optional array of Basic type with Transform\npublic func <- <Transform: TransformType>(left: inout [Transform.Object]?, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet values = fromJSONArrayWithTransform(map.currentValue, transform: transform)\n\t\tFromJSON.optionalBasicType(&left, object: values)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: [Transform.Object]?, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON {\n\t\tlet values = toJSONArrayWithTransform(left, transform: transform)\n\t\tToJSON.optionalBasicType(values, map: map)\n\t}\n}\n\n\n// Code targeting the Swift 4.1 compiler and below.\n#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n/// Implicitly unwrapped optional array of Basic type with Transform\npublic func <- <Transform: TransformType>(left: inout [Transform.Object]!, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet values = fromJSONArrayWithTransform(map.currentValue, transform: transform)\n\t\tFromJSON.optionalBasicType(&left, object: values)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n#endif\n\n/// Dictionary of Basic type with Transform\npublic func <- <Transform: TransformType>(left: inout [String: Transform.Object], right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet values = fromJSONDictionaryWithTransform(map.currentValue, transform: transform)\n\t\tFromJSON.basicType(&left, object: values)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: [String: Transform.Object], right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tif map.mappingType == . toJSON {\n\t\tlet values = toJSONDictionaryWithTransform(left, transform: transform)\n\t\tToJSON.optionalBasicType(values, map: map)\n\t}\n}\n\n\n/// Optional dictionary of Basic type with Transform\npublic func <- <Transform: TransformType>(left: inout [String: Transform.Object]?, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet values = fromJSONDictionaryWithTransform(map.currentValue, transform: transform)\n\t\tFromJSON.optionalBasicType(&left, object: values)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: [String: Transform.Object]?, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON {\n\t\tlet values = toJSONDictionaryWithTransform(left, transform: transform)\n\t\tToJSON.optionalBasicType(values, map: map)\n\t}\n}\n\n\n// Code targeting the Swift 4.1 compiler and below.\n#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n/// Implicitly unwrapped optional dictionary of Basic type with Transform\npublic func <- <Transform: TransformType>(left: inout [String: Transform.Object]!, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet values = fromJSONDictionaryWithTransform(map.currentValue, transform: transform)\n\t\tFromJSON.optionalBasicType(&left, object: values)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n#endif\n\n// MARK:- Transforms of Mappable Objects - <T: BaseMappable>\n\n/// Object conforming to Mappable that have transforms\npublic func <- <Transform: TransformType>(left: inout Transform.Object, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet value: Transform.Object? = transform.transformFromJSON(map.currentValue)\n\t\tFromJSON.basicType(&left, object: value)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: Transform.Object, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON {\n\t\tlet value: Transform.JSON? = transform.transformToJSON(left)\n\t\tToJSON.optionalBasicType(value, map: map)\n\t}\n}\n\n\n/// Optional Mappable objects that have transforms\npublic func <- <Transform: TransformType>(left: inout Transform.Object?, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet value: Transform.Object? = transform.transformFromJSON(map.currentValue)\n\t\tFromJSON.optionalBasicType(&left, object: value)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: Transform.Object?, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON{\n\t\tlet value: Transform.JSON? = transform.transformToJSON(left)\n\t\tToJSON.optionalBasicType(value, map: map)\n\t}\n}\n\n\n// Code targeting the Swift 4.1 compiler and below.\n#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n/// Implicitly unwrapped optional Mappable objects that have transforms\npublic func <- <Transform: TransformType>(left: inout Transform.Object!, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet value: Transform.Object? = transform.transformFromJSON(map.currentValue)\n\t\tFromJSON.optionalBasicType(&left, object: value)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n#endif\n\n\n// MARK:- Dictionary of Mappable objects with a transform - Dictionary<String, T: BaseMappable>\n\n/// Dictionary of Mappable objects <String, T: Mappable> with a transform\npublic func <- <Transform: TransformType>(left: inout Dictionary<String, Transform.Object>, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tif map.mappingType == .fromJSON && map.isKeyPresent,\n\t\tlet object = map.currentValue as? [String: Any] {\n\t\tlet value = fromJSONDictionaryWithTransform(object as Any?, transform: transform) ?? left\n\t\tFromJSON.basicType(&left, object: value)\n\t} else if map.mappingType == .toJSON {\n\t\tleft >>> right\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: Dictionary<String, Transform.Object>, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON {\n\t\tlet value = toJSONDictionaryWithTransform(left, transform: transform)\n\t\tToJSON.basicType(value, map: map)\n\t}\n}\n\n\n/// Optional Dictionary of Mappable object <String, T: Mappable> with a transform\npublic func <- <Transform: TransformType>(left: inout Dictionary<String, Transform.Object>?, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tif map.mappingType == .fromJSON && map.isKeyPresent, let object = map.currentValue as? [String : Any]{\n\t\tlet value = fromJSONDictionaryWithTransform(object as Any?, transform: transform) ?? left\n\t\tFromJSON.optionalBasicType(&left, object: value)\n\t} else if map.mappingType == .toJSON {\n\t\tleft >>> right\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: Dictionary<String, Transform.Object>?, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON {\n\t\tlet value = toJSONDictionaryWithTransform(left, transform: transform)\n\t\tToJSON.optionalBasicType(value, map: map)\n\t}\n}\n\n\n// Code targeting the Swift 4.1 compiler and below.\n#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n/// Implicitly unwrapped Optional Dictionary of Mappable object <String, T: Mappable> with a transform\npublic func <- <Transform: TransformType>(left: inout Dictionary<String, Transform.Object>!, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tif map.mappingType == .fromJSON && map.isKeyPresent, let dictionary = map.currentValue as? [String : Any]{\n\t\tlet transformedDictionary = fromJSONDictionaryWithTransform(dictionary as Any?, transform: transform) ?? left\n\t\tFromJSON.optionalBasicType(&left, object: transformedDictionary)\n\t} else if map.mappingType == .toJSON {\n\t\tleft >>> right\n\t}\n}\n#endif\n\n/// Dictionary of Mappable objects <String, T: Mappable> with a transform\npublic func <- <Transform: TransformType>(left: inout Dictionary<String, [Transform.Object]>, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\t\n\tif let dictionary = map.currentValue as? [String : [Any]], map.mappingType == .fromJSON && map.isKeyPresent {\n\t\tlet transformedDictionary = dictionary.map { (arg: (key: String, values: [Any])) -> (String, [Transform.Object]) in\n\t\t\tlet (key, values) = arg\n\t\t\tif let jsonArray = fromJSONArrayWithTransform(values, transform: transform) {\n\t\t\t\treturn (key, jsonArray)\n\t\t\t}\n\t\t\tif let leftValue = left[key] {\n\t\t\t\treturn (key, leftValue)\n\t\t\t}\n\t\t\treturn (key, [])\n\t\t}\n\t\t\n\t\tFromJSON.basicType(&left, object: transformedDictionary)\n\t} else if map.mappingType == .toJSON {\n\t\tleft >>> right\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: Dictionary<String, [Transform.Object]>, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\t\n\tif map.mappingType == .toJSON {\n\t\t\n\t\tlet transformedDictionary = left.map { (arg: (key: String, value: [Transform.Object])) in\n\t\t\treturn (arg.key, toJSONArrayWithTransform(arg.value, transform: transform) ?? [])\n\t\t}\n\t\t\n\t\tToJSON.basicType(transformedDictionary, map: map)\n\t}\n}\n\n\n/// Optional Dictionary of Mappable object <String, T: Mappable> with a transform\npublic func <- <Transform: TransformType>(left: inout Dictionary<String, [Transform.Object]>?, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\t\n\tif let dictionary = map.currentValue as? [String : [Any]], map.mappingType == .fromJSON && map.isKeyPresent {\n\t\t\n\t\tlet transformedDictionary = dictionary.map { (arg: (key: String, values: [Any])) -> (String, [Transform.Object]) in\n\t\t\tlet (key, values) = arg\n\t\t\tif let jsonArray = fromJSONArrayWithTransform(values, transform: transform) {\n\t\t\t\treturn (key, jsonArray)\n\t\t\t}\n\t\t\tif let leftValue = left?[key] {\n\t\t\t\treturn (key, leftValue)\n\t\t\t}\n\t\t\treturn (key, [])\n\t\t}\n\t\t\n\t\tFromJSON.optionalBasicType(&left, object: transformedDictionary)\n\t} else if map.mappingType == .toJSON {\n\t\tleft >>> right\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: Dictionary<String, [Transform.Object]>?, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\t\n\tif map.mappingType == .toJSON {\n\t\tlet transformedDictionary = left?.map { (arg: (key: String, values: [Transform.Object])) in\n\t\t\treturn (arg.key, toJSONArrayWithTransform(arg.values, transform: transform) ?? [])\n\t\t}\n\t\t\n\t\tToJSON.optionalBasicType(transformedDictionary, map: map)\n\t}\n}\n\n\n// Code targeting the Swift 4.1 compiler and below.\n#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n/// Implicitly unwrapped Optional Dictionary of Mappable object <String, T: Mappable> with a transform\npublic func <- <Transform: TransformType>(left: inout Dictionary<String, [Transform.Object]>!, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\t\n\tif let dictionary = map.currentValue as? [String : [Any]], map.mappingType == .fromJSON && map.isKeyPresent {\n\t\tlet transformedDictionary = dictionary.map { (arg: (key: String, values: [Any])) -> (String, [Transform.Object]) in\n\t\t\tlet (key, values) = arg\n\t\t\tif let jsonArray = fromJSONArrayWithTransform(values, transform: transform) {\n\t\t\t\treturn (key, jsonArray)\n\t\t\t}\n\t\t\tif let leftValue = left?[key] {\n\t\t\t\treturn (key, leftValue)\n\t\t\t}\n\t\t\treturn (key, [])\n\t\t}\n\t\tFromJSON.optionalBasicType(&left, object: transformedDictionary)\n\t} else if map.mappingType == .toJSON {\n\t\tleft >>> right\n\t}\n}\n#endif\n\n// MARK:- Array of Mappable objects with transforms - Array<T: BaseMappable>\n\n/// Array of Mappable objects\npublic func <- <Transform: TransformType>(left: inout Array<Transform.Object>, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tif let transformedValues = fromJSONArrayWithTransform(map.currentValue, transform: transform) {\n\t\t\tFromJSON.basicType(&left, object: transformedValues)\n\t\t}\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: Array<Transform.Object>, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON {\n\t\tlet transformedValues = toJSONArrayWithTransform(left, transform: transform)\n\t\tToJSON.optionalBasicType(transformedValues, map: map)\n\t}\n}\n\n\n/// Optional array of Mappable objects\npublic func <- <Transform: TransformType>(left: inout Array<Transform.Object>?, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet transformedValues = fromJSONArrayWithTransform(map.currentValue, transform: transform)\n\t\tFromJSON.optionalBasicType(&left, object: transformedValues)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: Array<Transform.Object>?, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON {\n\t\tlet transformedValues = toJSONArrayWithTransform(left, transform: transform)\n\t\tToJSON.optionalBasicType(transformedValues, map: map)\n\t}\n}\n\n\n// Code targeting the Swift 4.1 compiler and below.\n#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n/// Implicitly unwrapped Optional array of Mappable objects\npublic func <- <Transform: TransformType>(left: inout Array<Transform.Object>!, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet transformedValues = fromJSONArrayWithTransform(map.currentValue, transform: transform)\n\t\tFromJSON.optionalBasicType(&left, object: transformedValues)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n#endif\n\n// MARK:- Array of Array of objects - Array<Array<T>>> with transforms\n\n/// Array of Array of objects with transform\npublic func <- <Transform: TransformType>(left: inout [[Transform.Object]], right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .toJSON:\n\t\tleft >>> right\n\tcase .fromJSON where map.isKeyPresent:\n\t\tguard let original2DArray = map.currentValue as? [[Any]] else { break }\n\t\t#if swift(>=4.1)\n\t\tlet transformed2DArray = original2DArray.compactMap { values in\n\t\t\tfromJSONArrayWithTransform(values as Any?, transform: transform)\n\t\t}\n\t\t#else\n\t\tlet transformed2DArray = original2DArray.flatMap { values in\n\t\t\tfromJSONArrayWithTransform(values as Any?, transform: transform)\n\t\t}\n\t\t#endif\n\t\tFromJSON.basicType(&left, object: transformed2DArray)\n\tdefault:\n\t\tbreak\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: [[Transform.Object]], right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON{\n\t\t#if swift(>=4.1)\n\t\tlet transformed2DArray = left.compactMap { values in\n\t\t\ttoJSONArrayWithTransform(values, transform: transform)\n\t\t}\n\t\t#else\n\t\tlet transformed2DArray = left.flatMap { values in\n\t\t\ttoJSONArrayWithTransform(values, transform: transform)\n\t\t}\n\t\t#endif\n\t\tToJSON.basicType(transformed2DArray, map: map)\n\t}\n}\n\n/// Optional array of array of objects with transform\npublic func <- <Transform: TransformType>(left: inout [[Transform.Object]]?, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .toJSON:\n\t\tleft >>> right\n\tcase .fromJSON where map.isKeyPresent:\n\t\tguard let original2DArray = map.currentValue as? [[Any]] else { break }\n\t\t#if swift(>=4.1)\n\t\tlet transformed2DArray = original2DArray.compactMap { values in\n\t\t\tfromJSONArrayWithTransform(values as Any?, transform: transform)\n\t\t}\n\t\t#else\n\t\tlet transformed2DArray = original2DArray.flatMap { values in\n\t\t\tfromJSONArrayWithTransform(values as Any?, transform: transform)\n\t\t}\n\t\t#endif\n\t\tFromJSON.optionalBasicType(&left, object: transformed2DArray)\n\tdefault:\n\t\tbreak\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: [[Transform.Object]]?, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON {\n\t\t#if swift(>=4.1)\n\t\tlet transformed2DArray = left?.compactMap { values in\n\t\t\ttoJSONArrayWithTransform(values, transform: transform)\n\t\t}\n\t\t#else\n\t\tlet transformed2DArray = left?.flatMap { values in\n\t\t\ttoJSONArrayWithTransform(values, transform: transform)\n\t\t}\n\t\t#endif\n\t\tToJSON.optionalBasicType(transformed2DArray, map: map)\n\t}\n}\n\n\n// Code targeting the Swift 4.1 compiler and below.\n#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n/// Implicitly unwrapped Optional array of array of objects with transform\npublic func <- <Transform: TransformType>(left: inout [[Transform.Object]]!, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .toJSON:\n\t\tleft >>> right\n\tcase .fromJSON where map.isKeyPresent:\n\t\tguard let original2DArray = map.currentValue as? [[Any]] else { break }\n\t\t#if swift(>=4.1)\n\t\tlet transformed2DArray = original2DArray.compactMap { values in\n\t\t\tfromJSONArrayWithTransform(values as Any?, transform: transform)\n\t\t}\n\t\t#else\n\t\tlet transformed2DArray = original2DArray.flatMap { values in\n\t\t\tfromJSONArrayWithTransform(values as Any?, transform: transform)\n\t\t}\n\t\t#endif\n\t\tFromJSON.optionalBasicType(&left, object: transformed2DArray)\n\tdefault:\n\t\tbreak\n\t}\n}\n#endif\n\n// MARK:- Set of Mappable objects with a transform - Set<T: BaseMappable>\n\n/// Set of Mappable objects with transform\npublic func <- <Transform: TransformType>(left: inout Set<Transform.Object>, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tif let transformedValues = fromJSONArrayWithTransform(map.currentValue, transform: transform) {\n\t\t\tFromJSON.basicType(&left, object: Set(transformedValues))\n\t\t}\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: Set<Transform.Object>, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON {\n\t\tlet transformedValues = toJSONArrayWithTransform(Array(left), transform: transform)\n\t\tToJSON.optionalBasicType(transformedValues, map: map)\n\t}\n}\n\n\n/// Optional Set of Mappable objects with transform\npublic func <- <Transform: TransformType>(left: inout Set<Transform.Object>?, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tif let transformedValues = fromJSONArrayWithTransform(map.currentValue, transform: transform) {\n\t\t\tFromJSON.basicType(&left, object: Set(transformedValues))\n\t\t}\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: Set<Transform.Object>?, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON {\n\t\tif let values = left {\n\t\t\tlet transformedValues = toJSONArrayWithTransform(Array(values), transform: transform)\n\t\t\tToJSON.optionalBasicType(transformedValues, map: map)\n\t\t}\n\t}\n}\n\n\n// Code targeting the Swift 4.1 compiler and below.\n#if !(swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0)))\n/// Implicitly unwrapped Optional set of Mappable objects with transform\npublic func <- <Transform: TransformType>(left: inout Set<Transform.Object>!, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tif let transformedValues = fromJSONArrayWithTransform(map.currentValue, transform: transform) {\n\t\t\tFromJSON.basicType(&left, object: Set(transformedValues))\n\t\t}\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n#endif\n\n\nprivate func fromJSONArrayWithTransform<Transform: TransformType>(_ input: Any?, transform: Transform) -> [Transform.Object]? {\n\tif let values = input as? [Any] {\n\t\t#if swift(>=4.1)\n\t\treturn values.compactMap { value in\n\t\t\treturn transform.transformFromJSON(value)\n\t\t}\n\t\t#else\n\t\treturn values.flatMap { value in\n\t\t\treturn transform.transformFromJSON(value)\n\t\t}\n\t\t#endif\n\t} else {\n\t\treturn nil\n\t}\n}\n\nprivate func fromJSONDictionaryWithTransform<Transform: TransformType>(_ input: Any?, transform: Transform) -> [String: Transform.Object]? {\n\tif let values = input as? [String: Any] {\n\t\treturn values.filterMap { value in\n\t\t\treturn transform.transformFromJSON(value)\n\t\t}\n\t} else {\n\t\treturn nil\n\t}\n}\n\nprivate func toJSONArrayWithTransform<Transform: TransformType>(_ input: [Transform.Object]?, transform: Transform) -> [Transform.JSON]? {\n\t#if swift(>=4.1)\n\treturn input?.compactMap { value in\n\t\treturn transform.transformToJSON(value)\n\t}\n\t#else\n\treturn input?.flatMap { value in\n\t\treturn transform.transformToJSON(value)\n\t}\n\t#endif\n}\n\nprivate func toJSONDictionaryWithTransform<Transform: TransformType>(_ input: [String: Transform.Object]?, transform: Transform) -> [String: Transform.JSON]? {\n\treturn input?.filterMap { value in\n\t\treturn transform.transformToJSON(value)\n\t}\n}\n"
  },
  {
    "path": "Sources/TransformType.swift",
    "content": "//\n//  TransformType.swift\n//  ObjectMapper\n//\n//  Created by Syo Ikeda on 2/4/15.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\npublic protocol TransformType {\n\tassociatedtype Object\n\tassociatedtype JSON\n\n\tfunc transformFromJSON(_ value: Any?) -> Object?\n\tfunc transformToJSON(_ value: Object?) -> JSON?\n}\n"
  },
  {
    "path": "Sources/URLTransform.swift",
    "content": "//\n//  URLTransform.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2014-10-27.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\nopen class URLTransform: TransformType {\n\tpublic typealias Object = URL\n\tpublic typealias JSON = String\n\tprivate let shouldEncodeURLString: Bool\n\tprivate let allowedCharacterSet: CharacterSet\n\n\t/**\n\tInitializes the URLTransform with an option to encode URL strings before converting them to an NSURL\n\t- parameter shouldEncodeUrlString: when true (the default) the string is encoded before passing\n\tto `NSURL(string:)`\n\t- returns: an initialized transformer\n\t*/\n\tpublic init(shouldEncodeURLString: Bool = false, allowedCharacterSet: CharacterSet = .urlQueryAllowed) {\n\t\tself.shouldEncodeURLString = shouldEncodeURLString\n\t\tself.allowedCharacterSet = allowedCharacterSet\n\t}\n\n\topen func transformFromJSON(_ value: Any?) -> URL? {\n\t\tguard let URLString = value as? String else { return nil }\n\t\t\n\t\tif !shouldEncodeURLString {\n\t\t\treturn URL(string: URLString)\n\t\t}\n\n\t\tguard let escapedURLString = URLString.addingPercentEncoding(withAllowedCharacters: allowedCharacterSet) else {\n\t\t\treturn nil\n\t\t}\n\t\treturn URL(string: escapedURLString)\n\t}\n\n\topen func transformToJSON(_ value: URL?) -> String? {\n\t\tif let URL = value {\n\t\t\treturn URL.absoluteString\n\t\t}\n\t\treturn nil\n\t}\n}\n"
  },
  {
    "path": "Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Tests/ObjectMapperTests/BasicTypes.swift",
    "content": "//\n//  BasicTypes.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2015-02-17.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\nimport ObjectMapper\n\nclass BasicTypes: Mappable {\n\tvar bool: Bool = true\n\tvar boolOptional: Bool?\n\tvar boolImplicityUnwrapped: Bool!\n\n\tvar int: Int = 0\n\tvar intOptional: Int?\n\tvar intImplicityUnwrapped: Int!\n\n\tvar int8: Int8 = 0\n\tvar int8Optional: Int8?\n\tvar int8ImplicityUnwrapped: Int8!\n\n\tvar int16: Int16 = 0\n\tvar int16Optional: Int16?\n\tvar int16ImplicityUnwrapped: Int16!\n\n\tvar int32: Int32 = 0\n\tvar int32Optional: Int32?\n\tvar int32ImplicityUnwrapped: Int32!\n\n\tvar int64: Int64 = 0\n\tvar int64Optional: Int64?\n\tvar int64ImplicityUnwrapped: Int64!\n\n\tvar uint: UInt = 0\n\tvar uintOptional: UInt?\n\tvar uintImplicityUnwrapped: UInt!\n\n\tvar uint8: UInt8 = 0\n\tvar uint8Optional: UInt8?\n\tvar uint8ImplicityUnwrapped: UInt8!\n\n\tvar uint16: UInt16 = 0\n\tvar uint16Optional: UInt16?\n\tvar uint16ImplicityUnwrapped: UInt16!\n\n\tvar uint32: UInt32 = 0\n\tvar uint32Optional: UInt32?\n\tvar uint32ImplicityUnwrapped: UInt32!\n\n\tvar uint64: UInt64 = 0\n\tvar uint64Optional: UInt64?\n\tvar uint64ImplicityUnwrapped: UInt64!\n\n\tvar double: Double = 1.1\n\tvar doubleOptional: Double?\n\tvar doubleImplicityUnwrapped: Double!\n\tvar float: Float = 1.11\n\tvar floatOptional: Float?\n\tvar floatImplicityUnwrapped: Float!\n\tvar string: String = \"\"\n\tvar stringOptional: String?\n\tvar stringImplicityUnwrapped: String!\n\tvar anyObject: Any = true\n\tvar anyObjectOptional: Any?\n\tvar anyObjectImplicitlyUnwrapped: Any!\n\t\n\tvar arrayBool: Array<Bool> = []\n\tvar arrayBoolOptional: Array<Bool>?\n\tvar arrayBoolImplicityUnwrapped: Array<Bool>!\n\tvar arrayInt: Array<Int> = []\n\tvar arrayIntOptional: Array<Int>?\n\tvar arrayIntImplicityUnwrapped: Array<Int>!\n\tvar arrayDouble: Array<Double> = []\n\tvar arrayDoubleOptional: Array<Double>?\n\tvar arrayDoubleImplicityUnwrapped: Array<Double>!\n\tvar arrayFloat: Array<Float> = []\n\tvar arrayFloatOptional: Array<Float>?\n\tvar arrayFloatImplicityUnwrapped: Array<Float>!\n\tvar arrayString: Array<String> = []\n\tvar arrayStringOptional: Array<String>?\n\tvar arrayStringImplicityUnwrapped: Array<String>!\n\tvar arrayAnyObject: Array<Any> = []\n\tvar arrayAnyObjectOptional: Array<Any>?\n\tvar arrayAnyObjectImplicitlyUnwrapped: Array<Any>!\n\t\n\tvar dictBool: Dictionary<String,Bool> = [:]\n\tvar dictBoolOptional: Dictionary<String, Bool>?\n\tvar dictBoolImplicityUnwrapped: Dictionary<String, Bool>!\n\tvar dictInt: Dictionary<String,Int> = [:]\n\tvar dictIntOptional: Dictionary<String,Int>?\n\tvar dictIntImplicityUnwrapped: Dictionary<String,Int>!\n\tvar dictDouble: Dictionary<String,Double> = [:]\n\tvar dictDoubleOptional: Dictionary<String,Double>?\n\tvar dictDoubleImplicityUnwrapped: Dictionary<String,Double>!\n\tvar dictFloat: Dictionary<String,Float> = [:]\n\tvar dictFloatOptional: Dictionary<String,Float>?\n\tvar dictFloatImplicityUnwrapped: Dictionary<String,Float>!\n\tvar dictString: Dictionary<String,String> = [:]\n\tvar dictStringOptional: Dictionary<String,String>?\n\tvar dictStringImplicityUnwrapped: Dictionary<String,String>!\n\tvar dictAnyObject: Dictionary<String, Any> = [:]\n\tvar dictAnyObjectOptional: Dictionary<String, Any>?\n\tvar dictAnyObjectImplicitlyUnwrapped: Dictionary<String, Any>!\n\n\tenum EnumInt: Int {\n\t\tcase Default\n\t\tcase Another\n\t}\n\tvar enumInt: EnumInt = .Default\n\tvar enumIntOptional: EnumInt?\n\tvar enumIntImplicitlyUnwrapped: EnumInt!\n\n\tenum EnumDouble: Double {\n\t\tcase Default\n\t\tcase Another\n\t}\n\tvar enumDouble: EnumDouble = .Default\n\tvar enumDoubleOptional: EnumDouble?\n\tvar enumDoubleImplicitlyUnwrapped: EnumDouble!\n\n\tenum EnumFloat: Float {\n\t\tcase Default\n\t\tcase Another\n\t}\n\tvar enumFloat: EnumFloat = .Default\n\tvar enumFloatOptional: EnumFloat?\n\tvar enumFloatImplicitlyUnwrapped: EnumFloat!\n\n\tenum EnumString: String {\n\t\tcase Default = \"Default\"\n\t\tcase Another = \"Another\"\n\t}\n\tvar enumString: EnumString = .Default\n\tvar enumStringOptional: EnumString?\n\tvar enumStringImplicitlyUnwrapped: EnumString!\n\n\tvar arrayEnumInt: [EnumInt] = []\n\tvar arrayEnumIntOptional: [EnumInt]?\n\tvar arrayEnumIntImplicitlyUnwrapped: [EnumInt]!\n\n\tvar dictEnumInt: [String: EnumInt] = [:]\n\tvar dictEnumIntOptional: [String: EnumInt]?\n\tvar dictEnumIntImplicitlyUnwrapped: [String: EnumInt]!\n\n\tinit(){\n\t\t\n\t}\n\t\n\trequired init?(map: Map){\n\n\t}\n\t\n\tfunc mapping(map: Map) {\n\t\tbool\t\t\t\t\t\t\t\t<- map[\"bool\"]\n\t\tboolOptional\t\t\t\t\t\t<- map[\"boolOpt\"]\n\t\tboolImplicityUnwrapped\t\t\t\t<- map[\"boolImp\"]\n\n\t\tint\t\t\t\t\t\t\t\t\t<- map[\"int\"]\n\t\tintOptional\t\t\t\t\t\t\t<- map[\"intOpt\"]\n\t\tintImplicityUnwrapped\t\t\t\t<- map[\"intImp\"]\n\n\t\tint8                    \t\t\t<- map[\"int8\"]\n\t\tint8Optional            \t\t\t<- map[\"int8Opt\"]\n\t\tint8ImplicityUnwrapped  \t\t\t<- map[\"int8Imp\"]\n\n\t\tint16                   \t\t\t<- map[\"int16\"]\n\t\tint16Optional           \t\t\t<- map[\"int16Opt\"]\n\t\tint16ImplicityUnwrapped \t\t\t<- map[\"int16Imp\"]\n\n\t\tint32                   \t\t\t<- map[\"int32\"]\n\t\tint32Optional           \t\t\t<- map[\"int32Opt\"]\n\t\tint32ImplicityUnwrapped \t\t\t<- map[\"int32Imp\"]\n\n\t\tint64\t\t\t\t\t\t\t\t<- map[\"int64\"]\n\t\tint64Optional\t\t\t\t\t\t<- map[\"int64Opt\"]\n\t\tint64ImplicityUnwrapped\t\t\t\t<- map[\"int64Imp\"]\n\n\t\tuint\t\t\t\t\t\t\t\t<- map[\"uint\"]\n\t\tuintOptional\t\t\t\t\t\t<- map[\"uintOpt\"]\n\t\tuintImplicityUnwrapped\t\t\t\t<- map[\"uintImp\"]\n\n\t\tuint8                    \t\t\t<- map[\"uint8\"]\n\t\tuint8Optional            \t\t\t<- map[\"uint8Opt\"]\n\t\tuint8ImplicityUnwrapped  \t\t\t<- map[\"uint8Imp\"]\n\n\t\tuint16                   \t\t\t<- map[\"uint16\"]\n\t\tuint16Optional           \t\t\t<- map[\"uint16Opt\"]\n\t\tuint16ImplicityUnwrapped \t\t\t<- map[\"uint16Imp\"]\n\n\t\tuint32                   \t\t\t<- map[\"uint32\"]\n\t\tuint32Optional           \t\t\t<- map[\"uint32Opt\"]\n\t\tuint32ImplicityUnwrapped \t\t\t<- map[\"uint32Imp\"]\n\n\t\tuint64\t\t\t\t\t\t\t\t<- map[\"uint64\"]\n\t\tuint64Optional\t\t\t\t\t\t<- map[\"uint64Opt\"]\n\t\tuint64ImplicityUnwrapped\t\t\t<- map[\"uint64Imp\"]\n\n\t\tdouble\t\t\t\t\t\t\t\t<- map[\"double\"]\n\t\tdoubleOptional\t\t\t\t\t\t<- map[\"doubleOpt\"]\n\t\tdoubleImplicityUnwrapped\t\t\t<- map[\"doubleImp\"]\n\t\tfloat\t\t\t\t\t\t\t\t<- map[\"float\"]\n\t\tfloatOptional\t\t\t\t\t\t<- map[\"floatOpt\"]\n\t\tfloatImplicityUnwrapped\t\t\t\t<- map[\"floatImp\"]\n\t\tstring\t\t\t\t\t\t\t\t<- map[\"string\"]\n\t\tstringOptional\t\t\t\t\t\t<- map[\"stringOpt\"]\n\t\tstringImplicityUnwrapped\t\t\t<- map[\"stringImp\"]\n\t\tanyObject\t\t\t\t\t\t\t<- map[\"anyObject\"]\n\t\tanyObjectOptional\t\t\t\t\t<- map[\"anyObjectOpt\"]\n\t\tanyObjectImplicitlyUnwrapped\t\t<- map[\"anyObjectImp\"]\n\t\t\n\t\tarrayBool\t\t\t\t\t\t\t<- map[\"arrayBool\"]\n\t\tarrayBoolOptional\t\t\t\t\t<- map[\"arrayBoolOpt\"]\n\t\tarrayBoolImplicityUnwrapped\t\t\t<- map[\"arrayBoolImp\"]\n\t\tarrayInt\t\t\t\t\t\t\t<- map[\"arrayInt\"]\n\t\tarrayIntOptional\t\t\t\t\t<- map[\"arrayIntOpt\"]\n\t\tarrayIntImplicityUnwrapped\t\t\t<- map[\"arrayIntImp\"]\n\t\tarrayDouble\t\t\t\t\t\t\t<- map[\"arrayDouble\"]\n\t\tarrayDoubleOptional\t\t\t\t\t<- map[\"arrayDoubleOpt\"]\n\t\tarrayDoubleImplicityUnwrapped\t\t<- map[\"arrayDoubleImp\"]\n\t\tarrayFloat\t\t\t\t\t\t\t<- map[\"arrayFloat\"]\n\t\tarrayFloatOptional\t\t\t\t\t<- map[\"arrayFloatOpt\"]\n\t\tarrayFloatImplicityUnwrapped\t\t<- map[\"arrayFloatImp\"]\n\t\tarrayString\t\t\t\t\t\t\t<- map[\"arrayString\"]\n\t\tarrayStringOptional\t\t\t\t\t<- map[\"arrayStringOpt\"]\n\t\tarrayStringImplicityUnwrapped\t\t<- map[\"arrayStringImp\"]\n\t\tarrayAnyObject\t\t\t\t\t\t<- map[\"arrayAnyObject\"]\n\t\tarrayAnyObjectOptional\t\t\t\t<- map[\"arrayAnyObjectOpt\"]\n\t\tarrayAnyObjectImplicitlyUnwrapped\t<- map[\"arrayAnyObjectImp\"]\n\t\t\n\t\tdictBool\t\t\t\t\t\t\t<- map[\"dictBool\"]\n\t\tdictBoolOptional\t\t\t\t\t<- map[\"dictBoolOpt\"]\n\t\tdictBoolImplicityUnwrapped\t\t\t<- map[\"dictBoolImp\"]\n\t\tdictInt\t\t\t\t\t\t\t\t<- map[\"dictInt\"]\n\t\tdictIntOptional\t\t\t\t\t\t<- map[\"dictIntOpt\"]\n\t\tdictIntImplicityUnwrapped\t\t\t<- map[\"dictIntImp\"]\n\t\tdictDouble\t\t\t\t\t\t\t<- map[\"dictDouble\"]\n\t\tdictDoubleOptional\t\t\t\t\t<- map[\"dictDoubleOpt\"]\n\t\tdictDoubleImplicityUnwrapped\t\t<- map[\"dictDoubleImp\"]\n\t\tdictFloat\t\t\t\t\t\t\t<- map[\"dictFloat\"]\n\t\tdictFloatOptional\t\t\t\t\t<- map[\"dictFloatOpt\"]\n\t\tdictFloatImplicityUnwrapped\t\t\t<- map[\"dictFloatImp\"]\n\t\tdictString\t\t\t\t\t\t\t<- map[\"dictString\"]\n\t\tdictStringOptional\t\t\t\t\t<- map[\"dictStringOpt\"]\n\t\tdictStringImplicityUnwrapped\t\t<- map[\"dictStringImp\"]\n\t\tdictAnyObject\t\t\t\t\t\t<- map[\"dictAnyObject\"]\n\t\tdictAnyObjectOptional\t\t\t\t<- map[\"dictAnyObjectOpt\"]\n\t\tdictAnyObjectImplicitlyUnwrapped\t<- map[\"dictAnyObjectImp\"]\n\n\t\tenumInt\t\t\t\t\t\t\t\t<- map[\"enumInt\"]\n\t\tenumIntOptional\t\t\t\t\t\t<- map[\"enumIntOpt\"]\n\t\tenumIntImplicitlyUnwrapped\t\t\t<- map[\"enumIntImp\"]\n\t\tenumDouble\t\t\t\t\t\t\t<- map[\"enumDouble\"]\n\t\tenumDoubleOptional\t\t\t\t\t<- map[\"enumDoubleOpt\"]\n\t\tenumDoubleImplicitlyUnwrapped\t\t<- map[\"enumDoubleImp\"]\n\t\tenumFloat\t\t\t\t\t\t\t<- map[\"enumFloat\"]\n\t\tenumFloatOptional\t\t\t\t\t<- map[\"enumFloatOpt\"]\n\t\tenumFloatImplicitlyUnwrapped\t\t<- map[\"enumFloatImp\"]\n\t\tenumString\t\t\t\t\t\t\t<- map[\"enumString\"]\n\t\tenumStringOptional\t\t\t\t\t<- map[\"enumStringOpt\"]\n\t\tenumStringImplicitlyUnwrapped\t\t<- map[\"enumStringImp\"]\n\n\t\tarrayEnumInt\t\t\t\t\t\t<- map[\"arrayEnumInt\"]\n\t\tarrayEnumIntOptional\t\t\t\t<- map[\"arrayEnumIntOpt\"]\n\t\tarrayEnumIntImplicitlyUnwrapped\t\t<- map[\"arrayEnumIntImp\"]\n\t\t\n\t\tdictEnumInt\t\t\t\t\t\t\t<- map[\"dictEnumInt\"]\n\t\tdictEnumIntOptional\t\t\t\t\t<- map[\"dictEnumIntOpt\"]\n\t\tdictEnumIntImplicitlyUnwrapped\t\t<- map[\"dictEnumIntImp\"]\n\t}\n}\n\nclass TestCollectionOfPrimitives: Mappable {\n\tvar dictStringString: [String: String] = [:]\n\tvar dictStringInt: [String: Int] = [:]\n\tvar dictStringBool: [String: Bool] = [:]\n\tvar dictStringDouble: [String: Double] = [:]\n\tvar dictStringFloat: [String: Float] = [:]\n\t\n\tvar arrayString: [String] = []\n\tvar arrayInt: [Int] = []\n\tvar arrayBool: [Bool] = []\n\tvar arrayDouble: [Double] = []\n\tvar arrayFloat: [Float] = []\n\t\n\tinit(){\n\t\t\n\t}\n\t\n\trequired init?(map: Map){\n\t\tif map[\"value\"].value() == nil {\n\t\t\t\n\t\t}\n\t\tif map.JSON[\"value\"] == nil {\n\t\t\t\n\t\t}\n\t}\n\t\n\tfunc mapping(map: Map) {\n\t\tdictStringString    <- map[\"dictStringString\"]\n\t\tdictStringBool      <- map[\"dictStringBool\"]\n\t\tdictStringInt       <- map[\"dictStringInt\"]\n\t\tdictStringDouble    <- map[\"dictStringDouble\"]\n\t\tdictStringFloat     <- map[\"dictStringFloat\"]\n\t\tarrayString         <- map[\"arrayString\"]\n\t\tarrayInt            <- map[\"arrayInt\"]\n\t\tarrayBool           <- map[\"arrayBool\"]\n\t\tarrayDouble         <- map[\"arrayDouble\"]\n\t\tarrayFloat          <- map[\"arrayFloat\"]\n\t}\n}\n"
  },
  {
    "path": "Tests/ObjectMapperTests/BasicTypesTestsFromJSON.swift",
    "content": "//\n//  BasicTypesFromJSON.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2015-02-17.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\nimport XCTest\nimport ObjectMapper\n\nclass BasicTypesTestsFromJSON: XCTestCase {\n\n\tlet mapper = Mapper<BasicTypes>()\n\t\n\toverride func setUp() {\n\t\tsuper.setUp()\n\t\t// Put setup code here. This method is called before the invocation of each test method in the class.\n\t}\n\t\n\toverride func tearDown() {\n\t\t// Put teardown code here. This method is called after the invocation of each test method in the class.\n\t\tsuper.tearDown()\n\t}\n\t\n\t// MARK: Test mapping to JSON and back (basic types: Bool, Int, Double, Float, String)\n\t\n\tfunc testMappingBoolFromJSON(){\n\t\tlet value: Bool = true\n\t\tlet JSONString = \"{\\\"bool\\\" : \\(value), \\\"boolOpt\\\" : \\(value), \\\"boolImp\\\" : \\(value)}\"\n\t\t\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.bool, value)\n\t\tXCTAssertEqual(mappedObject?.boolOptional, value)\n\t\tXCTAssertEqual(mappedObject?.boolImplicityUnwrapped, value)\n\t}\n\n\t/// - warning: This test doens't consider integer overflow/underflow.\n\tfunc testMappingIntegerFromJSON(){\n\t\tfunc parameterize<T: FixedWidthInteger>(_ type: T.Type) {\n\t\t\tlet value: T = 123\n\t\t\tlet json: [String: Any] = [\n\t\t\t\t\"int\": value,\n\t\t\t\t\"intOpt\": value,\n\t\t\t\t\"intImp\": value,\n\t\t\t\t\n\t\t\t\t\"int8\": value,\n\t\t\t\t\"int8Opt\": value,\n\t\t\t\t\"int8Imp\": value,\n\t\t\t\t\n\t\t\t\t\"int16\": value,\n\t\t\t\t\"int16Opt\": value,\n\t\t\t\t\"int16Imp\": value,\n\t\t\t\t\n\t\t\t\t\"int32\": value,\n\t\t\t\t\"int32Opt\": value,\n\t\t\t\t\"int32Imp\": value,\n\t\t\t\t\n\t\t\t\t\"int64\": value,\n\t\t\t\t\"int64Opt\": value,\n\t\t\t\t\"int64Imp\": value,\n\t\t\t\t\n\t\t\t\t\"uint\": value,\n\t\t\t\t\"uintOpt\": value,\n\t\t\t\t\"uintImp\": value,\n\t\t\t\t\n\t\t\t\t\"uint8\": value,\n\t\t\t\t\"uint8Opt\": value,\n\t\t\t\t\"uint8Imp\": value,\n\t\t\t\t\n\t\t\t\t\"uint16\": value,\n\t\t\t\t\"uint16Opt\": value,\n\t\t\t\t\"uint16Imp\": value,\n\t\t\t\t\n\t\t\t\t\"uint32\": value,\n\t\t\t\t\"uint32Opt\": value,\n\t\t\t\t\"uint32Imp\": value,\n\t\t\t\t\n\t\t\t\t\"uint64\": value,\n\t\t\t\t\"uint64Opt\": value,\n\t\t\t\t\"uint64Imp\": value,\n\t\t\t]\n\t\t\tlet mappedObject = mapper.map(JSON: json)\n\t\t\tXCTAssertNotNil(mappedObject)\n\t\t\t\n\t\t\tXCTAssertEqual(mappedObject?.int, 123)\n\t\t\tXCTAssertEqual(mappedObject?.intOptional, 123)\n\t\t\tXCTAssertEqual(mappedObject?.intImplicityUnwrapped, 123)\n\t\t\t\n\t\t\tXCTAssertEqual(mappedObject?.int8, 123)\n\t\t\tXCTAssertEqual(mappedObject?.int8Optional, 123)\n\t\t\tXCTAssertEqual(mappedObject?.int8ImplicityUnwrapped, 123)\n\t\t\t\n\t\t\tXCTAssertEqual(mappedObject?.int16, 123)\n\t\t\tXCTAssertEqual(mappedObject?.int16Optional, 123)\n\t\t\tXCTAssertEqual(mappedObject?.int16ImplicityUnwrapped, 123)\n\t\t\t\n\t\t\tXCTAssertEqual(mappedObject?.int32, 123)\n\t\t\tXCTAssertEqual(mappedObject?.int32Optional, 123)\n\t\t\tXCTAssertEqual(mappedObject?.int32ImplicityUnwrapped, 123)\n\t\t\t\n\t\t\tXCTAssertEqual(mappedObject?.int64, 123)\n\t\t\tXCTAssertEqual(mappedObject?.int64Optional, 123)\n\t\t\tXCTAssertEqual(mappedObject?.int64ImplicityUnwrapped, 123)\n\t\t\t\n\t\t\tXCTAssertEqual(mappedObject?.uint, 123)\n\t\t\tXCTAssertEqual(mappedObject?.uintOptional, 123)\n\t\t\tXCTAssertEqual(mappedObject?.uintImplicityUnwrapped, 123)\n\t\t\t\n\t\t\tXCTAssertEqual(mappedObject?.uint8, 123)\n\t\t\tXCTAssertEqual(mappedObject?.uint8Optional, 123)\n\t\t\tXCTAssertEqual(mappedObject?.uint8ImplicityUnwrapped, 123)\n\t\t\t\n\t\t\tXCTAssertEqual(mappedObject?.uint16, 123)\n\t\t\tXCTAssertEqual(mappedObject?.uint16Optional, 123)\n\t\t\tXCTAssertEqual(mappedObject?.uint16ImplicityUnwrapped, 123)\n\t\t\t\n\t\t\tXCTAssertEqual(mappedObject?.uint32, 123)\n\t\t\tXCTAssertEqual(mappedObject?.uint32Optional, 123)\n\t\t\tXCTAssertEqual(mappedObject?.uint32ImplicityUnwrapped, 123)\n\t\t\t\n\t\t\tXCTAssertEqual(mappedObject?.uint64, 123)\n\t\t\tXCTAssertEqual(mappedObject?.uint64Optional, 123)\n\t\t\tXCTAssertEqual(mappedObject?.uint64ImplicityUnwrapped, 123)\n\t\t}\n\t\t\n\t\tparameterize(Int.self)\n\t\tparameterize(Int8.self)\n\t\tparameterize(Int16.self)\n\t\tparameterize(Int32.self)\n\t\tparameterize(Int64.self)\n\t\t\n\t\tparameterize(UInt.self)\n\t\tparameterize(UInt8.self)\n\t\tparameterize(UInt16.self)\n\t\tparameterize(UInt32.self)\n\t\tparameterize(UInt64.self)\n\t}\n\n\tfunc testMappingIntegerWithOverflowFromJSON(){\n\t\tlet signedValue = Int.max\n\t\tlet unsignedValue = UInt.max\n\n\t\tlet json: [String: Any] = [\n\t\t\t\"int\": signedValue,\n\t\t\t\"intOpt\": signedValue,\n\t\t\t\"intImp\": signedValue,\n\n\t\t\t\"int8\": signedValue,\n\t\t\t\"int8Opt\": signedValue,\n\t\t\t\"int8Imp\": signedValue,\n\n\t\t\t\"int16\": signedValue,\n\t\t\t\"int16Opt\": signedValue,\n\t\t\t\"int16Imp\": signedValue,\n\n\t\t\t\"int32\": signedValue,\n\t\t\t\"int32Opt\": signedValue,\n\t\t\t\"int32Imp\": signedValue,\n\n\t\t\t\"int64\": signedValue,\n\t\t\t\"int64Opt\": signedValue,\n\t\t\t\"int64Imp\": signedValue,\n\n\t\t\t\"uint\": unsignedValue,\n\t\t\t\"uintOpt\": unsignedValue,\n\t\t\t\"uintImp\": unsignedValue,\n\n\t\t\t\"uint8\": unsignedValue,\n\t\t\t\"uint8Opt\": unsignedValue,\n\t\t\t\"uint8Imp\": unsignedValue,\n\n\t\t\t\"uint16\": unsignedValue,\n\t\t\t\"uint16Opt\": unsignedValue,\n\t\t\t\"uint16Imp\": unsignedValue,\n\n\t\t\t\"uint32\": unsignedValue,\n\t\t\t\"uint32Opt\": unsignedValue,\n\t\t\t\"uint32Imp\": unsignedValue,\n\n\t\t\t\"uint64\": unsignedValue,\n\t\t\t\"uint64Opt\": unsignedValue,\n\t\t\t\"uint64Imp\": unsignedValue,\n\t\t]\n\t\tlet mappedObject = mapper.map(JSON: json)\n\t\tXCTAssertNotNil(mappedObject)\n\n\t\tXCTAssertEqual(mappedObject?.int, Int.max)\n\t\tXCTAssertEqual(mappedObject?.intOptional, Int.max)\n\t\tXCTAssertEqual(mappedObject?.intImplicityUnwrapped, Int.max)\n\n\t\tXCTAssertEqual(mappedObject?.int8, 0)\n\t\tXCTAssertEqual(mappedObject?.int8Optional, nil)\n\t\tXCTAssertEqual(mappedObject?.int8ImplicityUnwrapped, nil)\n\n\t\tXCTAssertEqual(mappedObject?.int16, 0)\n\t\tXCTAssertEqual(mappedObject?.int16Optional, nil)\n\t\tXCTAssertEqual(mappedObject?.int16ImplicityUnwrapped, nil)\n\n#if arch(x86_64) || arch(arm64)\n\t\tXCTAssertEqual(mappedObject?.int32, 0)\n\t\tXCTAssertEqual(mappedObject?.int32Optional, nil)\n\t\tXCTAssertEqual(mappedObject?.int32ImplicityUnwrapped, nil)\n\n\t\tXCTAssertEqual(mappedObject?.int64, Int64.max)\n\t\tXCTAssertEqual(mappedObject?.int64Optional, Int64.max)\n\t\tXCTAssertEqual(mappedObject?.int64ImplicityUnwrapped, Int64.max)\n#else\n\t\tXCTAssertEqual(mappedObject?.int32, Int32.max)\n\t\tXCTAssertEqual(mappedObject?.int32Optional, Int32.max)\n\t\tXCTAssertEqual(mappedObject?.int32ImplicityUnwrapped, Int32.max)\n\n\t\tXCTAssertEqual(mappedObject?.int64, Int64(Int32.max))\n\t\tXCTAssertEqual(mappedObject?.int64Optional, Int64(Int32.max))\n\t\tXCTAssertEqual(mappedObject?.int64ImplicityUnwrapped, Int64(Int32.max))\n#endif\n\n\t\tXCTAssertEqual(mappedObject?.uint, UInt.max)\n\t\tXCTAssertEqual(mappedObject?.uintOptional, UInt.max)\n\t\tXCTAssertEqual(mappedObject?.uintImplicityUnwrapped, UInt.max)\n\n\t\tXCTAssertEqual(mappedObject?.uint8, 0)\n\t\tXCTAssertEqual(mappedObject?.uint8Optional, nil)\n\t\tXCTAssertEqual(mappedObject?.uint8ImplicityUnwrapped, nil)\n\n\t\tXCTAssertEqual(mappedObject?.uint16, 0)\n\t\tXCTAssertEqual(mappedObject?.uint16Optional, nil)\n\t\tXCTAssertEqual(mappedObject?.uint16ImplicityUnwrapped, nil)\n\n#if arch(x86_64) || arch(arm64)\n\t\tXCTAssertEqual(mappedObject?.uint32, 0)\n\t\tXCTAssertEqual(mappedObject?.uint32Optional, nil)\n\t\tXCTAssertEqual(mappedObject?.uint32ImplicityUnwrapped, nil)\n\n\t\tXCTAssertEqual(mappedObject?.uint64, UInt64.max)\n\t\tXCTAssertEqual(mappedObject?.uint64Optional, UInt64.max)\n\t\tXCTAssertEqual(mappedObject?.uint64ImplicityUnwrapped, UInt64.max)\n#else\n\t\tXCTAssertEqual(mappedObject?.uint32, UInt32.max)\n\t\tXCTAssertEqual(mappedObject?.uint32Optional, UInt32.max)\n\t\tXCTAssertEqual(mappedObject?.uint32ImplicityUnwrapped, UInt32.max)\n\n\t\tXCTAssertEqual(mappedObject?.uint64, UInt64(UInt32.max))\n\t\tXCTAssertEqual(mappedObject?.uint64Optional, UInt64(UInt32.max))\n\t\tXCTAssertEqual(mappedObject?.uint64ImplicityUnwrapped, UInt64(UInt32.max))\n#endif\n\t}\n\t\n\tfunc testMappingDoubleFromJSON(){\n\t\tlet value: Double = 11\n\t\tlet JSONString = \"{\\\"double\\\" : \\(value), \\\"doubleOpt\\\" : \\(value), \\\"doubleImp\\\" : \\(value)}\"\n\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.double, value)\n\t\tXCTAssertEqual(mappedObject?.doubleOptional, value)\n\t\tXCTAssertEqual(mappedObject?.doubleImplicityUnwrapped, value)\n\t}\n\t\n\tfunc testMappingFloatFromJSON(){\n\t\tlet value: Float = 11\n\t\tlet JSONString = \"{\\\"float\\\" : \\(value), \\\"floatOpt\\\" : \\(value), \\\"floatImp\\\" : \\(value)}\"\n\t\t\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.float, value)\n\t\tXCTAssertEqual(mappedObject?.floatOptional, value)\n\t\tXCTAssertEqual(mappedObject?.floatImplicityUnwrapped, value)\n\t}\n\t\n\tfunc testMappingStringFromJSON(){\n\t\tlet value: String = \"STRINGNGNGG\"\n\t\tlet JSONString = \"{\\\"string\\\" : \\\"\\(value)\\\", \\\"stringOpt\\\" : \\\"\\(value)\\\", \\\"stringImp\\\" : \\\"\\(value)\\\"}\"\n\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.string, value)\n\t\tXCTAssertEqual(mappedObject?.stringOptional, value)\n\t\tXCTAssertEqual(mappedObject?.stringImplicityUnwrapped, value)\n\t}\n\t\n\tfunc testMappingAnyObjectFromJSON(){\n\t\tlet value1 = \"STRING\"\n\t\tlet value2: Int = 1234\n\t\tlet value3: Double = 11.11\n\t\tlet JSONString = \"{\\\"anyObject\\\" : \\\"\\(value1)\\\", \\\"anyObjectOpt\\\" : \\(value2), \\\"anyObjectImp\\\" : \\(value3)}\"\n\t\t\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.anyObject as? String, value1)\n\t\tXCTAssertEqual(mappedObject?.anyObjectOptional as? Int, value2)\n\t\tXCTAssertEqual(mappedObject?.anyObjectImplicitlyUnwrapped as? Double, value3)\n\t}\n\n\tfunc testMappingStringFromNSStringJSON(){\n\t\tlet value: String = \"STRINGNGNGG\"\n\t\tlet JSONNSString : NSString = \"{\\\"string\\\" : \\\"\\(value)\\\", \\\"stringOpt\\\" : \\\"\\(value)\\\", \\\"stringImp\\\" : \\\"\\(value)\\\"}\" as NSString\n\t\t\n\t\tlet mappedObject = mapper.map(JSONString: JSONNSString as String)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.string, value)\n\t\tXCTAssertEqual(mappedObject?.stringOptional, value)\n\t\tXCTAssertEqual(mappedObject?.stringImplicityUnwrapped, value)\n\t}\n\n\t// MARK: Test mapping Arrays to JSON and back (with basic types in them Bool, Int, Double, Float, String)\n\t\n\tfunc testMappingBoolArrayFromJSON(){\n\t\tlet value: Bool = true\n\t\tlet JSONString = \"{\\\"arrayBool\\\" : [\\(value)], \\\"arrayBoolOpt\\\" : [\\(value)], \\\"arrayBoolImp\\\" : [\\(value)] }\"\n\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.arrayBool.first, value)\n\t\tXCTAssertEqual(mappedObject?.arrayBoolOptional?.first, value)\n\t\tXCTAssertEqual(mappedObject?.arrayBoolImplicityUnwrapped.first, value)\n\t}\n\t\n\tfunc testMappingIntArrayFromJSON(){\n\t\tlet value: Int = 1\n\t\tlet JSONString = \"{\\\"arrayInt\\\" : [\\(value)], \\\"arrayIntOpt\\\" : [\\(value)], \\\"arrayIntImp\\\" : [\\(value)] }\"\n\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.arrayInt.first, value)\n\t\tXCTAssertEqual(mappedObject?.arrayIntOptional?.first, value)\n\t\tXCTAssertEqual(mappedObject?.arrayIntImplicityUnwrapped.first, value)\n\t}\n\t\n\tfunc testMappingDoubleArrayFromJSON(){\n\t\tlet value: Double = 1.0\n\t\tlet JSONString = \"{\\\"arrayDouble\\\" : [\\(value)], \\\"arrayDoubleOpt\\\" : [\\(value)], \\\"arrayDoubleImp\\\" : [\\(value)] }\"\n\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.arrayDouble.first, value)\n\t\tXCTAssertEqual(mappedObject?.arrayDoubleOptional?.first, value)\n\t\tXCTAssertEqual(mappedObject?.arrayDoubleImplicityUnwrapped.first, value)\n\t}\n\t\n\tfunc testMappingFloatArrayFromJSON(){\n\t\tlet value: Float = 1.001\n\t\tlet JSONString = \"{\\\"arrayFloat\\\" : [\\(value)], \\\"arrayFloatOpt\\\" : [\\(value)], \\\"arrayFloatImp\\\" : [\\(value)] }\"\n\t\t\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.arrayFloat.first, value)\n\t\tXCTAssertEqual(mappedObject?.arrayFloatOptional?.first, value)\n\t\tXCTAssertEqual(mappedObject?.arrayFloatImplicityUnwrapped?.first, value)\n\t}\n\t\n\tfunc testMappingStringArrayFromJSON(){\n\t\tlet value: String = \"Stringgggg\"\n\t\tlet JSONString = \"{\\\"arrayString\\\" : [\\\"\\(value)\\\"], \\\"arrayStringOpt\\\" : [\\\"\\(value)\\\"], \\\"arrayStringImp\\\" : [\\\"\\(value)\\\"] }\"\n\t\t\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.arrayString.first, value)\n\t\tXCTAssertEqual(mappedObject?.arrayStringOptional?.first, value)\n\t\tXCTAssertEqual(mappedObject?.arrayStringImplicityUnwrapped.first, value)\n\t}\n\t\n\tfunc testMappingAnyObjectArrayFromJSON(){\n\t\tlet value1 = \"STRING\"\n\t\tlet value2: Int = 1234\n\t\tlet value3: Double = 11.11\n\t\tlet JSONString = \"{\\\"arrayAnyObject\\\" : [\\\"\\(value1)\\\"], \\\"arrayAnyObjectOpt\\\" : [\\(value2)], \\\"arrayAnyObjectImp\\\" : [\\(value3)] }\"\n\t\t\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.arrayAnyObject.first as? String, value1)\n\t\tXCTAssertEqual(mappedObject?.arrayAnyObjectOptional?.first as? Int, value2)\n\t\tXCTAssertEqual(mappedObject?.arrayAnyObjectImplicitlyUnwrapped.first as? Double, value3)\n\t}\n\t\n\t// MARK: Test mapping Dictionaries to JSON and back (with basic types in them Bool, Int, Double, Float, String)\n\t\n\tfunc testMappingBoolDictionaryFromJSON(){\n\t\tlet key = \"key\"\n\t\tlet value: Bool = true\n\t\tlet JSONString = \"{\\\"dictBool\\\" : { \\\"\\(key)\\\" : \\(value)}, \\\"dictBoolOpt\\\" : { \\\"\\(key)\\\" : \\(value)}, \\\"dictBoolImp\\\" : { \\\"\\(key)\\\" : \\(value)} }\"\n\t\t\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.dictBool[key], value)\n\t\tXCTAssertEqual(mappedObject?.dictBoolOptional?[key], value)\n\t\tXCTAssertEqual(mappedObject?.dictBoolImplicityUnwrapped[key], value)\n\t}\n\t\n\tfunc testMappingIntDictionaryFromJSON(){\n\t\tlet key = \"key\"\n\t\tlet value: Int = 11\n\t\tlet JSONString = \"{\\\"dictInt\\\" : { \\\"\\(key)\\\" : \\(value)}, \\\"dictIntOpt\\\" : { \\\"\\(key)\\\" : \\(value)}, \\\"dictIntImp\\\" : { \\\"\\(key)\\\" : \\(value)} }\"\n\t\t\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.dictInt[key], value)\n\t\tXCTAssertEqual(mappedObject?.dictIntOptional?[key], value)\n\t\tXCTAssertEqual(mappedObject?.dictIntImplicityUnwrapped[key], value)\n\t}\n\t\n\tfunc testMappingDoubleDictionaryFromJSON(){\n\t\tlet key = \"key\"\n\t\tlet value: Double = 11\n\t\tlet JSONString = \"{\\\"dictDouble\\\" : { \\\"\\(key)\\\" : \\(value)}, \\\"dictDoubleOpt\\\" : { \\\"\\(key)\\\" : \\(value)}, \\\"dictDoubleImp\\\" : { \\\"\\(key)\\\" : \\(value)} }\"\n\t\t\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.dictDouble[key], value)\n\t\tXCTAssertEqual(mappedObject?.dictDoubleOptional?[key], value)\n\t\tXCTAssertEqual(mappedObject?.dictDoubleImplicityUnwrapped[key], value)\n\t}\n\t\n\tfunc testMappingFloatDictionaryFromJSON(){\n\t\tlet key = \"key\"\n\t\tlet value: Float = 111.1\n\t\tlet JSONString = \"{\\\"dictFloat\\\" : { \\\"\\(key)\\\" : \\(value)}, \\\"dictFloatOpt\\\" : { \\\"\\(key)\\\" : \\(value)}, \\\"dictFloatImp\\\" : { \\\"\\(key)\\\" : \\(value)} }\"\n\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.dictFloat[key], value)\n\t\tXCTAssertEqual(mappedObject?.dictFloatOptional?[key], value)\n\t\tXCTAssertEqual(mappedObject?.dictFloatImplicityUnwrapped?[key], value)\n\t}\n\t\n\tfunc testMappingStringDictionaryFromJSON(){\n\t\tlet key = \"key\"\n\t\tlet value = \"value\"\n\t\tlet JSONString = \"{\\\"dictString\\\" : { \\\"\\(key)\\\" : \\\"\\(value)\\\"}, \\\"dictStringOpt\\\" : { \\\"\\(key)\\\" : \\\"\\(value)\\\"}, \\\"dictStringImp\\\" : { \\\"\\(key)\\\" : \\\"\\(value)\\\"} }\"\n\t\t\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.dictString[key], value)\n\t\tXCTAssertEqual(mappedObject?.dictStringOptional?[key], value)\n\t\tXCTAssertEqual(mappedObject?.dictStringImplicityUnwrapped?[key], value)\n\t}\n\t\n\tfunc testMappingAnyObjectDictionaryFromJSON(){\n\t\tlet key = \"key\"\n\t\tlet value1 = \"STRING\"\n\t\tlet value2: Int = 1234\n\t\tlet value3: Double = 11.11\n\t\tlet JSONString = \"{\\\"dictAnyObject\\\" : { \\\"\\(key)\\\" : \\\"\\(value1)\\\"}, \\\"dictAnyObjectOpt\\\" : { \\\"\\(key)\\\" : \\(value2)}, \\\"dictAnyObjectImp\\\" : { \\\"\\(key)\\\" : \\(value3)} }\"\n\t\t\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.dictAnyObject[key] as? String, value1)\n\t\tXCTAssertEqual(mappedObject?.dictAnyObjectOptional?[key] as? Int, value2)\n\t\tXCTAssertEqual(mappedObject?.dictAnyObjectImplicitlyUnwrapped[key] as? Double, value3)\n\t}\n\n\tfunc testMappingIntEnumFromJSON(){\n\t\tlet value: BasicTypes.EnumInt = .Another\n\t\tlet JSONString = \"{\\\"enumInt\\\" : \\(value.rawValue), \\\"enumIntOpt\\\" : \\(value.rawValue), \\\"enumIntImp\\\" : \\(value.rawValue) }\"\n\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.enumInt, value)\n\t\tXCTAssertEqual(mappedObject?.enumIntOptional, value)\n\t\tXCTAssertEqual(mappedObject?.enumIntImplicitlyUnwrapped, value)\n\t}\n\n\tfunc testMappingIntEnumFromJSONShouldNotCrashWithNonDefinedvalue() {\n\t\tlet value = Int.min\n\t\tlet JSONString = \"{\\\"enumInt\\\" : \\(value), \\\"enumIntOpt\\\" : \\(value), \\\"enumIntImp\\\" : \\(value) }\"\n\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\t\t\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.enumInt, BasicTypes.EnumInt.Default)\n\t\tXCTAssertNil(mappedObject?.enumIntOptional)\n\t\tXCTAssertNil(mappedObject?.enumIntImplicitlyUnwrapped)\n\t}\n\n\tfunc testMappingDoubleEnumFromJSON(){\n\t\tlet value: BasicTypes.EnumDouble = .Another\n\t\tlet JSONString = \"{\\\"enumDouble\\\" : \\(value.rawValue), \\\"enumDoubleOpt\\\" : \\(value.rawValue), \\\"enumDoubleImp\\\" : \\(value.rawValue) }\"\n\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\t\t\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.enumDouble, value)\n\t\tXCTAssertEqual(mappedObject?.enumDoubleOptional, value)\n\t\tXCTAssertEqual(mappedObject?.enumDoubleImplicitlyUnwrapped, value)\n\t}\n\n\tfunc testMappingFloatEnumFromJSON(){\n\t\tlet value: BasicTypes.EnumFloat = .Another\n\t\tlet JSONString = \"{\\\"enumFloat\\\" : \\(value.rawValue), \\\"enumFloatOpt\\\" : \\(value.rawValue), \\\"enumFloatImp\\\" : \\(value.rawValue) }\"\n\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\t\t\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.enumFloat, value)\n\t\tXCTAssertEqual(mappedObject?.enumFloatOptional, value)\n\t\tXCTAssertEqual(mappedObject?.enumFloatImplicitlyUnwrapped, value)\n\t}\n\n\tfunc testMappingStringEnumFromJSON(){\n\t\tlet value: BasicTypes.EnumString = .Another\n\t\tlet JSONString = \"{\\\"enumString\\\" : \\\"\\(value.rawValue)\\\", \\\"enumStringOpt\\\" : \\\"\\(value.rawValue)\\\", \\\"enumStringImp\\\" : \\\"\\(value.rawValue)\\\" }\"\n\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\t\t\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.enumString, value)\n\t\tXCTAssertEqual(mappedObject?.enumStringOptional, value)\n\t\tXCTAssertEqual(mappedObject?.enumStringImplicitlyUnwrapped, value)\n\t}\n\n\tfunc testMappingEnumIntArrayFromJSON(){\n\t\tlet value: BasicTypes.EnumInt = .Another\n\t\tlet JSONString = \"{ \\\"arrayEnumInt\\\" : [\\(value.rawValue)], \\\"arrayEnumIntOpt\\\" : [\\(value.rawValue)], \\\"arrayEnumIntImp\\\" : [\\(value.rawValue)] }\"\n\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\t\t\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.arrayEnumInt.first, value)\n\t\tXCTAssertEqual(mappedObject?.arrayEnumIntOptional?.first, value)\n\t\tXCTAssertEqual(mappedObject?.arrayEnumIntImplicitlyUnwrapped.first, value)\n\t}\n\n\tfunc testMappingEnumIntArrayFromJSONShouldNotCrashWithNonDefinedvalue() {\n\t\tlet value = Int.min\n\t\tlet JSONString = \"{ \\\"arrayEnumInt\\\" : [\\(value)], \\\"arrayEnumIntOpt\\\" : [\\(value)], \\\"arrayEnumIntImp\\\" : [\\(value)] }\"\n\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\t\t\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertNil(mappedObject?.arrayEnumInt.first)\n\t\tXCTAssertNil(mappedObject?.arrayEnumIntOptional?.first)\n\t\tXCTAssertNil(mappedObject?.arrayEnumIntImplicitlyUnwrapped.first)\n\t}\n\n\tfunc testMappingEnumIntDictionaryFromJSON(){\n\t\tlet key = \"key\"\n\t\tlet value: BasicTypes.EnumInt = .Another\n\t\tlet JSONString = \"{ \\\"dictEnumInt\\\" : { \\\"\\(key)\\\" : \\(value.rawValue) }, \\\"dictEnumIntOpt\\\" : { \\\"\\(key)\\\" : \\(value.rawValue) }, \\\"dictEnumIntImp\\\" : { \\\"\\(key)\\\" : \\(value.rawValue) } }\"\n\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\t\t\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.dictEnumInt[key], value)\n\t\tXCTAssertEqual(mappedObject?.dictEnumIntOptional?[key], value)\n\t\tXCTAssertEqual(mappedObject?.dictEnumIntImplicitlyUnwrapped[key], value)\n\t}\n\n\tfunc testMappingEnumIntDictionaryFromJSONShouldNotCrashWithNonDefinedvalue() {\n\t\tlet key = \"key\"\n\t\tlet value = Int.min\n\t\tlet JSONString = \"{ \\\"dictEnumInt\\\" : { \\\"\\(key)\\\" : \\(value) }, \\\"dictEnumIntOpt\\\" : { \\\"\\(key)\\\" : \\(value) }, \\\"dictEnumIntImp\\\" : { \\\"\\(key)\\\" : \\(value) } }\"\n\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\t\t\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertNil(mappedObject?.dictEnumInt[key])\n\t\tXCTAssertNil(mappedObject?.dictEnumIntOptional?[key])\n\t\tXCTAssertNil(mappedObject?.dictEnumIntImplicitlyUnwrapped[key])\n\t}\n\n\tfunc testObjectModelOptionalDictionnaryOfPrimitives() {\n\t\tlet JSON: [String: [String: Any]] = [\"dictStringString\":[\"string\": \"string\"], \"dictStringBool\":[\"string\": false], \"dictStringInt\":[\"string\": 1], \"dictStringDouble\":[\"string\": 1.1], \"dictStringFloat\":[\"string\": Float(1.2)]]\n\t\t\n\t\tlet mapper = Mapper<TestCollectionOfPrimitives>()\n\t\tlet testSet: TestCollectionOfPrimitives! = mapper.map(JSON: JSON)\n\n\t\tXCTAssertNotNil(testSet)\n\n\t\tXCTAssertTrue(testSet.dictStringString.count > 0)\n\t\tXCTAssertTrue(testSet.dictStringInt.count > 0)\n\t\tXCTAssertTrue(testSet.dictStringBool.count > 0)\n\t\tXCTAssertTrue(testSet.dictStringDouble.count > 0)\n\t\tXCTAssertTrue(testSet.dictStringFloat.count > 0)\n\t}\n}\n"
  },
  {
    "path": "Tests/ObjectMapperTests/BasicTypesTestsToJSON.swift",
    "content": "//\n//  BasicTypesTests.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2014-12-04.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\nimport XCTest\nimport ObjectMapper\n\nclass BasicTypesTestsToJSON: XCTestCase {\n\n    let mapper = Mapper<BasicTypes>()\n\n    override func setUp() {\n        super.setUp()\n        // Put setup code here. This method is called before the invocation of each test method in the class.\n    }\n    \n    override func tearDown() {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n        super.tearDown()\n    }\n\n\t// MARK: Test mapping to JSON and back (basic types: Bool, Int, Double, Float, String)\n\t\n\tfunc testShouldIncludeNilValues(){\n\t\tlet object = BasicTypes()\n\t\t\n\t\tlet JSONWithNil = Mapper<BasicTypes>(shouldIncludeNilValues: true).toJSONString(object, prettyPrint: true)\n\t\tlet JSONWithoutNil = Mapper<BasicTypes>(shouldIncludeNilValues: false).toJSONString(object, prettyPrint: true)\n\t\t\n\t\t//TODO This test could be improved\n\t\tXCTAssertNotNil(JSONWithNil)\n\t\tXCTAssertTrue((JSONWithNil!.count) > 5)\n\t\tXCTAssertTrue((JSONWithNil!.count) != (JSONWithoutNil!.count))\n\t}\n\t\n\tfunc testMappingBoolToJSON(){\n\t\tlet value: Bool = true\n\t\tlet object = BasicTypes()\n\t\tobject.bool = value\n\t\tobject.boolOptional = value\n\t\tobject.boolImplicityUnwrapped = value\n\t\t\n\t\tlet JSONString = Mapper().toJSONString(object, prettyPrint: true)\n\t\tlet mappedObject = mapper.map(JSONString: JSONString!)\n\t\t\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.bool, value)\n\t\tXCTAssertEqual(mappedObject?.boolOptional, value)\n\t\tXCTAssertEqual(mappedObject?.boolImplicityUnwrapped, value)\n\t}\n\t\n\tfunc testMappingIntegerToJSON(){\n\t\tlet object = BasicTypes()\n\n\t\tobject.int = 123\n\t\tobject.intOptional = 123\n\t\tobject.intImplicityUnwrapped = 123\n\n\t\tobject.int8 = 123\n\t\tobject.int8Optional = 123\n\t\tobject.int8ImplicityUnwrapped = 123\n\n\t\tobject.int16 = 123\n\t\tobject.int16Optional = 123\n\t\tobject.int16ImplicityUnwrapped = 123\n\n\t\tobject.int32 = 123\n\t\tobject.int32Optional = 123\n\t\tobject.int32ImplicityUnwrapped = 123\n\n\t\tobject.int64 = 123\n\t\tobject.int64Optional = 123\n\t\tobject.int64ImplicityUnwrapped = 123\n\n\t\tobject.uint = 123\n\t\tobject.uintOptional = 123\n\t\tobject.uintImplicityUnwrapped = 123\n\n\t\tobject.uint8 = 123\n\t\tobject.uint8Optional = 123\n\t\tobject.uint8ImplicityUnwrapped = 123\n\n\t\tobject.uint16 = 123\n\t\tobject.uint16Optional = 123\n\t\tobject.uint16ImplicityUnwrapped = 123\n\n\t\tobject.uint32 = 123\n\t\tobject.uint32Optional = 123\n\t\tobject.uint32ImplicityUnwrapped = 123\n\n\t\tobject.uint64 = 123\n\t\tobject.uint64Optional = 123\n\t\tobject.uint64ImplicityUnwrapped = 123\n\n\t\tlet JSONString = Mapper().toJSONString(object, prettyPrint: true)\n\t\tlet mappedObject = mapper.map(JSONString: JSONString!)\n\n\t\tXCTAssertNotNil(mappedObject)\n\n\t\tXCTAssertEqual(mappedObject?.int, 123)\n\t\tXCTAssertEqual(mappedObject?.intOptional, 123)\n\t\tXCTAssertEqual(mappedObject?.intImplicityUnwrapped, 123)\n\n\t\tXCTAssertEqual(mappedObject?.int8, 123)\n\t\tXCTAssertEqual(mappedObject?.int8Optional, 123)\n\t\tXCTAssertEqual(mappedObject?.int8ImplicityUnwrapped, 123)\n\n\t\tXCTAssertEqual(mappedObject?.int16, 123)\n\t\tXCTAssertEqual(mappedObject?.int16Optional, 123)\n\t\tXCTAssertEqual(mappedObject?.int16ImplicityUnwrapped, 123)\n\n\t\tXCTAssertEqual(mappedObject?.int32, 123)\n\t\tXCTAssertEqual(mappedObject?.int32Optional, 123)\n\t\tXCTAssertEqual(mappedObject?.int32ImplicityUnwrapped, 123)\n\n\t\tXCTAssertEqual(mappedObject?.int64, 123)\n\t\tXCTAssertEqual(mappedObject?.int64Optional, 123)\n\t\tXCTAssertEqual(mappedObject?.int64ImplicityUnwrapped, 123)\n\n\t\tXCTAssertEqual(mappedObject?.uint, 123)\n\t\tXCTAssertEqual(mappedObject?.uintOptional, 123)\n\t\tXCTAssertEqual(mappedObject?.uintImplicityUnwrapped, 123)\n\n\t\tXCTAssertEqual(mappedObject?.uint8, 123)\n\t\tXCTAssertEqual(mappedObject?.uint8Optional, 123)\n\t\tXCTAssertEqual(mappedObject?.uint8ImplicityUnwrapped, 123)\n\n\t\tXCTAssertEqual(mappedObject?.uint16, 123)\n\t\tXCTAssertEqual(mappedObject?.uint16Optional, 123)\n\t\tXCTAssertEqual(mappedObject?.uint16ImplicityUnwrapped, 123)\n\n\t\tXCTAssertEqual(mappedObject?.uint32, 123)\n\t\tXCTAssertEqual(mappedObject?.uint32Optional, 123)\n\t\tXCTAssertEqual(mappedObject?.uint32ImplicityUnwrapped, 123)\n\n\t\tXCTAssertEqual(mappedObject?.uint64, 123)\n\t\tXCTAssertEqual(mappedObject?.uint64Optional, 123)\n\t\tXCTAssertEqual(mappedObject?.uint64ImplicityUnwrapped, 123)\n\t}\n\n\tfunc testMappingDoubleToJSON(){\n\t\tlet value: Double = 11\n\t\tlet object = BasicTypes()\n\t\tobject.double = value\n\t\tobject.doubleOptional = value\n\t\tobject.doubleImplicityUnwrapped = value\n\t\t\n\t\tlet JSONString = Mapper().toJSONString(object, prettyPrint: true)\n\t\tlet mappedObject = mapper.map(JSONString: JSONString!)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.double, value)\n\t\tXCTAssertEqual(mappedObject?.doubleOptional, value)\n\t\tXCTAssertEqual(mappedObject?.doubleImplicityUnwrapped, value)\n\t}\n\n\tfunc testMappingFloatToJSON(){\n\t\tlet value: Float = 11\n\t\tlet object = BasicTypes()\n\t\tobject.float = value\n\t\tobject.floatOptional = value\n\t\tobject.floatImplicityUnwrapped = value\n\t\t\n\t\tlet JSONString = Mapper().toJSONString(object, prettyPrint: true)\n\t\tlet mappedObject = mapper.map(JSONString: JSONString!)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.float, value)\n\t\tXCTAssertEqual(mappedObject?.floatOptional, value)\n\t\tXCTAssertEqual(mappedObject?.floatImplicityUnwrapped, value)\n\t}\n\t\n\tfunc testMappingStringToJSON(){\n\t\tlet value: String = \"STRINGNGNGG\"\n\t\tlet object = BasicTypes()\n\t\tobject.string = value\n\t\tobject.stringOptional = value\n\t\tobject.stringImplicityUnwrapped = value\n\t\t\n\t\tlet JSONString = Mapper().toJSONString(object, prettyPrint: true)\n\t\tlet mappedObject = mapper.map(JSONString: JSONString!)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.string, value)\n\t\tXCTAssertEqual(mappedObject?.stringOptional, value)\n\t\tXCTAssertEqual(mappedObject?.stringImplicityUnwrapped, value)\n\t}\n\t\n\tfunc testMappingAnyObjectToJSON(){\n\t\tlet value: String = \"STRINGNGNGG\"\n\t\tlet object = BasicTypes()\n\t\tobject.anyObject = value\n\t\tobject.anyObjectOptional = value\n\t\tobject.anyObjectImplicitlyUnwrapped = value\n\t\t\n\t\tlet JSONString = Mapper().toJSONString(object, prettyPrint: true)\n\t\tlet mappedObject = mapper.map(JSONString: JSONString!)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.anyObject as? String, value)\n\t\tXCTAssertEqual(mappedObject?.anyObjectOptional as? String, value)\n\t\tXCTAssertEqual(mappedObject?.anyObjectImplicitlyUnwrapped as? String, value)\n\t}\n\t\n\t// MARK: Test mapping Arrays to JSON and back (with basic types in them Bool, Int, Double, Float, String)\n\t\n\tfunc testMappingEmptyArrayToJSON(){\n\t\tlet object = BasicTypes()\n\t\tobject.arrayBool = []\n\t\tobject.arrayBoolOptional = []\n\t\tobject.arrayBoolImplicityUnwrapped = []\n\t\t\n\t\tlet JSONString = Mapper().toJSONString(object, prettyPrint: true)\n\t\tlet mappedObject = mapper.map(JSONString: JSONString!)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject!.arrayBool, [])\n\t\tXCTAssertEqual(mappedObject!.arrayBoolOptional!, [])\n\t\tXCTAssertEqual(mappedObject!.arrayBoolImplicityUnwrapped, [])\n\t}\n\t\n\tfunc testMappingBoolArrayToJSON(){\n\t\tlet value: Bool = true\n\t\tlet object = BasicTypes()\n\t\tobject.arrayBool = [value]\n\t\tobject.arrayBoolOptional = [value]\n\t\tobject.arrayBoolImplicityUnwrapped = [value]\n\t\t\n\t\tlet JSONString = Mapper().toJSONString(object, prettyPrint: true)\n\t\tlet mappedObject = mapper.map(JSONString: JSONString!)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.arrayBool.first, value)\n\t\tXCTAssertEqual(mappedObject?.arrayBoolOptional?.first, value)\n\t\tXCTAssertEqual(mappedObject?.arrayBoolImplicityUnwrapped.first, value)\n\t}\n\t\n\tfunc testMappingIntArrayToJSON(){\n\t\tlet value: Int = 1\n\t\tlet object = BasicTypes()\n\t\tobject.arrayInt = [value]\n\t\tobject.arrayIntOptional = [value]\n\t\tobject.arrayIntImplicityUnwrapped = [value]\n\t\t\n\t\tlet JSONString = Mapper().toJSONString(object, prettyPrint: true)\n\t\tlet mappedObject = mapper.map(JSONString: JSONString!)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.arrayInt.first, value)\n\t\tXCTAssertEqual(mappedObject?.arrayIntOptional?.first, value)\n\t\tXCTAssertEqual(mappedObject?.arrayIntImplicityUnwrapped.first, value)\n\t}\n\t\n\tfunc testMappingDoubleArrayToJSON(){\n\t\tlet value: Double = 1.0\n\t\tlet object = BasicTypes()\n\t\tobject.arrayDouble = [value]\n\t\tobject.arrayDoubleOptional = [value]\n\t\tobject.arrayDoubleImplicityUnwrapped = [value]\n\t\t\n\t\tlet JSONString = Mapper().toJSONString(object, prettyPrint: true)\n\t\tlet mappedObject = mapper.map(JSONString: JSONString!)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.arrayDouble.first, value)\n\t\tXCTAssertEqual(mappedObject?.arrayDoubleOptional?.first, value)\n\t\tXCTAssertEqual(mappedObject?.arrayDoubleImplicityUnwrapped.first, value)\n\t}\n\t\n\tfunc testMappingFloatArrayToJSON(){\n\t\tlet value: Float = 1.001\n\t\tlet object = BasicTypes()\n\t\tobject.arrayFloat = [value]\n\t\tobject.arrayFloatOptional = [value]\n\t\tobject.arrayFloatImplicityUnwrapped = [value]\n\t\t\n\t\tlet JSONString = Mapper().toJSONString(object, prettyPrint: true)\n\t\tlet mappedObject = mapper.map(JSONString: JSONString!)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.arrayFloat.first, value)\n\t\tXCTAssertEqual(mappedObject?.arrayFloatOptional?.first, value)\n\t\tXCTAssertEqual(mappedObject?.arrayFloatImplicityUnwrapped.first, value)\n\t}\n\t\n\tfunc testMappingStringArrayToJSON(){\n\t\tlet value: String = \"Stringgggg\"\n\t\tlet object = BasicTypes()\n\t\tobject.arrayString = [value]\n\t\tobject.arrayStringOptional = [value]\n\t\tobject.arrayStringImplicityUnwrapped = [value]\n\t\t\n\t\tlet JSONString = Mapper().toJSONString(object, prettyPrint: true)\n\t\tlet mappedObject = mapper.map(JSONString: JSONString!)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.arrayString.first, value)\n\t\tXCTAssertEqual(mappedObject?.arrayStringOptional?.first, value)\n\t\tXCTAssertEqual(mappedObject?.arrayStringImplicityUnwrapped.first, value)\n\t}\n\t\n\tfunc testMappingAnyObjectArrayToJSON(){\n\t\tlet value: String = \"Stringgggg\"\n\t\tlet object = BasicTypes()\n\t\tobject.arrayAnyObject = [value]\n\t\tobject.arrayAnyObjectOptional = [value]\n\t\tobject.arrayAnyObjectImplicitlyUnwrapped = [value]\n\t\t\n\t\tlet JSONString = Mapper().toJSONString(object, prettyPrint: true)\n\t\tlet mappedObject = mapper.map(JSONString: JSONString!)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.arrayAnyObject.first as? String, value)\n\t\tXCTAssertEqual(mappedObject?.arrayAnyObjectOptional?.first as? String, value)\n\t\tXCTAssertEqual(mappedObject?.arrayAnyObjectImplicitlyUnwrapped.first as? String, value)\n\t}\n\t\n\t// MARK: Test mapping Dictionaries to JSON and back (with basic types in them Bool, Int, Double, Float, String)\n\t\n\tfunc testMappingEmptyDictionaryToJSON(){\n\t\tlet object = BasicTypes()\n\t\tobject.dictBool = [:]\n\t\tobject.dictBoolOptional = [:]\n\t\tobject.dictBoolImplicityUnwrapped = [:]\n\t\t\n\t\tlet JSONString = Mapper().toJSONString(object, prettyPrint: true)\n\t\tlet mappedObject = mapper.map(JSONString: JSONString!)\n\t\t\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject!.dictBool, [:])\n\t\tXCTAssertEqual(mappedObject!.dictBoolOptional!, [:])\n\t\tXCTAssertEqual(mappedObject!.dictBoolImplicityUnwrapped, [:])\n\t}\n\t\n\tfunc testMappingBoolDictionaryToJSON(){\n\t\tlet key = \"key\"\n\t\tlet value: Bool = true\n\t\tlet object = BasicTypes()\n\t\tobject.dictBool = [key:value]\n\t\tobject.dictBoolOptional = [key:value]\n\t\tobject.dictBoolImplicityUnwrapped = [key:value]\n\t\t\n\t\tlet JSONString = Mapper().toJSONString(object, prettyPrint: true)\n\t\tlet mappedObject = mapper.map(JSONString: JSONString!)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.dictBool[key], value)\n\t\tXCTAssertEqual(mappedObject?.dictBoolOptional?[key], value)\n\t\tXCTAssertEqual(mappedObject?.dictBoolImplicityUnwrapped[key], value)\n\t}\n\t\n\tfunc testMappingIntDictionaryToJSON(){\n\t\tlet key = \"key\"\n\t\tlet value: Int = 11\n\t\tlet object = BasicTypes()\n\t\tobject.dictInt = [key:value]\n\t\tobject.dictIntOptional = [key:value]\n\t\tobject.dictIntImplicityUnwrapped = [key:value]\n\t\t\n\t\tlet JSONString = Mapper().toJSONString(object, prettyPrint: true)\n\t\tlet mappedObject = mapper.map(JSONString: JSONString!)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.dictInt[key], value)\n\t\tXCTAssertEqual(mappedObject?.dictIntOptional?[key], value)\n\t\tXCTAssertEqual(mappedObject?.dictIntImplicityUnwrapped[key], value)\n\t}\n\t\n\tfunc testMappingDoubleDictionaryToJSON(){\n\t\tlet key = \"key\"\n\t\tlet value: Double = 11\n\t\tlet object = BasicTypes()\n\t\tobject.dictDouble = [key:value]\n\t\tobject.dictDoubleOptional = [key:value]\n\t\tobject.dictDoubleImplicityUnwrapped = [key:value]\n\t\t\n\t\tlet JSONString = Mapper().toJSONString(object, prettyPrint: true)\n\t\tlet mappedObject = mapper.map(JSONString: JSONString!)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.dictDouble[key], value)\n\t\tXCTAssertEqual(mappedObject?.dictDoubleOptional?[key], value)\n\t\tXCTAssertEqual(mappedObject?.dictDoubleImplicityUnwrapped[key], value)\n\t}\n\t\n\tfunc testMappingFloatDictionaryToJSON(){\n\t\tlet key = \"key\"\n\t\tlet value: Float = 11\n\t\tlet object = BasicTypes()\n\t\tobject.dictFloat = [key:value]\n\t\tobject.dictFloatOptional = [key:value]\n\t\tobject.dictFloatImplicityUnwrapped = [key:value]\n\t\t\n\t\tlet JSONString = Mapper().toJSONString(object, prettyPrint: true)\n\t\tlet mappedObject = mapper.map(JSONString: JSONString!)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.dictFloat[key], value)\n\t\tXCTAssertEqual(mappedObject?.dictFloatOptional?[key], value)\n\t\tXCTAssertEqual(mappedObject?.dictFloatImplicityUnwrapped[key], value)\n\t}\n\t\n\tfunc testMappingStringDictionaryToJSON(){\n\t\tlet key = \"key\"\n\t\tlet value = \"value\"\n\t\tlet object = BasicTypes()\n\t\tobject.dictString = [key:value]\n\t\tobject.dictStringOptional = [key:value]\n\t\tobject.dictStringImplicityUnwrapped = [key:value]\n\t\t\n\t\tlet JSONString = Mapper().toJSONString(object, prettyPrint: true)\n\t\tlet mappedObject = mapper.map(JSONString: JSONString!)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.dictString[key], value)\n\t\tXCTAssertEqual(mappedObject?.dictStringOptional?[key], value)\n\t\tXCTAssertEqual(mappedObject?.dictStringImplicityUnwrapped[key], value)\n\t}\n\n\tfunc testMappingAnyObjectDictionaryToJSON(){\n\t\tlet key = \"key\"\n\t\tlet value = \"value\"\n\t\tlet object = BasicTypes()\n\t\tobject.dictAnyObject = [key:value]\n\t\tobject.dictAnyObjectOptional = [key:value]\n\t\tobject.dictAnyObjectImplicitlyUnwrapped = [key:value]\n\t\t\n\t\tlet JSONString = Mapper().toJSONString(object, prettyPrint: true)\n\t\tlet mappedObject = mapper.map(JSONString: JSONString!)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.dictAnyObject[key] as? String, value)\n\t\tXCTAssertEqual(mappedObject?.dictAnyObjectOptional?[key] as? String, value)\n\t\tXCTAssertEqual(mappedObject?.dictAnyObjectImplicitlyUnwrapped[key] as? String, value)\n\t}\n\n\tfunc testMappingIntEnumToJSON(){\n\t\tlet value = BasicTypes.EnumInt.Another\n\t\tlet object = BasicTypes()\n\t\tobject.enumInt = value\n\t\tobject.enumIntOptional = value\n\t\tobject.enumIntImplicitlyUnwrapped = value\n\n\t\tlet JSONString = Mapper().toJSONString(object, prettyPrint: true)\n\t\tlet mappedObject = mapper.map(JSONString: JSONString!)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.enumInt, value)\n\t\tXCTAssertEqual(mappedObject?.enumIntOptional, value)\n\t\tXCTAssertEqual(mappedObject?.enumIntImplicitlyUnwrapped, value)\n\t}\n\n\tfunc testMappingDoubleEnumToJSON(){\n\t\tlet value = BasicTypes.EnumDouble.Another\n\t\tlet object = BasicTypes()\n\t\tobject.enumDouble = value\n\t\tobject.enumDoubleOptional = value\n\t\tobject.enumDoubleImplicitlyUnwrapped = value\n\n\t\tlet JSONString = Mapper().toJSONString(object, prettyPrint: true)\n\t\tlet mappedObject = mapper.map(JSONString: JSONString!)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.enumDouble, value)\n\t\tXCTAssertEqual(mappedObject?.enumDoubleOptional, value)\n\t\tXCTAssertEqual(mappedObject?.enumDoubleImplicitlyUnwrapped, value)\n\t}\n\n\tfunc testMappingFloatEnumToJSON(){\n\t\tlet value = BasicTypes.EnumFloat.Another\n\t\tlet object = BasicTypes()\n\t\tobject.enumFloat = value\n\t\tobject.enumFloatOptional = value\n\t\tobject.enumFloatImplicitlyUnwrapped = value\n\n\t\tlet JSONString = Mapper().toJSONString(object, prettyPrint: true)\n\t\tlet mappedObject = mapper.map(JSONString: JSONString!)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.enumFloat, value)\n\t\tXCTAssertEqual(mappedObject?.enumFloatOptional, value)\n\t\tXCTAssertEqual(mappedObject?.enumFloatImplicitlyUnwrapped, value)\n\t}\n\n\tfunc testMappingStringEnumToJSON(){\n\t\tlet value = BasicTypes.EnumString.Another\n\t\tlet object = BasicTypes()\n\t\tobject.enumString = value\n\t\tobject.enumStringOptional = value\n\t\tobject.enumStringImplicitlyUnwrapped = value\n\n\t\tlet JSONString = Mapper().toJSONString(object, prettyPrint: true)\n\t\tlet mappedObject = mapper.map(JSONString: JSONString!)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.enumString, value)\n\t\tXCTAssertEqual(mappedObject?.enumStringOptional, value)\n\t\tXCTAssertEqual(mappedObject?.enumStringImplicitlyUnwrapped, value)\n\t}\n\n\tfunc testMappingEnumIntArrayToJSON(){\n\t\tlet value = BasicTypes.EnumInt.Another\n\t\tlet object = BasicTypes()\n\t\tobject.arrayEnumInt = [value]\n\t\tobject.arrayEnumIntOptional = [value]\n\t\tobject.arrayEnumIntImplicitlyUnwrapped = [value]\n\n\t\tlet JSONString = Mapper().toJSONString(object, prettyPrint: true)\n\t\tlet mappedObject = mapper.map(JSONString: JSONString!)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.arrayEnumInt.first, value)\n\t\tXCTAssertEqual(mappedObject?.arrayEnumIntOptional?.first, value)\n\t\tXCTAssertEqual(mappedObject?.arrayEnumIntImplicitlyUnwrapped.first, value)\n\t}\n\n\tfunc testMappingEnumIntDictionaryToJSON(){\n\t\tlet key = \"key\"\n\t\tlet value = BasicTypes.EnumInt.Another\n\t\tlet object = BasicTypes()\n\t\tobject.dictEnumInt = [key: value]\n\t\tobject.dictEnumIntOptional = [key: value]\n\t\tobject.dictEnumIntImplicitlyUnwrapped = [key: value]\n\n\t\tlet JSONString = Mapper().toJSONString(object, prettyPrint: true)\n\t\tlet mappedObject = mapper.map(JSONString: JSONString!)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.dictEnumInt[key], value)\n\t\tXCTAssertEqual(mappedObject?.dictEnumIntOptional?[key], value)\n\t\tXCTAssertEqual(mappedObject?.dictEnumIntImplicitlyUnwrapped[key], value)\n\t}\n\n\tfunc testObjectToModelDictionnaryOfPrimitives() {\n\t\tlet object = TestCollectionOfPrimitives()\n\t\tobject.dictStringString = [\"string\": \"string\"]\n\t\tobject.dictStringBool = [\"string\": false]\n\t\tobject.dictStringInt = [\"string\": 1]\n\t\tobject.dictStringDouble = [\"string\": 1.2]\n\t\tobject.dictStringFloat = [\"string\": 1.3]\n\t\t\n\t\tlet json = Mapper<TestCollectionOfPrimitives>().toJSON(object)\n\n\t\tXCTAssertTrue((json[\"dictStringString\"] as? [String:String])?.count ?? 0 > 0)\n\t\tXCTAssertTrue((json[\"dictStringBool\"] as? [String:Bool])?.count ?? 0 > 0)\n\t\tXCTAssertTrue((json[\"dictStringInt\"] as? [String:Int])?.count ?? 0 > 0)\n\t\tXCTAssertTrue((json[\"dictStringDouble\"] as? [String:Double])?.count ?? 0 > 0)\n\t\tXCTAssertTrue((json[\"dictStringFloat\"] as? [String:Float])?.count ?? 0 > 0)\n\t\tXCTAssertEqual((json[\"dictStringString\"] as? [String:String])?[\"string\"], \"string\")\n\t}\n}\n"
  },
  {
    "path": "Tests/ObjectMapperTests/ClassClusterTests.swift",
    "content": "//\n//  ClassClusterTests.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2015-09-18.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\nimport XCTest\nimport ObjectMapper\n\nclass ClassClusterTests: XCTestCase {\n    \n    override func setUp() {\n        super.setUp()\n        // Put setup code here. This method is called before the invocation of each test method in the class.\n    }\n    \n    override func tearDown() {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n        super.tearDown()\n    }\n\t\n    func testClassClusters() {\n\t\tlet carName = \"Honda\"\n\t\tlet JSON = [\"name\": carName, \"type\": \"car\"]\n\t\t\n\t\tif let vehicle = Mapper<Vehicle>().map(JSON: JSON){\n\t\t\tXCTAssertNotNil(vehicle)\n\t\t\tXCTAssertNotNil(vehicle as? Car)\n\t\t\tXCTAssertEqual((vehicle as? Car)?.name, carName)\n\t\t}\n    }\n\t\n\tfunc testClassClustersFromJSONString() {\n\t\tlet carName = \"Honda\"\n\t\tlet JSON = \"{\\\"name\\\": \\\"\\(carName)\\\", \\\"type\\\": \\\"car\\\"}\"\n\t\t\n\t\tif let vehicle = Mapper<Vehicle>().map(JSONString: JSON){\n\t\t\tXCTAssertNotNil(vehicle)\n\t\t\tXCTAssertNotNil(vehicle as? Car)\n\t\t\tXCTAssertEqual((vehicle as? Car)?.name, carName)\n\t\t}\n\t}\n\t\n\tfunc testClassClusterArray() {\n\t\tlet carName = \"Honda\"\n\t\tlet JSON = [[\"name\": carName, \"type\": \"car\"], [\"type\": \"bus\"], [\"type\": \"vehicle\"]]\n\t\t\n\t\tlet vehicles = Mapper<Vehicle>().mapArray(JSONArray: JSON)\n\t\tXCTAssertNotNil(vehicles)\n\t\tXCTAssertTrue(vehicles.count == 3)\n\t\tXCTAssertNotNil(vehicles[0] as? Car)\n\t\tXCTAssertNotNil(vehicles[1] as? Bus)\n\t\tXCTAssertNotNil(vehicles[2])\n\t\tXCTAssertEqual((vehicles[0] as? Car)?.name, carName)\n\t}\n}\n\nclass Vehicle: StaticMappable {\n\t\n\tvar type: String?\n\t\n\tclass func objectForMapping(map: Map) -> BaseMappable? {\n\t\tif let type: String = map[\"type\"].value() {\n\t\t\tswitch type {\n\t\t\t\tcase \"car\":\n\t\t\t\t\treturn Car()\n\t\t\t\tcase \"bus\":\n\t\t\t\t\treturn Bus()\n\t\t\t\tdefault:\n\t\t\t\t\treturn Vehicle()\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\n\tinit(){\n\t\t\n\t}\n\t\n\tfunc mapping(map: Map) {\n\t\ttype <- map[\"type\"]\n\t}\n}\n\nclass Car: Vehicle {\n\t\n\tvar name: String?\n\t\n\toverride class func objectForMapping(map: Map) -> BaseMappable? {\n\t\treturn nil\n\t}\n\t\n\toverride func mapping(map: Map) {\n\t\tsuper.mapping(map: map)\n\t\t\n\t\tname <- map[\"name\"]\n\t}\n}\n\nclass Bus: Vehicle {\n\n\toverride func mapping(map: Map) {\n\t\tsuper.mapping(map: map)\n\t}\n}\n"
  },
  {
    "path": "Tests/ObjectMapperTests/CodableTests.swift",
    "content": "//\n//  CodableTests.swift\n//  ObjectMapper\n//\n//  Created by Jari Kalinainen on 11.10.18.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\nimport XCTest\nimport ObjectMapper\n\nclass CodableTests: XCTestCase {\n\t\n\toverride func setUp() {\n\t\tsuper.setUp()\n\t\t// Put setup code here. This method is called before the invocation of each test method in the class.\n\t}\n\t\n\toverride func tearDown() {\n\t\t// Put teardown code here. This method is called after the invocation of each test method in the class.\n\t\tsuper.tearDown()\n\t}\n\t\n\tfunc testCodableTransform() {\n\t\tlet value: [String: Any] = [ \"one\": \"1\", \"two\": 2, \"three\": true ]\n\t\tlet JSON: [String: Any] = [ \"value\": value, \"array_value\": [value, value]]\n\t\t\n\t\tlet mapper = Mapper<ImmutableMappableObject>()\n\t\t\n\t\tlet object: ImmutableMappableObject! = mapper.map(JSON: JSON)\n\t\tXCTAssertNotNil(object)\n\t\tXCTAssertNil(object.nilValue) // without transform this is nil\n\t\tXCTAssertNotNil(object.value)\n\t\tXCTAssertNotNil(object.value?.one)\n\t\tXCTAssertNotNil(object.value?.two)\n\t\tXCTAssertNotNil(object.value?.three)\n\t\tXCTAssertNotNil(object.arrayValue)\n\t}\n}\n\nclass ImmutableMappableObject: ImmutableMappable {\n\t\n\tvar value: CodableModel?\n\tvar arrayValue: [CodableModel]?\n\tvar nilValue: CodableModel?\n\t\n\trequired init(map: Map) throws {\n\t\tnilValue = try? map.value(\"value\")\n\t\tvalue = try? map.value(\"value\", using: CodableTransform<CodableModel>())\n\t\tarrayValue = try? map.value(\"array_value\", using: CodableTransform<[CodableModel]>())\n\t}\n\n\tfunc mapping(map: Map) {\n\t\tnilValue <- map[\"value\"]\n\t\tvalue\t<- (map[\"value\"], using: CodableTransform<CodableModel>())\n\t\tarrayValue <- (map[\"array_value\"], using: CodableTransform<[CodableModel]>())\n\t}\n}\n\nstruct CodableModel: Codable {\n\tlet one: String\n\tlet two: Int\n\tlet three: Bool\n}\n"
  },
  {
    "path": "Tests/ObjectMapperTests/CustomTransformTests.swift",
    "content": "//\n//  CustomTransformTests.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2015-03-09.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\nimport XCTest\nimport ObjectMapper\n\n#if os(iOS) || os(tvOS) || os(watchOS)\n\ttypealias TestHexColor = UIColor\n#else\n\ttypealias TestHexColor = NSColor\n#endif\n\nclass CustomTransformTests: XCTestCase {\n\n\tlet mapper = Mapper<Transforms>()\n\t\n    override func setUp() {\n        super.setUp()\n        // Put setup code here. This method is called before the invocation of each test method in the class.\n    }\n    \n    override func tearDown() {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n        super.tearDown()\n    }\n\n\tfunc testDateTransform() {\n\t\tlet transforms = Transforms()\n\t\ttransforms.date = Date(timeIntervalSince1970: 946684800)\n\t\ttransforms.dateOpt = Date(timeIntervalSince1970: 946684912)\n\t\ttransforms.dateMs = transforms.date\n\t\ttransforms.dateOptMs = transforms.dateOpt\n\t\t\n\t\tlet JSON = mapper.toJSON(transforms)\n\t\tlet parsedTransforms = mapper.map(JSON: JSON)\n\t\tXCTAssertNotNil(parsedTransforms)\n\t\tXCTAssertEqual(parsedTransforms?.date, transforms.date)\n\t\tXCTAssertEqual(parsedTransforms?.dateOpt, transforms.dateOpt)\n\t\tXCTAssertEqual(parsedTransforms?.dateMs, transforms.dateMs)\n\t\tXCTAssertEqual(parsedTransforms?.dateOptMs, transforms.dateOptMs)\n\t\t\n\t\tlet JSONDateString: [String: Any] = [\"date\": \"946684800\", \"dateOpt\": \"946684912\",\n\t\t\t\t\t\t\t\t\t\t\t \"dateMs\": \"946684800000\", \"dateOptMs\": \"946684912000\"]\n\t\tlet parsedTransformsDateString = mapper.map(JSON: JSONDateString)\n\t\t\n\t\tXCTAssertNotNil(parsedTransformsDateString)\n\t\tXCTAssertEqual(parsedTransforms?.date, parsedTransformsDateString?.date)\n\t\tXCTAssertEqual(parsedTransforms?.dateOpt, parsedTransformsDateString?.dateOpt)\n\t\tXCTAssertEqual(parsedTransforms?.dateMs, parsedTransformsDateString?.dateMs)\n\t\tXCTAssertEqual(parsedTransforms?.dateOptMs, parsedTransformsDateString?.dateOptMs)\n\n\t}\n\t\n\tfunc testISO8601DateTransform() {\n\t\tlet transforms = Transforms()\n\t\ttransforms.ISO8601Date = Date(timeIntervalSince1970: 1398956159)\n\t\ttransforms.ISO8601DateOpt = Date(timeIntervalSince1970: 1398956159)\n\t\tlet JSON = mapper.toJSON(transforms)\n\n\t\tlet parsedTransforms = mapper.map(JSON: JSON)\n\t\tXCTAssertNotNil(parsedTransforms)\n\t\tXCTAssertEqual(parsedTransforms?.ISO8601Date, transforms.ISO8601Date)\n\t\tXCTAssertEqual(parsedTransforms?.ISO8601DateOpt, transforms.ISO8601DateOpt)\n\t}\n\t\n\tfunc testISO8601DateTransformWithInvalidInput() {\n\t\tvar JSON: [String: Any] = [\"ISO8601Date\": \"\"]\n\t\tlet transforms = mapper.map(JSON: JSON)\n\n\t\tXCTAssertNil(transforms?.ISO8601DateOpt)\n\n\t\tJSON[\"ISO8601Date\"] = \"incorrect format\"\n\n\t\tlet transforms2 = mapper.map(JSON: JSON)\n\n\t\tXCTAssertNil(transforms2?.ISO8601DateOpt)\n\t}\n\t\n\tfunc testCustomFormatDateTransform(){\n\t\tlet dateString = \"2015-03-03T02:36:44\"\n\t\tlet JSON: [String: Any] = [\"customFormateDate\": dateString]\n\t\tlet transform: Transforms! = mapper.map(JSON: JSON)\n\t\tXCTAssertNotNil(transform)\n\t\t\n\t\tlet JSONOutput = mapper.toJSON(transform)\n\n\t\tXCTAssertEqual(JSONOutput[\"customFormateDate\"] as? String, dateString)\n\t}\n\t\n\tfunc testIntToStringTransformOf() {\n\t\tlet intValue = 12345\n\t\tlet JSON: [String: Any] = [\"intWithString\": \"\\(intValue)\"]\n\t\tlet transforms = mapper.map(JSON: JSON)\n\n\t\tXCTAssertEqual(transforms?.intWithString, intValue)\n\t}\n\t\n\tfunc testInt64MaxValue() {\n\t\tlet transforms = Transforms()\n\t\ttransforms.int64Value = INT64_MAX\n\t\t\n\t\tlet JSON = mapper.toJSON(transforms)\n\n\t\tlet parsedTransforms = mapper.map(JSON: JSON)\n\t\tXCTAssertNotNil(parsedTransforms)\n\t\tXCTAssertEqual(parsedTransforms?.int64Value, transforms.int64Value)\n\t}\n\t\n\tfunc testURLTranform() {\n\t\tlet transforms = Transforms()\n\t\ttransforms.URL = URL(string: \"http://google.com/image/1234\")!\n\t\ttransforms.URLOpt = URL(string: \"http://google.com/image/1234\")\n\t\ttransforms.URLWithoutEncoding = URL(string: \"http://google.com/image/1234#fragment\")!\n\t\t\n\t\tlet JSON = mapper.toJSON(transforms)\n\n\t\tlet parsedTransforms = mapper.map(JSON: JSON)\n\t\t\n\t\tXCTAssertNotNil(parsedTransforms)\n\t\tXCTAssertEqual(parsedTransforms?.URL, transforms.URL)\n\t\tXCTAssertEqual(parsedTransforms?.URLOpt, transforms.URLOpt)\n\t\tXCTAssertEqual(parsedTransforms?.URLWithoutEncoding, transforms.URLWithoutEncoding)\n\t}\n\t\n\tfunc testEnumTransform() {\n\t\tlet JSON: [String: Any] = [\"firstImageType\": \"cover\", \"secondImageType\": \"thumbnail\"]\n\t\tlet transforms = mapper.map(JSON: JSON)\n\n\t\tlet imageType = Transforms.ImageType.self\n\t\tXCTAssertEqual(transforms?.firstImageType, imageType.Cover)\n\t\tXCTAssertEqual(transforms?.secondImageType, imageType.Thumbnail)\n\t}\n\t\n\tfunc testHexColorTransform() {\n\t\tlet JSON: [String: Any] = [\n\t\t\t\"colorRed\": \"#FF0000\",\n\t\t\t\"colorGreenLowercase\": \"#00FF00\",\n\t\t\t\"colorBlueWithoutHash\": \"0000FF\",\n\t\t\t\"color3lenght\": \"F00\",\n\t\t\t\"color4lenght\": \"F00f\",\n\t\t\t\"color8lenght\": \"ff0000ff\"\n\t\t]\n\t\t\n\t\tlet transform = mapper.map(JSON: JSON)\n\t\t\n\t\tXCTAssertEqual(transform?.colorRed, TestHexColor.red)\n\t\tXCTAssertEqual(transform?.colorGreenLowercase, TestHexColor.green)\n\t\tXCTAssertEqual(transform?.colorBlueWithoutHash, TestHexColor.blue)\n\t\tXCTAssertEqual(transform?.color3lenght, TestHexColor.red)\n\t\tXCTAssertEqual(transform?.color4lenght, TestHexColor.red)\n\t\tXCTAssertEqual(transform?.color8lenght, TestHexColor.red)\n\t\t\n\t\tlet JSONOutput = mapper.toJSON(transform!)\n\t\t\n\t\tXCTAssertEqual(JSONOutput[\"colorRed\"] as? String, \"FF0000\")\n\t\tXCTAssertEqual(JSONOutput[\"colorGreenLowercase\"] as? String, \"00FF00\")\n\t\tXCTAssertEqual(JSONOutput[\"colorBlueWithoutHash\"] as? String, \"#0000FF\") // prefixToJSON = true\n\t\tXCTAssertEqual(JSONOutput[\"color3lenght\"] as? String, \"FF0000\")\n\t\tXCTAssertEqual(JSONOutput[\"color4lenght\"] as? String, \"FF0000\")\n\t\tXCTAssertEqual(JSONOutput[\"color8lenght\"] as? String, \"FF0000FF\") // alphaToJSON = true\n\t}\n}\n\nclass Transforms: Mappable {\n\t\n\tinternal enum ImageType: String {\n\t\tcase Cover = \"cover\"\n\t\tcase Thumbnail = \"thumbnail\"\n\t}\n\n\tvar date = Date()\n\tvar dateOpt: Date?\n\t\n\tvar dateMs = Date()\n\tvar dateOptMs: Date?\n\t\n\tvar ISO8601Date: Date = Date()\n\tvar ISO8601DateOpt: Date?\n\t\n\tvar customFormatDate = Date()\n\tvar customFormatDateOpt: Date?\n\t\n\tvar URL = Foundation.URL(string: \"\")\n\tvar URLOpt: Foundation.URL?\n\tvar URLWithoutEncoding = Foundation.URL(string: \"\")\n\t\n\tvar intWithString: Int = 0\n\t\n\tvar int64Value: Int64 = 0\n\t\n\tvar firstImageType: ImageType?\n\tvar secondImageType: ImageType?\n\t\n\tvar colorRed: TestHexColor?\n\tvar colorGreenLowercase: TestHexColor?\n\tvar colorBlueWithoutHash: TestHexColor?\n\tvar color3lenght: TestHexColor?\n\tvar color4lenght: TestHexColor?\n\tvar color8lenght: TestHexColor?\n\n\tinit(){\n\t\t\n\t}\n\t\n\trequired init?(map: Map){\n\t\t\n\t}\n\t\n\tfunc mapping(map: Map) {\n\t\tdate\t\t\t\t<- (map[\"date\"], DateTransform())\n\t\tdateOpt\t\t\t\t<- (map[\"dateOpt\"], DateTransform())\n\t\t\n\t\tdateMs\t\t\t\t<- (map[\"dateMs\"], DateTransform(unit: .milliseconds))\n\t\tdateOptMs\t\t\t<- (map[\"dateOptMs\"], DateTransform(unit: .milliseconds))\n\t\t\n\t\tISO8601Date\t\t\t<- (map[\"ISO8601Date\"], ISO8601DateTransform())\n\t\tISO8601DateOpt\t\t<- (map[\"ISO8601DateOpt\"], ISO8601DateTransform())\n\t\t\n\t\tcustomFormatDate\t<- (map[\"customFormateDate\"], CustomDateFormatTransform(formatString: \"yyyy-MM-dd'T'HH:mm:ss\"))\n\t\tcustomFormatDateOpt <- (map[\"customFormateDateOpt\"], CustomDateFormatTransform(formatString: \"yyyy-MM-dd'T'HH:mm:ss\"))\n\n\t\tURL\t\t\t\t\t<- (map[\"URL\"], URLTransform())\n\t\tURLOpt\t\t\t\t<- (map[\"URLOpt\"], URLTransform())\n\t\tURLWithoutEncoding  <- (map[\"URLWithoutEncoding\"], URLTransform(shouldEncodeURLString: false))\n\t\t\n\t\tintWithString\t\t<- (map[\"intWithString\"], TransformOf<Int, String>(fromJSON: { $0 == nil ? nil : Int($0!) }, toJSON: { $0.map { String($0) } }))\n\t\tint64Value\t\t\t<- (map[\"int64Value\"], TransformOf<Int64, NSNumber>(fromJSON: { $0?.int64Value }, toJSON: { $0.map { NSNumber(value: $0) } }))\n\t\t\n\t\tfirstImageType\t\t<- (map[\"firstImageType\"], EnumTransform<ImageType>())\n\t\tsecondImageType\t\t<- (map[\"secondImageType\"], EnumTransform<ImageType>())\n\t\t\n\t\tcolorRed\t\t\t<- (map[\"colorRed\"], HexColorTransform())\n\t\tcolorGreenLowercase <- (map[\"colorGreenLowercase\"], HexColorTransform())\n\t\tcolorBlueWithoutHash <- (map[\"colorBlueWithoutHash\"], HexColorTransform(prefixToJSON: true))\n\t\tcolor3lenght\t\t\t<- (map[\"color3lenght\"], HexColorTransform())\n\t\tcolor4lenght\t\t\t<- (map[\"color4lenght\"], HexColorTransform())\n\t\tcolor8lenght\t\t\t<- (map[\"color8lenght\"], HexColorTransform(alphaToJSON: true))\n\t}\n}\n\n"
  },
  {
    "path": "Tests/ObjectMapperTests/DataTransformTests.swift",
    "content": "//\n//  NSDataTransformTests.swift\n//  ObjectMapper\n//\n//  Created by Yagrushkin, Evgeny on 8/30/16.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport XCTest\nimport ObjectMapper\n\nclass DataTransformTests: XCTestCase {\n\t\n\tlet mapper = Mapper<DataType>()\n\n\tfunc testDataTransform() {\n\n\t\tlet dataLength = 20\n\t\tlet bytes = malloc(dataLength)\n\t\t\n\t\tlet data = Data(bytes: bytes!, count: dataLength)\n\t\tlet dataString = data.base64EncodedString()\n\t\tlet JSONString = \"{\\\"data\\\" : \\\"\\(dataString)\\\"}\"\n\t\t\n\t\tlet mappedObject = mapper.map(JSONString: JSONString)\n\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.stringData, dataString)\n\t\tXCTAssertEqual(mappedObject?.data, data)\n\t}\n\n}\n\nclass DataType: Mappable {\n\t\n\tvar data: Data?\n\tvar stringData: String?\n\t\n\tinit(){\n\t\t\n\t}\n\t\n\trequired init?(map: Map){\n\t\t\n\t}\n\t\n\tfunc mapping(map: Map) {\n\t\tstringData <- map[\"data\"]\n\t\tdata <- (map[\"data\"], DataTransform())\n\t}\n}\n"
  },
  {
    "path": "Tests/ObjectMapperTests/DictionaryTransformTests.swift",
    "content": "//\n//  DictionaryTransformTests.swift\n//  ObjectMapper\n//\n//  Created by Milen Halachev on 7/20/16.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\nimport XCTest\nimport ObjectMapper\n\nclass DictionaryTransformTests: XCTestCase {\n\t\n\tfunc testDictionaryTransform() {\n\t\t\n\t\tlet JSON = \"{\\\"dictionary\\\":{\\\"1\\\":{\\\"foo\\\":\\\"uno\\\",\\\"bar\\\":1},\\\"two\\\":{\\\"foo\\\":\\\"dve\\\",\\\"bar\\\":2},\\\"bar\\\":{\\\"foo\\\":\\\"bar\\\",\\\"bar\\\":777}}}\"\n\t\t\n\t\tguard let result = DictionaryTransformTestsObject(JSONString: JSON) else {\n\t\t\t\n\t\t\tXCTFail(\"Unable to parse the JSON\")\n\t\t\treturn\n\t\t}\n\t\t\n\t\tXCTAssertEqual(result.dictionary.count, 3)\n\t\t\n\t\tXCTAssertEqual(result.dictionary[.One]?.foo, \"uno\")\n\t\tXCTAssertEqual(result.dictionary[.One]?.bar, 1)\n\t\t\n\t\tXCTAssertEqual(result.dictionary[.Two]?.foo, \"dve\")\n\t\tXCTAssertEqual(result.dictionary[.Two]?.bar, 2)\n\t\t\n\t\tXCTAssertEqual(result.dictionary[.Foo]?.foo, \"bar\")\n\t\tXCTAssertEqual(result.dictionary[.Foo]?.bar, 777)\n\t}\n}\n\nclass DictionaryTransformTestsObject: Mappable {\n\t\n\tvar dictionary: [MyKey: MyValue] = [:]\n\t\n\trequired init?(map: Map) {\n\n\t\t\n\t}\n\t\n\tfunc mapping(map: Map) {\n\t\t\n\t\tself.dictionary <- (map[\"dictionary\"], DictionaryTransform<MyKey, MyValue>())\n\t}\n}\n\nextension DictionaryTransformTestsObject {\n\t\n\tenum MyKey: String {\n\t\t\n\t\tcase One = \"1\"\n\t\tcase Two = \"two\"\n\t\tcase Foo = \"bar\"\n\t}\n}\n\nextension DictionaryTransformTestsObject {\n\t\n\tclass MyValue: Mappable {\n\t\t\n\t\tvar foo: String\n\t\tvar bar: Int\n\t\t\n\t\trequired init?(map: Map) {\n\t\t\t\n\t\t\tself.foo = \"__foo\"\n\t\t\tself.bar = self.foo.hash\n\t\t\t\n\t\t\tself.mapping(map: map)\n\t\t\t\n\t\t\tguard self.foo != \"__foo\" && self.bar != self.foo.hash else {\n\t\t\t\t\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\t\n\t\tfunc mapping(map: Map) {\n\t\t\t\n\t\t\tself.foo <- map[\"foo\"]\n\t\t\tself.bar <- map[\"bar\"]\n\t\t}\n\t}\n}\n\n"
  },
  {
    "path": "Tests/ObjectMapperTests/GenericObjectsTests.swift",
    "content": "//\n//  GenericObjectsTests.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2016-09-26.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport XCTest\nimport ObjectMapper\n\nclass GenericObjectsTests: XCTestCase {\n\n    override func setUp() {\n        super.setUp()\n        // Put setup code here. This method is called before the invocation of each test method in the class.\n    }\n    \n    override func tearDown() {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n        super.tearDown()\n    }\n\n\tfunc testSubclass() {\n\t\tlet object = Subclass()\n\t\tobject.base = \"base var\"\n\t\tobject.sub = \"sub var\"\n\t\t\n\t\tlet json = Mapper().toJSON(object)\n\t\tlet parsedObject = Mapper<Subclass>().map(JSON: json)\n\t\t\n\t\tXCTAssertEqual(object.base, parsedObject?.base)\n\t\tXCTAssertEqual(object.sub, parsedObject?.sub)\n\t}\n\t\n\tfunc testGenericSubclass() {\n\t\tlet object = GenericSubclass<String>()\n\t\tobject.base = \"base var\"\n\t\tobject.sub = \"sub var\"\n\t\t\n\t\tlet json = Mapper().toJSON(object)\n\t\tlet parsedObject = Mapper<GenericSubclass<String>>().map(JSON: json)\n\t\t\n\t\tXCTAssertEqual(object.base, parsedObject?.base)\n\t\tXCTAssertEqual(object.sub, parsedObject?.sub)\n\t}\n\t\n\tfunc testSubclassWithGenericArrayInSuperclass() {\n\t\tlet JSONString = \"{\\\"genericItems\\\":[{\\\"value\\\":\\\"value0\\\"}, {\\\"value\\\":\\\"value1\\\"}]}\"\n\t\t\n\t\tlet parsedObject = Mapper<SubclassWithGenericArrayInSuperclass<AnyObject>>().map(JSONString: JSONString)\n\t\t\n\t\tlet genericItems = parsedObject?.genericItems\n\t\t\n\t\tXCTAssertNotNil(genericItems)\n\t\tXCTAssertEqual(genericItems?[0].value, \"value0\")\n\t\tXCTAssertEqual(genericItems?[1].value, \"value1\")\n\t}\n\t\n\t\n\tfunc testMappingAGenericObject(){\n\t\tlet code: Int = 22\n\t\tlet JSONString = \"{\\\"result\\\":{\\\"code\\\":\\(code)}}\"\n\t\t\n\t\tlet response = Mapper<Response<Status>>().map(JSONString: JSONString)\n\t\t\n\t\tlet status = response?.result?.status\n\t\t\n\t\tXCTAssertNotNil(status)\n\t\tXCTAssertEqual(status, code)\n\t}\n\t\n\t\n\tfunc testMappingAGenericObjectViaMappableExtension(){\n\t\tlet code: Int = 22\n\t\tlet JSONString = \"{\\\"result\\\":{\\\"code\\\":\\(code)}}\"\n\t\t\n\t\tlet response = Response<Status>(JSONString: JSONString)\n\t\t\n\t\tlet status = response?.result?.status\n\t\t\n\t\tXCTAssertNotNil(status)\n\t\tXCTAssertEqual(status, code)\n\t}\n\t\n}\n\nclass Base: Mappable {\n\t\n\tvar base: String?\n\t\n\tinit(){\n\t\t\n\t}\n\t\n\trequired init?(map: Map){\n\t\t\n\t}\n\t\n\tfunc mapping(map: Map) {\n\t\tbase <- map[\"base\"]\n\t}\n}\n\nclass Subclass: Base {\n\t\n\tvar sub: String?\n\t\n\toverride init(){\n\t\tsuper.init()\n\t}\n\t\n\trequired init?(map: Map){\n\t\tsuper.init(map: map)\n\t}\n\t\n\toverride func mapping(map: Map) {\n\t\tsuper.mapping(map: map)\n\t\t\n\t\tsub <- map[\"sub\"]\n\t}\n}\n\n\nclass GenericSubclass<T>: Base {\n\t\n\tvar sub: String?\n\t\n\toverride init(){\n\t\tsuper.init()\n\t}\n\t\n\trequired init?(map: Map){\n\t\tsuper.init(map: map)\n\t}\n\t\n\toverride func mapping(map: Map) {\n\t\tsuper.mapping(map: map)\n\t\t\n\t\tsub <- map[\"sub\"]\n\t}\n}\n\nclass WithGenericArray<T: Mappable>: Mappable {\n\tvar genericItems: [T]?\n\t\n\trequired init?(map: Map){\n\t\t\n\t}\n\t\n\tfunc mapping(map: Map) {\n\t\tgenericItems <- map[\"genericItems\"]\n\t}\n}\n\nclass ConcreteItem: Mappable {\n\tvar value: String?\n\t\n\trequired init?(map: Map){\n\t\t\n\t}\n\t\n\tfunc mapping(map: Map) {\n\t\tvalue <- map[\"value\"]\n\t}\n}\n\nclass SubclassWithGenericArrayInSuperclass<Unused>: WithGenericArray<ConcreteItem> {\n\trequired init?(map: Map){\n\t\tsuper.init(map: map)\n\t}\n}\n\nclass Response<T: Mappable>: Mappable {\n\tvar result: T?\n\t\n\trequired init?(map: Map){\n\t\t\n\t}\n\t\n\tfunc mapping(map: Map) {\n\t\tresult <- map[\"result\"]\n\t}\n}\n"
  },
  {
    "path": "Tests/ObjectMapperTests/IgnoreNilTests.swift",
    "content": "//\n//  IgnoreNilTests.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2016-06-06.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport XCTest\nimport ObjectMapper\n\nclass IgnoreNilTests: XCTestCase {\n    \n    override func setUp() {\n        super.setUp()\n        // Put setup code here. This method is called before the invocation of each test method in the class.\n    }\n    \n    override func tearDown() {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n        super.tearDown()\n    }\n\t\n\tfunc testIgnoreNullField(){\n\t\tlet name = \"Tristan\"\n\t\tvar user = User()\n\t\tuser.name = name\n\t\t\n\t\tlet JSON = \"{\\\"name\\\" : null}\"\n\t\tuser = Mapper<User>().map(JSONString: JSON, toObject: user)\n\t\t\n\t\tXCTAssertEqual(user.name, name)\n\t}\n\t\n\tfunc testIgnoreNilField(){\n\t\tlet name = \"Tristan\"\n\t\tvar user = User()\n\t\tuser.name = name\n\t\t\n\t\tlet JSON = \"{\\\"name\\\" : nil}\"\n\t\tuser = Mapper<User>().map(JSONString: JSON, toObject: user)\n\t\t\n\t\tXCTAssertEqual(user.name, name)\n\t}\n\n\tprivate class User: Mappable {\n\t\tvar name: String?\n\t\t\n\t\tinit(){}\n\t\t\n\t\trequired init?(map: Map){\n\t\t\t\n\t\t}\n\t\t\n\t\tfunc mapping(map: Map){\n\t\t\tname <- map[\"name\", ignoreNil: true]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Tests/ObjectMapperTests/ImmutableTests.swift",
    "content": "//\n//  ImmutableTests.swift\n//  ObjectMapper\n//\n//  Created by Suyeol Jeon on 23/09/2016.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\nimport XCTest\nimport ObjectMapper\n\nclass ImmutableObjectTests: XCTestCase {\n\tlet JSON: [String: Any] = [\n\t\t\n\t\t// Basic types\n\t\t\"prop1\": \"Immutable!\",\n\t\t\"prop2\": 255,\n\t\t\"prop3\": true,\n\t\t// prop4 has a default value\n\t\t\n\t\t// String\n\t\t\"prop5\": \"prop5\",\n\t\t\"prop6\": \"prop6\",\n\t\t\"prop7\": \"prop7\",\n\t\t\n\t\t// [String]\n\t\t\"prop8\": [\"prop8\"],\n\t\t\"prop9\": [\"prop9\"],\n\t\t\"prop10\": [\"prop10\"],\n\t\t\n\t\t// [String: String]\n\t\t\"prop11\": [\"key\": \"prop11\"],\n\t\t\"prop12\": [\"key\": \"prop12\"],\n\t\t\"prop13\": [\"key\": \"prop13\"],\n\t\t\n\t\t// Base\n\t\t\"prop14\": [\"base\": \"prop14\"],\n\t\t\"prop15\": [\"base\": \"prop15\"],\n\t\t\"prop16\": [\"base\": \"prop16\"],\n\t\t\n\t\t// [Base]\n\t\t\"prop17\": [[\"base\": \"prop17\"]],\n\t\t\"prop18\": [[\"base\": \"prop18\"]],\n\t\t\"prop19\": [[\"base\": \"prop19\"]],\n\t\t\n\t\t// [String: Base]\n\t\t\"prop20\": [\"key\": [\"base\": \"prop20\"]],\n\t\t\"prop21\": [\"key\": [\"base\": \"prop21\"]],\n\t\t\"prop22\": [\"key\": [\"base\": \"prop22\"]],\n\t\t\n\t\t// Optional with immutables\n\t\t\"prop23\": \"Optional\",\n\t\t\"prop24\": 255,\n\t\t\"prop25\": true,\n\t\t\"prop26\": 255.0,\n\t\t\n\t\t// RawRepresentable\n\t\t\"prop27a\": NSNumber(value: 0),\n\t\t\"prop27b\": NSNumber(value: 1000),\n\t\t\"prop27c\": [NSNumber(value: 0), NSNumber(value: 1000)],\n\n\t\t\"prop28a\": Int(0),\n\t\t\"prop28b\": Int(255),\n\t\t\"prop28c\": [Int(0), Int(255)],\n\n\t\t\"prop29a\": Double(0),\n\t\t\"prop29b\": Double(100),\n\t\t\"prop29c\": [Double(0), Double(100)],\n\n\t\t\"prop30a\": Float(0),\n\t\t\"prop30b\": Float(100),\n\t\t\"prop30c\": [Float(0), Float(100)],\n\t\t\n\t\t\"prop31a\": \"String A\",\n\t\t\"prop31b\": \"String B\",\n\t\t\"prop31c\": [\"String A\", \"String B\"],\n\t\t\n\t\t// [[String]]\n\t\t\"prop32\": [[\"prop32\"]],\n\t\t\"prop33\": [[\"prop33\"]],\n\t\t\"prop34\": [[\"prop34\"]],\n\t\t\n\t\t// [[Base]]\n\t\t\"prop35\": [[[\"base\": \"prop35\"]]],\n\t\t\"prop36\": [[[\"base\": \"prop36\"]]],\n\t\t\"prop37\": [[[\"base\": \"prop37\"]]],\n\t\t\n\t\t\"non.nested->key\": \"string\",\n\t\t\"nested\": [\n\t\t\t\"int\": 123,\n\t\t\t\"string\": \"hello\",\n\t\t\t\"array\": [\"a\", \"b\", \"c\"],\n\t\t\t\"dictionary\": [\"a\": 10, \"b\": 20, \"c\": 30],\n\t\t],\n\t\t\"com.tristanhimmelman.ObjectMapper.nested\": [\n\t\t\t\"com.tristanhimmelman.ObjectMapper.int\": 123,\n\t\t\t\"com.tristanhimmelman.ObjectMapper.string\": \"hello\",\n\t\t\t\"array\": [\"a\", \"b\", \"c\"],\n\t\t\t\"dictionary\": [\"a\": 10, \"b\": 20, \"c\": 30],\n\t\t]\n\t\t]\n\t\n\tfunc testImmutableMappable() {\n\t\tlet mapper = Mapper<Struct>()\n\t\t\n\t\tlet immutable: Struct = try! mapper.map(JSON: JSON)\n\t\tXCTAssertNotNil(immutable)\n\t\tXCTAssertEqual(immutable.prop1, \"Immutable!\")\n\t\tXCTAssertEqual(immutable.prop2, 255)\n\t\tXCTAssertEqual(immutable.prop3, true)\n\t\tXCTAssertEqual(immutable.prop4, .greatestFiniteMagnitude)\n\t\t\n\t\tXCTAssertEqual(immutable.prop5, \"prop5_TRANSFORMED\")\n\t\tXCTAssertEqual(immutable.prop6, \"prop6_TRANSFORMED\")\n\t\tXCTAssertEqual(immutable.prop7, \"prop7_TRANSFORMED\")\n\t\t\n\t\tXCTAssertEqual(immutable.prop8, [\"prop8_TRANSFORMED\"])\n\t\tXCTAssertEqual(immutable.prop9!, [\"prop9_TRANSFORMED\"])\n\t\tXCTAssertEqual(immutable.prop10, [\"prop10_TRANSFORMED\"])\n\t\t\n\t\tXCTAssertEqual(immutable.prop11, [\"key\": \"prop11_TRANSFORMED\"])\n\t\tXCTAssertEqual(immutable.prop12!, [\"key\": \"prop12_TRANSFORMED\"])\n\t\tXCTAssertEqual(immutable.prop13, [\"key\": \"prop13_TRANSFORMED\"])\n\t\t\n\t\tXCTAssertEqual(immutable.prop14.base, \"prop14\")\n\t\tXCTAssertEqual(immutable.prop15?.base, \"prop15\")\n\t\tXCTAssertEqual(immutable.prop16.base, \"prop16\")\n\t\t\n\t\tXCTAssertEqual(immutable.prop17[0].base, \"prop17\")\n\t\tXCTAssertEqual(immutable.prop18![0].base, \"prop18\")\n\t\tXCTAssertEqual(immutable.prop19[0].base, \"prop19\")\n\t\t\n\t\tXCTAssertEqual(immutable.prop20[\"key\"]!.base, \"prop20\")\n\t\tXCTAssertEqual(immutable.prop21![\"key\"]!.base, \"prop21\")\n\t\tXCTAssertEqual(immutable.prop22[\"key\"]!.base, \"prop22\")\n\t\t\n\t\tXCTAssertEqual(immutable.prop23!, \"Optional\")\n\t\tXCTAssertEqual(immutable.prop24!, 255)\n\t\tXCTAssertEqual(immutable.prop25!, true)\n\t\tXCTAssertEqual(immutable.prop26!, 255.0)\n\t\t\n\t\tXCTAssertEqual(immutable.prop27a.rawValue, Int64Enum.a.rawValue)\n\t\tXCTAssertEqual(immutable.prop27b.rawValue, Int64Enum.b.rawValue)\n\t\tXCTAssertEqual(immutable.prop27c, [Int64Enum.a, Int64Enum.b])\n\t\t\n\t\tXCTAssertEqual(immutable.prop28a.rawValue, IntEnum.a.rawValue)\n\t\tXCTAssertEqual(immutable.prop28b.rawValue, IntEnum.b.rawValue)\n\t\tXCTAssertEqual(immutable.prop28c, [IntEnum.a, IntEnum.b])\n\t\t\n\t\tXCTAssertEqual(immutable.prop29a.rawValue, DoubleEnum.a.rawValue)\n\t\tXCTAssertEqual(immutable.prop29b.rawValue, DoubleEnum.b.rawValue)\n\t\tXCTAssertEqual(immutable.prop29c, [DoubleEnum.a, DoubleEnum.b])\n\t\t\n\t\tXCTAssertEqual(immutable.prop30a.rawValue, FloatEnum.a.rawValue)\n\t\tXCTAssertEqual(immutable.prop30b.rawValue, FloatEnum.b.rawValue)\n\t\tXCTAssertEqual(immutable.prop30c, [FloatEnum.a, FloatEnum.b])\n\t\t\n\t\tXCTAssertEqual(immutable.prop31a.rawValue, StringEnum.A.rawValue)\n\t\tXCTAssertEqual(immutable.prop31b.rawValue, StringEnum.B.rawValue)\n\t\tXCTAssertEqual(immutable.prop31c, [StringEnum.A, StringEnum.B])\n\t\t\n\t\tXCTAssertEqual(immutable.prop32[0][0], \"prop32_TRANSFORMED\")\n\t\tXCTAssertEqual(immutable.prop33![0][0], \"prop33_TRANSFORMED\")\n\t\tXCTAssertEqual(immutable.prop34[0][0], \"prop34_TRANSFORMED\")\n\t\t\n\t\tXCTAssertEqual(immutable.prop35[0][0].base, \"prop35\")\n\t\tXCTAssertEqual(immutable.prop36![0][0].base, \"prop36\")\n\t\tXCTAssertEqual(immutable.prop37[0][0].base, \"prop37\")\n\t\t\n\t\tXCTAssertEqual(immutable.nonnestedString, \"string\")\n\t\t\n\t\tXCTAssertEqual(immutable.nestedInt, 123)\n\t\tXCTAssertEqual(immutable.nestedString, \"hello\")\n\t\tXCTAssertEqual(immutable.nestedArray, [\"a\", \"b\", \"c\"])\n\t\tXCTAssertEqual(immutable.nestedDictionary, [\"a\": 10, \"b\": 20, \"c\": 30])\n\t\t\n\t\tXCTAssertEqual(immutable.delimiterNestedInt, 123)\n\t\tXCTAssertEqual(immutable.delimiterNestedString, \"hello\")\n\t\tXCTAssertEqual(immutable.delimiterNestedArray, [\"a\", \"b\", \"c\"])\n\t\tXCTAssertEqual(immutable.delimiterNestedDictionary, [\"a\": 10, \"b\": 20, \"c\": 30])\n\t\t\n\t\tlet JSON2: [String: Any] = [ \"prop1\": \"prop1\", \"prop2\": NSNull() ]\n\t\tlet immutable2 = try? mapper.map(JSON: JSON2)\n\t\tXCTAssertNil(immutable2)\n\t\t\n\t\t// TODO: ImmutableMappable to JSON\n\t\tlet JSONFromObject = mapper.toJSON(immutable)\n\t\tlet objectFromJSON = try? mapper.map(JSON: JSONFromObject)\n\t\tXCTAssertNotNil(objectFromJSON)\n\t\tassertImmutableObjectsEqual(objectFromJSON!, immutable)\n\t}\n\t\n\tfunc testMappingFromArray() {\n\t\tlet JSONArray: [[String: Any]] = [JSON]\n\t\t\n\t\tlet array: [Struct] = try! Mapper<Struct>().mapArray(JSONArray: JSONArray)\n\t\tXCTAssertNotNil(array.first)\n\t}\n\t\n\tfunc testMappingFromDictionary() {\n\t\tlet JSONDictionary: [String: [String: Any]] = [\n\t\t\t\"key1\": JSON,\n\t\t\t\"key2\": JSON,\n\t\t]\n\t\t\n\t\tlet dictionary: [String: Struct] = try! Mapper<Struct>().mapDictionary(JSON: JSONDictionary)\n\t\tXCTAssertNotNil(dictionary.first)\n\t\tXCTAssertEqual(dictionary.count, 2)\n\t\tXCTAssertEqual(Set(dictionary.keys), Set([\"key1\", \"key2\"]))\n\t}\n\t\n\tfunc testMappingFromDictionary_empty() {\n\t\tlet JSONDictionary: [String: [String: Any]] = [:]\n\t\t\n\t\tlet dictionary: [String: Struct] = try! Mapper<Struct>().mapDictionary(JSON: JSONDictionary)\n\t\tXCTAssertTrue(dictionary.isEmpty)\n\t}\n\t\n\tfunc testMappingFromDictionary_throws() {\n\t\tlet JSONDictionary: [String: [String: Any]] = [\n\t\t\t\"key1\": JSON,\n\t\t\t\"key2\": [\"invalid\": \"dictionary\"],\n\t\t]\n\t\t\n\t\tXCTAssertThrowsError(try Mapper<Struct>().mapDictionary(JSON: JSONDictionary))\n\t}\n\t\n\tfunc testMappingFromDictionaryOfArrays() {\n\t\tlet JSONDictionary: [String: [[String: Any]]] = [\n\t\t\t\"key1\": [JSON, JSON],\n\t\t\t\"key2\": [JSON],\n\t\t\t\"key3\": [],\n\t\t]\n\t\t\n\t\tlet dictionary: [String: [Struct]] = try! Mapper<Struct>().mapDictionaryOfArrays(JSON: JSONDictionary)\n\t\tXCTAssertNotNil(dictionary.first)\n\t\tXCTAssertEqual(dictionary.count, 3)\n\t\tXCTAssertEqual(Set(dictionary.keys), Set([\"key1\", \"key2\", \"key3\"]))\n\t\tXCTAssertEqual(dictionary[\"key1\"]?.count, 2)\n\t\tXCTAssertEqual(dictionary[\"key2\"]?.count, 1)\n\t\tXCTAssertEqual(dictionary[\"key3\"]?.count, 0)\n\t}\n\t\n\tfunc testMappingFromDictionaryOfArrays_empty() {\n\t\tlet JSONDictionary: [String: [[String: Any]]] = [:]\n\t\t\n\t\tlet dictionary: [String: [Struct]] = try! Mapper<Struct>().mapDictionaryOfArrays(JSON: JSONDictionary)\n\t\tXCTAssertTrue(dictionary.isEmpty)\n\t}\n\t\n\tfunc testMappingFromDictionaryOfArrays_throws() {\n\t\tlet JSONDictionary: [String: [[String: Any]]] = [\n\t\t\t\"key1\": [JSON],\n\t\t\t\"key2\": [[\"invalid\": \"dictionary\"]],\n\t\t]\n\t\t\n\t\tXCTAssertThrowsError(try Mapper<Struct>().mapDictionaryOfArrays(JSON: JSONDictionary))\n\t}\n\t\n\tfunc testMappingArrayOfArrays() {\n\t\tlet JSONArray: [[[String: Any]]] = [\n\t\t\t[JSON, JSON],\n\t\t\t[JSON],\n\t\t\t[],\n\t\t]\n\t\tlet array: [[Struct]] = try! Mapper<Struct>().mapArrayOfArrays(JSONObject: JSONArray)\n\t\tXCTAssertNotNil(array.first)\n\t\tXCTAssertEqual(array.count, 3)\n\t\tXCTAssertEqual(array[0].count, 2)\n\t\tXCTAssertEqual(array[1].count, 1)\n\t\tXCTAssertEqual(array[2].count, 0)\n\t}\n\t\n\tfunc testMappingArrayOfArrays_empty() {\n\t\tlet JSONArray: [[[String: Any]]] = []\n\t\tlet array: [[Struct]] = try! Mapper<Struct>().mapArrayOfArrays(JSONObject: JSONArray)\n\t\tXCTAssertTrue(array.isEmpty)\n\t}\n\t\n\tfunc testMappingArrayOfArrays_throws() {\n\t\tlet JSONArray: [[[String: Any]]] = [\n\t\t\t[JSON],\n\t\t\t[[\"invalid\": \"dictionary\"]],\n\t\t]\n\t\tXCTAssertThrowsError(try Mapper<Struct>().mapArrayOfArrays(JSONObject: JSONArray))\n\t}\n\t\n\tfunc testAsPropertyOfMappable() {\n\t\tstruct ImmutableObject: ImmutableMappable {\n\t\t\tlet value: String\n\t\t\tinit(map: Map) throws {\n\t\t\t\tself.value = try map.value(\"value\")\n\t\t\t}\n\t\t}\n\t\t\n\t\tstruct Object: Mappable {\n\t\t\tvar immutable: ImmutableObject!\n\t\t\tinit?(map: Map) {}\n\t\t\tmutating func mapping(map: Map) {\n\t\t\t\tself.immutable <- map[\"immutable\"]\n\t\t\t}\n\t\t}\n\t\t\n\t\tlet json: [String: Any] = [\n\t\t\t\"immutable\": [\n\t\t\t\t\"value\": \"Hello\"\n\t\t\t]\n\t\t]\n\t\tlet object = Mapper<Object>().map(JSON: json)\n\t\tXCTAssertEqual(object?.immutable?.value, \"Hello\")\n\t}\n\t\n\tfunc testAsPropertyOfOptionalImmutableMappable() {\n\t\tstruct ImmutableObject: ImmutableMappable {\n\t\t\tlet value: String?\n\t\t\tinit(map: Map) throws {\n\t\t\t\tself.value = try map.value(\"value\")\n\t\t\t}\n\t\t}\n\n\t\tenum RawRepresentableEnum: String {\n\t\t\tcase world\n\t\t}\n\t\tstruct Object: ImmutableMappable {\n\t\t\tlet immutable: ImmutableObject?\n\t\t\tlet enumValue: RawRepresentableEnum?\n\t\t\tinit(map: Map) throws {\n\t\t\t\tself.immutable = try map.value(\"immutable\")\n\t\t\t\tself.enumValue = try map.value(\"enum\")\n\t\t\t}\n\t\t}\n\n\t\tlet json: [String: Any] = [\n\t\t\t\"immutable\": [\n\t\t\t\t\"value\": \"Hello\"\n\t\t\t],\n\t\t\t\"enum\": \"world\"\n\t\t]\n\t\tdo {\n\t\t\tlet object = try Mapper<Object>().map(JSON: json)\n\t\t\tXCTAssertEqual(object.immutable?.value, \"Hello\")\n\t\t\tXCTAssertEqual(object.enumValue, .world)\n\t\t} catch {\n\t\t\tXCTFail()\n\t\t}\n\t}\n\n}\n\nstruct Struct {\n\tlet prop1: String\n\tlet prop2: Int\n\tlet prop3: Bool\n\tlet prop4: Double\n\t\n\tlet prop5: String\n\tlet prop6: String?\n\tlet prop7: String!\n\t\n\tlet prop8: [String]\n\tlet prop9: [String]?\n\tlet prop10: [String]!\n\t\n\tlet prop11: [String: String]\n\tlet prop12: [String: String]?\n\tlet prop13: [String: String]!\n\t\n\tlet prop14: Base\n\tlet prop15: Base?\n\tlet prop16: Base!\n\t\n\tlet prop17: [Base]\n\tlet prop18: [Base]?\n\tlet prop19: [Base]!\n\t\n\tlet prop20: [String: Base]\n\tlet prop21: [String: Base]?\n\tlet prop22: [String: Base]!\n\t\n\t// Optionals\n\tvar prop23: String?\n\tvar prop24: Int?\n\tvar prop25: Bool?\n\tvar prop26: Double?\n\t\n\t// RawRepresentable\n\tlet prop27a: Int64Enum\n\tlet prop27b: Int64Enum\n\tlet prop27c: [Int64Enum]\n\t\n\tlet prop28a: IntEnum\n\tlet prop28b: IntEnum\n\tlet prop28c: [IntEnum]\n\t\n\tlet prop29a: DoubleEnum\n\tlet prop29b: DoubleEnum\n\tlet prop29c: [DoubleEnum]\n\t\n\tlet prop30a: FloatEnum\n\tlet prop30b: FloatEnum\n\tlet prop30c: [FloatEnum]\n\t\n\tlet prop31a: StringEnum\n\tlet prop31b: StringEnum\n\tlet prop31c: [StringEnum]\n\t\n\tlet prop32: [[String]]\n\tlet prop33: [[String]]?\n\tlet prop34: [[String]]!\n\t\n\tlet prop35: [[Base]]\n\tlet prop36: [[Base]]?\n\tlet prop37: [[Base]]!\n\t\n\tvar nonnestedString: String\n\tvar nestedInt: Int\n\tvar nestedString: String\n\tvar nestedArray: [String]\n\tvar nestedDictionary: [String: Int]\n\t\n\tvar delimiterNestedInt: Int\n\tvar delimiterNestedString: String\n\tvar delimiterNestedArray: [String]\n\tvar delimiterNestedDictionary: [String: Int]\n}\n\nextension Struct: ImmutableMappable {\n\tinit(map: Map) throws {\n\t\tprop1 = try map.value(\"prop1\")\n\t\tprop2 = try map.value(\"prop2\")\n\t\tprop3 = try map.value(\"prop3\")\n\t\tprop4 = (try? map.value(\"prop4\")) ?? .greatestFiniteMagnitude\n\t\t\n\t\tprop5 = try map.value(\"prop5\", using: stringTransform)\n\t\tprop6 = try? map.value(\"prop6\", using: stringTransform)\n\t\tprop7 = try? map.value(\"prop7\", using: stringTransform)\n\t\t\n\t\tprop8 = try map.value(\"prop8\", using: stringTransform)\n\t\tprop9 = try? map.value(\"prop9\", using: stringTransform)\n\t\tprop10 = try? map.value(\"prop10\", using: stringTransform)\n\t\t\n\t\tprop11 = try map.value(\"prop11\", using: stringTransform)\n\t\tprop12 = try? map.value(\"prop12\", using: stringTransform)\n\t\tprop13 = try? map.value(\"prop13\", using: stringTransform)\n\t\t\n\t\tprop14 = try map.value(\"prop14\")\n\t\tprop15 = try? map.value(\"prop15\")\n\t\tprop16 = try? map.value(\"prop16\")\n\t\t\n\t\tprop17 = try map.value(\"prop17\")\n\t\tprop18 = try? map.value(\"prop18\")\n\t\tprop19 = try? map.value(\"prop19\")\n\t\t\n\t\tprop20 = try map.value(\"prop20\")\n\t\tprop21 = try? map.value(\"prop21\")\n\t\tprop22 = try? map.value(\"prop22\")\n\t\t\n\t\tprop27a = try map.value(\"prop27a\")\n\t\tprop27b = try map.value(\"prop27b\")\n\t\tprop27c = try map.value(\"prop27c\")\n\t\t\n\t\tprop28a = try map.value(\"prop28a\")\n\t\tprop28b = try map.value(\"prop28b\")\n\t\tprop28c = try map.value(\"prop28c\")\n\t\t\n\t\tprop29a = try map.value(\"prop29a\")\n\t\tprop29b = try map.value(\"prop29b\")\n\t\tprop29c = try map.value(\"prop29c\")\n\t\t\n\t\tprop30a = try map.value(\"prop30a\")\n\t\tprop30b = try map.value(\"prop30b\")\n\t\tprop30c = try map.value(\"prop30c\")\n\t\t\n\t\tprop31a = try map.value(\"prop31a\")\n\t\tprop31b = try map.value(\"prop31b\")\n\t\tprop31c = try map.value(\"prop31c\")\n\t\t\n\t\tprop32 = try map.value(\"prop32\", using: stringTransform)\n\t\tprop33 = try? map.value(\"prop33\", using: stringTransform)\n\t\tprop34 = try? map.value(\"prop34\", using: stringTransform)\n\t\t\n\t\tprop35 = try map.value(\"prop35\")\n\t\tprop36 = try? map.value(\"prop36\")\n\t\tprop37 = try? map.value(\"prop37\")\n\t\t\n\t\tnonnestedString = try map.value(\"non.nested->key\", nested: false)\n\t\t\n\t\tnestedInt = try map.value(\"nested.int\")\n\t\tnestedString = try map.value(\"nested.string\")\n\t\tnestedArray = try map.value(\"nested.array\")\n\t\tnestedDictionary = try map.value(\"nested.dictionary\")\n\t\t\n\t\tdelimiterNestedInt = try map.value(\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.int\", delimiter: \"->\")\n\t\tdelimiterNestedString = try map.value(\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.string\", delimiter: \"->\")\n\t\tdelimiterNestedArray = try map.value(\"com.tristanhimmelman.ObjectMapper.nested->array\", delimiter: \"->\")\n\t\tdelimiterNestedDictionary = try map.value(\"com.tristanhimmelman.ObjectMapper.nested->dictionary\", delimiter: \"->\")\n\t}\n\n\tmutating func mapping(map: Map) {\n\t\tprop1 >>> map[\"prop1\"]\n\t\tprop2 >>> map[\"prop2\"]\n\t\tprop3 >>> map[\"prop3\"]\n\t\tprop4 >>> map[\"prop4\"]\n\t\t\n\t\tprop5 >>> (map[\"prop5\"], stringTransform)\n\t\tprop6 >>> (map[\"prop6\"], stringTransform)\n\t\tprop7 >>> (map[\"prop7\"], stringTransform)\n\t\t\n\t\tprop8 >>> (map[\"prop8\"], stringTransform)\n\t\tprop9 >>> (map[\"prop9\"], stringTransform)\n\t\tprop10 >>> (map[\"prop10\"], stringTransform)\n\t\t\n\t\tprop11 >>> (map[\"prop11\"], stringTransform)\n\t\tprop12 >>> (map[\"prop12\"], stringTransform)\n\t\tprop13 >>> (map[\"prop13\"], stringTransform)\n\t\t\n\t\tprop14 >>> map[\"prop14\"]\n\t\tprop15 >>> map[\"prop15\"]\n\t\tprop16 >>> map[\"prop16\"]\n\t\t\n\t\tprop17 >>> map[\"prop17\"]\n\t\tprop18 >>> map[\"prop18\"]\n\t\tprop19 >>> map[\"prop19\"]\n\t\t\n\t\tprop20 >>> map[\"prop20\"]\n\t\tprop21 >>> map[\"prop21\"]\n\t\tprop22 >>> map[\"prop22\"]\n\t\t\n\t\tprop23 <- map[\"prop23\"]\n\t\tprop24 <- map[\"prop24\"]\n\t\tprop25 <- map[\"prop25\"]\n\t\tprop26 <- map[\"prop26\"]\n\t\t\n\t\tprop27a >>> map[\"prop27a\"]\n\t\tprop27b >>> map[\"prop27b\"]\n\t\tprop27c >>> map[\"prop27c\"]\n\t\t\n\t\tprop28a >>> map[\"prop28a\"]\n\t\tprop28b >>> map[\"prop28b\"]\n\t\tprop28c >>> map[\"prop28c\"]\n\t\t\n\t\tprop29a >>> map[\"prop29a\"]\n\t\tprop29b >>> map[\"prop29b\"]\n\t\tprop29c >>> map[\"prop29c\"]\n\t\t\n\t\tprop30a >>> map[\"prop30a\"]\n\t\tprop30b >>> map[\"prop30b\"]\n\t\tprop30c >>> map[\"prop30c\"]\n\t\t\n\t\tprop31a >>> map[\"prop31a\"]\n\t\tprop31b >>> map[\"prop31b\"]\n\t\tprop31c >>> map[\"prop31c\"]\n\n\t\tprop32 >>> (map[\"prop32\"], stringTransform)\n\t\tprop33 >>> (map[\"prop33\"], stringTransform)\n\t\tprop34 >>> (map[\"prop34\"], stringTransform)\n\t\t\n\t\tprop35 >>> map[\"prop35\"]\n\t\tprop36 >>> map[\"prop36\"]\n\t\tprop37 >>> map[\"prop37\"]\n\t\t\n\t\tnonnestedString >>> map[\"non.nested->key\", nested: false]\n\t\t\n\t\tnestedInt >>> map[\"nested.int\"]\n\t\tnestedString >>> map[\"nested.string\"]\n\t\tnestedArray >>> map[\"nested.array\"]\n\t\tnestedDictionary >>> map[\"nested.dictionary\"]\n\t\t\n\t\tdelimiterNestedInt >>> map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.int\", delimiter: \"->\"]\n\t\tdelimiterNestedString >>> map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.string\", delimiter: \"->\"]\n\t\tdelimiterNestedArray >>> map[\"com.tristanhimmelman.ObjectMapper.nested->array\", delimiter: \"->\"]\n\t\tdelimiterNestedDictionary >>> map[\"com.tristanhimmelman.ObjectMapper.nested->dictionary\", delimiter: \"->\"]\n\t}\n}\n\nlet stringTransform = TransformOf<String, String>(\n\tfromJSON: { (str: String?) -> String? in\n\t\tguard let str = str else {\n\t\t\treturn nil\n\t\t}\n\t\treturn \"\\(str)_TRANSFORMED\"\n\t},\n\ttoJSON: { (str: String?) -> String? in\n\t\treturn str?.replacingOccurrences(of: \"_TRANSFORMED\", with: \"\")\n\t}\n)\n\nprivate func assertImmutableObjectsEqual(_ lhs: Struct, _ rhs: Struct) {\n\tXCTAssertEqual(lhs.prop1, rhs.prop1)\n\tXCTAssertEqual(lhs.prop2, rhs.prop2)\n\tXCTAssertEqual(lhs.prop3, rhs.prop3)\n\tXCTAssertEqual(lhs.prop4, rhs.prop4)\n\tXCTAssertEqual(lhs.prop5, rhs.prop5)\n\tXCTAssertEqual(lhs.prop6, rhs.prop6)\n\tXCTAssertEqual(lhs.prop7, rhs.prop7)\n\tXCTAssertEqual(lhs.prop8, rhs.prop8)\n\tXCTAssertEqual(lhs.prop23, rhs.prop23)\n\t\n\t// @hack: compare arrays and objects with their string representation.\n\tXCTAssertEqual(\"\\(lhs.prop9 as Optional)\", \"\\(rhs.prop9 as Optional)\")\n\tXCTAssertEqual(\"\\(String(describing: lhs.prop10))\", \"\\(String(describing: rhs.prop10))\")\n\tXCTAssertEqual(\"\\(lhs.prop11)\", \"\\(rhs.prop11)\")\n\tXCTAssertEqual(\"\\(lhs.prop12 as Optional)\", \"\\(rhs.prop12 as Optional)\")\n\tXCTAssertEqual(\"\\(String(describing: lhs.prop13))\", \"\\(String(describing: rhs.prop13))\")\n\tXCTAssertEqual(\"\\(lhs.prop14)\", \"\\(rhs.prop14)\")\n\tXCTAssertEqual(\"\\(lhs.prop15 as Optional)\", \"\\(rhs.prop15 as Optional)\")\n\tXCTAssertEqual(\"\\(String(describing: lhs.prop16))\", \"\\(String(describing: rhs.prop16))\")\n\tXCTAssertEqual(\"\\(lhs.prop17)\", \"\\(rhs.prop17)\")\n\tXCTAssertEqual(\"\\(lhs.prop18 as Optional)\", \"\\(rhs.prop18 as Optional)\")\n\tXCTAssertEqual(\"\\(String(describing: lhs.prop19))\", \"\\(String(describing: rhs.prop19))\")\n\tXCTAssertEqual(\"\\(lhs.prop20)\", \"\\(rhs.prop20)\")\n\tXCTAssertEqual(\"\\(lhs.prop21 as Optional)\", \"\\(rhs.prop21 as Optional)\")\n\tXCTAssertEqual(\"\\(String(describing: lhs.prop22))\", \"\\(String(describing: rhs.prop22))\")\n\tXCTAssertEqual(\"\\(lhs.prop32)\", \"\\(rhs.prop32)\")\n\tXCTAssertEqual(\"\\(lhs.prop33 as Optional)\", \"\\(rhs.prop33 as Optional)\")\n\tXCTAssertEqual(\"\\(String(describing: lhs.prop34))\", \"\\(String(describing: rhs.prop34))\")\n\tXCTAssertEqual(\"\\(lhs.prop35)\", \"\\(rhs.prop35)\")\n\tXCTAssertEqual(\"\\(lhs.prop36 as Optional)\", \"\\(rhs.prop36 as Optional)\")\n\tXCTAssertEqual(\"\\(String(describing: lhs.prop37))\", \"\\(String(describing: rhs.prop37))\")\n}\n\n"
  },
  {
    "path": "Tests/ObjectMapperTests/MapContextTests.swift",
    "content": "//\n//  MapContextTests.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2016-05-10.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport XCTest\nimport ObjectMapper\n\nclass MapContextTests: XCTestCase {\n    \n    override func setUp() {\n        super.setUp()\n        // Put setup code here. This method is called before the invocation of each test method in the class.\n    }\n    \n    override func tearDown() {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n        super.tearDown()\n    }\n    \n\t// MARK: - BaseMappable\n\t// MARK: Single\n\tfunc testMappingWithContext() {\n\t\tlet JSON = [\"name\": \"Tristan\"]\n\t\tlet context = Context(shouldMap: true)\n\t\t\n\t\tlet person = Mapper<Person>(context: context).map(JSON: JSON)\n\t\t\n\t\tXCTAssertNotNil(person)\n\t\tXCTAssertNotNil(person?.name)\n\t}\n\t\n\tfunc testMappingWithContextViaMappableExtension() {\n\t\tlet JSON = [\"name\": \"Tristan\"]\n\t\tlet context = Context(shouldMap: true)\n\t\t\n\t\tlet person = Person(JSON: JSON, context: context)\n\t\t\n\t\tXCTAssertNotNil(person)\n\t\tXCTAssertNotNil(person?.name)\n\t}\n\t\n\tfunc testMappingWithoutContext() {\n\t\tlet JSON = [\"name\": \"Tristan\"]\n\t\t\n\t\tlet person = Mapper<Person>().map(JSON: JSON)\n\t\t\n\t\tXCTAssertNotNil(person)\n\t\tXCTAssertNil(person?.name)\n\t}\n\t\n\t// MARK: Nested\n\tfunc testNestedMappingWithContext() {\n\t\tlet JSON = [\"person\": [\"name\": \"Tristan\"]]\n\t\tlet context = Context(shouldMap: true)\n\t\t\n\t\tlet nestedPerson = Mapper<NestedPerson>(context: context).map(JSON: JSON)\n\t\t\n\t\tXCTAssertNotNil(nestedPerson)\n\t\tXCTAssertNotNil(nestedPerson?.person?.name)\n\t}\n\t\n\tfunc testNestedMappingWithContextViaMappableExtension() {\n\t\tlet JSON = [\"person\": [\"name\": \"Tristan\"]]\n\t\tlet context = Context(shouldMap: true)\n\t\t\n\t\tlet nestedPerson = NestedPerson(JSON: JSON, context: context)\n\t\t\n\t\tXCTAssertNotNil(nestedPerson)\n\t\tXCTAssertNotNil(nestedPerson?.person?.name)\n\t}\n\n\tfunc testNestedMappingWithoutContext() {\n\t\tlet JSON = [\"person\": [\"name\": \"Tristan\"]]\n\t\t\n\t\tlet nestedPerson = Mapper<NestedPerson>().map(JSON: JSON)\n\t\t\n\t\tXCTAssertNotNil(nestedPerson)\n\t\tXCTAssertNil(nestedPerson?.person?.name)\n\t}\n\t\n\t// MARK: Array\n\tfunc testArrayMappingWithContext() {\n\t\tlet JSON = [\"persons\": [[\"name\": \"Tristan\"], [\"name\": \"Anton\"]]]\n\t\tlet context = Context(shouldMap: true)\n\t\t\n\t\tlet person = Mapper<PersonList>(context: context).map(JSON: JSON)\n\t\t\n\t\tXCTAssertNotNil(person)\n\t\tXCTAssertNotNil(person?.persons)\n\t}\n\t\n\tfunc testArrayMappingWithContextViaMappableExtension() {\n\t\tlet JSON = [\"persons\": [[\"name\": \"Tristan\"], [\"name\": \"Anton\"]]]\n\t\tlet context = Context(shouldMap: true)\n\t\t\n\t\tlet person = PersonList(JSON: JSON, context: context)\n\t\t\n\t\tXCTAssertNotNil(person)\n\t\tXCTAssertNotNil(person?.persons)\n\t}\n\t\n\tfunc testArrayMappingWithoutContext() {\n\t\tlet JSON = [\"persons\": [[\"name\": \"Tristan\"], [\"name\": \"Anton\"]]]\n\t\t\n\t\tlet person = Mapper<PersonList>().map(JSON: JSON)\n\t\t\n\t\tXCTAssertNotNil(person)\n\t\tXCTAssertNil(person?.persons)\n\t}\n\t\n\t// MARK: ImmutableMappable\n\t// MARK: Single\n\tfunc testImmutableMappingWithContext() {\n\t\tlet JSON = [\"name\": \"Anton\"]\n\t\tlet context = ImmutableContext(isDeveloper: true)\n\t\t\n\t\tlet person = try? Mapper<ImmutablePerson>(context: context).map(JSON: JSON)\n\t\t\n\t\tXCTAssertNotNil(person)\n\t\t\n\t\tXCTAssertEqual(person?.isDeveloper ?? !context.isDeveloper, context.isDeveloper)\n\t}\n\t\n\tfunc testImmutableMappingWithContextViaMappableExtension() {\n\t\tlet JSON = [\"name\": \"Anton\"]\n\t\tlet context = ImmutableContext(isDeveloper: true)\n\t\t\n\t\tlet person = try? ImmutablePerson(JSON: JSON, context: context)\n\t\t\n\t\tXCTAssertNotNil(person)\n\t\tXCTAssertEqual(person?.isDeveloper ?? !context.isDeveloper, context.isDeveloper)\n\t}\n\t\n\tfunc testImmutableMappingWithoutContext() {\n\t\tlet JSON = [\"name\": \"Anton\"]\n\t\t\n\t\tdo {\n\t\t\tlet _ = try Mapper<ImmutablePerson>().map(JSON: JSON)\n\t\t} catch ImmutablePersonMappingError.contextAbsense {\n\t\t\t// Empty\n\t\t} catch {\n\t\t\tXCTFail()\n\t\t}\n\t}\n\t\n\t// MARK: Nested\n\tfunc testNestedImmutableMappingWithContext() {\n\t\tlet JSON = [\"person\": [\"name\": \"Anton\"]]\n\t\tlet context = ImmutableContext(isDeveloper: true)\n\t\t\n\t\tlet nestedPerson = try? Mapper<ImmutableNestedPerson>(context: context).map(JSON: JSON)\n\t\t\n\t\tXCTAssertNotNil(nestedPerson)\n\t\tXCTAssertEqual(nestedPerson?.person.isDeveloper ?? !context.isDeveloper, context.isDeveloper)\n\t}\n\t\n\tfunc testNestedImmutableMappingWithContextViaMappableExtension() {\n\t\tlet JSON = [\"person\": [\"name\": \"Anton\"]]\n\t\tlet context = ImmutableContext(isDeveloper: true)\n\t\t\n\t\tlet nestedPerson = try? ImmutableNestedPerson(JSON: JSON, context: context)\n\t\t\n\t\tXCTAssertNotNil(nestedPerson)\n\t\tXCTAssertEqual(nestedPerson?.person.isDeveloper ?? !context.isDeveloper, context.isDeveloper)\n\t}\n\t\n\tfunc testNestedImmutableMappingWithoutContext() {\n\t\tlet JSON = [\"person\": [\"name\": \"Anton\"]]\n\t\t\n\t\tdo {\n\t\t\tlet _ = try Mapper<ImmutableNestedPerson>().map(JSON: JSON)\n\t\t} catch ImmutablePersonMappingError.contextAbsense {\n\t\t\treturn\n\t\t} catch {\n\t\t\tXCTFail()\n\t\t}\n\t\t\n\t\tXCTFail()\n\t}\n\t\n\t// MARK: Array\n\tfunc testArrayImmutableMappingWithContext() {\n\t\tlet JSON = [\"persons\": [[\"name\": \"Tristan\"], [\"name\": \"Anton\"]]]\n\t\tlet context = ImmutableContext(isDeveloper: true)\n\t\t\n\t\tlet personList = try? Mapper<ImmutablePersonList>(context: context).map(JSON: JSON)\n\t\t\n\t\tXCTAssertNotNil(personList)\n\t\t\n\t\tpersonList?.persons.forEach { person in\n\t\t\tXCTAssertEqual(person.isDeveloper, context.isDeveloper)\n\t\t}\n\t}\n\t\n\tfunc testArrayImmutableMappingWithContextViaMappableExtension() {\n\t\tlet JSON = [\"persons\": [[\"name\": \"Tristan\"], [\"name\": \"Anton\"]]]\n\t\tlet context = ImmutableContext(isDeveloper: true)\n\t\t\n\t\tlet personList = try? ImmutablePersonList(JSON: JSON, context: context)\n\t\t\n\t\tXCTAssertNotNil(personList)\n\t\t\n\t\tpersonList?.persons.forEach { person in\n\t\t\tXCTAssertEqual(person.isDeveloper, context.isDeveloper)\n\t\t}\n\t}\n\t\n\tfunc testArrayImmutableMappingWithoutContext() {\n\t\tlet JSON = [\"persons\": [[\"name\": \"Tristan\"], [\"name\": \"Anton\"]]]\n\t\t\n\t\tdo {\n\t\t\tlet _ = try Mapper<ImmutablePersonList>().map(JSON: JSON)\n\t\t} catch ImmutablePersonMappingError.contextAbsense {\n\t\t\treturn\n\t\t} catch {\n\t\t\tXCTFail()\n\t\t}\n\t\t\n\t\tXCTFail()\n\t}\n\n\tfunc testDefaultArgumentWithoutValue() {\n\t\tlet JSON: [String: Any] = [:]\n\t\tlet dog = try? Mapper<ImmutableDog>().map(JSON: JSON) as ImmutableDog\n\n\t\tXCTAssertNotNil(dog)\n\t\tXCTAssertTrue(dog!.name == \"Sasha\")\n\t}\n\n\tfunc testDefaultArgumentWithValue() {\n\t\tlet JSON = [\"name\": \"Sofie\"]\n\t\tlet dog = try? Mapper<ImmutableDog>().map(JSON: JSON) as ImmutableDog\n\n\t\tXCTAssertNotNil(dog)\n\t\tXCTAssertTrue(dog!.name == \"Sofie\")\n\t}\n\n\t// MARK: - Default Argument\n\tpublic struct ImmutableDog: ImmutableMappable {\n\t\tpublic let name: String\n\n\t\t/// Define `default` value to use if it is nothing to parse in `name`\n\t\tpublic init(map: Map) throws {\n\t\t\tname = try map.value(\"name\", default: \"Sasha\")\n\t\t}\n\t}\n\t\n\t// MARK: - Nested Types\n\t// MARK: BaseMappable\n\tstruct Context: MapContext {\n\t\tvar shouldMap = false\n\t\t\n\t\tinit(shouldMap: Bool){\n\t\t\tself.shouldMap = shouldMap\n\t\t}\n\t}\n\t\n\tclass Person: Mappable {\n\t\tvar name: String?\n\t\t\n\t\trequired init?(map: Map){\n\t\t\t\n\t\t}\n\t\t\n\t\tfunc mapping(map: Map) {\n\t\t\tif (map.context as? Context)?.shouldMap == true {\n\t\t\t\tname <- map[\"name\"]\n\t\t\t}\n\t\t}\n\t}\n\t\n\tclass NestedPerson: Mappable {\n\t\tvar person: Person?\n\t\t\n\t\trequired init?(map: Map){\n\t\t\t\n\t\t}\n\t\t\n\t\tfunc mapping(map: Map) {\n\t\t\tif (map.context as? Context)?.shouldMap == true {\n\t\t\t\tperson <- map[\"person\"]\n\t\t\t}\n\t\t}\n\t}\n\t\n\tclass PersonList: Mappable {\n\t\tvar persons: [Person]?\n\t\t\n\t\trequired init?(map: Map){\n\t\t\t\n\t\t}\n\t\t\n\t\tfunc mapping(map: Map) {\n\t\t\tif (map.context as? Context)?.shouldMap == true {\n\t\t\t\tpersons <- map[\"persons\"]\n\t\t\t}\n\t\t}\n\t}\n\t\n\t// MARK: ImmutableMappable\n\tstruct ImmutableContext: MapContext {\n\t\tlet isDeveloper: Bool\n\t}\n\t\n\tenum ImmutablePersonMappingError: Error {\n\t\tcase contextAbsense\n\t}\n\t\n\tstruct ImmutablePerson: ImmutableMappable {\n\t\tlet name: String\n\t\tlet isDeveloper: Bool\n\t\t\n\t\tinit(map: Map) throws {\n\t\t\tguard let context = map.context as? ImmutableContext else {\n\t\t\t\tthrow ImmutablePersonMappingError.contextAbsense\n\t\t\t}\n\t\t\t\n\t\t\tname = try map.value(\"name\")\n\t\t\tisDeveloper = context.isDeveloper\n\t\t}\n\t}\n\t\n\tstruct ImmutableNestedPerson: ImmutableMappable {\n\t\tlet person: ImmutablePerson\n\t\t\n\t\tinit(map: Map) throws {\n\t\t\tperson = try map.value(\"person\")\n\t\t}\n\t}\n\t\n\tstruct ImmutablePersonList: ImmutableMappable {\n\t\tlet persons: [ImmutablePerson]\n\t\t\n\t\tinit(map: Map) throws {\n\t\t\tpersons = try map.value(\"persons\")\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Tests/ObjectMapperTests/MappableExtensionsTests.swift",
    "content": "//\n//  MappableExtensionsTests.swift\n//  ObjectMapper\n//\n//  Created by Scott Hoyt on 10/25/15.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\nimport XCTest\nimport ObjectMapper\n\nstruct TestMappable: Mappable, Equatable, Hashable {\n\tstatic let valueForString = \"This string should work\"\n\tstatic let workingJSONString = \"{ \\\"value\\\" : \\\"\\(valueForString)\\\" }\"\n\tstatic let workingJSON: [String: Any] = [\"value\": valueForString]\n\tstatic let workingJSONArrayString = \"[\\(workingJSONString)]\"\n\t\n\tvar value: String?\n\t\n\tinit() {}\n\tinit?(map: Map) {\t}\n\t\n\tmutating func mapping(map: Map) {\n\t\tvalue <- map[\"value\"]\n\t}\n\t\n\tvar hashValue: Int {\n\t\tif let value = value {\n\t\t\treturn value.hashValue\n\t\t}\n\t\treturn NSIntegerMax\n\t}\n}\n\nfunc ==(lhs: TestMappable, rhs: TestMappable) -> Bool {\n\treturn lhs.value == rhs.value\n}\n\nclass MappableExtensionsTests: XCTestCase {\n\t\n\tvar testMappable: TestMappable!\n\t\n\toverride func setUp() {\n\t\tsuper.setUp()\n\t\ttestMappable = TestMappable()\n\t\ttestMappable.value = TestMappable.valueForString\n\t}\n\t\n\tfunc testInitFromString() {\n\t\tlet mapped = TestMappable(JSONString: TestMappable.workingJSONString)\n\t\t\n\t\tXCTAssertNotNil(mapped)\n\t\tXCTAssertEqual(mapped?.value, TestMappable.valueForString)\n\t}\n\t\n\tfunc testToJSONAndBack() {\n\t\tlet mapped = TestMappable(JSON: testMappable.toJSON())\n\t\tXCTAssertEqual(mapped, testMappable)\n\t}\n\t\n\tfunc testArrayFromString() {\n\t\tlet mapped = [TestMappable](JSONString: TestMappable.workingJSONArrayString)!\n\t\tXCTAssertEqual(mapped, [testMappable])\n\t}\n\t\n\tfunc testArrayToJSONAndBack() {\n\t\tlet mapped = [TestMappable](JSONArray: [testMappable].toJSON())\n\t\tXCTAssertEqual(mapped, [testMappable])\n\t}\n\t\n\tfunc testSetInitFailsWithEmptyString() {\n\t\tXCTAssertNil(Set<TestMappable>(JSONString: \"\"))\n\t}\n\t\n\tfunc testSetFromString() {\n\t\tlet mapped = Set<TestMappable>(JSONString: TestMappable.workingJSONArrayString)!\n\t\tXCTAssertEqual(mapped, Set<TestMappable>([testMappable]))\n\t}\n\t\n\tfunc testSetToJSONAndBack() {\n\t\tlet mapped = Set<TestMappable>(JSONArray: Set([testMappable]).toJSON())\n\t\tXCTAssertEqual(mapped, [testMappable])\n\t}\n}\n"
  },
  {
    "path": "Tests/ObjectMapperTests/MappableTypesWithTransformsTests.swift",
    "content": "//\n//  MappableTypesWithTransformsTests.swift\n//  ObjectMapper\n//\n//  Created by Paddy O'Brien on 2015-12-04.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport XCTest\nimport ObjectMapper\n\n\nclass MappableTypesWithTransformsTests: XCTestCase {\n\t// This is a func so that it can be collapsed\n\tfunc JSONPayload() -> [String: Any] {\n\t\treturn [\n\t\t\t\"teams\": [[\n\t\t\t\t\"api_uri\": \"/teams/8\",\n\t\t\t\t\"full_name\": \"Team Secret\",\n\t\t\t\t\"short_name\": \"Secret\",\n\t\t\t\t\"players\": [\"/players/1\", \"/players/2\", \"/players/3\", \"/players/4\", \"/players/5\"]\n\t\t\t\t], [\n\t\t\t\t\t\"api_uri\": \"/teams/43\",\n\t\t\t\t\t\"full_name\": \"Mineski\",\n\t\t\t\t\t\"short_name\": \"Mski\",\n\t\t\t\t\t\"players\": [\"/players/6\", \"/players/7\", \"/players/8\", \"/players/9\", \"/players/10\"]\n\t\t\t\t]],\n\t\t\t\"game\": [\n\t\t\t\t\"api_uri\": \"/games/2723\",\n\t\t\t\t\"game_time\": \"33:49\",\n\t\t\t\t\"players\": [\n\t\t\t\t\t[\"/players/1\", \"/players/2\", \"/players/3\", \"/players/4\", \"/players/5\"],\n\t\t\t\t\t[\"/players/6\", \"/players/7\", \"/players/8\", \"/players/9\", \"/players/10\"]\n\t\t\t\t],\n\t\t\t\t\"team1_lineup\": [\n\t\t\t\t\t\"top\": \"/players/1\",\n\t\t\t\t\t\"mid\": \"/players/2\",\n\t\t\t\t\t\"bottom\": \"/players/3\",\n\t\t\t\t\t\"support\": \"/players/4\",\n\t\t\t\t\t\"carry\": \"/players/5\"\n\t\t\t\t],\n\t\t\t\t\"team2_lineup\": [\n\t\t\t\t\t\"top\": \"/players/6\",\n\t\t\t\t\t\"mid\": \"/players/7\",\n\t\t\t\t\t\"bottom\": \"/players/8\",\n\t\t\t\t\t\"support\": \"/players/9\",\n\t\t\t\t\t\"carry\": \"/players/10\"\n\t\t\t\t],\n\t\t\t\t\"head_to_head\": [\n\t\t\t\t\t\"top\": [\"/players/1\", \"/players/6\"],\n\t\t\t\t\t\"mid\": [\"/players/2\", \"/players/7\"],\n\t\t\t\t\t\"bottom\": [\"/players/3\", \"/players/8\"],\n\t\t\t\t\t\"support\": [\"/players/4\", \"/players/9\"],\n\t\t\t\t\t\"carry\": [\"/players/5\", \"/players/10\"]\n\t\t\t\t],\n\t\t\t\t\"teams\": [\"/teams/43\", \"/teams/8\"],\n\t\t\t\t\"winning_team_url\": \"/teams/8\"\n\t\t\t]\n\t\t]\n\t}\n\t\n\t\n\t// MARK: - Non-Optional Tests\n\tfunc testParsingSingleInstanceWithTransform() {\n\t\tlet game = Mapper<Game>().map(JSONObject: JSONPayload()[\"game\"])\n\t\t\n\t\tXCTAssertNotNil(game)\n\t\tXCTAssertNotEqual(game!.winner.URI, \"FAKE\")\n\t}\n\t\n\tfunc testParsingArrayOfObjectsWithTransform() {\n\t\tlet teams = Mapper<Team>().mapArray(JSONObject: JSONPayload()[\"teams\"])\n\n\t\tXCTAssertNotNil(teams)\n\t\tXCTAssertNotEqual(teams!.count, 0)\n\t\t\n\t\tXCTAssertNotEqual(teams!.first!.players.count, 0)\n\t}\n\t\n\tfunc testParsing2DimensionalArrayOfObjectsWithTransform() {\n\t\tlet game = Mapper<Game>().map(JSONObject: JSONPayload()[\"game\"])\n\n\t\tXCTAssertNotNil(game)\n\t\tXCTAssertNotEqual(game!.players.count, 0)\n\t\tXCTAssertNotEqual(game!.players.first!.count, 0)\n\t\tXCTAssertNotEqual(game!.players.last!.count, 0)\n\t}\n\t\n\tfunc testParsingDictionaryOfObjectsWithTransform() {\n\t\tlet game = Mapper<Game>().map(JSONObject: JSONPayload()[\"game\"])\n\n\t\tXCTAssertNotNil(game)\n\t\tXCTAssertNotEqual(game!.team1Lineup.count, 0)\n\t\tXCTAssertNotEqual(game!.team2Lineup.count, 0)\n\t}\n\t\n\tfunc testParsingDictionaryOfArrayOfObjectsWithTransform() {\n\t\tlet game = Mapper<Game>().map(JSONObject: JSONPayload()[\"game\"])\n\t\t\n\t\tXCTAssertNotNil(game)\n\t\tfor (position, players) in game!.headToHead {\n\t\t\tXCTAssertNotEqual(players.count, 0, \"No players were mapped for \\(position)\")\n\t\t}\n\t}\n\t\n\tfunc testParsingSetOfObjectsWithTransform() {\n\t\tlet game = Mapper<Game>().map(JSONObject: JSONPayload()[\"game\"])\n\t\t\n\t\tXCTAssertNotNil(game)\n\t\tXCTAssertNotEqual(game!.teams.count, 0)\n\t}\n\t\n\t\n\t// MARK: - Optional Tests\n\tfunc testParsingOptionalSingleInstanceWithTransform() {\n\t\tlet game = Mapper<Game>().map(JSONObject: JSONPayload()[\"game\"])\n\t\t\n\t\tXCTAssertNotNil(game)\n\t\tXCTAssertNotNil(game!.O_winner)\n\t}\n\t\n\tfunc testParsingOptionalArrayOfObjectsWithTransform() {\n\t\tlet teams = Mapper<Team>().mapArray(JSONObject: JSONPayload()[\"teams\"])\n\t\t\n\t\tXCTAssertNotNil(teams)\n\t\tXCTAssertNotEqual(teams!.count, 0)\n\t\t\n\t\tXCTAssertNotNil(teams!.first!.O_players)\n\t\tXCTAssertNotEqual(teams!.first!.O_players!.count, 0)\n\t}\n\t\n\tfunc testParsingOptional2DimensionalArrayOfObjectsWithTransform() {\n\t\tlet game = Mapper<Game>().map(JSONObject: JSONPayload()[\"game\"])\n\t\t\n\t\tXCTAssertNotNil(game)\n\t\tXCTAssertNotNil(game!.O_players)\n\t\tXCTAssertNotEqual(game!.O_players!.count, 0)\n\t\tXCTAssertNotEqual(game!.O_players!.first!.count, 0)\n\t\tXCTAssertNotEqual(game!.O_players!.last!.count, 0)\n\t}\n\t\n\tfunc testParsingOptionalDictionaryOfObjectsWithTransform() {\n\t\tlet game = Mapper<Game>().map(JSONObject: JSONPayload()[\"game\"])\n\t\t\n\t\tXCTAssertNotNil(game)\n\t\tXCTAssertNotNil(game!.O_team1Lineup)\n\t\tXCTAssertNotEqual(game!.O_team1Lineup!.count, 0)\n\t\tXCTAssertNotNil(game!.O_team2Lineup)\n\t\tXCTAssertNotEqual(game!.O_team2Lineup!.count, 0)\n\t}\n\t\n\tfunc testParsingOptionalDictionaryOfArrayOfObjectsWithTransform() {\n\t\tlet game = Mapper<Game>().map(JSONObject: JSONPayload()[\"game\"])\n\t\t\n\t\tXCTAssertNotNil(game)\n\t\tXCTAssertNotNil(game!.O_headToHead)\n\t\tfor (position, players) in game!.O_headToHead! {\n\t\t\tXCTAssertNotEqual(players.count, 0, \"No players were mapped for \\(position)\")\n\t\t}\n\t}\n\t\n\tfunc testParsingOptionalSetOfObjectsWithTransform() {\n\t\tlet game = Mapper<Game>().map(JSONObject: JSONPayload()[\"game\"])\n\t\t\n\t\tXCTAssertNotNil(game)\n\t\tXCTAssertNotNil(game!.O_teams)\n\t\tXCTAssertNotEqual(game!.O_teams!.count, 0)\n\t}\n\n\t// MARK: - Implicitly Unwrapped Optional Tests\n\tfunc testParsingImplicitlyUnwrappedSingleInstanceWithTransform() {\n\t\tlet game = Mapper<Game>().map(JSONObject: JSONPayload()[\"game\"])\n\t\t\n\t\tXCTAssertNotNil(game)\n\t\tXCTAssertNotNil(game!.I_winner)\n\t}\n\t\n\tfunc testParsingImplicitlyUnwrappedArrayOfObjectsWithTransform() {\n\t\tlet teams = Mapper<Team>().mapArray(JSONObject: JSONPayload()[\"teams\"])\n\t\t\n\t\tXCTAssertNotNil(teams)\n\t\tXCTAssertNotEqual(teams!.count, 0)\n\t\t\n\t\tXCTAssertNotNil(teams!.first!.I_players)\n\t\tXCTAssertNotEqual(teams!.first!.I_players!.count, 0)\n\t}\n\t\n\tfunc testParsingImplicitlyUnwrapped2DimensionalArrayOfObjectsWithTransform() {\n\t\tlet game = Mapper<Game>().map(JSONObject: JSONPayload()[\"game\"])\n\t\t\n\t\tXCTAssertNotNil(game)\n\t\tXCTAssertNotNil(game!.I_players)\n\t\tXCTAssertNotEqual(game!.I_players!.count, 0)\n\t\tXCTAssertNotEqual(game!.I_players!.first!.count, 0)\n\t\tXCTAssertNotEqual(game!.I_players!.last!.count, 0)\n\t}\n\t\n\tfunc testParsingImplicitlyUnwrappedDictionaryOfObjectsWithTransform() {\n\t\tlet game = Mapper<Game>().map(JSONObject: JSONPayload()[\"game\"])\n\t\t\n\t\tXCTAssertNotNil(game)\n\t\tXCTAssertNotNil(game!.I_team1Lineup)\n\t\tXCTAssertNotEqual(game!.I_team1Lineup!.count, 0)\n\t\tXCTAssertNotNil(game!.I_team2Lineup)\n\t\tXCTAssertNotEqual(game!.I_team2Lineup!.count, 0)\n\t}\n\t\n\tfunc testParsingImplicitlyUnwrappedDictionaryOfArrayOfObjectsWithTransform() {\n\t\tlet game = Mapper<Game>().map(JSONObject: JSONPayload()[\"game\"])\n\t\t\n\t\tXCTAssertNotNil(game)\n\t\tXCTAssertNotNil(game!.I_headToHead)\n\t\tfor (position, players) in game!.I_headToHead! {\n\t\t\tXCTAssertNotEqual(players.count, 0, \"No players were mapped for \\(position)\")\n\t\t}\n\t}\n\t\n\tfunc testParsingImplicitlyUnwrappedSetOfObjectsWithTransform() {\n\t\tlet game = Mapper<Game>().map(JSONObject: JSONPayload()[\"game\"])\n\t\t\n\t\tXCTAssertNotNil(game)\n\t\tXCTAssertNotNil(game!.I_teams)\n\t\tXCTAssertNotEqual(game!.I_teams!.count, 0)\n\t}\n\n\t// MARK: - Internal classes for testing\n\tclass Game: Mappable, URIInitiable {\n\t\tvar URI: String?\n\t\tvar players: [[Player]] = [[]]\n\t\tvar team1Lineup: [String: Player] = [:]\n\t\tvar team2Lineup: [String: Player] = [:]\n\t\tvar headToHead: [String: [Player]] = [:]\n\t\tvar teams: Set<Team> = []\n\t\tvar winner: Team = Team(URI: \"FAKE\")\n\n\t\t// Optional\n\t\tvar O_players: [[Player]]?\n\t\tvar O_team1Lineup: [String: Player]?\n\t\tvar O_team2Lineup: [String: Player]?\n\t\tvar O_headToHead: [String: [Player]]?\n\t\tvar O_teams: Set<Team>?\n\t\tvar O_winner: Team?\n\t\t\n\t\t// Implicitly Unwrapped\n\t\tvar I_players: [[Player]]!\n\t\tvar I_team1Lineup: [String: Player]!\n\t\tvar I_team2Lineup: [String: Player]!\n\t\tvar I_headToHead: [String: [Player]]!\n\t\tvar I_teams: Set<Team>!\n\t\tvar I_winner: Team!\n\t\t\n\t\trequired init(URI: String) { self.URI = URI }\n\t\trequired init?(map: Map) {}\n\t\t\n\t\tfunc mapping(map: Map) {\n\t\t\tplayers\t\t<- (map[\"players\"], RelationshipTransform<Player>())\t\t// 2D Array with transform\n\t\t\tteam1Lineup\t<- (map[\"team1_lineup\"], RelationshipTransform<Player>())\t// Dictionary with transform\n\t\t\tteam2Lineup\t<- (map[\"team1_lineup\"], RelationshipTransform<Player>())\n\t\t\theadToHead\t<- (map[\"head_to_head\"], RelationshipTransform<Player>())\t// Dictionary of arrays with transform\n\t\t\tteams\t\t<- (map[\"teams\"], RelationshipTransform<Team>())\t\t\t// Set with transform\n\t\t\twinner\t\t<- (map[\"winning_team_url\"], RelationshipTransform<Team>())\t// Single instance with transform\n\n\t\t\t// Optional\n\t\t\tO_players\t\t<- (map[\"players\"], RelationshipTransform<Player>())\n\t\t\tO_team1Lineup\t<- (map[\"team1_lineup\"], RelationshipTransform<Player>())\n\t\t\tO_team2Lineup\t<- (map[\"team1_lineup\"], RelationshipTransform<Player>())\n\t\t\tO_headToHead\t<- (map[\"head_to_head\"], RelationshipTransform<Player>())\n\t\t\tO_teams\t\t\t<- (map[\"teams\"], RelationshipTransform<Team>())\n\t\t\tO_winner\t\t<- (map[\"winning_team_url\"], RelationshipTransform<Team>())\n\t\t\t\n\t\t\t// Implicitly Unwrapped\n\t\t\tI_players\t\t<- (map[\"players\"], RelationshipTransform<Player>())\n\t\t\tI_team1Lineup\t<- (map[\"team1_lineup\"], RelationshipTransform<Player>())\n\t\t\tI_team2Lineup\t<- (map[\"team1_lineup\"], RelationshipTransform<Player>())\n\t\t\tI_headToHead\t<- (map[\"head_to_head\"], RelationshipTransform<Player>())\n\t\t\tI_teams\t\t\t<- (map[\"teams\"], RelationshipTransform<Team>())\n\t\t\tI_winner\t\t<- (map[\"winning_team_url\"], RelationshipTransform<Team>())\n\t\t}\n\t}\n\t\n\tclass Team: NSObject, Mappable, URIInitiable {\n\t\tvar URI: String?\n\t\tvar players: [Player] = []\n\t\tvar O_players: [Player]?\n\t\tvar I_players: [Player]?\n\t\t\n\t\trequired init(URI: String) { self.URI = URI }\n\t\trequired init?(map: Map) {}\n\t\t\n\t\tfunc mapping(map: Map) {\n\t\t\tplayers\t\t<- (map[\"players\"], RelationshipTransform<Player>())\n\t\t\tO_players\t<- (map[\"players\"], RelationshipTransform<Player>())\n\t\t\tI_players\t<- (map[\"players\"], RelationshipTransform<Player>())\n\t\t}\n\t}\n\t\n\tclass Player: Mappable, URIInitiable {\n\t\trequired init(URI: String) {}\n\t\trequired init?(map: Map) {}\n\t\t\n\t\tfunc mapping(map: Map) {}\n\t}\n}\n\nprotocol URIInitiable {\n\tinit(URI: String)\n}\n\nclass RelationshipTransform<ObjectType>: TransformType where ObjectType: Mappable & URIInitiable {\n\ttypealias Object = ObjectType\n\ttypealias JSON = [String: AnyObject]\n\t\n\tfunc transformFromJSON(_ value: Any?) -> Object? {\n\t\tguard let URI = value as? String else { return nil }\n\t\tlet relation = ObjectType(URI: URI)\n\t\t\n\t\treturn relation\n\t}\n\t\n\tfunc transformToJSON(_ value: Object?) -> JSON? {\n\t\treturn nil\n\t}\n}\n"
  },
  {
    "path": "Tests/ObjectMapperTests/NSDecimalNumberTransformTests.swift",
    "content": "//\n//  NestedArrayTests.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 10/21/15.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport XCTest\nimport ObjectMapper\n\nclass NSDecimalNumberTransformTests: XCTestCase {\n\n    let mapper = Mapper<NSDecimalNumberType>()\n\n    func testNSDecimalNumberTransform() {\n        let int: Int = 11\n        let double: Double = 11.11\n        /* Cannot use a float literal (eg: `let decimal: Decimal = 1.66`) as this transforms the value from 1.66 to 1.6599999999999995904 */\n        let decimal = Decimal(string: \"1.66\")!\n        let intString = \"11\"\n        let doubleString = \"11.11\"\n        let decimalString = \"1.66\"\n        let JSONString = \"{\\\"double\\\" : \\(doubleString), \\\"int\\\" : \\(intString), \\\"decimal\\\" : \\(decimalString), \\\"intString\\\" : \\\"\\(intString)\\\", \\\"doubleString\\\" : \\\"\\(doubleString)\\\", \\\"decimalString\\\" : \\\"\\(decimalString)\\\"}\"\n\n        let mappedObject = mapper.map(JSONString: JSONString)\n\n        XCTAssertNotNil(mappedObject)\n        XCTAssertEqual(mappedObject?.int, NSDecimalNumber(value: int))\n        XCTAssertEqual(mappedObject?.double, NSDecimalNumber(value: double))\n        XCTAssertEqual(mappedObject?.decimal, NSDecimalNumber(decimal: decimal))\n        XCTAssertEqual(mappedObject?.intString, NSDecimalNumber(string: intString))\n        XCTAssertEqual(mappedObject?.doubleString, NSDecimalNumber(string: doubleString))\n        XCTAssertEqual(mappedObject?.decimalString, NSDecimalNumber(string: decimalString))\n        XCTAssertEqual(mappedObject?.int?.stringValue, intString)\n        XCTAssertEqual(mappedObject?.double?.stringValue, doubleString)\n        XCTAssertEqual(mappedObject?.decimal?.stringValue, decimalString)\n    }\n}\n\nclass NSDecimalNumberType: Mappable {\n\n    var int: NSDecimalNumber?\n    var double: NSDecimalNumber?\n    var decimal: NSDecimalNumber?\n    var intString: NSDecimalNumber?\n    var doubleString: NSDecimalNumber?\n    var decimalString: NSDecimalNumber?\n\n    init(){\n\n    }\n\n    required init?(map: Map){\n\n    }\n\n    func mapping(map: Map) {\n        int <- (map[\"int\"], NSDecimalNumberTransform())\n        double <- (map[\"double\"], NSDecimalNumberTransform())\n        decimal <- (map[\"decimal\"], NSDecimalNumberTransform())\n        intString <- (map[\"intString\"], NSDecimalNumberTransform())\n        doubleString <- (map[\"doubleString\"], NSDecimalNumberTransform())\n        decimalString <- (map[\"decimalString\"], NSDecimalNumberTransform())\n    }\n}\n"
  },
  {
    "path": "Tests/ObjectMapperTests/NestedArrayTests.swift",
    "content": "//\n//  NestedArrayTests.swift\n//  ObjectMapper\n//\n//  Created by Ruben Samsonyan on 10/21/15.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\nimport XCTest\nimport ObjectMapper\n\nclass NestedArrayTests: XCTestCase {\n\n    override func setUp() {\n        super.setUp()\n        // Put setup code here. This method is called before the invocation of each test method in the class.\n    }\n    \n    override func tearDown() {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n        super.tearDown()\n    }\n\t\n\tfunc testNestedArray() {\n\t\tlet JSON: [String: Any] = [ \"nested\": [ [\"value\": 123], [\"value\": 456] ] ]\n\t\t\n\t\tlet mapper = Mapper<NestedArray>()\n\t\t\n\t\tlet value: NestedArray! = mapper.map(JSON: JSON)\n\t\tXCTAssertNotNil(value)\n\t\t\n\t\tlet JSONFromValue = mapper.toJSON(value)\n\t\tlet valueFromParsedJSON: NestedArray! = mapper.map(JSON: JSONFromValue)\n\t\tXCTAssertNotNil(valueFromParsedJSON)\n\t\t\n\t\tXCTAssertEqual(value.value_0, valueFromParsedJSON.value_0)\n\t\tXCTAssertEqual(value.value_1, valueFromParsedJSON.value_1)\n\t}\n\t\n\tfunc testNestedObjectArray() {\n\t\tlet value = 456\n\t\tlet JSON: [String: Any] = [ \"nested\": [ [\"value\": 123], [\"value\": value] ] ]\n\t\t\n\t\tlet mapper = Mapper<NestedArray>()\n\t\t\n\t\tlet mappedObject: NestedArray! = mapper.map(JSON: JSON)\n\t\tXCTAssertNotNil(mappedObject)\n\t\t\n\t\tXCTAssertEqual(mappedObject.nestedObject!.value, value)\n\t\tXCTAssertEqual(mappedObject.nestedObjectValue, value)\n\t}\n}\n\nclass NestedArray: Mappable {\n\t\n\tvar value_0: Int?\n\tvar value_1: Int?\n\t\n\tvar nestedObject: NestedObject?\n\n\tvar nestedObjectValue: Int?\n\t\n\trequired init?(map: Map){\n\t\t\n\t}\n\t\n\tfunc mapping(map: Map) {\n\t\tvalue_0\t<- map[\"nested.0.value\"]\n\t\tvalue_1\t<- map[\"nested.1.value\"]\n\t\t\n\t\tnestedObject <- map[\"nested.1\"]\n\t\tnestedObjectValue <- map[\"nested.1.value\"]\n\t}\n}\n\nclass NestedObject: Mappable {\n\tvar value: Int?\n\t\n\trequired init?(map: Map){}\n\t\n\tfunc mapping(map: Map) {\n\t\tvalue\t<- map[\"value\"]\n\t}\n}\n"
  },
  {
    "path": "Tests/ObjectMapperTests/NestedKeysTests.swift",
    "content": "//\n//  NestedKeysTests.swift\n//  ObjectMapper\n//\n//  Created by Syo Ikeda on 3/10/15.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\nimport XCTest\nimport ObjectMapper\n\nclass NestedKeysTests: XCTestCase {\n\n\toverride func setUp() {\n\t\tsuper.setUp()\n\t\t// Put setup code here. This method is called before the invocation of each test method in the class.\n\t}\n\n\toverride func tearDown() {\n\t\t// Put teardown code here. This method is called after the invocation of each test method in the class.\n\t\tsuper.tearDown()\n\t}\n\n\tfunc testNestedKeys() {\n\t\tlet JSON: [String: Any] = [\n\t\t\t\"non.nested.key\": \"string\",\n\t\t\t\"nested\": [\n\t\t\t\t\"int64\": NSNumber(value: INT64_MAX),\n\t\t\t\t\"bool\": true,\n\t\t\t\t\"int\": 255,\n\t\t\t\t\"double\": 100.0 as Double,\n\t\t\t\t\"float\": 50.0 as Float,\n\t\t\t\t\"string\": \"String!\",\n\n\t\t\t\t\"nested\": [\n\t\t\t\t\t\"int64Array\": [NSNumber(value: INT64_MAX), NSNumber(value: INT64_MAX - 1), NSNumber(value: INT64_MAX - 10)],\n\t\t\t\t\t\"boolArray\": [false, true, false],\n\t\t\t\t\t\"intArray\": [1, 2, 3],\n\t\t\t\t\t\"doubleArray\": [1.0, 2.0, 3.0],\n\t\t\t\t\t\"floatArray\": [1.0 as Float, 2.0 as Float, 3.0 as Float],\n\t\t\t\t\t\"stringArray\": [\"123\", \"ABC\"],\n\n\t\t\t\t\t\"int64Dict\": [\"1\": NSNumber(value: INT64_MAX)],\n\t\t\t\t\t\"boolDict\": [\"2\": true],\n\t\t\t\t\t\"intDict\": [\"3\": 999],\n\t\t\t\t\t\"doubleDict\": [\"4\": 999.999],\n\t\t\t\t\t\"floatDict\": [\"5\": 123.456 as Float],\n\t\t\t\t\t\"stringDict\": [\"6\": \"InDict\"],\n\n\t\t\t\t\t\"int64Enum\": 1000,\n\t\t\t\t\t\"intEnum\": 255,\n\t\t\t\t\t\"doubleEnum\": 100.0,\n\t\t\t\t\t\"floatEnum\": 100.0,\n\t\t\t\t\t\"stringEnum\": \"String B\",\n\n\t\t\t\t\t\"nested\": [\n\t\t\t\t\t\t\"object\": [\"value\": 987],\n\t\t\t\t\t\t\"objectArray\": [ [\"value\": 123], [\"value\": 456] ],\n\t\t\t\t\t\t\"objectDict\": [\"key\": [\"value\": 999]]\n\t\t\t\t\t]\n\t\t\t\t]\n\t\t\t]\n\t\t]\n\n\t\tlet mapper = Mapper<NestedKeys>()\n\n\t\tlet value: NestedKeys! = mapper.map(JSONObject: JSON)\n\t\tXCTAssertNotNil(value)\n\t\t\n\t\tlet JSONFromValue = mapper.toJSON(value)\n\t\tlet valueFromParsedJSON: NestedKeys! = mapper.map(JSON: JSONFromValue)\n\t\tXCTAssertNotNil(valueFromParsedJSON)\n\n\t\tXCTAssertEqual(value.nonNestedString, valueFromParsedJSON.nonNestedString)\n\t\t\n\t\tXCTAssertEqual(value.int64, valueFromParsedJSON.int64)\n\t\tXCTAssertEqual(value.bool, valueFromParsedJSON.bool)\n\t\tXCTAssertEqual(value.int, valueFromParsedJSON.int)\n\t\tXCTAssertEqual(value.double, valueFromParsedJSON.double)\n\t\tXCTAssertEqual(value.float, valueFromParsedJSON.float)\n\t\tXCTAssertEqual(value.string, valueFromParsedJSON.string)\n\n\t\tXCTAssertEqual(value.int64Array, valueFromParsedJSON.int64Array)\n\t\tXCTAssertEqual(value.boolArray, valueFromParsedJSON.boolArray)\n\t\tXCTAssertEqual(value.intArray, valueFromParsedJSON.intArray)\n\t\tXCTAssertEqual(value.doubleArray, valueFromParsedJSON.doubleArray)\n\t\tXCTAssertEqual(value.floatArray, valueFromParsedJSON.floatArray)\n\t\tXCTAssertEqual(value.stringArray, valueFromParsedJSON.stringArray)\n\n\t\tXCTAssertEqual(value.int64Dict, valueFromParsedJSON.int64Dict)\n\t\tXCTAssertEqual(value.boolDict, valueFromParsedJSON.boolDict)\n\t\tXCTAssertEqual(value.intDict, valueFromParsedJSON.intDict)\n\t\tXCTAssertEqual(value.doubleDict, valueFromParsedJSON.doubleDict)\n\t\tXCTAssertEqual(value.floatDict, valueFromParsedJSON.floatDict)\n\t\tXCTAssertEqual(value.stringDict, valueFromParsedJSON.stringDict)\n\n\t\tXCTAssertEqual(value.int64Enum, valueFromParsedJSON.int64Enum)\n\t\tXCTAssertEqual(value.intEnum, valueFromParsedJSON.intEnum)\n\t\tXCTAssertEqual(value.doubleEnum, valueFromParsedJSON.doubleEnum)\n\t\tXCTAssertEqual(value.floatEnum, valueFromParsedJSON.floatEnum)\n\t\tXCTAssertEqual(value.stringEnum, valueFromParsedJSON.stringEnum)\n\n\t\tXCTAssertEqual(value.object, valueFromParsedJSON.object)\n\t\tXCTAssertEqual(value.objectArray, valueFromParsedJSON.objectArray)\n\t\tXCTAssertEqual(value.objectDict, valueFromParsedJSON.objectDict)\n\t}\n\n\tfunc testNestedKeysWithDelimiter() {\n\t\tlet JSON: [String: Any] = [\n\t\t\t\"non.nested->key\": \"string\",\n\t\t\t\"com.tristanhimmelman.ObjectMapper.nested\": [\n\t\t\t\t\"com.tristanhimmelman.ObjectMapper.int64\": NSNumber(value: INT64_MAX),\n\t\t\t\t\"com.tristanhimmelman.ObjectMapper.bool\": true,\n\t\t\t\t\"com.tristanhimmelman.ObjectMapper.int\": 255,\n\t\t\t\t\"com.tristanhimmelman.ObjectMapper.double\": 100.0 as Double,\n\t\t\t\t\"com.tristanhimmelman.ObjectMapper.float\": 50.0 as Float,\n\t\t\t\t\"com.tristanhimmelman.ObjectMapper.string\": \"String!\",\n\n\t\t\t\t\"com.tristanhimmelman.ObjectMapper.nested\": [\n\t\t\t\t\t\"int64Array\": [NSNumber(value: INT64_MAX), NSNumber(value: INT64_MAX - 1), NSNumber(value: INT64_MAX - 10)],\n\t\t\t\t\t\"boolArray\": [false, true, false],\n\t\t\t\t\t\"intArray\": [1, 2, 3],\n\t\t\t\t\t\"doubleArray\": [1.0, 2.0, 3.0],\n\t\t\t\t\t\"floatArray\": [1.0 as Float, 2.0 as Float, 3.0 as Float],\n\t\t\t\t\t\"stringArray\": [\"123\", \"ABC\"],\n\n\t\t\t\t\t\"int64Dict\": [\"1\": NSNumber(value: INT64_MAX)],\n\t\t\t\t\t\"boolDict\": [\"2\": true],\n\t\t\t\t\t\"intDict\": [\"3\": 999],\n\t\t\t\t\t\"doubleDict\": [\"4\": 999.999],\n\t\t\t\t\t\"floatDict\": [\"5\": 123.456 as Float],\n\t\t\t\t\t\"stringDict\": [\"6\": \"InDict\"],\n\n\t\t\t\t\t\"int64Enum\": 1000,\n\t\t\t\t\t\"intEnum\": 255,\n\t\t\t\t\t\"doubleEnum\": 100.0,\n\t\t\t\t\t\"floatEnum\": 100.0,\n\t\t\t\t\t\"stringEnum\": \"String B\",\n\n\t\t\t\t\t\"com.tristanhimmelman.ObjectMapper.nested\": [\n\t\t\t\t\t\t\"object\": [\"value\": 987],\n\t\t\t\t\t\t\"objectArray\": [ [\"value\": 123], [\"value\": 456] ],\n\t\t\t\t\t\t\"objectDict\": [\"key\": [\"value\": 999]]\n\t\t\t\t\t]\n\t\t\t\t]\n\t\t\t]\n\t\t]\n\n\t\tlet mapper = Mapper<DelimiterNestedKeys>()\n\n\t\tlet value: DelimiterNestedKeys! = mapper.map(JSONObject: JSON)\n\t\tXCTAssertNotNil(value)\n\n\t\tXCTAssertEqual(value.nonNestedString, \"string\")\n\t\t\n\t\tXCTAssertEqual(value.int64, NSNumber(value: INT64_MAX))\n\t\tXCTAssertEqual(value.bool, true)\n\t\tXCTAssertEqual(value.int, 255)\n\t\tXCTAssertEqual(value.double, 100.0 as Double)\n\t\tXCTAssertEqual(value.float, 50.0 as Float)\n\t\tXCTAssertEqual(value.string, \"String!\")\n\n\t\tlet int64Array = [NSNumber(value: INT64_MAX), NSNumber(value: INT64_MAX - 1), NSNumber(value: INT64_MAX - 10)]\n\t\tXCTAssertEqual(value.int64Array, int64Array)\n\t\tXCTAssertEqual(value.boolArray, [false, true, false])\n\t\tXCTAssertEqual(value.intArray, [1, 2, 3])\n\t\tXCTAssertEqual(value.doubleArray, [1.0, 2.0, 3.0])\n\t\tXCTAssertEqual(value.floatArray, [1.0 as Float, 2.0 as Float, 3.0 as Float])\n\t\tXCTAssertEqual(value.stringArray, [\"123\", \"ABC\"])\n\n\t\tXCTAssertEqual(value.int64Dict, [\"1\": NSNumber(value: INT64_MAX)])\n\t\tXCTAssertEqual(value.boolDict, [\"2\": true])\n\t\tXCTAssertEqual(value.intDict, [\"3\": 999])\n\t\tXCTAssertEqual(value.doubleDict, [\"4\": 999.999])\n\t\tXCTAssertEqual(value.floatDict, [\"5\": 123.456 as Float])\n\t\tXCTAssertEqual(value.stringDict, [\"6\": \"InDict\"])\n\n\t\tXCTAssertEqual(value.int64Enum, Int64Enum.b)\n\t\tXCTAssertEqual(value.intEnum, IntEnum.b)\n//\t\t Skip tests due to float issue - #591\n//\t\tXCTAssertEqual(value.doubleEnum, DoubleEnum.b)\n//\t\tXCTAssertEqual(value.floatEnum, FloatEnum.b)\n\t\tXCTAssertEqual(value.stringEnum, StringEnum.B)\n\n\t\tXCTAssertEqual(value.object?.value, 987)\n\t\tXCTAssertEqual(value.objectArray.map { $0.value }, [123, 456])\n\t\tXCTAssertEqual(value.objectDict[\"key\"]?.value, 999)\n\t\t\n\t\tlet JSONFromValue = mapper.toJSON(value)\n\t\tlet valueFromParsedJSON: DelimiterNestedKeys! = mapper.map(JSON: JSONFromValue)\n\t\tXCTAssertNotNil(valueFromParsedJSON)\n\n\t\tXCTAssertEqual(value.nonNestedString, valueFromParsedJSON.nonNestedString)\n\t\t\n\t\tXCTAssertEqual(value.int64, valueFromParsedJSON.int64)\n\t\tXCTAssertEqual(value.bool, valueFromParsedJSON.bool)\n\t\tXCTAssertEqual(value.int, valueFromParsedJSON.int)\n\t\tXCTAssertEqual(value.double, valueFromParsedJSON.double)\n\t\tXCTAssertEqual(value.float, valueFromParsedJSON.float)\n\t\tXCTAssertEqual(value.string, valueFromParsedJSON.string)\n\n\t\tXCTAssertEqual(value.int64Array, valueFromParsedJSON.int64Array)\n\t\tXCTAssertEqual(value.boolArray, valueFromParsedJSON.boolArray)\n\t\tXCTAssertEqual(value.intArray, valueFromParsedJSON.intArray)\n\t\tXCTAssertEqual(value.doubleArray, valueFromParsedJSON.doubleArray)\n\t\tXCTAssertEqual(value.floatArray, valueFromParsedJSON.floatArray)\n\t\tXCTAssertEqual(value.stringArray, valueFromParsedJSON.stringArray)\n\n\t\tXCTAssertEqual(value.int64Dict, valueFromParsedJSON.int64Dict)\n\t\tXCTAssertEqual(value.boolDict, valueFromParsedJSON.boolDict)\n\t\tXCTAssertEqual(value.intDict, valueFromParsedJSON.intDict)\n\t\tXCTAssertEqual(value.doubleDict, valueFromParsedJSON.doubleDict)\n\t\tXCTAssertEqual(value.floatDict, valueFromParsedJSON.floatDict)\n\t\tXCTAssertEqual(value.stringDict, valueFromParsedJSON.stringDict)\n\n\t\tXCTAssertEqual(value.int64Enum, valueFromParsedJSON.int64Enum)\n\t\tXCTAssertEqual(value.intEnum, valueFromParsedJSON.intEnum)\n\t\tXCTAssertEqual(value.doubleEnum, valueFromParsedJSON.doubleEnum)\n\t\tXCTAssertEqual(value.floatEnum, valueFromParsedJSON.floatEnum)\n\t\tXCTAssertEqual(value.stringEnum, valueFromParsedJSON.stringEnum)\n\n\t\tXCTAssertEqual(value.object, valueFromParsedJSON.object)\n\t\tXCTAssertEqual(value.objectArray, valueFromParsedJSON.objectArray)\n\t\tXCTAssertEqual(value.objectDict, valueFromParsedJSON.objectDict)\n\t}\n\n}\n\nclass NestedKeys: Mappable {\n\t\n\tvar nonNestedString: String?\n\t\n\tvar int64: NSNumber?\n\tvar bool: Bool?\n\tvar int: Int?\n\tvar double: Double?\n\tvar float: Float?\n\tvar string: String?\n\n\tvar int64Array: [NSNumber] = []\n\tvar boolArray: [Bool] = []\n\tvar intArray: [Int] = []\n\tvar doubleArray: [Double] = []\n\tvar floatArray: [Float] = []\n\tvar stringArray: [String] = []\n\n\tvar int64Dict: [String: NSNumber] = [:]\n\tvar boolDict: [String: Bool] = [:]\n\tvar intDict: [String: Int] = [:]\n\tvar doubleDict: [String: Double] = [:]\n\tvar floatDict: [String: Float] = [:]\n\tvar stringDict: [String: String] = [:]\n\n\tvar int64Enum: Int64Enum?\n\tvar intEnum: IntEnum?\n\tvar doubleEnum: DoubleEnum?\n\tvar floatEnum: FloatEnum?\n\tvar stringEnum: StringEnum?\n\n\tvar object: Object?\n\tvar objectArray: [Object] = []\n\tvar objectDict: [String: Object] = [:]\n\n\trequired init?(map: Map){\n\t\t\n\t}\n\n\tfunc mapping(map: Map) {\n\t\tnonNestedString <- map[\"non.nested.key\", nested: false]\n\t\t\n\t\tint64\t<- map[\"nested.int64\"]\n\t\tbool\t<- map[\"nested.bool\"]\n\t\tint\t\t<- map[\"nested.int\"]\n\t\tdouble\t<- map[\"nested.double\"]\n\t\tfloat\t<- map[\"nested.float\"]\n\t\tstring\t<- map[\"nested.string\"]\n\n\t\tint64Array\t<- map[\"nested.nested.int64Array\"]\n\t\tboolArray\t<- map[\"nested.nested.boolArray\"]\n\t\tintArray\t<- map[\"nested.nested.intArray\"]\n\t\tdoubleArray\t<- map[\"nested.nested.doubleArray\"]\n\t\tfloatArray\t<- map[\"nested.nested.floatArray\"]\n\t\tstringArray\t<- map[\"nested.nested.stringArray\"]\n\n\t\tint64Dict\t<- map[\"nested.nested.int64Dict\"]\n\t\tboolDict\t<- map[\"nested.nested.boolDict\"]\n\t\tintDict\t\t<- map[\"nested.nested.intDict\"]\n\t\tdoubleDict\t<- map[\"nested.nested.doubleDict\"]\n\t\tfloatDict\t<- map[\"nested.nested.floatDict\"]\n\t\tstringDict\t<- map[\"nested.nested.stringDict\"]\n\n\t\tint64Enum\t<- map[\"nested.nested.int64Enum\"]\n\t\tintEnum\t\t<- map[\"nested.nested.intEnum\"]\n\t\tdoubleEnum\t<- map[\"nested.nested.doubleEnum\"]\n\t\tfloatEnum\t<- map[\"nested.nested.floatEnum\"]\n\t\tstringEnum\t<- map[\"nested.nested.stringEnum\"]\n\n\t\tobject\t\t<- map[\"nested.nested.nested.object\"]\n\t\tobjectArray\t<- map[\"nested.nested.nested.objectArray\"]\n\t\tobjectDict\t<- map[\"nested.nested.nested.objectDict\"]\n\t}\n}\n\nclass DelimiterNestedKeys: NestedKeys {\n\toverride func mapping(map: Map) {\n\t\tnonNestedString <- map[\"non.nested->key\", nested: false, delimiter: \"->\"]\n\n\t\tint64   <- map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.int64\", delimiter: \"->\"]\n\t\tbool    <- map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.bool\", delimiter: \"->\"]\n\t\tint     <- map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.int\", delimiter: \"->\"]\n\t\tdouble  <- map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.double\", delimiter: \"->\"]\n\t\tfloat   <- map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.float\", delimiter: \"->\"]\n\t\tstring  <- map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.string\", delimiter: \"->\"]\n\n\t\tint64Array  <- map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.nested->int64Array\", delimiter: \"->\"]\n\t\tboolArray   <- map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.nested->boolArray\", delimiter: \"->\"]\n\t\tintArray    <- map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.nested->intArray\", delimiter: \"->\"]\n\t\tdoubleArray <- map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.nested->doubleArray\", delimiter: \"->\"]\n\t\tfloatArray  <- map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.nested->floatArray\", delimiter: \"->\"]\n\t\tstringArray <- map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.nested->stringArray\", delimiter: \"->\"]\n\n\t\tint64Dict   <- map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.nested->int64Dict\", delimiter: \"->\"]\n\t\tboolDict    <- map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.nested->boolDict\", delimiter: \"->\"]\n\t\tintDict     <- map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.nested->intDict\", delimiter: \"->\"]\n\t\tdoubleDict  <- map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.nested->doubleDict\", delimiter: \"->\"]\n\t\tfloatDict   <- map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.nested->floatDict\", delimiter: \"->\"]\n\t\tstringDict  <- map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.nested->stringDict\", delimiter: \"->\"]\n\n\t\tint64Enum   <- map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.nested->int64Enum\", delimiter: \"->\"]\n\t\tintEnum     <- map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.nested->intEnum\", delimiter: \"->\"]\n\t\tdoubleEnum  <- map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.nested->doubleEnum\", delimiter: \"->\"]\n\t\tfloatEnum   <- map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.nested->floatEnum\", delimiter: \"->\"]\n\t\tstringEnum  <- map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.nested->stringEnum\", delimiter: \"->\"]\n\n\t\tobject      <- map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.nested->object\", delimiter: \"->\"]\n\t\tobjectArray <- map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.nested->objectArray\", delimiter: \"->\"]\n\t\tobjectDict  <- map[\"com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.nested->com.tristanhimmelman.ObjectMapper.nested->objectDict\", delimiter: \"->\"]\n\t}\n}\n\nclass Object: Mappable, Equatable {\n\tvar value: Int = Int.min\n\t\n\trequired init?(map: Map){\n\t\t\n\t}\n\t\n\tfunc mapping(map: Map) {\n\t\tvalue <- map[\"value\"]\n\t}\n}\n\nfunc == (lhs: Object, rhs: Object) -> Bool {\n\treturn lhs.value == rhs.value\n}\n\nenum Int64Enum: NSNumber {\n\tcase a = 0\n\tcase b = 1000\n}\n\nenum IntEnum: Int {\n\tcase a = 0\n\tcase b = 255\n}\n\nenum DoubleEnum: Double {\n\tcase a = 0.0\n\tcase b = 100.0\n}\n\nenum FloatEnum: Float {\n\tcase a = 0.0\n\tcase b = 100.0\n}\n\nenum StringEnum: String {\n\tcase A = \"String A\"\n\tcase B = \"String B\"\n}\n"
  },
  {
    "path": "Tests/ObjectMapperTests/NullableKeysFromJSONTests.swift",
    "content": "//\n//  NullableKeysFromJSONTests.swift\n//  ObjectMapper\n//\n//  Created by Fabio Teles on 3/22/16.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan HImmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\nimport XCTest\nimport ObjectMapper\n\nclass NullableKeysFromJSONTests: XCTestCase {\n\n\tlet fullJSONString = \"{\\\"firstName\\\": \\\"John\\\", \\\"lastName\\\": \\\"Doe\\\", \\\"team\\\": \\\"Broncos\\\", \\\"age\\\": 25, \\\"address\\\": {\\\"street\\\": \\\"Nothing Ave\\\", \\\"number\\\": 101, \\\"city\\\": \\\"Los Angeles\\\"} }\"\n\tlet nullJSONString = \"{\\\"firstName\\\": \\\"John\\\", \\\"lastName\\\": null, \\\"team\\\": \\\"Broncos\\\", \\\"age\\\": null, \\\"address\\\": {\\\"street\\\": \\\"Nothing Ave\\\", \\\"number\\\": 101, \\\"city\\\": null} }\"\n\tlet absentJSONString = \"{\\\"firstName\\\": \\\"John\\\", \\\"team\\\": \\\"Broncos\\\", \\\"address\\\": {\\\"street\\\": \\\"Nothing Ave\\\", \\\"number\\\": 102} }\"\n\n\tlet mapper = Mapper<Player>()\n\n    override func setUp() {\n        super.setUp()\n\t\t// Put setup code here. This method is called before the invocation of each test method in the class.\n    }\n    \n    func testMapperNullifiesValues() {\n\t\tguard let player = mapper.map(JSONString: fullJSONString) else {\n\t\t\tXCTFail(\"Mapping failed\")\n\t\t\treturn\n\t\t}\n\n\t\tXCTAssertNotNil(player.lastName)\n\t\tXCTAssertNotNil(player.age)\n\t\tXCTAssertNotNil(player.address?.city)\n\n\t\t_ = mapper.map(JSONString: nullJSONString, toObject: player)\n\n\t\tXCTAssertNotNil(player.firstName)\n\t\tXCTAssertNil(player.lastName)\n\t\tXCTAssertNil(player.age)\n\t\tXCTAssertNil(player.address?.city)\n    }\n\n\tfunc testMapperAbsentValues() {\n\t\tguard let player = mapper.map(JSONString: fullJSONString) else {\n\t\t\tXCTFail(\"Mapping failed\")\n\t\t\treturn\n\t\t}\n\n\t\tXCTAssertNotNil(player.lastName)\n\t\tXCTAssertNotNil(player.age)\n\t\tXCTAssertNotNil(player.address?.city)\n\n\t\t_ = mapper.map(JSONString: absentJSONString, toObject: player)\n\n\t\tXCTAssertNotNil(player.firstName)\n\t\tXCTAssertNotNil(player.lastName)\n\t\tXCTAssertNotNil(player.age)\n\t\tXCTAssertNotNil(player.address?.city)\n\t\tXCTAssertEqual(player.address?.number, 102)\n\t}\n}\n\nclass Player: Mappable  {\n\tvar firstName: String?\n\tvar lastName: String?\n\tvar team: String?\n\tvar age: Int?\n\tvar address: Address?\n\n\trequired init?(map: Map){\n\t\tmapping(map: map)\n\t}\n\n\tfunc mapping(map: Map) {\n\t\tfirstName <- map[\"firstName\"]\n\t\tlastName <- map[\"lastName\"]\n\t\tteam <- map[\"team\"]\n\t\tage <- map[\"age\"]\n\t\taddress <- map[\"address\"]\n\t}\n}\n\nclass Address: Mappable {\n\tvar street: String?\n\tvar number: Int?\n\tvar city: String?\n\n\trequired init?(map: Map){\n\t\tmapping(map: map)\n\t}\n\n\tfunc mapping(map: Map) {\n\t\tstreet <- map[\"street\"]\n\t\tnumber <- map[\"number\"]\n\t\tcity <- map[\"city\"]\n\t}\n}\n"
  },
  {
    "path": "Tests/ObjectMapperTests/ObjectMapperTests.swift",
    "content": "//\n//  ObjectMapperTests.swift\n//  ObjectMapperTests\n//\n//  Created by Tristan Himmelman on 2014-10-16.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\nimport XCTest\nimport ObjectMapper\n\nclass ObjectMapperTests: XCTestCase {\n\n    let userMapper = Mapper<User>()\n    \n    override func setUp() {\n        super.setUp()\n        // Put setup code here. This method is called before the invocation of each test method in the class.\n    }\n    \n    override func tearDown() {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n        super.tearDown()\n    }\n\n    func testBasicParsing() {\n        let username = \"John Doe\"\n        let identifier = \"user8723\"\n        let photoCount = 13\n        let age = 1227\n        let weight = 123.23\n        let float: Float = 123.231\n        let drinker = true\n        let smoker = false\n\t\tlet sex: Sex = .Female\n\t\tlet canDrive = true\n\t\tlet subUserJSON = \"{\\\"identifier\\\" : \\\"user8723\\\", \\\"drinker\\\" : true, \\\"age\\\": 17, \\\"username\\\" : \\\"sub user\\\", \\\"canDrive\\\": \\(canDrive) }\"\n        \n\t\tlet userJSONString = \"{\\\"username\\\":\\\"\\(username)\\\",\\\"identifier\\\":\\\"\\(identifier)\\\",\\\"photoCount\\\":\\(photoCount),\\\"age\\\":\\(age),\\\"drinker\\\":\\(drinker),\\\"smoker\\\":\\(smoker), \\\"sex\\\":\\\"\\(sex.rawValue)\\\", \\\"canDrive\\\": \\(canDrive), \\\"arr\\\":[ \\\"bla\\\", true, 42 ], \\\"dict\\\":{ \\\"key1\\\" : \\\"value1\\\", \\\"key2\\\" : false, \\\"key3\\\" : 142 }, \\\"arrOpt\\\":[ \\\"bla\\\", true, 42 ], \\\"dictOpt\\\":{ \\\"key1\\\" : \\\"value1\\\", \\\"key2\\\" : false, \\\"key3\\\" : 142 }, \\\"weight\\\": \\(weight), \\\"float\\\": \\(float), \\\"friend\\\": \\(subUserJSON), \\\"friendDictionary\\\":{ \\\"bestFriend\\\": \\(subUserJSON)}, \\\"friends\\\": [\\(subUserJSON), \\(subUserJSON)]}\"\n\n\t\tguard let user = userMapper.map(JSONString: userJSONString) else {\n\t\t\tXCTFail()\n\t\t\treturn\n\t\t}\n\t\t\n\t\tXCTAssertNotNil(user)\n\t\tXCTAssertEqual(username, user.username)\n\t\tXCTAssertEqual(identifier, user.identifier)\n\t\tXCTAssertEqual(photoCount, user.photoCount)\n\t\tXCTAssertEqual(age, user.age)\n\t\tXCTAssertEqual(weight, user.weight)\n\t\tXCTAssertEqual(float, user.float)\n\t\tXCTAssertEqual(drinker, user.drinker)\n\t\tXCTAssertEqual(smoker, user.smoker)\n\t\tXCTAssertEqual(sex, user.sex)\n\t\tXCTAssertEqual(canDrive, user.canDrive)\n\t\tXCTAssertNotNil(user.friends)\n\t\tXCTAssertEqual(user.friends?.count, 2)\n\t\tXCTAssertEqual(user.friends?[1].canDrive, canDrive)\n\n\t\t//print(Mapper().toJSONString(user, prettyPrint: true))\n    }\n\t\n\tfunc testOptionalStringParsing() {\n\t\tlet username = \"John Doe\"\n\t\tlet identifier = \"user8723\"\n\t\tlet photoCount = 13\n\t\tlet age = 1227\n\t\tlet weight = 123.23\n\t\tlet float: Float = 123.231\n\t\tlet drinker = true\n\t\tlet smoker = false\n\t\tlet sex: Sex = .Female\n\t\tlet subUserJSON = \"{\\\"identifier\\\" : \\\"user8723\\\", \\\"drinker\\\" : true, \\\"age\\\": 17, \\\"username\\\" : \\\"sub user\\\" }\"\n\t\t\n\t\tlet userJSONString = \"{\\\"username\\\":\\\"\\(username)\\\",\\\"identifier\\\":\\\"\\(identifier)\\\",\\\"photoCount\\\":\\(photoCount),\\\"age\\\":\\(age),\\\"drinker\\\":\\(drinker),\\\"smoker\\\":\\(smoker), \\\"sex\\\":\\\"\\(sex.rawValue)\\\", \\\"arr\\\":[ \\\"bla\\\", true, 42 ], \\\"dict\\\":{ \\\"key1\\\" : \\\"value1\\\", \\\"key2\\\" : false, \\\"key3\\\" : 142 }, \\\"arrOpt\\\":[ \\\"bla\\\", true, 42 ], \\\"dictOpt\\\":{ \\\"key1\\\" : \\\"value1\\\", \\\"key2\\\" : false, \\\"key3\\\" : 142 }, \\\"weight\\\": \\(weight), \\\"float\\\": \\(float), \\\"friend\\\": \\(subUserJSON), \\\"friendDictionary\\\":{ \\\"bestFriend\\\": \\(subUserJSON)}}\"\n\t\t\n\t\tlet user = userMapper.map(JSONString: userJSONString)!\n\t\t\n\t\tXCTAssertNotNil(user)\n\t\tXCTAssertEqual(username, user.username)\n\t\tXCTAssertEqual(identifier, user.identifier)\n\t\tXCTAssertEqual(photoCount, user.photoCount)\n\t\tXCTAssertEqual(age, user.age)\n\t\tXCTAssertEqual(weight, user.weight)\n\t\tXCTAssertEqual(float, user.float)\n\t\tXCTAssertEqual(drinker, user.drinker)\n\t\tXCTAssertEqual(smoker, user.smoker)\n\t\tXCTAssertEqual(sex, user.sex)\n\t}\n\n    func testInstanceParsing() {\n        let username = \"John Doe\"\n        let identifier = \"user8723\"\n        let photoCount = 13\n        let age = 1227\n        let weight = 180.51\n        let float: Float = 123.231\n        let drinker = true\n        let smoker = false\n\t\tlet sex: Sex = .Female\n        let subUserJSON = \"{\\\"identifier\\\" : \\\"user8723\\\", \\\"drinker\\\" : true, \\\"age\\\": 17, \\\"username\\\" : \\\"sub user\\\" }\"\n        \n        let userJSONString = \"{\\\"username\\\":\\\"\\(username)\\\",\\\"identifier\\\":\\\"\\(identifier)\\\",\\\"photoCount\\\":\\(photoCount),\\\"age\\\":\\(age),\\\"drinker\\\":\\(drinker),\\\"smoker\\\":\\(smoker), \\\"sex\\\":\\\"\\(sex.rawValue)\\\", \\\"arr\\\":[ \\\"bla\\\", true, 42 ], \\\"dict\\\":{ \\\"key1\\\" : \\\"value1\\\", \\\"key2\\\" : false, \\\"key3\\\" : 142 }, \\\"arrOpt\\\":[ \\\"bla\\\", true, 42 ], \\\"dictOpt\\\":{ \\\"key1\\\" : \\\"value1\\\", \\\"key2\\\" : false, \\\"key3\\\" : 142 },\\\"weight\\\": \\(weight), \\\"float\\\": \\(float), \\\"friend\\\": \\(subUserJSON), \\\"friendDictionary\\\":{ \\\"bestFriend\\\": \\(subUserJSON)}}\"\n        \n\t\tlet user = Mapper().map(JSONString: userJSONString, toObject: User())\n\n\t\tXCTAssertEqual(username, user.username)\n\t\tXCTAssertEqual(identifier, user.identifier)\n\t\tXCTAssertEqual(photoCount, user.photoCount)\n\t\tXCTAssertEqual(age, user.age)\n\t\tXCTAssertEqual(weight, user.weight)\n\t\tXCTAssertEqual(float, user.float)\n\t\tXCTAssertEqual(drinker, user.drinker)\n\t\tXCTAssertEqual(smoker, user.smoker)\n\t\tXCTAssertEqual(sex, user.sex)\n        //print(Mapper().toJSONString(user, prettyPrint: true))\n    }\n    \n    func testDictionaryParsing() {\n        let name: String = \"Genghis khan\"\n        let UUID: String = \"12345\"\n        let major: Int = 99\n        let minor: Int = 1\n        let json: [String: Any] = [\"name\": name, \"UUID\": UUID, \"major\": major]\n        \n        //test that the sematics of value types works as expected.  the resulting maped student\n        //should have the correct minor property set even thoug it's not mapped\n        var s = Student()\n        s.minor = minor\n        let student = Mapper().map(JSON: json, toObject: s)\n\n\t\tXCTAssertEqual(name, student.name)\n\t\tXCTAssertEqual(UUID, student.UUID)\n\t\tXCTAssertEqual(major, student.major)\n\t\tXCTAssertEqual(minor, student.minor)\n\n        //Test that mapping a reference type works as expected while not relying on the return value\n        let username: String = \"Barack Obama\"\n        let identifier: String = \"Political\"\n        let photoCount: Int = 1000000000\n        \n        let json2: [String: Any] = [\"username\": username, \"identifier\": identifier, \"photoCount\": photoCount]\n        let user = User()\n        _ = Mapper().map(JSON: json2, toObject: user)\n\t\t\n\t\tXCTAssertEqual(username, user.username)\n\t\tXCTAssertEqual(identifier, user.identifier)\n\t\tXCTAssertEqual(photoCount, user.photoCount)\n    }\n    \n\tfunc testNullObject() {\n\t\tlet JSONString = \"{\\\"username\\\":\\\"bob\\\"}\"\n\n\t\tlet user = userMapper.map(JSONString: JSONString)\n\t\t\n\t\tXCTAssertNotNil(user)\n\t\tXCTAssertNil(user?.age)\n\t}\n\t\n    func testToJSONAndBack(){\n        let user = User()\n        user.username = \"tristan_him\"\n        user.identifier = \"tristan_him_identifier\"\n        user.photoCount = 0\n        user.age = 28\n        user.weight = 150\n        user.drinker = true\n        user.smoker = false\n\t\t\t  user.sex = .Female\n        user.arr = [\"cheese\", 11234]\n\t\t\n        let JSONString = Mapper().toJSONString(user, prettyPrint: true)\n        //print(JSONString)\n\n\t\tlet parsedUser = userMapper.map(JSONString: JSONString!)!\n\t\t\n\t\tXCTAssertNotNil(parsedUser)\n\t\tXCTAssertEqual(user.identifier, parsedUser.identifier)\n\t\tXCTAssertEqual(user.photoCount, parsedUser.photoCount)\n\t\tXCTAssertEqual(user.age, parsedUser.age)\n\t\tXCTAssertEqual(user.weight, parsedUser.weight)\n\t\tXCTAssertEqual(user.drinker, parsedUser.drinker)\n\t\tXCTAssertEqual(user.smoker, parsedUser.smoker)\n\t\tXCTAssertEqual(user.sex, parsedUser.sex)\n    }\n\t\n\tfunc testToJSONArrayAndBack(){\n\t\tlet user = User()\n\t\tuser.username = \"tristan_him\"\n\t\tuser.identifier = \"tristan_him_identifier\"\n\t\tuser.photoCount = 0\n\t\tuser.age = 28\n\t\tuser.weight = 150\n\t\tuser.drinker = true\n\t\tuser.smoker = false\n\t\tuser.sex = .Female\n\t\tuser.arr = [\"cheese\", 11234]\n\t\tlet users = [user, user, user]\n\t\t\n\t\t//print(JSONString)\n\t\tlet JSONString = Mapper().toJSONString(users)\n\t\tlet parsedUsers = userMapper.mapArray(JSONString: JSONString!)\n\n\t\tXCTAssertNotNil(parsedUsers)\n\t\tXCTAssertTrue(parsedUsers?.count == 3)\n\t\tXCTAssertEqual(user.identifier, parsedUsers?[0].identifier)\n\t\tXCTAssertEqual(user.photoCount, parsedUsers?[0].photoCount)\n\t\tXCTAssertEqual(user.age, parsedUsers?[0].age)\n\t\tXCTAssertEqual(user.weight, parsedUsers?[0].weight)\n\t\tXCTAssertEqual(user.drinker, parsedUsers?[0].drinker)\n\t\tXCTAssertEqual(user.smoker, parsedUsers?[0].smoker)\n\t\tXCTAssertEqual(user.sex, parsedUsers?[0].sex)\n\t}\n\n    func testUnknownPropertiesIgnored() {\n        let JSONString = \"{\\\"username\\\":\\\"bob\\\",\\\"identifier\\\":\\\"bob1987\\\", \\\"foo\\\" : \\\"bar\\\", \\\"fooArr\\\" : [ 1, 2, 3], \\\"fooObj\\\" : { \\\"baz\\\" : \\\"qux\\\" } }\"\n\n\t\tlet user = userMapper.map(JSONString: JSONString)\n\n\t\tXCTAssertNotNil(user)\n    }\n    \n    func testInvalidJsonResultsInNilObject() {\n        let JSONString = \"{\\\"username\\\":\\\"bob\\\",\\\"identifier\\\":\\\"bob1987\\\"\" // missing ending brace\n\n        let user = userMapper.map(JSONString: JSONString)\n\n\t\tXCTAssertNil(user)\n    }\n\t\n\tfunc testMapArrayJSON(){\n\t\tlet name1 = \"Bob\"\n\t\tlet name2 = \"Jane\"\n\t\t\n\t\tlet JSONString = \"[{\\\"name\\\": \\\"\\(name1)\\\", \\\"UUID\\\": \\\"3C074D4B-FC8C-4CA2-82A9-6E9367BBC875\\\", \\\"major\\\": 541, \\\"minor\\\": 123},{ \\\"name\\\": \\\"\\(name2)\\\", \\\"UUID\\\": \\\"3C074D4B-FC8C-4CA2-82A9-6E9367BBC876\\\", \\\"major\\\": 54321,\\\"minor\\\": 13 }]\"\n\t\n\t\tlet students = Mapper<Student>().mapArray(JSONString: JSONString)\n\n\t\tXCTAssertTrue(students?.count ?? 0 > 0)\n\t\tXCTAssertTrue(students?.count == 2)\n\t\tXCTAssertEqual(students?[0].name, name1)\n\t\tXCTAssertEqual(students?[1].name, name2)\n\t}\n\n\t// test mapArray() with JSON string that is not an array form\n\t// should return a collection with one item\n\tfunc testMapArrayJSONWithNoArray(){\n\t\tlet name1 = \"Bob\"\n\t\t\n\t\tlet JSONString = \"{\\\"name\\\": \\\"\\(name1)\\\", \\\"UUID\\\": \\\"3C074D4B-FC8C-4CA2-82A9-6E9367BBC875\\\", \\\"major\\\": 541, \\\"minor\\\": 123}\"\n\t\t\n\t\tlet students = Mapper<Student>().mapArray(JSONString: JSONString)\n\n\t\tXCTAssertTrue(students?.count ?? 0 > 0)\n\t\tXCTAssertTrue(students?.count == 1)\n\t\tXCTAssertEqual(students?[0].name, name1)\n\t}\n\n\tfunc testMapArrayJSONWithEmptyArray() {\n\t\tlet JSONString = \"[]\"\n\n\t\tlet students = Mapper<Student>().mapArray(JSONString: JSONString)\n\n\t\tXCTAssertNotNil(students)\n\t\tXCTAssertTrue(students?.count == 0)\n\t}\n\n\tfunc testArrayOfCustomObjects(){\n\t\tlet percentage1: Double = 0.1\n\t\tlet percentage2: Double = 1792.41\n\t\t\n\t\tlet JSONString = \"{ \\\"tasks\\\": [{\\\"taskId\\\":103,\\\"percentage\\\":\\(percentage1)},{\\\"taskId\\\":108,\\\"percentage\\\":\\(percentage2)}] }\"\n\t\t\n\t\tlet plan = Mapper<Plan>().map(JSONString: JSONString)\n\n\t\tlet tasks = plan?.tasks\n\t\t\n\t\tXCTAssertNotNil(tasks)\n\t\tXCTAssertEqual(tasks?[0].percentage, percentage1)\n\t\tXCTAssertEqual(tasks?[1].percentage, percentage2)\n\t}\n\n\tfunc testDictionaryOfArrayOfCustomObjects(){\n\t\tlet percentage1: Double = 0.1\n\t\tlet percentage2: Double = 1792.41\n\t\t\n\t\tlet JSONString = \"{ \\\"dictionaryOfTasks\\\": { \\\"mondayTasks\\\" :[{\\\"taskId\\\":103,\\\"percentage\\\":\\(percentage1)},{\\\"taskId\\\":108,\\\"percentage\\\":\\(percentage2)}] } }\"\n\t\t\n\t\tlet plan = Mapper<Plan>().map(JSONString: JSONString)\n\t\t\n\t\tlet dictionaryOfTasks = plan?.dictionaryOfTasks\n\t\tXCTAssertNotNil(dictionaryOfTasks)\n\t\tXCTAssertEqual(dictionaryOfTasks?[\"mondayTasks\"]?[0].percentage, percentage1)\n\t\tXCTAssertEqual(dictionaryOfTasks?[\"mondayTasks\"]?[1].percentage, percentage2)\n\t\t\n\t\tlet planToJSON = Mapper().toJSONString(plan!, prettyPrint: true)\n\t\t//print(planToJSON!)\n\t\tlet planFromJSON = Mapper<Plan>().map(JSONString: planToJSON!)\n\n\t\tlet dictionaryOfTasks2 = planFromJSON?.dictionaryOfTasks\n\t\tXCTAssertNotNil(dictionaryOfTasks2)\n\t\tXCTAssertEqual(dictionaryOfTasks2?[\"mondayTasks\"]?[0].percentage, percentage1)\n\t\tXCTAssertEqual(dictionaryOfTasks2?[\"mondayTasks\"]?[1].percentage, percentage2)\n\t}\n\t\n\tfunc testArrayOfEnumObjects(){\n\t\tlet a: ExampleEnum = .a\n\t\tlet b: ExampleEnum = .b\n\t\tlet c: ExampleEnum = .c\n\n\t\tlet JSONString = \"{ \\\"enums\\\": [\\(a.rawValue), \\(b.rawValue), \\(c.rawValue)] }\"\n\n\t\tlet enumArray = Mapper<ExampleEnumArray>().map(JSONString: JSONString)\n\t\tlet enums = enumArray?.enums\n\t\t\n\t\tXCTAssertNotNil(enums)\n\t\tXCTAssertTrue(enums?.count == 3)\n\t\tXCTAssertEqual(enums?[0], a)\n\t\tXCTAssertEqual(enums?[1], b)\n\t\tXCTAssertEqual(enums?[2], c)\n\t}\n\n\tfunc testDictionaryOfCustomObjects(){\n\t\tlet percentage1: Double = 0.1\n\t\tlet percentage2: Double = 1792.41\n\t\t\n\t\tlet JSONString = \"{\\\"tasks\\\": { \\\"task1\\\": {\\\"taskId\\\":103,\\\"percentage\\\":\\(percentage1)}, \\\"task2\\\": {\\\"taskId\\\":108,\\\"percentage\\\":\\(percentage2)}}}\"\n\t\t\n\t\tlet taskDict = Mapper<TaskDictionary>().map(JSONString: JSONString)\n\t\t\n\t\tlet task = taskDict?.tasks?[\"task1\"]\n\t\tXCTAssertNotNil(task)\n\t\tXCTAssertEqual(task?.percentage, percentage1)\n\t}\n\n\tfunc testDictionryOfEnumObjects(){\n\t\tlet a: ExampleEnum = .a\n\t\tlet b: ExampleEnum = .b\n\t\tlet c: ExampleEnum = .c\n\n\t\tlet JSONString = \"{ \\\"enums\\\": {\\\"A\\\": \\(a.rawValue), \\\"B\\\": \\(b.rawValue), \\\"C\\\": \\(c.rawValue)} }\"\n\n\t\tlet enumDict = Mapper<ExampleEnumDictionary>().map(JSONString: JSONString)\n\t\tlet enums = enumDict?.enums\n\t\t\n\t\tXCTAssertNotNil(enums)\n\t\tXCTAssertTrue(enums?.count == 3)\n\t}\n\n\tfunc testDoubleParsing(){\n\t\tlet percentage1: Double = 1792.41\n\t\t\n\t\tlet JSONString = \"{\\\"taskId\\\":103,\\\"percentage\\\":\\(percentage1)}\"\n\t\t\n\t\tlet task = Mapper<Task>().map(JSONString: JSONString)\n\n\t\tXCTAssertNotNil(task)\n\t\tXCTAssertEqual(task?.percentage, percentage1)\n\t}\n\n\tfunc testToJSONArray(){\n\t\tlet task1 = Task()\n\t\ttask1.taskId = 1\n\t\ttask1.percentage = 11.1\n\t\tlet task2 = Task()\n\t\ttask2.taskId = 2\n\t\ttask2.percentage = 22.2\n\t\tlet task3 = Task()\n\t\ttask3.taskId = 3\n\t\ttask3.percentage = 33.3\n\t\t\n\t\tlet taskArray = [task1, task2, task3]\n\t\t\n\t\tlet JSONArray = Mapper().toJSONArray(taskArray)\n\t\t\n\t\tlet taskId1 = JSONArray[0][\"taskId\"] as? Int\n\t\tlet percentage1 = JSONArray[0][\"percentage\"] as? Double\n\n\t\tXCTAssertEqual(taskId1, task1.taskId)\n\t\tXCTAssertEqual(percentage1, task1.percentage)\n\n\t\tlet taskId2 = JSONArray[1][\"taskId\"] as? Int\n\t\tlet percentage2 = JSONArray[1][\"percentage\"] as? Double\n\t\t\n\t\tXCTAssertEqual(taskId2, task2.taskId)\n\t\tXCTAssertEqual(percentage2, task2.percentage)\n\n\t\tlet taskId3 = JSONArray[2][\"taskId\"] as? Int\n\t\tlet percentage3 = JSONArray[2][\"percentage\"] as? Double\n\t\t\n\t\tXCTAssertEqual(taskId3, task3.taskId)\n\t\tXCTAssertEqual(percentage3, task3.percentage)\n\t}\n\t\n\tfunc testArrayOfArrayOfMappable() {\n\t\tlet base1 = \"1\"\n\t\tlet base2 = \"2\"\n\t\tlet base3 = \"3\"\n\t\tlet base4 = \"4\"\n\t\t\n\t\tlet array1 = [[\"base\": base1], [\"base\": base2], [\"base\": base3]]\n\t\tlet array2 = [[\"base\": base4]]\n\t\tlet JSON = [\"twoDimensionalArray\":[array1, array2]]\n\t\t\n\t\tlet arrayTest = Mapper<ArrayTest>().map(JSON: JSON)\n\t\t\n\t\tXCTAssertNotNil(arrayTest)\n\t\tXCTAssertEqual(arrayTest?.twoDimensionalArray?[0][0].base, base1)\n\t\tXCTAssertEqual(arrayTest?.twoDimensionalArray?[0][1].base, base2)\n\t\tXCTAssertEqual(arrayTest?.twoDimensionalArray?[0][2].base, base3)\n\t\tXCTAssertEqual(arrayTest?.twoDimensionalArray?[1][0].base, base4)\n\t\t\n\t\tXCTAssertEqual(arrayTest?.twoDimensionalArray?[0].count, array1.count)\n\t\tXCTAssertEqual(arrayTest?.twoDimensionalArray?[1].count, array2.count)\n\t\t\n\t\tlet backToJSON = Mapper<ArrayTest>().toJSON(arrayTest!)\n\t\tXCTAssertNotNil(backToJSON)\n\t\t\n\t\tlet arrayTest2 = Mapper<ArrayTest>().map(JSON: backToJSON)\n\t\tXCTAssertNotNil(arrayTest2)\n\t\tXCTAssertEqual(arrayTest2?.twoDimensionalArray?[0][0].base, arrayTest?.twoDimensionalArray?[0][0].base)\n\t\tXCTAssertEqual(arrayTest2?.twoDimensionalArray?[0][1].base, arrayTest?.twoDimensionalArray?[0][1].base)\n\t}\n\n\tfunc testShouldPreventOverwritingMappableProperty() {\n\t\tlet json: [String: Any] = [\n\t\t\t\"name\": \"Entry 1\",\n\t\t\t\"bigList\": [[\"name\": \"item 1\"], [\"name\": \"item 2\"], [\"name\": \"item 3\"]]\n\t\t]\n\t\tlet model = CachedModel()\n\t\t_ = Mapper().map(JSON: json, toObject: model)\n\n\t\tXCTAssertEqual(model.name, \"Entry 1\")\n\t\tXCTAssertEqual(model.bigList?.count, 3)\n\n\t\tlet json2: [String: Any] = [\"name\": \"Entry 1\"]\n\t\t_ = Mapper().map(JSON: json2, toObject: model)\n\n\t\tXCTAssertEqual(model.name, \"Entry 1\")\n\t\tXCTAssertEqual(model.bigList?.count, 3)\n\t}\n}\n\nclass Status: Mappable {\n\tvar status: Int?\n\t\n\trequired init?(map: Map){\n\t\t\n\t}\n\n\tfunc mapping(map: Map) {\n\t\tstatus <- map[\"code\"]\n\t}\n}\n\nclass Plan: Mappable {\n\tvar tasks: [Task]?\n\tvar dictionaryOfTasks: [String: [Task]]?\n\t\n\trequired init?(map: Map){\n\t\t\n\t}\n\t\n\tfunc mapping(map: Map) {\n\t\ttasks <- map[\"tasks\"]\n\t\tdictionaryOfTasks <- map[\"dictionaryOfTasks\"]\n\t}\n}\n\nclass Task: Mappable {\n\tvar taskId: Int?\n\tvar percentage: Double?\n\t\n\tinit(){\n\t\t\n\t}\n\t\n\trequired init?(map: Map){\n\t\t\n\t}\n\n\tfunc mapping(map: Map) {\n\t\ttaskId <- map[\"taskId\"]\n\t\tpercentage <- map[\"percentage\"]\n\t}\n}\n\nclass TaskDictionary: Mappable {\n\tvar test: String?\n\tvar tasks: [String : Task]?\n\t\n\trequired init?(map: Map){\n\t\t\n\t}\n\t\n\tfunc mapping(map: Map) {\n\t\ttest <- map[\"test\"]\n\t\ttasks <- map[\"tasks\"]\n\t}\n}\n\n\n// Confirm that struct can conform to `Mappable`\nstruct Student: Mappable {\n\tvar name: String?\n\tvar UUID: String?\n\tvar major: Int?\n\tvar minor: Int?\n\t\n\tinit(){\n\t\t\n\t}\n\t\n\tinit?(map: Map){\n\t\t\n\t}\n\n\tmutating func mapping(map: Map) {\n\t\tname <- map[\"name\"]\n\t\tUUID <- map[\"UUID\"]\n\t\tmajor <- map[\"major\"]\n\t\tminor <- map[\"minor\"]\n\t}\n}\n\nenum Sex: String {\n\tcase Male = \"Male\"\n\tcase Female = \"Female\"\n}\n\nclass User: Mappable {\n    \n    var username: String = \"\"\n    var identifier: String?\n    var photoCount: Int = 0\n    var age: Int?\n    var weight: Double?\n    var float: Float?\n    var drinker: Bool = false\n    var smoker: Bool?\n  \tvar sex: Sex?\n\tvar canDrive: Bool?\n    var arr: [Any] = []\n    var arrOptional: [Any]?\n    var dict: [String : Any] = [:]\n    var dictOptional: [String : Any]?\n\tvar dictString: [String : String]?\n    var friendDictionary: [String : User]?\n    var friend: User?\n    var friends: [User]? = []\n\n\tinit(){\n\t\t\n\t}\n\t\n\trequired init?(map: Map){\n\t\t\n\t}\n\t\n\tfunc mapping(map: Map) {\n\t\tusername         <- map[\"username\"]\n\t\tidentifier       <- map[\"identifier\"]\n\t\tphotoCount       <- map[\"photoCount\"]\n\t\tage              <- map[\"age\"]\n\t\tweight           <- map[\"weight\"]\n\t\tfloat            <- map[\"float\"]\n\t\tdrinker          <- map[\"drinker\"]\n\t\tsmoker           <- map[\"smoker\"]\n\t\tsex              <- map[\"sex\"]\n\t\tcanDrive\t\t <- map[\"canDrive\"]\n\t\tarr              <- map[\"arr\"]\n\t\tarrOptional      <- map[\"arrOpt\"]\n\t\tdict             <- map[\"dict\"]\n\t\tdictOptional     <- map[\"dictOpt\"]\n\t\tfriend           <- map[\"friend\"]\n\t\tfriends          <- map[\"friends\"]\n\t\tfriendDictionary <- map[\"friendDictionary\"]\n\t\tdictString\t\t <- map[\"dictString\"]\n\t}\n}\n\n\nenum ExampleEnum: Int {\n\tcase a\n\tcase b\n\tcase c\n}\n\nclass ExampleEnumArray: Mappable {\n\tvar enums: [ExampleEnum] = []\n\n\trequired init?(map: Map){\n\t\t\n\t}\n\n\tfunc mapping(map: Map) {\n\t\tenums <- map[\"enums\"]\n\t}\n}\n\nclass ExampleEnumDictionary: Mappable {\n\tvar enums: [String: ExampleEnum] = [:]\n\n\trequired init?(map: Map){\n\t\t\n\t}\n\n\tfunc mapping(map: Map) {\n\t\tenums <- map[\"enums\"]\n\t}\n}\n\nclass ArrayTest: Mappable {\n\t\n\tvar twoDimensionalArray: Array<Array<Base>>?\n\t\n\trequired init?(map: Map){}\n\t\n\tfunc mapping(map: Map) {\n\t\ttwoDimensionalArray <- map[\"twoDimensionalArray\"]\n\t}\n}\n\nclass CachedModel: Mappable {\n\tvar name: String?\n\tvar bigList: [CachedItem]?\n\n\tinit() {}\n\n\trequired init?(map: Map){}\n\n\tfunc mapping(map: Map) {\n\t\tname <- map[\"name\"]\n\t\tbigList <- map[\"bigList\"]\n\t}\n}\n\nstruct CachedItem: Mappable {\n\tvar name: String?\n\n\tinit?(map: Map){}\n\n\tmutating func mapping(map: Map) {\n\t\tname <- map[\"name\"]\n\t}\n}\n"
  },
  {
    "path": "Tests/ObjectMapperTests/PerformanceTests.swift",
    "content": "//\n//  PerformanceTests.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2015-09-21.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\nimport XCTest\nimport ObjectMapper\n\nclass PerformanceTests: XCTestCase {\n\t\n\tlet JSONTestString: String = {\n\t\tlet subObjectJSON = \"{\\\"string\\\":\\\"This is a string\\\", \\\"int\\\": 12,\\\"double\\\":12.27,\\\"float\\\":12.3212, \\\"bool\\\":false, \\\"arr\\\":[ \\\"bla\\\", true, 42 ], \\\"dict\\\":{ \\\"key1\\\" : \\\"value1\\\", \\\"key2\\\" : false, \\\"key3\\\" : 142 } }\"\n\t\t\n\t\tlet objectJSONString = \"{\\\"string\\\":\\\"This is a string\\\", \\\"int\\\": 12,\\\"double\\\":12.27,\\\"float\\\":12.3212, \\\"bool\\\":false, \\\"arr\\\":[ \\\"bla\\\", true, 42 ], \\\"dict\\\":{ \\\"key1\\\" : \\\"value1\\\", \\\"key2\\\" : false, \\\"key3\\\" : 142 }, \\\"object\\\": \\(subObjectJSON), \\\"objects\\\":{ \\\"key1\\\": \\(subObjectJSON), \\\"key2\\\": \\(subObjectJSON)}}\"\n\t\t\n\t\tvar JSONString = \"[\"\n\t\tfor _ in 0...1000 {\n\t\t\tJSONString += \"\\(objectJSONString),\"\n\t\t}\n\t\tJSONString += \"\\(objectJSONString)]\"\n\t\treturn JSONString\n\t}()\n\t\n    override func setUp() {\n        super.setUp()\n        // Put setup code here. This method is called before the invocation of each test method in the class.\n    }\n    \n    override func tearDown() {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n        super.tearDown()\n    }\n\n    func testPerformance() {\n        self.measure {\n            // Put the code you want to measure the time of here.\n\t\t\t_ = Mapper<PerformanceMappableObject>().mapArray(JSONString: self.JSONTestString)\n        }\n    }\n\t\n\tfunc testPerformanceCluster() {\n\t\tself.measure {\n\t\t\t// Put the code you want to measure the time of here.\n\t\t\t_ = Mapper<PerformanceStaticMappableObject>().mapArray(JSONString: self.JSONTestString)\n\t\t}\n\t}\n\t\n\tfunc testPerformanceImmutable() {\n\t\tself.measure {\n\t\t\t_ = try? Mapper<PerformanceImmutableMappableObject>().mapArray(JSONString: self.JSONTestString)\n\t\t}\n\t}\n}\n\nclass PerformanceMappableObject: Mappable {\n\t\n\tvar string: String?\n\tvar int: Int?\n\tvar double: Double?\n\tvar float: Float?\n\tvar bool: Bool?\n\tvar array: [Any]?\n\tvar dictionary: [String: Any]?\n\tvar object: PerformanceMappableObject?\n\tvar objects: [PerformanceMappableObject]?\n\t\n\trequired init?(map: Map){\n\t\t\n\t}\n\t\n\tfunc mapping(map: Map) {\n\t\tstring\t\t<- map[\"string\"]\n\t\tint\t\t\t<- map[\"int\"]\n\t\tdouble\t\t<- map[\"double\"]\n\t\tfloat\t\t<- map[\"float\"]\n\t\tbool\t\t<- map[\"bool\"]\n\t\tarray\t\t<- map[\"array\"]\n\t\tdictionary\t<- map[\"dictionary\"]\n\t\tobject\t\t<- map[\"object\"]\n\t\tobjects\t\t<- map[\"objects\"]\n\t}\n}\n\nclass PerformanceStaticMappableObject: StaticMappable {\n\t\n\tvar string: String?\n\tvar int: Int?\n\tvar double: Double?\n\tvar float: Float?\n\tvar bool: Bool?\n\tvar array: [Any]?\n\tvar dictionary: [String: Any]?\n\tvar object: PerformanceStaticMappableObject?\n\tvar objects: [PerformanceStaticMappableObject]?\n\t\n\tstatic func objectForMapping(map: Map) -> BaseMappable? {\n\t\treturn PerformanceStaticMappableObject()\n\t}\n\t\n\tfunc mapping(map: Map) {\n\t\tstring\t\t<- map[\"string\"]\n\t\tint\t\t\t<- map[\"int\"]\n\t\tdouble\t\t<- map[\"double\"]\n\t\tfloat\t\t<- map[\"float\"]\n\t\tbool\t\t<- map[\"bool\"]\n\t\tarray\t\t<- map[\"array\"]\n\t\tdictionary\t<- map[\"dictionary\"]\n\t\tobject\t\t<- map[\"object\"]\n\t\tobjects\t\t<- map[\"objects\"]\n\t}\n}\n\nclass PerformanceImmutableMappableObject: ImmutableMappable {\n\t\n\tlet string: String?\n\tlet int: Int?\n\tlet double: Double?\n\tlet float: Float?\n\tlet bool: Bool?\n\tlet array: [Any]?\n\tlet dictionary: [String: Any]?\n\tlet object: PerformanceImmutableMappableObject?\n\tlet objects: [PerformanceImmutableMappableObject]?\n\n\trequired init(map: Map) throws {\n\t\tstring = try map.value(\"string\")\n\t\tint = try map.value(\"int\")\n\t\tdouble = try map.value(\"double\")\n\t\tfloat = try map.value(\"float\")\n\t\tbool = try map.value(\"bool\")\n\t\tarray = try map.value(\"array\")\n\t\tdictionary = try map.value(\"dictionary\")\n\t\tobject = try map.value(\"object\")\n\t\tobjects = try map.value(\"objects\")\n\t}\n\t\n\tfunc mapping(map: Map) {\n\t\tstring\t\t>>> map[\"string\"]\n\t\tint\t\t\t>>> map[\"int\"]\n\t\tdouble\t\t>>> map[\"double\"]\n\t\tfloat\t\t>>> map[\"float\"]\n\t\tbool\t\t>>> map[\"bool\"]\n\t\tarray\t\t>>> map[\"array\"]\n\t\tdictionary\t>>> map[\"dictionary\"]\n\t\tobject\t\t>>> map[\"object\"]\n\t\tobjects\t\t>>> map[\"objects\"]\n\t}\n}\n\n\n"
  },
  {
    "path": "Tests/ObjectMapperTests/ToObjectTests.swift",
    "content": "//\n//  ReferenceTypesFromJSON.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2015-11-29.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\nimport XCTest\nimport ObjectMapper\n\nclass ToObjectTests: XCTestCase {\n\t\n\toverride func setUp() {\n\t\tsuper.setUp()\n\t\t// Put setup code here. This method is called before the invocation of each test method in the class.\n\t}\n\t\n\toverride func tearDown() {\n\t\t// Put teardown code here. This method is called after the invocation of each test method in the class.\n\t\tsuper.tearDown()\n\t}\n\t\n\tfunc testMappingPersonFromJSON(){\n\t\tlet name = \"ASDF\"\n\t\tlet spouseName = \"HJKL\"\n\t\tlet JSONString = \"{\\\"name\\\" : \\\"\\(name)\\\", \\\"spouse\\\" : {\\\"name\\\" : \\\"\\(spouseName)\\\"}}\"\n\t\t\n\t\tlet mappedObject = Mapper<Person>().map(JSONString: JSONString)\n\t\t\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertEqual(mappedObject?.name, name)\n\t\tXCTAssertEqual(mappedObject?.spouse?.name, spouseName)\n\t}\n\t\n\tfunc testUpdatingChildObject(){\n\t\tlet name = \"ASDF\"\n\t\tlet initialSpouseName = \"HJKL\"\n\t\tlet updatedSpouseName = \"QWERTY\"\n\t\tlet initialJSONString = \"{\\\"name\\\" : \\\"\\(name)\\\", \\\"spouse\\\" : {\\\"name\\\" : \\\"\\(initialSpouseName)\\\"}}\"\n\t\tlet updatedJSONString = \"{\\\"name\\\" : \\\"\\(name)\\\", \\\"spouse\\\" : {\\\"name\\\" : \\\"\\(updatedSpouseName)\\\"}}\"\n\t\t\n\t\tlet mappedObject = Mapper<Person>().map(JSONString: initialJSONString)\n\t\tlet initialSpouse = mappedObject?.spouse\n\t\t\n\t\tXCTAssertNotNil(mappedObject)\n\t\t\n\t\tlet updatedObject = Mapper<Person>().map(JSONString: updatedJSONString, toObject: mappedObject!)\n\t\t\n\t\tXCTAssert(initialSpouse === updatedObject.spouse, \"Expected mapping to update the existing object not create a new one\")\n\t\tXCTAssertEqual(updatedObject.spouse?.name, updatedSpouseName)\n\t\tXCTAssertEqual(initialSpouse?.name,\tupdatedSpouseName)\n\t}\n\t\n\tfunc testUpdatingChildDictionary(){\n\t\tlet childKey = \"child_1\"\n\t\tlet initialChildName = \"HJKL\"\n\t\tlet updatedChildName = \"QWERTY\"\n\t\tlet initialJSONString = \"{\\\"children\\\" : {\\\"\\(childKey)\\\" : {\\\"name\\\" : \\\"\\(initialChildName)\\\"}}}\"\n\t\tlet updatedJSONString = \"{\\\"children\\\" : {\\\"\\(childKey)\\\" : {\\\"name\\\" : \\\"\\(updatedChildName)\\\"}}}\"\n\t\t\n\t\tlet mappedObject = Mapper<Person>().map(JSONString: initialJSONString)\n\t\tlet initialChild = mappedObject?.children?[childKey]\n\t\t\n\t\tXCTAssertNotNil(mappedObject)\n\t\tXCTAssertNotNil(initialChild)\n\t\tXCTAssertEqual(initialChild?.name, initialChildName)\n\t\t\n\t\t_ = Mapper<Person>().map(JSONString: updatedJSONString, toObject: mappedObject!)\n\t\t\n\t\tlet updatedChild = mappedObject?.children?[childKey]\n\t\tXCTAssert(initialChild === updatedChild, \"Expected mapping to update the existing object not create a new one\")\n\t\tXCTAssertEqual(updatedChild?.name, updatedChildName)\n\t\tXCTAssertEqual(initialChild?.name, updatedChildName)\n\t}\n\t\n\tfunc testToObjectFromString() {\n\t\tlet username = \"bob\"\n\t\tlet JSONString = \"{\\\"username\\\":\\\"\\(username)\\\"}\"\n\t\t\n\t\tlet user = User()\n\t\tuser.username = \"Tristan\"\n\t\t\n\t\t_ = Mapper().map(JSONString: JSONString, toObject: user)\n\t\t\n\t\tXCTAssertEqual(user.username, username)\n\t}\n\t\n\tfunc testToObjectFromJSON() {\n\t\tlet username = \"bob\"\n\t\tlet JSON = [\"username\": username]\n\t\t\n\t\tlet user = User()\n\t\tuser.username = \"Tristan\"\n\t\t\n\t\t_ = Mapper().map(JSON: JSON, toObject: user)\n\t\t\n\t\tXCTAssertEqual(username, user.username)\n\t}\n\t\n\tfunc testToObjectFromAny() {\n\t\tlet username = \"bob\"\n\t\tlet userJSON = [\"username\": username]\n\t\t\n\t\tlet user = User()\n\t\tuser.username = \"Tristan\"\n\t\t\n\t\t_ = Mapper().map(JSONObject: userJSON as Any, toObject: user)\n\t\t\n\t\tXCTAssertEqual(user.username, username)\n\t}\n\n\tclass Person: Mappable {\n\t\tvar name: String?\n\t\tvar spouse: Person?\n\t\tvar children: [String: Person]?\n\t\t\n\t\trequired init?(map: Map) {\n\t\t\t\n\t\t}\n\t\t\n\t\tfunc mapping(map: Map) {\n\t\t\tname\t\t<- map[\"name\"]\n\t\t\tspouse\t\t<- map[\"spouse\"]\n\t\t\tchildren\t<- map[\"children\"]\n\t\t}\n\t}\n\t\n\tclass User: Mappable {\n\t\t\n\t\tvar username: String = \"\"\n\t\t\n\t\tinit(){\n\t\t\t\n\t\t}\n\t\t\n\t\trequired init?(map: Map){\n\t\t\t\n\t\t}\n\t\t\n\t\tfunc mapping(map: Map) {\n\t\t\tusername\t<- map[\"username\"]\n\t\t}\n\t}\n\t\n\tstruct HumanInfo: Mappable {\n\t\tvar name: String?\n\t\t\n\t\tinit(name: String) {\n\t\t\tself.name = name\n\t\t}\n\t\t\n\t\tinit?(map: Map) {\n\t\t\t\n\t\t}\n\t\t\n\t\tmutating func mapping(map: Map) {\n\t\t\tname <- map[\"name\"]\n\t\t}\n\t}\n\t\n\tstruct Human: Mappable {\n\t\tvar info: HumanInfo?\n\t\t\n\t\tinit(name: String) {\n\t\t\tinfo = HumanInfo(name: name)\n\t\t}\n\t\t\n\t\tinit?(map: Map) {\n\t\t\t\n\t\t}\n\t\t\n\t\tmutating func mapping(map: Map) {\n\t\t\tinfo <- map[\"info\"]\n\t\t}\n\t}\n\t\n\tfunc testConsume() {\n\t\tvar human1 = Human(name: \"QW\") //has a with name \"QW\"\n\t\tlet human2 = Human(name: \"ER\") //has a with name \"ER\"\n\t\thuman1 = Mapper().map(JSON: human2.toJSON(), toObject: human1)\n\t\t\n\t\tXCTAssertEqual(human1.info?.name, human2.info?.name)\n\t}\n}\n\n"
  },
  {
    "path": "Tests/ObjectMapperTests/URLTransformTests.swift",
    "content": "//\n//  URLTransformTests.swift\n//  ObjectMapper\n//\n//  Created by pawel-rusin on 4/7/17.\n//\n//  Copyright (c) 2014-2018 Tristan Himmelman\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport XCTest\nimport ObjectMapper\n\nclass URLTransformTests: XCTestCase {\n\n    func testUrlQueryAllowed() {\n        let urlTransform = URLTransform()\n        let input = \"https://example.com/search?query=foo\"\n        let output = urlTransform.transformFromJSON(input)\n\n        XCTAssertEqual(output, URL(string: \"https://example.com/search?query=foo\"))\n    }\n\n    func testCanPassInAllowedCharacterSet() {\n        var characterSet = CharacterSet.urlQueryAllowed\n        characterSet.insert(charactersIn: \"%\")\n        let urlTransform = URLTransform(allowedCharacterSet: characterSet)\n        let input = \"https://example.com/%25\"\n        let output = urlTransform.transformFromJSON(input)\n\n        XCTAssertEqual(output, URL(string: \"https://example.com/%25\"))\n    }\n}\n"
  }
]