Add Dotfiles Xcode project, with ShellLog target for logging shell stuff to os_log facilities
This commit is contained in:
		
							parent
							
								
									a0cd8f4680
								
							
						
					
					
						commit
						d91d7ca90b
					
				
					 5 changed files with 408 additions and 0 deletions
				
			
		
							
								
								
									
										320
									
								
								Dotfiles/Dotfiles.xcodeproj/project.pbxproj
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										320
									
								
								Dotfiles/Dotfiles.xcodeproj/project.pbxproj
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,320 @@ | |||
| // !$*UTF8*$! | ||||
| { | ||||
| 	archiveVersion = 1; | ||||
| 	classes = { | ||||
| 	}; | ||||
| 	objectVersion = 55; | ||||
| 	objects = { | ||||
| 
 | ||||
| /* Begin PBXBuildFile section */ | ||||
| 		C084FC452797B3C100915D6A /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = C084FC442797B3C100915D6A /* main.swift */; }; | ||||
| 		C084FC4B2797B3EC00915D6A /* ArgumentParser in Frameworks */ = {isa = PBXBuildFile; productRef = C084FC4A2797B3EC00915D6A /* ArgumentParser */; }; | ||||
| /* End PBXBuildFile section */ | ||||
| 
 | ||||
| /* Begin PBXCopyFilesBuildPhase section */ | ||||
| 		C084FC3F2797B3C100915D6A /* CopyFiles */ = { | ||||
| 			isa = PBXCopyFilesBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			dstPath = /usr/share/man/man1/; | ||||
| 			dstSubfolderSpec = 0; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 1; | ||||
| 		}; | ||||
| /* End PBXCopyFilesBuildPhase section */ | ||||
| 
 | ||||
| /* Begin PBXFileReference section */ | ||||
| 		C084FC412797B3C100915D6A /* ShellLog */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ShellLog; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
| 		C084FC442797B3C100915D6A /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = "<group>"; }; | ||||
| /* End PBXFileReference section */ | ||||
| 
 | ||||
| /* Begin PBXFrameworksBuildPhase section */ | ||||
| 		C084FC3E2797B3C100915D6A /* Frameworks */ = { | ||||
| 			isa = PBXFrameworksBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 				C084FC4B2797B3EC00915D6A /* ArgumentParser in Frameworks */, | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| /* End PBXFrameworksBuildPhase section */ | ||||
| 
 | ||||
| /* Begin PBXGroup section */ | ||||
| 		C084FC362797B39E00915D6A = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				C084FC432797B3C100915D6A /* ShellLog */, | ||||
| 				C084FC422797B3C100915D6A /* Products */, | ||||
| 			); | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		C084FC422797B3C100915D6A /* Products */ = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				C084FC412797B3C100915D6A /* ShellLog */, | ||||
| 			); | ||||
| 			name = Products; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		C084FC432797B3C100915D6A /* ShellLog */ = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				C084FC442797B3C100915D6A /* main.swift */, | ||||
| 			); | ||||
| 			path = ShellLog; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| /* End PBXGroup section */ | ||||
| 
 | ||||
| /* Begin PBXNativeTarget section */ | ||||
| 		C084FC402797B3C100915D6A /* ShellLog */ = { | ||||
| 			isa = PBXNativeTarget; | ||||
| 			buildConfigurationList = C084FC462797B3C100915D6A /* Build configuration list for PBXNativeTarget "ShellLog" */; | ||||
| 			buildPhases = ( | ||||
| 				C084FC3D2797B3C100915D6A /* Sources */, | ||||
| 				C084FC3E2797B3C100915D6A /* Frameworks */, | ||||
| 				C084FC3F2797B3C100915D6A /* CopyFiles */, | ||||
| 			); | ||||
| 			buildRules = ( | ||||
| 			); | ||||
| 			dependencies = ( | ||||
| 			); | ||||
| 			name = ShellLog; | ||||
| 			packageProductDependencies = ( | ||||
| 				C084FC4A2797B3EC00915D6A /* ArgumentParser */, | ||||
| 			); | ||||
| 			productName = ShellLog; | ||||
| 			productReference = C084FC412797B3C100915D6A /* ShellLog */; | ||||
| 			productType = "com.apple.product-type.tool"; | ||||
| 		}; | ||||
| /* End PBXNativeTarget section */ | ||||
| 
 | ||||
| /* Begin PBXProject section */ | ||||
| 		C084FC372797B39E00915D6A /* Project object */ = { | ||||
| 			isa = PBXProject; | ||||
| 			attributes = { | ||||
| 				BuildIndependentTargetsInParallel = 1; | ||||
| 				LastSwiftUpdateCheck = 1320; | ||||
| 				LastUpgradeCheck = 1320; | ||||
| 				TargetAttributes = { | ||||
| 					C084FC402797B3C100915D6A = { | ||||
| 						CreatedOnToolsVersion = 13.2.1; | ||||
| 					}; | ||||
| 				}; | ||||
| 			}; | ||||
| 			buildConfigurationList = C084FC3A2797B39E00915D6A /* Build configuration list for PBXProject "Dotfiles" */; | ||||
| 			compatibilityVersion = "Xcode 13.0"; | ||||
| 			developmentRegion = en; | ||||
| 			hasScannedForEncodings = 0; | ||||
| 			knownRegions = ( | ||||
| 				en, | ||||
| 				Base, | ||||
| 			); | ||||
| 			mainGroup = C084FC362797B39E00915D6A; | ||||
| 			packageReferences = ( | ||||
| 				C084FC492797B3EC00915D6A /* XCRemoteSwiftPackageReference "swift-argument-parser" */, | ||||
| 			); | ||||
| 			productRefGroup = C084FC422797B3C100915D6A /* Products */; | ||||
| 			projectDirPath = ""; | ||||
| 			projectRoot = ""; | ||||
| 			targets = ( | ||||
| 				C084FC402797B3C100915D6A /* ShellLog */, | ||||
| 			); | ||||
| 		}; | ||||
| /* End PBXProject section */ | ||||
| 
 | ||||
| /* Begin PBXSourcesBuildPhase section */ | ||||
| 		C084FC3D2797B3C100915D6A /* Sources */ = { | ||||
| 			isa = PBXSourcesBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 				C084FC452797B3C100915D6A /* main.swift in Sources */, | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| /* End PBXSourcesBuildPhase section */ | ||||
| 
 | ||||
| /* Begin XCBuildConfiguration section */ | ||||
| 		C084FC3B2797B39E00915D6A /* Debug */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 			}; | ||||
| 			name = Debug; | ||||
| 		}; | ||||
| 		C084FC3C2797B39E00915D6A /* Release */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 			}; | ||||
| 			name = Release; | ||||
| 		}; | ||||
| 		C084FC472797B3C100915D6A /* Debug */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				ALWAYS_SEARCH_USER_PATHS = NO; | ||||
| 				CLANG_ANALYZER_NONNULL = YES; | ||||
| 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; | ||||
| 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; | ||||
| 				CLANG_CXX_LIBRARY = "libc++"; | ||||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CLANG_ENABLE_OBJC_ARC = YES; | ||||
| 				CLANG_ENABLE_OBJC_WEAK = YES; | ||||
| 				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; | ||||
| 				CLANG_WARN_BOOL_CONVERSION = YES; | ||||
| 				CLANG_WARN_COMMA = YES; | ||||
| 				CLANG_WARN_CONSTANT_CONVERSION = YES; | ||||
| 				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; | ||||
| 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | ||||
| 				CLANG_WARN_DOCUMENTATION_COMMENTS = YES; | ||||
| 				CLANG_WARN_EMPTY_BODY = YES; | ||||
| 				CLANG_WARN_ENUM_CONVERSION = YES; | ||||
| 				CLANG_WARN_INFINITE_RECURSION = YES; | ||||
| 				CLANG_WARN_INT_CONVERSION = YES; | ||||
| 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; | ||||
| 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; | ||||
| 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; | ||||
| 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | ||||
| 				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; | ||||
| 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; | ||||
| 				CLANG_WARN_STRICT_PROTOTYPES = YES; | ||||
| 				CLANG_WARN_SUSPICIOUS_MOVE = YES; | ||||
| 				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; | ||||
| 				CLANG_WARN_UNREACHABLE_CODE = YES; | ||||
| 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | ||||
| 				CODE_SIGN_STYLE = Automatic; | ||||
| 				COPY_PHASE_STRIP = NO; | ||||
| 				DEBUG_INFORMATION_FORMAT = dwarf; | ||||
| 				DEVELOPMENT_TEAM = 78372RE6B4; | ||||
| 				ENABLE_HARDENED_RUNTIME = YES; | ||||
| 				ENABLE_STRICT_OBJC_MSGSEND = YES; | ||||
| 				ENABLE_TESTABILITY = YES; | ||||
| 				GCC_C_LANGUAGE_STANDARD = gnu11; | ||||
| 				GCC_DYNAMIC_NO_PIC = NO; | ||||
| 				GCC_NO_COMMON_BLOCKS = YES; | ||||
| 				GCC_OPTIMIZATION_LEVEL = 0; | ||||
| 				GCC_PREPROCESSOR_DEFINITIONS = ( | ||||
| 					"DEBUG=1", | ||||
| 					"$(inherited)", | ||||
| 				); | ||||
| 				GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | ||||
| 				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | ||||
| 				GCC_WARN_UNDECLARED_SELECTOR = YES; | ||||
| 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||||
| 				GCC_WARN_UNUSED_FUNCTION = YES; | ||||
| 				GCC_WARN_UNUSED_VARIABLE = YES; | ||||
| 				INSTALL_PATH = "$(HOME)/bin"; | ||||
| 				MACOSX_DEPLOYMENT_TARGET = 11.6; | ||||
| 				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; | ||||
| 				MTL_FAST_MATH = YES; | ||||
| 				ONLY_ACTIVE_ARCH = YES; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				SDKROOT = macosx; | ||||
| 				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; | ||||
| 				SWIFT_OPTIMIZATION_LEVEL = "-Onone"; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 			}; | ||||
| 			name = Debug; | ||||
| 		}; | ||||
| 		C084FC482797B3C100915D6A /* Release */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				ALWAYS_SEARCH_USER_PATHS = NO; | ||||
| 				CLANG_ANALYZER_NONNULL = YES; | ||||
| 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; | ||||
| 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; | ||||
| 				CLANG_CXX_LIBRARY = "libc++"; | ||||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CLANG_ENABLE_OBJC_ARC = YES; | ||||
| 				CLANG_ENABLE_OBJC_WEAK = YES; | ||||
| 				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; | ||||
| 				CLANG_WARN_BOOL_CONVERSION = YES; | ||||
| 				CLANG_WARN_COMMA = YES; | ||||
| 				CLANG_WARN_CONSTANT_CONVERSION = YES; | ||||
| 				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; | ||||
| 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | ||||
| 				CLANG_WARN_DOCUMENTATION_COMMENTS = YES; | ||||
| 				CLANG_WARN_EMPTY_BODY = YES; | ||||
| 				CLANG_WARN_ENUM_CONVERSION = YES; | ||||
| 				CLANG_WARN_INFINITE_RECURSION = YES; | ||||
| 				CLANG_WARN_INT_CONVERSION = YES; | ||||
| 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; | ||||
| 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; | ||||
| 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; | ||||
| 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | ||||
| 				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; | ||||
| 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; | ||||
| 				CLANG_WARN_STRICT_PROTOTYPES = YES; | ||||
| 				CLANG_WARN_SUSPICIOUS_MOVE = YES; | ||||
| 				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; | ||||
| 				CLANG_WARN_UNREACHABLE_CODE = YES; | ||||
| 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | ||||
| 				CODE_SIGN_STYLE = Automatic; | ||||
| 				COPY_PHASE_STRIP = NO; | ||||
| 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; | ||||
| 				DEVELOPMENT_TEAM = 78372RE6B4; | ||||
| 				ENABLE_HARDENED_RUNTIME = YES; | ||||
| 				ENABLE_NS_ASSERTIONS = NO; | ||||
| 				ENABLE_STRICT_OBJC_MSGSEND = YES; | ||||
| 				GCC_C_LANGUAGE_STANDARD = gnu11; | ||||
| 				GCC_NO_COMMON_BLOCKS = YES; | ||||
| 				GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | ||||
| 				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | ||||
| 				GCC_WARN_UNDECLARED_SELECTOR = YES; | ||||
| 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||||
| 				GCC_WARN_UNUSED_FUNCTION = YES; | ||||
| 				GCC_WARN_UNUSED_VARIABLE = YES; | ||||
| 				INSTALL_PATH = "$(HOME)/bin"; | ||||
| 				MACOSX_DEPLOYMENT_TARGET = 11.6; | ||||
| 				MTL_ENABLE_DEBUG_INFO = NO; | ||||
| 				MTL_FAST_MATH = YES; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				SDKROOT = macosx; | ||||
| 				SWIFT_COMPILATION_MODE = wholemodule; | ||||
| 				SWIFT_OPTIMIZATION_LEVEL = "-O"; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 			}; | ||||
| 			name = Release; | ||||
| 		}; | ||||
| /* End XCBuildConfiguration section */ | ||||
| 
 | ||||
| /* Begin XCConfigurationList section */ | ||||
| 		C084FC3A2797B39E00915D6A /* Build configuration list for PBXProject "Dotfiles" */ = { | ||||
| 			isa = XCConfigurationList; | ||||
| 			buildConfigurations = ( | ||||
| 				C084FC3B2797B39E00915D6A /* Debug */, | ||||
| 				C084FC3C2797B39E00915D6A /* Release */, | ||||
| 			); | ||||
| 			defaultConfigurationIsVisible = 0; | ||||
| 			defaultConfigurationName = Release; | ||||
| 		}; | ||||
| 		C084FC462797B3C100915D6A /* Build configuration list for PBXNativeTarget "ShellLog" */ = { | ||||
| 			isa = XCConfigurationList; | ||||
| 			buildConfigurations = ( | ||||
| 				C084FC472797B3C100915D6A /* Debug */, | ||||
| 				C084FC482797B3C100915D6A /* Release */, | ||||
| 			); | ||||
| 			defaultConfigurationIsVisible = 0; | ||||
| 			defaultConfigurationName = Release; | ||||
| 		}; | ||||
| /* End XCConfigurationList section */ | ||||
| 
 | ||||
| /* Begin XCRemoteSwiftPackageReference section */ | ||||
| 		C084FC492797B3EC00915D6A /* XCRemoteSwiftPackageReference "swift-argument-parser" */ = { | ||||
| 			isa = XCRemoteSwiftPackageReference; | ||||
| 			repositoryURL = "https://github.com/apple/swift-argument-parser.git"; | ||||
| 			requirement = { | ||||
| 				kind = upToNextMajorVersion; | ||||
| 				minimumVersion = 1.0.0; | ||||
| 			}; | ||||
| 		}; | ||||
| /* End XCRemoteSwiftPackageReference section */ | ||||
| 
 | ||||
| /* Begin XCSwiftPackageProductDependency section */ | ||||
| 		C084FC4A2797B3EC00915D6A /* ArgumentParser */ = { | ||||
| 			isa = XCSwiftPackageProductDependency; | ||||
| 			package = C084FC492797B3EC00915D6A /* XCRemoteSwiftPackageReference "swift-argument-parser" */; | ||||
| 			productName = ArgumentParser; | ||||
| 		}; | ||||
| /* End XCSwiftPackageProductDependency section */ | ||||
| 	}; | ||||
| 	rootObject = C084FC372797B39E00915D6A /* Project object */; | ||||
| } | ||||
							
								
								
									
										7
									
								
								Dotfiles/Dotfiles.xcodeproj/project.xcworkspace/contents.xcworkspacedata
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Dotfiles/Dotfiles.xcodeproj/project.xcworkspace/contents.xcworkspacedata
									
										
									
										generated
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,7 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <Workspace | ||||
|    version = "1.0"> | ||||
|    <FileRef | ||||
|       location = "self:"> | ||||
|    </FileRef> | ||||
| </Workspace> | ||||
|  | @ -0,0 +1,8 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||
| <plist version="1.0"> | ||||
| <dict> | ||||
| 	<key>IDEDidComputeMac32BitWarning</key> | ||||
| 	<true/> | ||||
| </dict> | ||||
| </plist> | ||||
|  | @ -0,0 +1,16 @@ | |||
| { | ||||
|   "object": { | ||||
|     "pins": [ | ||||
|       { | ||||
|         "package": "swift-argument-parser", | ||||
|         "repositoryURL": "https://github.com/apple/swift-argument-parser.git", | ||||
|         "state": { | ||||
|           "branch": null, | ||||
|           "revision": "e1465042f195f374b94f915ba8ca49de24300a0d", | ||||
|           "version": "1.0.2" | ||||
|         } | ||||
|       } | ||||
|     ] | ||||
|   }, | ||||
|   "version": 1 | ||||
| } | ||||
							
								
								
									
										57
									
								
								Dotfiles/ShellLog/main.swift
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								Dotfiles/ShellLog/main.swift
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,57 @@ | |||
| // | ||||
| //  main.swift | ||||
| //  ShellLog | ||||
| // | ||||
| //  Created by Eryn Wells on 1/18/22. | ||||
| // | ||||
| 
 | ||||
| import ArgumentParser | ||||
| import OSLog | ||||
| 
 | ||||
| enum Level { | ||||
|     case Debug | ||||
|     case Info | ||||
|     case Warn | ||||
|     case Error | ||||
| } | ||||
| 
 | ||||
| extension Level: ExpressibleByArgument { | ||||
|     init?(argument: String) { | ||||
|         switch (argument) { | ||||
|         case "debug": | ||||
|             self = .Debug | ||||
|         case "info": | ||||
|             self = .Info | ||||
|         case "warn": | ||||
|             self = .Warn | ||||
|         case "error": | ||||
|             self = .Error | ||||
|         default: | ||||
|             return nil | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| struct ShellLog: ParsableCommand { | ||||
| 
 | ||||
|     @Option(name: .shortAndLong, help: "The log level") | ||||
|     var level: Level? | ||||
| 
 | ||||
|     @Argument() var message: String | ||||
| 
 | ||||
|     func run() throws { | ||||
|         let log = Logger(subsystem: "me.erynwells.shell", category: "Shell") | ||||
|         switch level { | ||||
|         case .some(.Debug): | ||||
|             log.debug("\(message, privacy: .public)") | ||||
|         case .none, .some(.Info): | ||||
|             log.info("\(message, privacy: .public)") | ||||
|         case .some(.Warn): | ||||
|             log.warning("\(message, privacy: .public)") | ||||
|         case .some(.Error): | ||||
|             log.error("\(message, privacy: .public)") | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| ShellLog.main() | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue