[
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2023 Cyril Zakka, MD\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "NameDrop/Assets.xcassets/AccentColor.colorset/Contents.json",
    "content": "{\n  \"colors\" : [\n    {\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "NameDrop/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"platform\" : \"ios\",\n      \"size\" : \"1024x1024\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "NameDrop/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "NameDrop/Assets.xcassets/wallpaper.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"filename\" : \"wallpaper.jpg\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "NameDrop/ContentView.swift",
    "content": "//\n//  ContentView.swift\n//  NameDrop\n//\n//  Created by Cyril Zakka on 6/5/23.\n//\n\nimport SwiftUI\nimport SpriteKit\n\nextension ContentView {\n    class WaterScene: SKScene {\n        private let spriteNode = SKSpriteNode()\n        var image: UIImage?\n        \n        // Converted from: https://www.shadertoy.com/view/llj3Dz\n        let waterShader = SKShader(source: \"\"\"\n        void main() {\n            float offset = (u_time - floor(u_time))/u_time;\n            float currentTime = u_time*offset*0.5;\n            vec3 waveParams = vec3(u_scale, u_sharpness, u_spread);\n            vec2 waveCenter = vec2(0.5, 1.05);\n        \n            vec2 coord = v_tex_coord;\n            float dist = distance(coord, waveCenter);\n            vec4 current_color = texture2D(u_texture, coord);\n        \n            //Only distort the pixels within the parameter distance from the center\n            if ((dist <= ((currentTime) + (waveParams.z))) &&\n                (dist >= ((currentTime) - (waveParams.z)))) {\n                float diff = (dist - currentTime);\n                float scaleDiff = (1.0 - pow(abs(diff * waveParams.x), waveParams.y));\n                float diffTime = (diff  * scaleDiff);\n                vec2 diffTexCoord = normalize(coord - waveCenter);\n                coord += ((diffTexCoord * diffTime) / (currentTime * dist * 10)); //40\n                current_color = texture2D(u_texture, coord);\n                current_color += (current_color * scaleDiff) / (currentTime * dist * 40.0);\n            }\n            \n            gl_FragColor = current_color;\n        }\n        \"\"\")\n        \n        override func sceneDidLoad() {\n            backgroundColor = .clear\n            scaleMode = .resizeFill\n\n            spriteNode.shader = waterShader\n            addChild(spriteNode)\n        }\n        \n        func updateTexture() {\n            guard view != nil else { return }\n            guard let image else { return }\n\n            let texture = SKTexture(image: image)\n            spriteNode.texture = texture\n            spriteNode.size = texture.size()\n            spriteNode.position.x = frame.midX\n            spriteNode.position.y = frame.midY\n        }\n\n        override func didMove(to view: SKView) {\n            updateTexture()\n        }\n    }\n    \n    struct WaterEffect<Content: View>: View {\n        @State private var scene = WaterScene()\n        @Environment(\\.displayScale) var displayScale\n\n        var scale: Double\n        var sharpness: Double\n        var spread: Double\n        @ViewBuilder var content: () -> Content\n        \n        var body: some View {\n            let renderer = ImageRenderer(content: content())\n            renderer.scale = displayScale\n            \n            let image = renderer.uiImage\n            let size = image?.size ?? .zero\n            \n            scene.waterShader.uniforms = [\n                SKUniform(name: \"u_scale\", float: Float(scale)),\n                SKUniform(name: \"u_sharpness\", float: Float(sharpness)),\n                SKUniform(name: \"u_spread\", float: Float(spread))\n            ]\n            \n            scene.image = image\n            scene.updateTexture()\n            \n            return SpriteView(scene: scene, options: .allowsTransparency)\n                .frame(width: size.width, height: size.height)\n        }\n    }\n}\n\nstruct ContentView: View {\n    \n    @State private var showControls = true\n    @State private var scale = 10.0\n    @State private var sharpness = 0.8\n    @State private var spread = 0.1\n    \n    var body: some View {\n            WaterEffect(scale: scale, sharpness: sharpness, spread: spread) {\n                ZStack(alignment: .top) {\n                    Image(\"wallpaper\")\n                        .imageScale(.large)\n                        .foregroundStyle(.tint)\n                    VStack(alignment: .center) {\n                        Text(\"Friday, June 9\")\n                            .font(.system(size: 20))\n                            .fontWeight(.semibold)\n                        Text(\"11:42\")\n                            .font(.system(size: 70))\n                            .fontWeight(.semibold)\n                        \n                        Text(\"Cyril Zakka\")\n                        \n                    }\n                    .padding(.top, 115)\n                    .foregroundColor(.white.opacity(0.7))\n                }\n            }.sheet( isPresented: $showControls, content: {\n                ScrollView {\n                    VStack {\n                        LabeledContent(\"Scale\") {\n                            Slider(value: $scale, in: 1...50, step: 1)\n                        }\n                        \n                        LabeledContent(\"Sharpness\") {\n                            Slider(value: $sharpness, in: 0...1, step: 0.1)\n                        }\n                        \n                        LabeledContent(\"Spread\") {\n                            Slider(value: $spread, in: 0...1, step: 0.1)\n                        }\n                    }.padding()\n                }.presentationBackground(.thinMaterial)\n                .padding()\n                .presentationDetents([.fraction(0.3),.medium, .large])\n            })\n    }\n}\n\n#Preview {\n    ContentView()\n}\n"
  },
  {
    "path": "NameDrop/NameDropApp.swift",
    "content": "//\n//  NameDropApp.swift\n//  NameDrop\n//\n//  Created by Cyril Zakka on 6/5/23.\n//\n\nimport SwiftUI\n\n@main\nstruct NameDropApp: App {\n    var body: some Scene {\n        WindowGroup {\n            ContentView()\n        }\n    }\n}\n"
  },
  {
    "path": "NameDrop/Preview Content/Preview Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "NameDrop/Ripple.fsh",
    "content": "//\n//  Ripple.fsh\n//  NameDrop\n//\n//  Created by Cyril Zakka on 6/8/23.\n//\n\n\nvoid main() {\n    float offset = (u_time - floor(u_time))/u_time;\n    float currentTime = (u_time)*(offset);\n    \n    vec2 coord = v_tex_coord;\n    vec3 waveParams = vec3(10.0, 0.8, 0.1);\n    float pixel_distance = distance(coord, u_center);\n    vec4 current_color = SKDefaultShading();\n    \n    if ((pixel_distance <= ((currentTime) + (waveParams.z))) &&\n        (pixel_distance >= ((currentTime) - (waveParams.z))))\n    {\n        float diff = (pixel_distance - currentTime);\n        float scaleDiff = (1.0 - pow(abs(diff * waveParams.x), waveParams.y));\n        float diffTime = (Ddiffiff  * scaleDiff);\n        \n        vec2 diffTexCoord = normalize(distance(v_tex_coord, u_center));\n        coord += ((diffTexCoord * diffTime) / (currentTime * pixel_distance * 40.0));\n        current_color += (current_color * scaleDiff) / (currentTime * pixel_distance * 40.0);\n    }\n    \n    gl_FragColor = current_color;\n}\n"
  },
  {
    "path": "NameDrop.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 56;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\tF16099492A2F06B400F288E0 /* NameDropApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = F16099482A2F06B400F288E0 /* NameDropApp.swift */; };\n\t\tF160994B2A2F06B400F288E0 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F160994A2A2F06B400F288E0 /* ContentView.swift */; };\n\t\tF160994D2A2F06B500F288E0 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F160994C2A2F06B500F288E0 /* Assets.xcassets */; };\n\t\tF16099502A2F06B500F288E0 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F160994F2A2F06B500F288E0 /* Preview Assets.xcassets */; };\n\t\tF160995A2A2F06B500F288E0 /* NameDropTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F16099592A2F06B500F288E0 /* NameDropTests.swift */; };\n\t\tF16099642A2F06B500F288E0 /* NameDropUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F16099632A2F06B500F288E0 /* NameDropUITests.swift */; };\n\t\tF16099662A2F06B500F288E0 /* NameDropUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F16099652A2F06B500F288E0 /* NameDropUITestsLaunchTests.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\tF16099562A2F06B500F288E0 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = F160993D2A2F06B400F288E0 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = F16099442A2F06B400F288E0;\n\t\t\tremoteInfo = NameDrop;\n\t\t};\n\t\tF16099602A2F06B500F288E0 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = F160993D2A2F06B400F288E0 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = F16099442A2F06B400F288E0;\n\t\t\tremoteInfo = NameDrop;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\tF16099452A2F06B400F288E0 /* NameDrop.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NameDrop.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tF16099482A2F06B400F288E0 /* NameDropApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NameDropApp.swift; sourceTree = \"<group>\"; };\n\t\tF160994A2A2F06B400F288E0 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = \"<group>\"; };\n\t\tF160994C2A2F06B500F288E0 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\tF160994F2A2F06B500F288E0 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = \"Preview Assets.xcassets\"; sourceTree = \"<group>\"; };\n\t\tF16099552A2F06B500F288E0 /* NameDropTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NameDropTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tF16099592A2F06B500F288E0 /* NameDropTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NameDropTests.swift; sourceTree = \"<group>\"; };\n\t\tF160995F2A2F06B500F288E0 /* NameDropUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NameDropUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tF16099632A2F06B500F288E0 /* NameDropUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NameDropUITests.swift; sourceTree = \"<group>\"; };\n\t\tF16099652A2F06B500F288E0 /* NameDropUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NameDropUITestsLaunchTests.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tF16099422A2F06B400F288E0 /* 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\tF16099522A2F06B500F288E0 /* 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\tF160995C2A2F06B500F288E0 /* 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\tF160993C2A2F06B400F288E0 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF16099472A2F06B400F288E0 /* NameDrop */,\n\t\t\t\tF16099582A2F06B500F288E0 /* NameDropTests */,\n\t\t\t\tF16099622A2F06B500F288E0 /* NameDropUITests */,\n\t\t\t\tF16099462A2F06B400F288E0 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF16099462A2F06B400F288E0 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF16099452A2F06B400F288E0 /* NameDrop.app */,\n\t\t\t\tF16099552A2F06B500F288E0 /* NameDropTests.xctest */,\n\t\t\t\tF160995F2A2F06B500F288E0 /* NameDropUITests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF16099472A2F06B400F288E0 /* NameDrop */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF16099482A2F06B400F288E0 /* NameDropApp.swift */,\n\t\t\t\tF160994A2A2F06B400F288E0 /* ContentView.swift */,\n\t\t\t\tF160994C2A2F06B500F288E0 /* Assets.xcassets */,\n\t\t\t\tF160994E2A2F06B500F288E0 /* Preview Content */,\n\t\t\t);\n\t\t\tpath = NameDrop;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF160994E2A2F06B500F288E0 /* Preview Content */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF160994F2A2F06B500F288E0 /* Preview Assets.xcassets */,\n\t\t\t);\n\t\t\tpath = \"Preview Content\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF16099582A2F06B500F288E0 /* NameDropTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF16099592A2F06B500F288E0 /* NameDropTests.swift */,\n\t\t\t);\n\t\t\tpath = NameDropTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF16099622A2F06B500F288E0 /* NameDropUITests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF16099632A2F06B500F288E0 /* NameDropUITests.swift */,\n\t\t\t\tF16099652A2F06B500F288E0 /* NameDropUITestsLaunchTests.swift */,\n\t\t\t);\n\t\t\tpath = NameDropUITests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\tF16099442A2F06B400F288E0 /* NameDrop */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = F16099692A2F06B500F288E0 /* Build configuration list for PBXNativeTarget \"NameDrop\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF16099412A2F06B400F288E0 /* Sources */,\n\t\t\t\tF16099422A2F06B400F288E0 /* Frameworks */,\n\t\t\t\tF16099432A2F06B400F288E0 /* 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 = NameDrop;\n\t\t\tproductName = NameDrop;\n\t\t\tproductReference = F16099452A2F06B400F288E0 /* NameDrop.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\tF16099542A2F06B500F288E0 /* NameDropTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = F160996C2A2F06B500F288E0 /* Build configuration list for PBXNativeTarget \"NameDropTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF16099512A2F06B500F288E0 /* Sources */,\n\t\t\t\tF16099522A2F06B500F288E0 /* Frameworks */,\n\t\t\t\tF16099532A2F06B500F288E0 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tF16099572A2F06B500F288E0 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = NameDropTests;\n\t\t\tproductName = NameDropTests;\n\t\t\tproductReference = F16099552A2F06B500F288E0 /* NameDropTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\tF160995E2A2F06B500F288E0 /* NameDropUITests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = F160996F2A2F06B500F288E0 /* Build configuration list for PBXNativeTarget \"NameDropUITests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF160995B2A2F06B500F288E0 /* Sources */,\n\t\t\t\tF160995C2A2F06B500F288E0 /* Frameworks */,\n\t\t\t\tF160995D2A2F06B500F288E0 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tF16099612A2F06B500F288E0 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = NameDropUITests;\n\t\t\tproductName = NameDropUITests;\n\t\t\tproductReference = F160995F2A2F06B500F288E0 /* NameDropUITests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.ui-testing\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tF160993D2A2F06B400F288E0 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = 1;\n\t\t\t\tLastSwiftUpdateCheck = 1500;\n\t\t\t\tLastUpgradeCheck = 1500;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\tF16099442A2F06B400F288E0 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 15.0;\n\t\t\t\t\t};\n\t\t\t\t\tF16099542A2F06B500F288E0 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 15.0;\n\t\t\t\t\t\tTestTargetID = F16099442A2F06B400F288E0;\n\t\t\t\t\t};\n\t\t\t\t\tF160995E2A2F06B500F288E0 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 15.0;\n\t\t\t\t\t\tTestTargetID = F16099442A2F06B400F288E0;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = F16099402A2F06B400F288E0 /* Build configuration list for PBXProject \"NameDrop\" */;\n\t\t\tcompatibilityVersion = \"Xcode 14.0\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = F160993C2A2F06B400F288E0;\n\t\t\tproductRefGroup = F16099462A2F06B400F288E0 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tF16099442A2F06B400F288E0 /* NameDrop */,\n\t\t\t\tF16099542A2F06B500F288E0 /* NameDropTests */,\n\t\t\t\tF160995E2A2F06B500F288E0 /* NameDropUITests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tF16099432A2F06B400F288E0 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF16099502A2F06B500F288E0 /* Preview Assets.xcassets in Resources */,\n\t\t\t\tF160994D2A2F06B500F288E0 /* Assets.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF16099532A2F06B500F288E0 /* 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\tF160995D2A2F06B500F288E0 /* 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\tF16099412A2F06B400F288E0 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF160994B2A2F06B400F288E0 /* ContentView.swift in Sources */,\n\t\t\t\tF16099492A2F06B400F288E0 /* NameDropApp.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF16099512A2F06B500F288E0 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF160995A2A2F06B500F288E0 /* NameDropTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF160995B2A2F06B500F288E0 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF16099662A2F06B500F288E0 /* NameDropUITestsLaunchTests.swift in Sources */,\n\t\t\t\tF16099642A2F06B500F288E0 /* NameDropUITests.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\tF16099572A2F06B500F288E0 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = F16099442A2F06B400F288E0 /* NameDrop */;\n\t\t\ttargetProxy = F16099562A2F06B500F288E0 /* PBXContainerItemProxy */;\n\t\t};\n\t\tF16099612A2F06B500F288E0 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = F16099442A2F06B400F288E0 /* NameDrop */;\n\t\t\ttargetProxy = F16099602A2F06B500F288E0 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\tF16099672A2F06B500F288E0 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\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++20\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = 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_DOCUMENTATION_COMMENTS = YES;\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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\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_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\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\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\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_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 = 17.0;\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"DEBUG $(inherited)\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tF16099682A2F06B500F288E0 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\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++20\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = 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_DOCUMENTATION_COMMENTS = YES;\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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\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_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\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\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\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 = 17.0;\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tF160996A2A2F06B500F288E0 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEVELOPMENT_ASSET_PATHS = \"\\\"NameDrop/Preview Content\\\"\";\n\t\t\t\tDEVELOPMENT_TEAM = AG2QJ56KLX;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;\n\t\t\t\tINFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;\n\t\t\t\tINFOPLIST_KEY_UILaunchScreen_Generation = YES;\n\t\t\t\tINFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = \"UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight\";\n\t\t\t\tINFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = \"UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = cyrilzakka.NameDrop;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tF160996B2A2F06B500F288E0 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEVELOPMENT_ASSET_PATHS = \"\\\"NameDrop/Preview Content\\\"\";\n\t\t\t\tDEVELOPMENT_TEAM = AG2QJ56KLX;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;\n\t\t\t\tINFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;\n\t\t\t\tINFOPLIST_KEY_UILaunchScreen_Generation = YES;\n\t\t\t\tINFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = \"UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight\";\n\t\t\t\tINFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = \"UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = cyrilzakka.NameDrop;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tF160996D2A2F06B500F288E0 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEVELOPMENT_TEAM = AG2QJ56KLX;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 17.0;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = cyrilzakka.NameDropTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = NO;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/NameDrop.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/NameDrop\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tF160996E2A2F06B500F288E0 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEVELOPMENT_TEAM = AG2QJ56KLX;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 17.0;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = cyrilzakka.NameDropTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = NO;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/NameDrop.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/NameDrop\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tF16099702A2F06B500F288E0 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEVELOPMENT_TEAM = AG2QJ56KLX;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = cyrilzakka.NameDropUITests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = NO;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tTEST_TARGET_NAME = NameDrop;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tF16099712A2F06B500F288E0 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEVELOPMENT_TEAM = AG2QJ56KLX;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = cyrilzakka.NameDropUITests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = NO;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tTEST_TARGET_NAME = NameDrop;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tF16099402A2F06B400F288E0 /* Build configuration list for PBXProject \"NameDrop\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tF16099672A2F06B500F288E0 /* Debug */,\n\t\t\t\tF16099682A2F06B500F288E0 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tF16099692A2F06B500F288E0 /* Build configuration list for PBXNativeTarget \"NameDrop\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tF160996A2A2F06B500F288E0 /* Debug */,\n\t\t\t\tF160996B2A2F06B500F288E0 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tF160996C2A2F06B500F288E0 /* Build configuration list for PBXNativeTarget \"NameDropTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tF160996D2A2F06B500F288E0 /* Debug */,\n\t\t\t\tF160996E2A2F06B500F288E0 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tF160996F2A2F06B500F288E0 /* Build configuration list for PBXNativeTarget \"NameDropUITests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tF16099702A2F06B500F288E0 /* Debug */,\n\t\t\t\tF16099712A2F06B500F288E0 /* 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 = F160993D2A2F06B400F288E0 /* Project object */;\n}\n"
  },
  {
    "path": "NameDrop.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "NameDrop.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": "NameDrop.xcodeproj/xcuserdata/cyril.xcuserdatad/xcschemes/xcschememanagement.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>SchemeUserState</key>\n\t<dict>\n\t\t<key>NameDrop.xcscheme_^#shared#^_</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>0</integer>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "NameDropTests/NameDropTests.swift",
    "content": "//\n//  NameDropTests.swift\n//  NameDropTests\n//\n//  Created by Cyril Zakka on 6/5/23.\n//\n\nimport XCTest\n@testable import NameDrop\n\nfinal class NameDropTests: XCTestCase {\n\n    override func setUpWithError() throws {\n        // Put setup code here. This method is called before the invocation of each test method in the class.\n    }\n\n    override func tearDownWithError() throws {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n    }\n\n    func testExample() throws {\n        // This is an example of a functional test case.\n        // Use XCTAssert and related functions to verify your tests produce the correct results.\n        // Any test you write for XCTest can be annotated as throws and async.\n        // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error.\n        // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards.\n    }\n\n    func testPerformanceExample() throws {\n        // This is an example of a performance test case.\n        self.measure {\n            // Put the code you want to measure the time of here.\n        }\n    }\n\n}\n"
  },
  {
    "path": "NameDropUITests/NameDropUITests.swift",
    "content": "//\n//  NameDropUITests.swift\n//  NameDropUITests\n//\n//  Created by Cyril Zakka on 6/5/23.\n//\n\nimport XCTest\n\nfinal class NameDropUITests: XCTestCase {\n\n    override func setUpWithError() throws {\n        // Put setup code here. This method is called before the invocation of each test method in the class.\n\n        // In UI tests it is usually best to stop immediately when a failure occurs.\n        continueAfterFailure = false\n\n        // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.\n    }\n\n    override func tearDownWithError() throws {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n    }\n\n    func testExample() throws {\n        // UI tests must launch the application that they test.\n        let app = XCUIApplication()\n        app.launch()\n\n        // Use XCTAssert and related functions to verify your tests produce the correct results.\n    }\n\n    func testLaunchPerformance() throws {\n        if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) {\n            // This measures how long it takes to launch your application.\n            measure(metrics: [XCTApplicationLaunchMetric()]) {\n                XCUIApplication().launch()\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "NameDropUITests/NameDropUITestsLaunchTests.swift",
    "content": "//\n//  NameDropUITestsLaunchTests.swift\n//  NameDropUITests\n//\n//  Created by Cyril Zakka on 6/5/23.\n//\n\nimport XCTest\n\nfinal class NameDropUITestsLaunchTests: XCTestCase {\n\n    override class var runsForEachTargetApplicationUIConfiguration: Bool {\n        true\n    }\n\n    override func setUpWithError() throws {\n        continueAfterFailure = false\n    }\n\n    func testLaunch() throws {\n        let app = XCUIApplication()\n        app.launch()\n\n        // Insert steps here to perform after app launch but before taking a screenshot,\n        // such as logging into a test account or navigating somewhere in the app\n\n        let attachment = XCTAttachment(screenshot: app.screenshot())\n        attachment.name = \"Launch Screen\"\n        attachment.lifetime = .keepAlways\n        add(attachment)\n    }\n}\n"
  },
  {
    "path": "README.md",
    "content": "# NameDrop\nWater ripple effect written in SwiftUI/GLSL to replicate the NameDrop animation first demoed on iOS 17. Should be easier to add with the new `.layerEffect` modifier. The magic mostly happens in this little block of code:\n```\n        void main() {\n            float offset = (u_time - floor(u_time))/u_time;\n            float currentTime = u_time*offset*0.5;\n            vec3 waveParams = vec3(u_scale, u_sharpness, u_spread);\n            vec2 waveCenter = vec2(0.5, 1.05);\n        \n            vec2 coord = v_tex_coord;\n            float dist = distance(coord, waveCenter);\n            vec4 current_color = texture2D(u_texture, coord);\n        \n            //Only distort the pixels within the parameter distance from the center\n            if ((dist <= ((currentTime) + (waveParams.z))) &&\n                (dist >= ((currentTime) - (waveParams.z)))) {\n                float diff = (dist - currentTime);\n                float scaleDiff = (1.0 - pow(abs(diff * waveParams.x), waveParams.y));\n                float diffTime = (diff  * scaleDiff);\n                vec2 diffTexCoord = normalize(coord - waveCenter);\n                coord += ((diffTexCoord * diffTime) / (currentTime * dist * 10)); //40\n                current_color = texture2D(u_texture, coord);\n                current_color += (current_color * scaleDiff) / (currentTime * dist * 40.0);\n            }\n            \n            gl_FragColor = current_color;\n```\nGive me a shoutout if you end up using it anywhere! \n\nTwitter: [@cyrilzakka](https://twitter.com/cyrilzakka)\n"
  }
]