[
  {
    "path": ".gitignore",
    "content": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata\n.netrc\n"
  },
  {
    "path": ".swiftpm/xcode/package.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": "DemoApp/DemoApp/DemoApp/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": "DemoApp/DemoApp/DemoApp/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": "DemoApp/DemoApp/DemoApp/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "DemoApp/DemoApp/DemoApp/ContentView.swift",
    "content": "//\n//  ContentView.swift\n//  DemoApp\n//\n//  Created by Qu Tian on 2024/7/31.\n//\n\nimport SwiftUI\nimport ContributionChart\n\n\nstruct ContentView: View {\n    @State private var data = [0.87, 0.17, 0.6, 0.21, 0.88, 0.41, 0.37, 0.39, 0.34, 0.91, 0.45, 0.51, 0.1, 0.97, 0.32, 0.72, 0.15, 0.2, 0.87, 0.86, 0.35, 0.12, 0.77, 0.56]\n\n    var body: some View {\n        RecordBlock {\n            ContributionChartView(data: data, rows: 3, columns: 8, targetValue: 1.0)\n        }\n        .frame(width: 210, height: 95)\n        .padding()\n    }\n}\n\nfileprivate struct RecordBlock<Content:View>: View {\n    @ViewBuilder var content:Content\n    \n    var body: some View {\n        ZStack {\n            RoundedRectangle(cornerRadius: 16)\n                .fill(Color.white)\n                .shadow(color: Color.black.opacity(0.3), radius: 16.0, y: 16.0)\n            content\n        }\n    }\n}\n\n\n#Preview {\n    ContentView()\n}\n"
  },
  {
    "path": "DemoApp/DemoApp/DemoApp/DemoAppApp.swift",
    "content": "//\n//  DemoAppApp.swift\n//  DemoApp\n//\n//  Created by Qu Tian on 2024/7/31.\n//\n\nimport SwiftUI\n\n@main\nstruct DemoAppApp: App {\n    var body: some Scene {\n        WindowGroup {\n            ContentView()\n        }\n    }\n}\n"
  },
  {
    "path": "DemoApp/DemoApp/DemoApp/Preview Content/Preview Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "DemoApp/DemoApp/DemoApp.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\tC00592122C59D22F00FAE9E2 /* DemoAppApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = C00592112C59D22F00FAE9E2 /* DemoAppApp.swift */; };\n\t\tC00592142C59D22F00FAE9E2 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C00592132C59D22F00FAE9E2 /* ContentView.swift */; };\n\t\tC00592162C59D23000FAE9E2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C00592152C59D23000FAE9E2 /* Assets.xcassets */; };\n\t\tC00592192C59D23000FAE9E2 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C00592182C59D23000FAE9E2 /* Preview Assets.xcassets */; };\n\t\tC00592232C59D23100FAE9E2 /* DemoAppTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C00592222C59D23100FAE9E2 /* DemoAppTests.swift */; };\n\t\tC005922D2C59D23100FAE9E2 /* DemoAppUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C005922C2C59D23100FAE9E2 /* DemoAppUITests.swift */; };\n\t\tC005922F2C59D23100FAE9E2 /* DemoAppUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C005922E2C59D23100FAE9E2 /* DemoAppUITestsLaunchTests.swift */; };\n\t\tC005923E2C59D5BC00FAE9E2 /* ContributionChart in Frameworks */ = {isa = PBXBuildFile; productRef = C005923D2C59D5BC00FAE9E2 /* ContributionChart */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\tC005921F2C59D23000FAE9E2 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = C00592062C59D22F00FAE9E2 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = C005920D2C59D22F00FAE9E2;\n\t\t\tremoteInfo = DemoApp;\n\t\t};\n\t\tC00592292C59D23100FAE9E2 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = C00592062C59D22F00FAE9E2 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = C005920D2C59D22F00FAE9E2;\n\t\t\tremoteInfo = DemoApp;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\tC005920E2C59D22F00FAE9E2 /* DemoApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DemoApp.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tC00592112C59D22F00FAE9E2 /* DemoAppApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoAppApp.swift; sourceTree = \"<group>\"; };\n\t\tC00592132C59D22F00FAE9E2 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = \"<group>\"; };\n\t\tC00592152C59D23000FAE9E2 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\tC00592182C59D23000FAE9E2 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = \"Preview Assets.xcassets\"; sourceTree = \"<group>\"; };\n\t\tC005921E2C59D23000FAE9E2 /* DemoAppTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DemoAppTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tC00592222C59D23100FAE9E2 /* DemoAppTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoAppTests.swift; sourceTree = \"<group>\"; };\n\t\tC00592282C59D23100FAE9E2 /* DemoAppUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DemoAppUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tC005922C2C59D23100FAE9E2 /* DemoAppUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoAppUITests.swift; sourceTree = \"<group>\"; };\n\t\tC005922E2C59D23100FAE9E2 /* DemoAppUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoAppUITestsLaunchTests.swift; sourceTree = \"<group>\"; };\n\t\tC005923C2C59D57200FAE9E2 /* SwiftUI-ContributionChart */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = \"SwiftUI-ContributionChart\"; path = ../..; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tC005920B2C59D22F00FAE9E2 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tC005923E2C59D5BC00FAE9E2 /* ContributionChart in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tC005921B2C59D23000FAE9E2 /* 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\tC00592252C59D23100FAE9E2 /* 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\tC00592052C59D22F00FAE9E2 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC00592102C59D22F00FAE9E2 /* DemoApp */,\n\t\t\t\tC00592212C59D23100FAE9E2 /* DemoAppTests */,\n\t\t\t\tC005922B2C59D23100FAE9E2 /* DemoAppUITests */,\n\t\t\t\tC005920F2C59D22F00FAE9E2 /* Products */,\n\t\t\t\tC005923B2C59D57200FAE9E2 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tC005920F2C59D22F00FAE9E2 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC005920E2C59D22F00FAE9E2 /* DemoApp.app */,\n\t\t\t\tC005921E2C59D23000FAE9E2 /* DemoAppTests.xctest */,\n\t\t\t\tC00592282C59D23100FAE9E2 /* DemoAppUITests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tC00592102C59D22F00FAE9E2 /* DemoApp */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC00592112C59D22F00FAE9E2 /* DemoAppApp.swift */,\n\t\t\t\tC00592132C59D22F00FAE9E2 /* ContentView.swift */,\n\t\t\t\tC00592152C59D23000FAE9E2 /* Assets.xcassets */,\n\t\t\t\tC00592172C59D23000FAE9E2 /* Preview Content */,\n\t\t\t);\n\t\t\tpath = DemoApp;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tC00592172C59D23000FAE9E2 /* Preview Content */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC00592182C59D23000FAE9E2 /* Preview Assets.xcassets */,\n\t\t\t);\n\t\t\tpath = \"Preview Content\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tC00592212C59D23100FAE9E2 /* DemoAppTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC00592222C59D23100FAE9E2 /* DemoAppTests.swift */,\n\t\t\t);\n\t\t\tpath = DemoAppTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tC005922B2C59D23100FAE9E2 /* DemoAppUITests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC005922C2C59D23100FAE9E2 /* DemoAppUITests.swift */,\n\t\t\t\tC005922E2C59D23100FAE9E2 /* DemoAppUITestsLaunchTests.swift */,\n\t\t\t);\n\t\t\tpath = DemoAppUITests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tC005923B2C59D57200FAE9E2 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC005923C2C59D57200FAE9E2 /* SwiftUI-ContributionChart */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\tC005920D2C59D22F00FAE9E2 /* DemoApp */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = C00592322C59D23100FAE9E2 /* Build configuration list for PBXNativeTarget \"DemoApp\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tC005920A2C59D22F00FAE9E2 /* Sources */,\n\t\t\t\tC005920B2C59D22F00FAE9E2 /* Frameworks */,\n\t\t\t\tC005920C2C59D22F00FAE9E2 /* 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 = DemoApp;\n\t\t\tpackageProductDependencies = (\n\t\t\t\tC005923D2C59D5BC00FAE9E2 /* ContributionChart */,\n\t\t\t);\n\t\t\tproductName = DemoApp;\n\t\t\tproductReference = C005920E2C59D22F00FAE9E2 /* DemoApp.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\tC005921D2C59D23000FAE9E2 /* DemoAppTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = C00592352C59D23100FAE9E2 /* Build configuration list for PBXNativeTarget \"DemoAppTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tC005921A2C59D23000FAE9E2 /* Sources */,\n\t\t\t\tC005921B2C59D23000FAE9E2 /* Frameworks */,\n\t\t\t\tC005921C2C59D23000FAE9E2 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tC00592202C59D23000FAE9E2 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = DemoAppTests;\n\t\t\tproductName = DemoAppTests;\n\t\t\tproductReference = C005921E2C59D23000FAE9E2 /* DemoAppTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\tC00592272C59D23100FAE9E2 /* DemoAppUITests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = C00592382C59D23100FAE9E2 /* Build configuration list for PBXNativeTarget \"DemoAppUITests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tC00592242C59D23100FAE9E2 /* Sources */,\n\t\t\t\tC00592252C59D23100FAE9E2 /* Frameworks */,\n\t\t\t\tC00592262C59D23100FAE9E2 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tC005922A2C59D23100FAE9E2 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = DemoAppUITests;\n\t\t\tproductName = DemoAppUITests;\n\t\t\tproductReference = C00592282C59D23100FAE9E2 /* DemoAppUITests.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\tC00592062C59D22F00FAE9E2 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = 1;\n\t\t\t\tLastSwiftUpdateCheck = 1540;\n\t\t\t\tLastUpgradeCheck = 1540;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\tC005920D2C59D22F00FAE9E2 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 15.4;\n\t\t\t\t\t};\n\t\t\t\t\tC005921D2C59D23000FAE9E2 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 15.4;\n\t\t\t\t\t\tTestTargetID = C005920D2C59D22F00FAE9E2;\n\t\t\t\t\t};\n\t\t\t\t\tC00592272C59D23100FAE9E2 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 15.4;\n\t\t\t\t\t\tTestTargetID = C005920D2C59D22F00FAE9E2;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = C00592092C59D22F00FAE9E2 /* Build configuration list for PBXProject \"DemoApp\" */;\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 = C00592052C59D22F00FAE9E2;\n\t\t\tproductRefGroup = C005920F2C59D22F00FAE9E2 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tC005920D2C59D22F00FAE9E2 /* DemoApp */,\n\t\t\t\tC005921D2C59D23000FAE9E2 /* DemoAppTests */,\n\t\t\t\tC00592272C59D23100FAE9E2 /* DemoAppUITests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tC005920C2C59D22F00FAE9E2 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tC00592192C59D23000FAE9E2 /* Preview Assets.xcassets in Resources */,\n\t\t\t\tC00592162C59D23000FAE9E2 /* Assets.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tC005921C2C59D23000FAE9E2 /* 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\tC00592262C59D23100FAE9E2 /* 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\tC005920A2C59D22F00FAE9E2 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tC00592142C59D22F00FAE9E2 /* ContentView.swift in Sources */,\n\t\t\t\tC00592122C59D22F00FAE9E2 /* DemoAppApp.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tC005921A2C59D23000FAE9E2 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tC00592232C59D23100FAE9E2 /* DemoAppTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tC00592242C59D23100FAE9E2 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tC005922D2C59D23100FAE9E2 /* DemoAppUITests.swift in Sources */,\n\t\t\t\tC005922F2C59D23100FAE9E2 /* DemoAppUITestsLaunchTests.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\tC00592202C59D23000FAE9E2 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = C005920D2C59D22F00FAE9E2 /* DemoApp */;\n\t\t\ttargetProxy = C005921F2C59D23000FAE9E2 /* PBXContainerItemProxy */;\n\t\t};\n\t\tC005922A2C59D23100FAE9E2 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = C005920D2C59D22F00FAE9E2 /* DemoApp */;\n\t\t\ttargetProxy = C00592292C59D23100FAE9E2 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\tC00592302C59D23100FAE9E2 /* 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.5;\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\tC00592312C59D23100FAE9E2 /* 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.5;\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\tC00592332C59D23100FAE9E2 /* 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 = \"\\\"DemoApp/Preview Content\\\"\";\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 = com.qutian.DemoApp;\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\tC00592342C59D23100FAE9E2 /* 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 = \"\\\"DemoApp/Preview Content\\\"\";\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 = com.qutian.DemoApp;\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\tC00592362C59D23100FAE9E2 /* 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\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 17.5;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.qutian.DemoAppTests;\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)/DemoApp.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/DemoApp\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tC00592372C59D23100FAE9E2 /* 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\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 17.5;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.qutian.DemoAppTests;\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)/DemoApp.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/DemoApp\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tC00592392C59D23100FAE9E2 /* 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\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.qutian.DemoAppUITests;\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 = DemoApp;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tC005923A2C59D23100FAE9E2 /* 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\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.qutian.DemoAppUITests;\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 = DemoApp;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tC00592092C59D22F00FAE9E2 /* Build configuration list for PBXProject \"DemoApp\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tC00592302C59D23100FAE9E2 /* Debug */,\n\t\t\t\tC00592312C59D23100FAE9E2 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tC00592322C59D23100FAE9E2 /* Build configuration list for PBXNativeTarget \"DemoApp\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tC00592332C59D23100FAE9E2 /* Debug */,\n\t\t\t\tC00592342C59D23100FAE9E2 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tC00592352C59D23100FAE9E2 /* Build configuration list for PBXNativeTarget \"DemoAppTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tC00592362C59D23100FAE9E2 /* Debug */,\n\t\t\t\tC00592372C59D23100FAE9E2 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tC00592382C59D23100FAE9E2 /* Build configuration list for PBXNativeTarget \"DemoAppUITests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tC00592392C59D23100FAE9E2 /* Debug */,\n\t\t\t\tC005923A2C59D23100FAE9E2 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\tC005923D2C59D5BC00FAE9E2 /* ContributionChart */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = ContributionChart;\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = C00592062C59D22F00FAE9E2 /* Project object */;\n}\n"
  },
  {
    "path": "DemoApp/DemoApp/DemoApp.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": "DemoApp/DemoApp/DemoApp.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": "DemoApp/DemoApp/DemoAppTests/DemoAppTests.swift",
    "content": "//\n//  DemoAppTests.swift\n//  DemoAppTests\n//\n//  Created by Qu Tian on 2024/7/31.\n//\n\nimport XCTest\n@testable import DemoApp\n\nfinal class DemoAppTests: 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": "DemoApp/DemoApp/DemoAppUITests/DemoAppUITests.swift",
    "content": "//\n//  DemoAppUITests.swift\n//  DemoAppUITests\n//\n//  Created by Qu Tian on 2024/7/31.\n//\n\nimport XCTest\n\nfinal class DemoAppUITests: 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": "DemoApp/DemoApp/DemoAppUITests/DemoAppUITestsLaunchTests.swift",
    "content": "//\n//  DemoAppUITestsLaunchTests.swift\n//  DemoAppUITests\n//\n//  Created by Qu Tian on 2024/7/31.\n//\n\nimport XCTest\n\nfinal class DemoAppUITestsLaunchTests: 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": "Package.swift",
    "content": "// swift-tools-version: 5.6\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: \"ContributionChart\",\n    platforms: [\n        .iOS(.v13), .macOS(.v10_15), .tvOS(.v13), .watchOS(.v6)\n    ],\n    products: [\n        // Products define the executables and libraries a package produces, and make them visible to other packages.\n        .library(\n            name: \"ContributionChart\",\n            targets: [\"ContributionChart\"]),\n    ],\n    dependencies: [\n        // Dependencies declare other packages that this package depends on.\n        // .package(url: /* package url */, from: \"1.0.0\"),\n    ],\n    targets: [\n        // Targets are the basic building blocks of a package. A target can define a module or a test suite.\n        // Targets can depend on other targets in this package, and on products in packages this package depends on.\n        .target(\n            name: \"ContributionChart\",\n            dependencies: [])\n    ]\n)\n"
  },
  {
    "path": "README.md",
    "content": "# ContributionChart\n\nA contribution chart (aka. heatmap, GitHub-like) library for iOS, macOS, and watchOS.\n\n100% written in SwiftUI.\n\n<img src=\"https://user-images.githubusercontent.com/78488529/183985880-614250a8-7d9d-4bfe-96b3-08d95d90d6e1.png\" width=\"120\" height=\"150\"><img src=\"https://user-images.githubusercontent.com/78488529/183985888-6724caf4-4f77-4467-9d0b-4e202159ef89.png\" width=\"120\" height=\"150\"><img src=\"https://user-images.githubusercontent.com/78488529/183985895-22ae2cd3-15d7-404f-acd8-2ecee6c74ae3.png\" width=\"120\" height=\"150\">\n\n- [It Supports](#it-supports)\n  * [Custom Block Number](#custom-block-number)\n  * [Custom Block Color](#custom-block-color)\n  * [Dark mode](#dark-mode)\n- [Installation](#installation)\n- [Usage](#usage)\n- [Demo Code](#demo-code)\n\nUpdates\n- 7/31/24 Support input array with any length and add a demo app inside.\n\n# It Supports\n## Custom Block Number\nOf course, you can also custom the **size** of blocks and **spacing** between blocks.\n\n<img src=\"https://user-images.githubusercontent.com/78488529/183973081-d743c369-8f61-4c72-a211-b51183bf28f2.JPEG\" width=\"255\" height=\"482\"> <img src=\"https://user-images.githubusercontent.com/78488529/183973087-22c09508-c9d1-4a77-b87c-dfbd4a4ded63.JPEG\" width=\"255\" height=\"482\">\n\n## Custom Block Color\nHere are examples using **system colors** as below, and you can custom any color you like.\n\n<img src=\"https://user-images.githubusercontent.com/78488529/183974533-5c3ae4ae-3530-458e-999a-f87a3924b185.JPEG\" width=\"255\" height=\"482\"> <img src=\"https://user-images.githubusercontent.com/78488529/183974538-4e14da58-bb4e-4c6a-9c2b-61aab28d3aef.JPEG\" width=\"255\" height=\"482\"> <img src=\"https://user-images.githubusercontent.com/78488529/183974546-04dd557d-5a59-42fc-bbde-4fbb0b9566ab.JPEG\" width=\"255\" height=\"482\">\n\n## Dark mode\nAdjust to dark mode color automatically.\n\n<img src=\"https://user-images.githubusercontent.com/78488529/183975854-60e806c4-5aa8-4adf-8e7c-840fe75c598c.JPEG\" width=\"255\" height=\"482\">\n\n# Installation\nRequire iOS 13, macOS 10.15, watchOS 6 and Xcode 11 or higher.\nIn Xcode go to `File -> Swift Packages -> Add Package Dependency` \nand paste in the repo's url: \n\n`https://github.com/VIkill33/SwiftUI-ContributionChart.git`\n\nOr you can download the code of this repo, then `Add Local...` in Xcode, and open the folder of the repo.\n\n# Usage\n- Import this package after you installed by `import ContributionChart`\n- Use the chart like\n```swift\nContributionChartView(data: yourData,\n                      rows: yourRows,\n                      columns: yourColumns,\n                      targetValue: yourTargetValue,\n                      blockColor: .green)\n```\nyourData is (**a double array**), and the targetValue is recommanded to set to the max value of the array.\n\nThe color of a block will appear as exactly the color as parameter `blockColor` when its value is equal to `targetValue`, and appears light gray when is equal to zero.\n\nThe top-Leading block represents the first value in array, while the bottom-trailing represents the last. And the order follows as below:\n\n<img src=\"https://user-images.githubusercontent.com/78488529/183982320-7c8b9d00-7bfb-4701-b2a6-b371cb9996c2.JPEG\" width=\"255\" height=\"482\">\n\n# Demo Code\n```swift\nimport SwiftUI\nimport ContributionChart\n\nstruct ContentView: View {\n    var data: [Double]\n    let rows = 7\n    let columns = 14\n    \n    init() {\n        data = [0.3, 0.4, 0.4, 0.4, 0.1, 0.5, 0.0, 0.1, 0.0, 0.2, 0.2, 0.2, 0.0, 0.2, 0.2, 0.5, 0.4, 0.2, 0.4, 0.5, 0.2, 0.2, 0.4, 0.3, 0.3, 0.2, 0.4, 0.0, 0.0, 0.5, 0.4, 0.3, 0.5, 0.3, 0.0, 0.0, 0.1, 0.0, 0.2, 0.3, 0.0, 0.0, 0.0, 0.5, 0.3, 0.3, 0.0, 0.3, 0.0, 0.5, 0.3, 0.3, 0.4, 0.5, 0.5, 0.3, 0.4, 0.1, 0.4, 0.2, 0.5, 0.1, 0.4, 0.2, 0.5, 0.4, 0.3, 0.5, 0.0, 0.4, 0.3, 0.2, 0.1, 0.5, 0.2, 0.0, 0.2, 0.5, 0.5, 0.3, 0.4, 0.0, 0.3, 0.3, 0.1, 0.2, 0.5, 0.2, 0.1, 0.4, 0.4, 0.0, 0.5, 0.3, 0.3, 0.5, 0.0, 0.2]\n    }\n    \n    var body: some View {\n                ContributionChartView(data: data,\n                                      rows: rows,\n                                      columns: columns,\n                                      targetValue: 0.5,\n                                      blockColor: .green)\n        }\n    }\n\n\nstruct ContentView_Previews: PreviewProvider {\n    static var previews: some View {\n        ContentView()\n    }\n}\n\n```\n"
  },
  {
    "path": "Sources/ContributionChart/ContributionChartTest.swift",
    "content": "//\n//  SwiftUIView.swift\n//  \n//\n//  Created by Vikill Blacks on 2023/2/2.\n//\n\nimport SwiftUI\n\nstruct SwiftUIView: View {\n    var body: some View {\n        ContributionChartView(data: [0,3,4,2,4,2,5,1,3], rows: 3, columns: 3, targetValue: 5, RectangleRadius: 2.0)\n    }\n}\n\nstruct SwiftUIView_Previews: PreviewProvider {\n    static var previews: some View {\n        SwiftUIView()\n            //.preferredColorScheme(.dark)\n    }\n}\n"
  },
  {
    "path": "Sources/ContributionChart/ContributionChartView.swift",
    "content": "import SwiftUI\n\n@available(iOS 13, macOS 10.15, watchOS 6, *)\npublic struct ContributionChartView: View {\n    \n    var data: [Double]\n    var rows: Int\n    var columns: Int\n    var targetValue: Double\n    var blockColor: Color = Color.green\n    var blockBackgroundColor: Color = Color.background\n    \n    var heatMapRectangleWidth: Double = 20.0\n    var heatMapRectangleSpacing: Double = 2.0\n    var heatMapRectangleRadius: Double = 5.0\n    \n    public init(data: [Double], rows: Int, columns: Int, targetValue: Double, blockColor: Color = Color.green, blockBackgroundColor: Color, RectangleWidth: Double = 20.0, RectangleSpacing: Double = 2.0, RectangleRadius: Double = 5.0){\n        self.data = data\n        self.rows = rows\n        self.columns = columns\n        self.targetValue = targetValue\n        self.blockColor = blockColor\n        self.blockBackgroundColor = blockBackgroundColor\n        self.heatMapRectangleWidth = RectangleWidth\n        self.heatMapRectangleSpacing = RectangleSpacing\n        self.heatMapRectangleRadius = RectangleRadius\n    }\n    \n    public init(data: [Double], rows: Int, columns: Int, targetValue: Double, blockColor: Color = Color.green, RectangleWidth: Double = 20.0, RectangleSpacing: Double = 2.0, RectangleRadius: Double = 5.0){\n        self.data = data\n        self.rows = rows\n        self.columns = columns\n        if data.count < rows * columns {\n            let elementsToAdd = Array(repeating: 0.0, count: rows * columns - data.count)\n            self.data.append(contentsOf: elementsToAdd)\n        }\n        self.targetValue = targetValue\n        self.blockColor = blockColor\n        self.heatMapRectangleWidth = RectangleWidth\n        self.heatMapRectangleSpacing = RectangleSpacing\n        self.heatMapRectangleRadius = RectangleRadius\n    }\n    \n    public var body: some View {\n        VStack {\n            // Chart\n            GeometryReader { geo in\n                ZStack {\n                    HStack(spacing: heatMapRectangleSpacing) {\n                        ForEach(0..<columns, id: \\.self) { i in\n                            let start = i * rows\n                            let end = (i + 1) * rows\n                            let splitedData = Array(data[start..<end])\n                            ContributionChartRowView(rowData: splitedData,\n                                                     rows: rows,\n                                                     targetValue: targetValue,\n                                                     blockColor: blockColor,\n                                                     blockBackgroundColor: blockBackgroundColor,\n                                                     heatMapRectangleWidth: heatMapRectangleWidth,\n                                                     heatMapRectangleSpacing: heatMapRectangleSpacing,\n                                                     heatMapRectangleRadius: heatMapRectangleRadius\n                            )\n                        }\n                    }\n                }\n                .frame(width: geo.size.width, height: geo.size.height, alignment: .center)\n                .onAppear {\n                    print(geo.size.width, geo.size.height)\n                }\n            }\n        }\n        .padding()\n        \n    }\n}\n\nstruct ContributionChartRowView: View {\n    @Environment(\\.colorScheme) var colorScheme\n    \n    var rowData: [Double]\n    var rows: Int\n    var targetValue: Double\n    var blockColor: Color\n    var blockBackgroundColor: Color\n    var heatMapRectangleWidth: Double\n    var heatMapRectangleSpacing: Double\n    var heatMapRectangleRadius: Double\n    \n    var body: some View {\n        VStack(spacing: heatMapRectangleSpacing) {\n            ForEach(0..<rows, id: \\.self) { index in\n                ZStack {\n                    RoundedRectangle(cornerRadius: heatMapRectangleRadius)\n                        .frame(width: heatMapRectangleWidth, height: heatMapRectangleWidth, alignment: .center\n                        )\n                        .foregroundColor(blockBackgroundColor)\n                    RoundedRectangle(cornerRadius: heatMapRectangleRadius)\n                        .frame(width: heatMapRectangleWidth, height: heatMapRectangleWidth, alignment: .center)\n                        .foregroundColor(blockColor\n                            .opacity(opacityRatio(index: index)))\n                }\n            }\n        }\n        .onAppear() {\n            print(rowData)\n        }\n    }\n    \n    func opacityRatio(index: Int) -> Double {\n        let opacityRatio: Double = Double(rowData[index]) / Double(targetValue)\n        return opacityRatio > 1.0 ? 1.0 : opacityRatio\n    }\n    \n}\n\nextension Color {\n    init(hexString: String) {\n        let hex = hexString.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)\n        var int = UInt64()\n        Scanner(string: hex).scanHexInt64(&int)\n        let r, g, b: UInt64\n        switch hex.count {\n        case 3: // RGB (12-bit)\n            (r, g, b) = ((int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17)\n        case 6: // RGB (24-bit)\n            (r, g, b) = (int >> 16, int >> 8 & 0xFF, int & 0xFF)\n        case 8: // ARGB (32-bit)\n            (r, g, b) = (int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF)\n        default:\n            (r, g, b) = (0, 0, 0)\n        }\n        self.init(red: Double(r) / 255, green: Double(g) / 255, blue: Double(b) / 255)\n    }\n#if os(macOS)\n    static let background = Color(NSColor.windowBackgroundColor)\n    static let secondaryBackground = Color(NSColor.underPageBackgroundColor)\n    static let tertiaryBackground = Color(NSColor.controlBackgroundColor)\n#endif\n#if os(iOS)\n    static let background = Color(UIColor.systemBackground)\n    static let secondaryBackground = Color(UIColor.secondarySystemBackground)\n    static let tertiaryBackground = Color(UIColor.tertiarySystemBackground)\n#endif\n#if os(watchOS)\n    static let background = Color.black\n#endif\n}\n"
  }
]