diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Info.plist b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Info.plist
new file mode 100644
index 0000000..01d943f
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Info.plist
@@ -0,0 +1,42 @@
+
+
+
+
+ BuildMachineOSBuild
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ SwiftGen_SwiftGenCLI
+ CFBundleIdentifier
+ SwiftGen.SwiftGenCLI.resources
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ SwiftGen_SwiftGenCLI
+ CFBundlePackageType
+ BNDL
+ CFBundleSupportedPlatforms
+
+ MacOSX
+
+ DTCompiler
+ com.apple.compilers.llvm.clang.1_0
+ DTPlatformBuild
+ 13A233
+ DTPlatformName
+ macosx
+ DTPlatformVersion
+ 11.3
+ DTSDKBuild
+ 20E214
+ DTSDKName
+ macosx11.3
+ DTXcode
+ 1300
+ DTXcodeBuild
+ 13A233
+ LSMinimumSystemVersion
+ 10.11
+
+
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/colors/literals-swift4.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/colors/literals-swift4.stencil
new file mode 100644
index 0000000..af60477
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/colors/literals-swift4.stencil
@@ -0,0 +1,43 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if palettes %}
+{% set enumName %}{{param.enumName|default:"ColorName"}}{% endset %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+#if os(macOS)
+ import AppKit
+ {% if enumName != 'NSColor' %}{{accessModifier}} enum {{enumName}} { }{% endif %}
+#elseif os(iOS) || os(tvOS) || os(watchOS)
+ import UIKit
+ {% if enumName != 'UIColor' %}{{accessModifier}} enum {{enumName}} { }{% endif %}
+#endif
+
+// swiftlint:disable superfluous_disable_command
+// swiftlint:disable file_length
+
+// MARK: - Colors
+
+// swiftlint:disable identifier_name line_length type_body_length
+{{accessModifier}} extension {{enumName}} {
+{% macro h2f hex %}{{hex|hexToInt|int255toFloat}}{% endmacro %}
+{% macro enumBlock colors accessPrefix %}
+ {% for color in colors %}
+ /// 0x{{color.red}}{{color.green}}{{color.blue}}{{color.alpha}} (r: {{color.red|hexToInt}}, g: {{color.green|hexToInt}}, b: {{color.blue|hexToInt}}, a: {{color.alpha|hexToInt}})
+ {{accessPrefix}}static let {{color.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = #colorLiteral(red: {% call h2f color.red %}, green: {% call h2f color.green %}, blue: {% call h2f color.blue %}, alpha: {% call h2f color.alpha %})
+ {% endfor %}
+{% endmacro %}
+ {% if palettes.count > 1 or param.forceFileNameEnum %}
+ {% set accessPrefix %}{{accessModifier}} {% endset %}
+ {% for palette in palettes %}
+ enum {{palette.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call enumBlock palette.colors accessPrefix %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call enumBlock palettes.first.colors "" %}
+ {% endif %}
+}
+// swiftlint:enable identifier_name line_length type_body_length
+{% else %}
+// No color found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/colors/literals-swift5.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/colors/literals-swift5.stencil
new file mode 100644
index 0000000..af60477
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/colors/literals-swift5.stencil
@@ -0,0 +1,43 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if palettes %}
+{% set enumName %}{{param.enumName|default:"ColorName"}}{% endset %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+#if os(macOS)
+ import AppKit
+ {% if enumName != 'NSColor' %}{{accessModifier}} enum {{enumName}} { }{% endif %}
+#elseif os(iOS) || os(tvOS) || os(watchOS)
+ import UIKit
+ {% if enumName != 'UIColor' %}{{accessModifier}} enum {{enumName}} { }{% endif %}
+#endif
+
+// swiftlint:disable superfluous_disable_command
+// swiftlint:disable file_length
+
+// MARK: - Colors
+
+// swiftlint:disable identifier_name line_length type_body_length
+{{accessModifier}} extension {{enumName}} {
+{% macro h2f hex %}{{hex|hexToInt|int255toFloat}}{% endmacro %}
+{% macro enumBlock colors accessPrefix %}
+ {% for color in colors %}
+ /// 0x{{color.red}}{{color.green}}{{color.blue}}{{color.alpha}} (r: {{color.red|hexToInt}}, g: {{color.green|hexToInt}}, b: {{color.blue|hexToInt}}, a: {{color.alpha|hexToInt}})
+ {{accessPrefix}}static let {{color.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = #colorLiteral(red: {% call h2f color.red %}, green: {% call h2f color.green %}, blue: {% call h2f color.blue %}, alpha: {% call h2f color.alpha %})
+ {% endfor %}
+{% endmacro %}
+ {% if palettes.count > 1 or param.forceFileNameEnum %}
+ {% set accessPrefix %}{{accessModifier}} {% endset %}
+ {% for palette in palettes %}
+ enum {{palette.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call enumBlock palette.colors accessPrefix %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call enumBlock palettes.first.colors "" %}
+ {% endif %}
+}
+// swiftlint:enable identifier_name line_length type_body_length
+{% else %}
+// No color found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/colors/swift4.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/colors/swift4.stencil
new file mode 100644
index 0000000..57c2d79
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/colors/swift4.stencil
@@ -0,0 +1,84 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if palettes %}
+{% set colorAlias %}{{param.colorAliasName|default:"Color"}}{% endset %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+#if os(macOS)
+ import AppKit.NSColor
+ {{accessModifier}} typealias {{colorAlias}} = NSColor
+#elseif os(iOS) || os(tvOS) || os(watchOS)
+ import UIKit.UIColor
+ {{accessModifier}} typealias {{colorAlias}} = UIColor
+#endif
+
+// swiftlint:disable superfluous_disable_command file_length implicit_return
+
+// MARK: - Colors
+
+// swiftlint:disable identifier_name line_length type_body_length
+{% set enumName %}{{param.enumName|default:"ColorName"}}{% endset %}
+{{accessModifier}} struct {{enumName}} {
+ {{accessModifier}} let rgbaValue: UInt32
+ {{accessModifier}} var color: {{colorAlias}} { return {{colorAlias}}(named: self) }
+
+{% macro rgbaValue color %}0x{{color.red}}{{color.green}}{{color.blue}}{{color.alpha}}{% endmacro %}
+{% macro enumBlock colors %}
+ {% for color in colors %}
+ ///
+ /// Alpha: {{color.alpha|hexToInt|int255toFloat|percent}}
(0x{{color.red}}{{color.green}}{{color.blue}}{{color.alpha}})
+ {{accessModifier}} static let {{color.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{enumName}}(rgbaValue: {% call rgbaValue color %})
+ {% endfor %}
+{% endmacro %}
+ {% if palettes.count > 1 or param.forceFileNameEnum %}
+ {% for palette in palettes %}
+ {{accessModifier}} enum {{palette.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call enumBlock palette.colors %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call enumBlock palettes.first.colors %}
+ {% endif %}
+}
+// swiftlint:enable identifier_name line_length type_body_length
+
+// MARK: - Implementation Details
+
+internal extension {{colorAlias}} {
+ convenience init(rgbaValue: UInt32) {
+ let components = RGBAComponents(rgbaValue: rgbaValue).normalized
+ self.init(red: components[0], green: components[1], blue: components[2], alpha: components[3])
+ }
+}
+
+private struct RGBAComponents {
+ let rgbaValue: UInt32
+
+ private var shifts: [UInt32] {
+ [
+ rgbaValue >> 24, // red
+ rgbaValue >> 16, // green
+ rgbaValue >> 8, // blue
+ rgbaValue // alpha
+ ]
+ }
+
+ private var components: [CGFloat] {
+ shifts.map {
+ CGFloat($0 & 0xff)
+ }
+ }
+
+ var normalized: [CGFloat] {
+ components.map { $0 / 255.0 }
+ }
+}
+
+{{accessModifier}} extension {{colorAlias}} {
+ convenience init(named color: {{enumName}}) {
+ self.init(rgbaValue: color.rgbaValue)
+ }
+}
+{% else %}
+// No color found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/colors/swift5.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/colors/swift5.stencil
new file mode 100644
index 0000000..57c2d79
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/colors/swift5.stencil
@@ -0,0 +1,84 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if palettes %}
+{% set colorAlias %}{{param.colorAliasName|default:"Color"}}{% endset %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+#if os(macOS)
+ import AppKit.NSColor
+ {{accessModifier}} typealias {{colorAlias}} = NSColor
+#elseif os(iOS) || os(tvOS) || os(watchOS)
+ import UIKit.UIColor
+ {{accessModifier}} typealias {{colorAlias}} = UIColor
+#endif
+
+// swiftlint:disable superfluous_disable_command file_length implicit_return
+
+// MARK: - Colors
+
+// swiftlint:disable identifier_name line_length type_body_length
+{% set enumName %}{{param.enumName|default:"ColorName"}}{% endset %}
+{{accessModifier}} struct {{enumName}} {
+ {{accessModifier}} let rgbaValue: UInt32
+ {{accessModifier}} var color: {{colorAlias}} { return {{colorAlias}}(named: self) }
+
+{% macro rgbaValue color %}0x{{color.red}}{{color.green}}{{color.blue}}{{color.alpha}}{% endmacro %}
+{% macro enumBlock colors %}
+ {% for color in colors %}
+ ///
+ /// Alpha: {{color.alpha|hexToInt|int255toFloat|percent}}
(0x{{color.red}}{{color.green}}{{color.blue}}{{color.alpha}})
+ {{accessModifier}} static let {{color.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{enumName}}(rgbaValue: {% call rgbaValue color %})
+ {% endfor %}
+{% endmacro %}
+ {% if palettes.count > 1 or param.forceFileNameEnum %}
+ {% for palette in palettes %}
+ {{accessModifier}} enum {{palette.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call enumBlock palette.colors %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call enumBlock palettes.first.colors %}
+ {% endif %}
+}
+// swiftlint:enable identifier_name line_length type_body_length
+
+// MARK: - Implementation Details
+
+internal extension {{colorAlias}} {
+ convenience init(rgbaValue: UInt32) {
+ let components = RGBAComponents(rgbaValue: rgbaValue).normalized
+ self.init(red: components[0], green: components[1], blue: components[2], alpha: components[3])
+ }
+}
+
+private struct RGBAComponents {
+ let rgbaValue: UInt32
+
+ private var shifts: [UInt32] {
+ [
+ rgbaValue >> 24, // red
+ rgbaValue >> 16, // green
+ rgbaValue >> 8, // blue
+ rgbaValue // alpha
+ ]
+ }
+
+ private var components: [CGFloat] {
+ shifts.map {
+ CGFloat($0 & 0xff)
+ }
+ }
+
+ var normalized: [CGFloat] {
+ components.map { $0 / 255.0 }
+ }
+}
+
+{{accessModifier}} extension {{colorAlias}} {
+ convenience init(named color: {{enumName}}) {
+ self.init(rgbaValue: color.rgbaValue)
+ }
+}
+{% else %}
+// No color found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/coredata/swift4.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/coredata/swift4.stencil
new file mode 100644
index 0000000..9832876
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/coredata/swift4.stencil
@@ -0,0 +1,211 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+// swiftlint:disable superfluous_disable_command implicit_return
+// swiftlint:disable sorted_imports
+import CoreData
+import Foundation
+{% for import in param.extraImports %}
+import {{ import }}
+{% empty %}
+{# If extraImports is a single String instead of an array, `for` considers it empty but we still have to check if there's a single String value #}
+{% if param.extraImports %}import {{ param.extraImports }}{% endif %}
+{% endfor %}
+
+// swiftlint:disable attributes file_length vertical_whitespace_closing_braces
+// swiftlint:disable identifier_name line_length type_body_length
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+
+{% for model in models %}
+{% for name, entity in model.entities %}
+{% set superclass %}{{ model.entities[entity.superEntity].className|default:"NSManagedObject" }}{% endset %}
+{% set entityClassName %}{{ entity.className|default:"NSManagedObject" }}{% endset %}
+// MARK: - {{ entity.name }}
+
+{% if not entity.shouldGenerateCode %}
+// Note: '{{ entity.name }}' has codegen enabled for Xcode, skipping code generation.
+
+{% elif entityClassName|contains:"." %}
+// Warning: '{{ entityClassName }}' cannot be a valid type name, skipping code generation.
+
+{% else %}
+{% if param.generateObjcName %}
+@objc({{ entityClassName }})
+{% endif %}
+{{ accessModifier }} class {{ entityClassName }}: {{ superclass }} {
+ {% set override %}{% if superclass != "NSManagedObject" %}override {% endif %}{% endset %}
+ {{ override }}{{ accessModifier }} class var entityName: String {
+ return "{{ entity.name }}"
+ }
+
+ {{ override }}{{ accessModifier }} class func entity(in managedObjectContext: NSManagedObjectContext) -> NSEntityDescription? {
+ return NSEntityDescription.entity(forEntityName: entityName, in: managedObjectContext)
+ }
+
+ @available(*, deprecated, renamed: "makeFetchRequest", message: "To avoid collisions with the less concrete method in `NSManagedObject`, please use `makeFetchRequest()` instead.")
+ @nonobjc {{ accessModifier }} class func fetchRequest() -> NSFetchRequest<{{ entityClassName }}> {
+ return NSFetchRequest<{{ entityClassName }}>(entityName: entityName)
+ }
+
+ @nonobjc {{ accessModifier }} class func makeFetchRequest() -> NSFetchRequest<{{ entityClassName }}> {
+ return NSFetchRequest<{{ entityClassName }}>(entityName: entityName)
+ }
+
+ // swiftlint:disable discouraged_optional_boolean discouraged_optional_collection
+ {% for attribute in entity.attributes %}
+ {% if attribute.userInfo.RawType %}
+ {% set rawType attribute.userInfo.RawType %}
+ {% set unwrapOptional attribute.userInfo.unwrapOptional %}
+ {{ accessModifier }} var {{ attribute.name }}: {{ rawType }}{% if not unwrapOptional %}?{% endif %} {
+ get {
+ let key = "{{ attribute.name }}"
+ willAccessValue(forKey: key)
+ defer { didAccessValue(forKey: key) }
+
+ {% if unwrapOptional %}
+ guard let value = primitiveValue(forKey: key) as? {{ rawType }}.RawValue,
+ let result = {{ rawType }}(rawValue: value) else {
+ fatalError("Could not convert value for key '\(key)' to type '{{ rawType }}'")
+ }
+ return result
+ {% else %}
+ guard let value = primitiveValue(forKey: key) as? {{ rawType }}.RawValue else {
+ return nil
+ }
+ return {{ rawType }}(rawValue: value)
+ {% endif %}
+ }
+ set {
+ let key = "{{ attribute.name }}"
+ willChangeValue(forKey: key)
+ defer { didChangeValue(forKey: key) }
+
+ setPrimitiveValue(newValue{% if not unwrapOptional %}?{% endif %}.rawValue, forKey: key)
+ }
+ }
+ {% elif attribute.usesScalarValueType and attribute.isOptional %}
+ {{ accessModifier }} var {{ attribute.name }}: {{ attribute.typeName }}? {
+ get {
+ let key = "{{ attribute.name }}"
+ willAccessValue(forKey: key)
+ defer { didAccessValue(forKey: key) }
+
+ return primitiveValue(forKey: key) as? {{ attribute.typeName }}
+ }
+ set {
+ let key = "{{ attribute.name }}"
+ willChangeValue(forKey: key)
+ defer { didChangeValue(forKey: key) }
+
+ setPrimitiveValue(newValue, forKey: key)
+ }
+ }
+ {% else %}
+ @NSManaged {{ accessModifier }} var {{ attribute.name }}: {{ attribute.typeName }}{% if attribute.isOptional %}?{% endif %}
+ {% endif %}
+ {% endfor %}
+ {% for relationship in entity.relationships %}
+ {% if relationship.isToMany %}
+ @NSManaged {{ accessModifier }} var {{ relationship.name }}: {% if relationship.isOrdered %}NSOrderedSet{% else %}Set<{{ model.entities[relationship.destinationEntity].className|default:"NSManagedObject" }}>{% endif %}{% if relationship.isOptional %}?{% endif %}
+ {% else %}
+ @NSManaged {{ accessModifier }} var {{ relationship.name }}: {{ model.entities[relationship.destinationEntity].className|default:"NSManagedObject" }}{% if relationship.isOptional %}?{% endif %}
+ {% endif %}
+ {% endfor %}
+ {% for fetchedProperty in entity.fetchedProperties %}
+ @NSManaged {{ accessModifier }} var {{ fetchedProperty.name }}: [{{ fetchedProperty.fetchRequest.entity }}]
+ {% endfor %}
+ // swiftlint:enable discouraged_optional_boolean discouraged_optional_collection
+}
+
+{% for relationship in entity.relationships where relationship.isToMany %}
+{% set destinationEntityClassName %}{{ model.entities[relationship.destinationEntity].className|default:"NSManagedObject" }}{% endset %}
+{% set collectionClassName %}{% if relationship.isOrdered %}NSOrderedSet{% else %}Set<{{ destinationEntityClassName }}>{% endif %}{% endset %}
+{% set relationshipName %}{{ relationship.name | upperFirstLetter }}{% endset %}
+// MARK: Relationship {{ relationshipName }}
+
+extension {{ entityClassName }} {
+ {% if relationship.isOrdered %}
+ @objc(insertObject:in{{ relationshipName }}AtIndex:)
+ @NSManaged public func insertInto{{ relationshipName }}(_ value: {{ destinationEntityClassName }}, at idx: Int)
+
+ @objc(removeObjectFrom{{ relationshipName }}AtIndex:)
+ @NSManaged public func removeFrom{{ relationshipName }}(at idx: Int)
+
+ @objc(insert{{ relationshipName }}:atIndexes:)
+ @NSManaged public func insertInto{{ relationshipName }}(_ values: [{{ destinationEntityClassName }}], at indexes: NSIndexSet)
+
+ @objc(remove{{ relationshipName }}AtIndexes:)
+ @NSManaged public func removeFrom{{ relationshipName }}(at indexes: NSIndexSet)
+
+ @objc(replaceObjectIn{{ relationshipName }}AtIndex:withObject:)
+ @NSManaged public func replace{{ relationshipName }}(at idx: Int, with value: {{ destinationEntityClassName }})
+
+ @objc(replace{{ relationshipName }}AtIndexes:with{{ relationshipName }}:)
+ @NSManaged public func replace{{ relationshipName }}(at indexes: NSIndexSet, with values: [{{ destinationEntityClassName }}])
+
+ {% endif %}
+ @objc(add{{ relationshipName }}Object:)
+ @NSManaged public func addTo{{ relationshipName }}(_ value: {{ destinationEntityClassName }})
+
+ @objc(remove{{ relationshipName }}Object:)
+ @NSManaged public func removeFrom{{ relationshipName }}(_ value: {{ destinationEntityClassName }})
+
+ @objc(add{{ relationshipName }}:)
+ @NSManaged public func addTo{{ relationshipName }}(_ values: {{ collectionClassName }})
+
+ @objc(remove{{ relationshipName }}:)
+ @NSManaged public func removeFrom{{ relationshipName }}(_ values: {{ collectionClassName }})
+}
+
+{% endfor %}
+{% if model.fetchRequests[entity.name].count > 0 %}
+// MARK: Fetch Requests
+
+extension {{ entityClassName }} {
+ {% for fetchRequest in model.fetchRequests[entity.name] %}
+ {% set resultTypeName %}{% filter removeNewlines:"leading" %}
+ {% if fetchRequest.resultType == "Object" %}
+ {{ entityClassName }}
+ {% elif fetchRequest.resultType == "Object ID" %}
+ NSManagedObjectID
+ {% elif fetchRequest.resultType == "Dictionary" %}
+ [String: Any]
+ {% endif %}
+ {% endfilter %}{% endset %}
+ class func fetch{{ fetchRequest.name | upperFirstLetter }}({% filter removeNewlines:"leading" %}
+ managedObjectContext: NSManagedObjectContext
+ {% for variableName, variableType in fetchRequest.substitutionVariables %}
+ , {{ variableName | lowerFirstWord }}: {{ variableType }}
+ {% endfor %}
+ {% endfilter %}) throws -> [{{ resultTypeName }}] {
+ guard let persistentStoreCoordinator = managedObjectContext.persistentStoreCoordinator else {
+ fatalError("Managed object context has no persistent store coordinator for getting fetch request templates")
+ }
+ let model = persistentStoreCoordinator.managedObjectModel
+ let substitutionVariables: [String: Any] = [
+ {% for variableName, variableType in fetchRequest.substitutionVariables %}
+ "{{ variableName }}": {{ variableName | lowerFirstWord }}{{ "," if not forloop.last }}
+ {% empty %}
+ :
+ {% endfor %}
+ ]
+
+ guard let fetchRequest = model.fetchRequestFromTemplate(withName: "{{ fetchRequest.name }}", substitutionVariables: substitutionVariables) else {
+ fatalError("No fetch request template named '{{ fetchRequest.name }}' found.")
+ }
+
+ guard let result = try managedObjectContext.fetch(fetchRequest) as? [{{ resultTypeName }}] else {
+ fatalError("Unable to cast fetch result to correct result type.")
+ }
+
+ return result
+ }
+
+ {% endfor %}
+}
+
+{% endif %}
+{% endif %}
+{% endfor %}
+{% endfor %}
+// swiftlint:enable identifier_name line_length type_body_length
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/coredata/swift5.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/coredata/swift5.stencil
new file mode 100644
index 0000000..9832876
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/coredata/swift5.stencil
@@ -0,0 +1,211 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+// swiftlint:disable superfluous_disable_command implicit_return
+// swiftlint:disable sorted_imports
+import CoreData
+import Foundation
+{% for import in param.extraImports %}
+import {{ import }}
+{% empty %}
+{# If extraImports is a single String instead of an array, `for` considers it empty but we still have to check if there's a single String value #}
+{% if param.extraImports %}import {{ param.extraImports }}{% endif %}
+{% endfor %}
+
+// swiftlint:disable attributes file_length vertical_whitespace_closing_braces
+// swiftlint:disable identifier_name line_length type_body_length
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+
+{% for model in models %}
+{% for name, entity in model.entities %}
+{% set superclass %}{{ model.entities[entity.superEntity].className|default:"NSManagedObject" }}{% endset %}
+{% set entityClassName %}{{ entity.className|default:"NSManagedObject" }}{% endset %}
+// MARK: - {{ entity.name }}
+
+{% if not entity.shouldGenerateCode %}
+// Note: '{{ entity.name }}' has codegen enabled for Xcode, skipping code generation.
+
+{% elif entityClassName|contains:"." %}
+// Warning: '{{ entityClassName }}' cannot be a valid type name, skipping code generation.
+
+{% else %}
+{% if param.generateObjcName %}
+@objc({{ entityClassName }})
+{% endif %}
+{{ accessModifier }} class {{ entityClassName }}: {{ superclass }} {
+ {% set override %}{% if superclass != "NSManagedObject" %}override {% endif %}{% endset %}
+ {{ override }}{{ accessModifier }} class var entityName: String {
+ return "{{ entity.name }}"
+ }
+
+ {{ override }}{{ accessModifier }} class func entity(in managedObjectContext: NSManagedObjectContext) -> NSEntityDescription? {
+ return NSEntityDescription.entity(forEntityName: entityName, in: managedObjectContext)
+ }
+
+ @available(*, deprecated, renamed: "makeFetchRequest", message: "To avoid collisions with the less concrete method in `NSManagedObject`, please use `makeFetchRequest()` instead.")
+ @nonobjc {{ accessModifier }} class func fetchRequest() -> NSFetchRequest<{{ entityClassName }}> {
+ return NSFetchRequest<{{ entityClassName }}>(entityName: entityName)
+ }
+
+ @nonobjc {{ accessModifier }} class func makeFetchRequest() -> NSFetchRequest<{{ entityClassName }}> {
+ return NSFetchRequest<{{ entityClassName }}>(entityName: entityName)
+ }
+
+ // swiftlint:disable discouraged_optional_boolean discouraged_optional_collection
+ {% for attribute in entity.attributes %}
+ {% if attribute.userInfo.RawType %}
+ {% set rawType attribute.userInfo.RawType %}
+ {% set unwrapOptional attribute.userInfo.unwrapOptional %}
+ {{ accessModifier }} var {{ attribute.name }}: {{ rawType }}{% if not unwrapOptional %}?{% endif %} {
+ get {
+ let key = "{{ attribute.name }}"
+ willAccessValue(forKey: key)
+ defer { didAccessValue(forKey: key) }
+
+ {% if unwrapOptional %}
+ guard let value = primitiveValue(forKey: key) as? {{ rawType }}.RawValue,
+ let result = {{ rawType }}(rawValue: value) else {
+ fatalError("Could not convert value for key '\(key)' to type '{{ rawType }}'")
+ }
+ return result
+ {% else %}
+ guard let value = primitiveValue(forKey: key) as? {{ rawType }}.RawValue else {
+ return nil
+ }
+ return {{ rawType }}(rawValue: value)
+ {% endif %}
+ }
+ set {
+ let key = "{{ attribute.name }}"
+ willChangeValue(forKey: key)
+ defer { didChangeValue(forKey: key) }
+
+ setPrimitiveValue(newValue{% if not unwrapOptional %}?{% endif %}.rawValue, forKey: key)
+ }
+ }
+ {% elif attribute.usesScalarValueType and attribute.isOptional %}
+ {{ accessModifier }} var {{ attribute.name }}: {{ attribute.typeName }}? {
+ get {
+ let key = "{{ attribute.name }}"
+ willAccessValue(forKey: key)
+ defer { didAccessValue(forKey: key) }
+
+ return primitiveValue(forKey: key) as? {{ attribute.typeName }}
+ }
+ set {
+ let key = "{{ attribute.name }}"
+ willChangeValue(forKey: key)
+ defer { didChangeValue(forKey: key) }
+
+ setPrimitiveValue(newValue, forKey: key)
+ }
+ }
+ {% else %}
+ @NSManaged {{ accessModifier }} var {{ attribute.name }}: {{ attribute.typeName }}{% if attribute.isOptional %}?{% endif %}
+ {% endif %}
+ {% endfor %}
+ {% for relationship in entity.relationships %}
+ {% if relationship.isToMany %}
+ @NSManaged {{ accessModifier }} var {{ relationship.name }}: {% if relationship.isOrdered %}NSOrderedSet{% else %}Set<{{ model.entities[relationship.destinationEntity].className|default:"NSManagedObject" }}>{% endif %}{% if relationship.isOptional %}?{% endif %}
+ {% else %}
+ @NSManaged {{ accessModifier }} var {{ relationship.name }}: {{ model.entities[relationship.destinationEntity].className|default:"NSManagedObject" }}{% if relationship.isOptional %}?{% endif %}
+ {% endif %}
+ {% endfor %}
+ {% for fetchedProperty in entity.fetchedProperties %}
+ @NSManaged {{ accessModifier }} var {{ fetchedProperty.name }}: [{{ fetchedProperty.fetchRequest.entity }}]
+ {% endfor %}
+ // swiftlint:enable discouraged_optional_boolean discouraged_optional_collection
+}
+
+{% for relationship in entity.relationships where relationship.isToMany %}
+{% set destinationEntityClassName %}{{ model.entities[relationship.destinationEntity].className|default:"NSManagedObject" }}{% endset %}
+{% set collectionClassName %}{% if relationship.isOrdered %}NSOrderedSet{% else %}Set<{{ destinationEntityClassName }}>{% endif %}{% endset %}
+{% set relationshipName %}{{ relationship.name | upperFirstLetter }}{% endset %}
+// MARK: Relationship {{ relationshipName }}
+
+extension {{ entityClassName }} {
+ {% if relationship.isOrdered %}
+ @objc(insertObject:in{{ relationshipName }}AtIndex:)
+ @NSManaged public func insertInto{{ relationshipName }}(_ value: {{ destinationEntityClassName }}, at idx: Int)
+
+ @objc(removeObjectFrom{{ relationshipName }}AtIndex:)
+ @NSManaged public func removeFrom{{ relationshipName }}(at idx: Int)
+
+ @objc(insert{{ relationshipName }}:atIndexes:)
+ @NSManaged public func insertInto{{ relationshipName }}(_ values: [{{ destinationEntityClassName }}], at indexes: NSIndexSet)
+
+ @objc(remove{{ relationshipName }}AtIndexes:)
+ @NSManaged public func removeFrom{{ relationshipName }}(at indexes: NSIndexSet)
+
+ @objc(replaceObjectIn{{ relationshipName }}AtIndex:withObject:)
+ @NSManaged public func replace{{ relationshipName }}(at idx: Int, with value: {{ destinationEntityClassName }})
+
+ @objc(replace{{ relationshipName }}AtIndexes:with{{ relationshipName }}:)
+ @NSManaged public func replace{{ relationshipName }}(at indexes: NSIndexSet, with values: [{{ destinationEntityClassName }}])
+
+ {% endif %}
+ @objc(add{{ relationshipName }}Object:)
+ @NSManaged public func addTo{{ relationshipName }}(_ value: {{ destinationEntityClassName }})
+
+ @objc(remove{{ relationshipName }}Object:)
+ @NSManaged public func removeFrom{{ relationshipName }}(_ value: {{ destinationEntityClassName }})
+
+ @objc(add{{ relationshipName }}:)
+ @NSManaged public func addTo{{ relationshipName }}(_ values: {{ collectionClassName }})
+
+ @objc(remove{{ relationshipName }}:)
+ @NSManaged public func removeFrom{{ relationshipName }}(_ values: {{ collectionClassName }})
+}
+
+{% endfor %}
+{% if model.fetchRequests[entity.name].count > 0 %}
+// MARK: Fetch Requests
+
+extension {{ entityClassName }} {
+ {% for fetchRequest in model.fetchRequests[entity.name] %}
+ {% set resultTypeName %}{% filter removeNewlines:"leading" %}
+ {% if fetchRequest.resultType == "Object" %}
+ {{ entityClassName }}
+ {% elif fetchRequest.resultType == "Object ID" %}
+ NSManagedObjectID
+ {% elif fetchRequest.resultType == "Dictionary" %}
+ [String: Any]
+ {% endif %}
+ {% endfilter %}{% endset %}
+ class func fetch{{ fetchRequest.name | upperFirstLetter }}({% filter removeNewlines:"leading" %}
+ managedObjectContext: NSManagedObjectContext
+ {% for variableName, variableType in fetchRequest.substitutionVariables %}
+ , {{ variableName | lowerFirstWord }}: {{ variableType }}
+ {% endfor %}
+ {% endfilter %}) throws -> [{{ resultTypeName }}] {
+ guard let persistentStoreCoordinator = managedObjectContext.persistentStoreCoordinator else {
+ fatalError("Managed object context has no persistent store coordinator for getting fetch request templates")
+ }
+ let model = persistentStoreCoordinator.managedObjectModel
+ let substitutionVariables: [String: Any] = [
+ {% for variableName, variableType in fetchRequest.substitutionVariables %}
+ "{{ variableName }}": {{ variableName | lowerFirstWord }}{{ "," if not forloop.last }}
+ {% empty %}
+ :
+ {% endfor %}
+ ]
+
+ guard let fetchRequest = model.fetchRequestFromTemplate(withName: "{{ fetchRequest.name }}", substitutionVariables: substitutionVariables) else {
+ fatalError("No fetch request template named '{{ fetchRequest.name }}' found.")
+ }
+
+ guard let result = try managedObjectContext.fetch(fetchRequest) as? [{{ resultTypeName }}] else {
+ fatalError("Unable to cast fetch result to correct result type.")
+ }
+
+ return result
+ }
+
+ {% endfor %}
+}
+
+{% endif %}
+{% endif %}
+{% endfor %}
+{% endfor %}
+// swiftlint:enable identifier_name line_length type_body_length
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/files/flat-swift4.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/files/flat-swift4.stencil
new file mode 100644
index 0000000..09df24d
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/files/flat-swift4.stencil
@@ -0,0 +1,103 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if groups.count > 0 %}
+{% set enumName %}{{param.enumName|default:"Files"}}{% endset %}
+{% set useExt %}{% if param.useExtension|default:"true" %}true{% endif %}{% endset %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+{% set resourceType %}{{param.resourceTypeName|default:"File"}}{% endset %}
+import Foundation
+
+// swiftlint:disable superfluous_disable_command file_length line_length implicit_return
+
+// MARK: - Files
+
+{% macro groupBlock group %}
+ {% for file in group.files %}
+ {% call fileBlock file %}
+ {% endfor %}
+ {% for dir in group.directories %}
+ {% call dirBlock dir %}
+ {% endfor %}
+{% endmacro %}
+{% macro fileBlock file %}
+ /// {% if file.path and param.preservePath %}{{file.path}}/{% endif %}{{file.name}}{% if file.ext %}.{{file.ext}}{% endif %}
+ {% set identifier %}{{ file.name }}{% if useExt %}.{{ file.ext }}{% endif %}{% endset %}
+ {{accessModifier}} static let {{identifier|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{resourceType}}(name: "{{file.name}}", ext: {% if file.ext %}"{{file.ext}}"{% else %}nil{% endif %}, relativePath: "{{file.path if param.preservePath}}", mimeType: "{{file.mimeType}}")
+{% endmacro %}
+{% macro dirBlock directory %}
+ {% for file in directory.files %}
+ {% call fileBlock file %}
+ {% endfor %}
+ {% for dir in directory.directories %}
+ {% call dirBlock dir %}
+ {% endfor %}
+{% endmacro %}
+// swiftlint:disable explicit_type_interface identifier_name
+// swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces
+{{accessModifier}} enum {{enumName}} {
+ {% if groups.count > 1 or param.forceFileNameEnum %}
+ {% for group in groups %}
+ {{accessModifier}} enum {{group.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call groupBlock group %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call groupBlock groups.first %}
+ {% endif %}
+}
+// swiftlint:enable explicit_type_interface identifier_name
+// swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces
+
+// MARK: - Implementation Details
+
+{{accessModifier}} struct {{resourceType}} {
+ {{accessModifier}} let name: String
+ {{accessModifier}} let ext: String?
+ {{accessModifier}} let relativePath: String
+ {{accessModifier}} let mimeType: String
+
+ {{accessModifier}} var url: URL {
+ return url(locale: nil)
+ }
+
+ {{accessModifier}} func url(locale: Locale?) -> URL {
+ let bundle = {{param.bundle|default:"BundleToken.bundle"}}
+ let url = bundle.url(
+ forResource: name,
+ withExtension: ext,
+ subdirectory: relativePath,
+ localization: locale?.identifier
+ )
+ guard let result = url else {
+ let file = name + (ext.flatMap { ".\($0)" } ?? "")
+ fatalError("Could not locate file named \(file)")
+ }
+ return result
+ }
+
+ {{accessModifier}} var path: String {
+ return path(locale: nil)
+ }
+
+ {{accessModifier}} func path(locale: Locale?) -> String {
+ return url(locale: locale).path
+ }
+}
+{% if not param.bundle %}
+
+// swiftlint:disable convenience_type explicit_type_interface
+private final class BundleToken {
+ static let bundle: Bundle = {
+ #if SWIFT_PACKAGE
+ return Bundle.module
+ #else
+ return Bundle(for: BundleToken.self)
+ #endif
+ }()
+}
+// swiftlint:enable convenience_type explicit_type_interface
+{% endif %}
+{% else %}
+// No files found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/files/flat-swift5.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/files/flat-swift5.stencil
new file mode 100644
index 0000000..09df24d
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/files/flat-swift5.stencil
@@ -0,0 +1,103 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if groups.count > 0 %}
+{% set enumName %}{{param.enumName|default:"Files"}}{% endset %}
+{% set useExt %}{% if param.useExtension|default:"true" %}true{% endif %}{% endset %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+{% set resourceType %}{{param.resourceTypeName|default:"File"}}{% endset %}
+import Foundation
+
+// swiftlint:disable superfluous_disable_command file_length line_length implicit_return
+
+// MARK: - Files
+
+{% macro groupBlock group %}
+ {% for file in group.files %}
+ {% call fileBlock file %}
+ {% endfor %}
+ {% for dir in group.directories %}
+ {% call dirBlock dir %}
+ {% endfor %}
+{% endmacro %}
+{% macro fileBlock file %}
+ /// {% if file.path and param.preservePath %}{{file.path}}/{% endif %}{{file.name}}{% if file.ext %}.{{file.ext}}{% endif %}
+ {% set identifier %}{{ file.name }}{% if useExt %}.{{ file.ext }}{% endif %}{% endset %}
+ {{accessModifier}} static let {{identifier|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{resourceType}}(name: "{{file.name}}", ext: {% if file.ext %}"{{file.ext}}"{% else %}nil{% endif %}, relativePath: "{{file.path if param.preservePath}}", mimeType: "{{file.mimeType}}")
+{% endmacro %}
+{% macro dirBlock directory %}
+ {% for file in directory.files %}
+ {% call fileBlock file %}
+ {% endfor %}
+ {% for dir in directory.directories %}
+ {% call dirBlock dir %}
+ {% endfor %}
+{% endmacro %}
+// swiftlint:disable explicit_type_interface identifier_name
+// swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces
+{{accessModifier}} enum {{enumName}} {
+ {% if groups.count > 1 or param.forceFileNameEnum %}
+ {% for group in groups %}
+ {{accessModifier}} enum {{group.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call groupBlock group %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call groupBlock groups.first %}
+ {% endif %}
+}
+// swiftlint:enable explicit_type_interface identifier_name
+// swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces
+
+// MARK: - Implementation Details
+
+{{accessModifier}} struct {{resourceType}} {
+ {{accessModifier}} let name: String
+ {{accessModifier}} let ext: String?
+ {{accessModifier}} let relativePath: String
+ {{accessModifier}} let mimeType: String
+
+ {{accessModifier}} var url: URL {
+ return url(locale: nil)
+ }
+
+ {{accessModifier}} func url(locale: Locale?) -> URL {
+ let bundle = {{param.bundle|default:"BundleToken.bundle"}}
+ let url = bundle.url(
+ forResource: name,
+ withExtension: ext,
+ subdirectory: relativePath,
+ localization: locale?.identifier
+ )
+ guard let result = url else {
+ let file = name + (ext.flatMap { ".\($0)" } ?? "")
+ fatalError("Could not locate file named \(file)")
+ }
+ return result
+ }
+
+ {{accessModifier}} var path: String {
+ return path(locale: nil)
+ }
+
+ {{accessModifier}} func path(locale: Locale?) -> String {
+ return url(locale: locale).path
+ }
+}
+{% if not param.bundle %}
+
+// swiftlint:disable convenience_type explicit_type_interface
+private final class BundleToken {
+ static let bundle: Bundle = {
+ #if SWIFT_PACKAGE
+ return Bundle.module
+ #else
+ return Bundle(for: BundleToken.self)
+ #endif
+ }()
+}
+// swiftlint:enable convenience_type explicit_type_interface
+{% endif %}
+{% else %}
+// No files found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/files/structured-swift4.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/files/structured-swift4.stencil
new file mode 100644
index 0000000..6d6db96
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/files/structured-swift4.stencil
@@ -0,0 +1,107 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if groups.count > 0 %}
+{% set enumName %}{{param.enumName|default:"Files"}}{% endset %}
+{% set useExt %}{% if param.useExtension|default:"true" %}true{% endif %}{% endset %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+{% set resourceType %}{{param.resourceTypeName|default:"File"}}{% endset %}
+import Foundation
+
+// swiftlint:disable superfluous_disable_command file_length line_length implicit_return
+
+// MARK: - Files
+
+{% macro groupBlock group %}
+ {% for file in group.files %}
+ {% call fileBlock file %}
+ {% endfor %}
+ {% for dir in group.directories %}
+ {% call dirBlock dir "" %}
+ {% endfor %}
+{% endmacro %}
+{% macro fileBlock file %}
+ /// {% if file.path and param.preservePath %}{{file.path}}/{% endif %}{{file.name}}{% if file.ext %}.{{file.ext}}{% endif %}
+ {% set identifier %}{{ file.name }}{% if useExt %}.{{ file.ext }}{% endif %}{% endset %}
+ {{accessModifier}} static let {{identifier|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{resourceType}}(name: "{{file.name}}", ext: {% if file.ext %}"{{file.ext}}"{% else %}nil{% endif %}, relativePath: "{{file.path if param.preservePath}}", mimeType: "{{file.mimeType}}")
+{% endmacro %}
+{% macro dirBlock directory parent %}
+ {% set fullDir %}{{parent}}{{directory.name}}/{% endset %}
+ /// {{ fullDir }}
+ {{accessModifier}} enum {{directory.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% for file in directory.files %}
+ {% filter indent:2 %}{% call fileBlock file %}{% endfilter %}
+ {% endfor %}
+ {% for dir in directory.directories %}
+ {% filter indent:2 %}{% call dirBlock dir fullDir %}{% endfilter %}
+ {% endfor %}
+ }
+{% endmacro %}
+// swiftlint:disable explicit_type_interface identifier_name
+// swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces
+{{accessModifier}} enum {{enumName}} {
+ {% if groups.count > 1 or param.forceFileNameEnum %}
+ {% for group in groups %}
+ {{accessModifier}} enum {{group.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call groupBlock group %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call groupBlock groups.first %}
+ {% endif %}
+}
+// swiftlint:enable explicit_type_interface identifier_name
+// swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces
+
+// MARK: - Implementation Details
+
+{{accessModifier}} struct {{resourceType}} {
+ {{accessModifier}} let name: String
+ {{accessModifier}} let ext: String?
+ {{accessModifier}} let relativePath: String
+ {{accessModifier}} let mimeType: String
+
+ {{accessModifier}} var url: URL {
+ return url(locale: nil)
+ }
+
+ {{accessModifier}} func url(locale: Locale?) -> URL {
+ let bundle = {{param.bundle|default:"BundleToken.bundle"}}
+ let url = bundle.url(
+ forResource: name,
+ withExtension: ext,
+ subdirectory: relativePath,
+ localization: locale?.identifier
+ )
+ guard let result = url else {
+ let file = name + (ext.flatMap { ".\($0)" } ?? "")
+ fatalError("Could not locate file named \(file)")
+ }
+ return result
+ }
+
+ {{accessModifier}} var path: String {
+ return path(locale: nil)
+ }
+
+ {{accessModifier}} func path(locale: Locale?) -> String {
+ return url(locale: locale).path
+ }
+}
+{% if not param.bundle %}
+
+// swiftlint:disable convenience_type explicit_type_interface
+private final class BundleToken {
+ static let bundle: Bundle = {
+ #if SWIFT_PACKAGE
+ return Bundle.module
+ #else
+ return Bundle(for: BundleToken.self)
+ #endif
+ }()
+}
+// swiftlint:enable convenience_type explicit_type_interface
+{% endif %}
+{% else %}
+// No files found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/files/structured-swift5.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/files/structured-swift5.stencil
new file mode 100644
index 0000000..6d6db96
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/files/structured-swift5.stencil
@@ -0,0 +1,107 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if groups.count > 0 %}
+{% set enumName %}{{param.enumName|default:"Files"}}{% endset %}
+{% set useExt %}{% if param.useExtension|default:"true" %}true{% endif %}{% endset %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+{% set resourceType %}{{param.resourceTypeName|default:"File"}}{% endset %}
+import Foundation
+
+// swiftlint:disable superfluous_disable_command file_length line_length implicit_return
+
+// MARK: - Files
+
+{% macro groupBlock group %}
+ {% for file in group.files %}
+ {% call fileBlock file %}
+ {% endfor %}
+ {% for dir in group.directories %}
+ {% call dirBlock dir "" %}
+ {% endfor %}
+{% endmacro %}
+{% macro fileBlock file %}
+ /// {% if file.path and param.preservePath %}{{file.path}}/{% endif %}{{file.name}}{% if file.ext %}.{{file.ext}}{% endif %}
+ {% set identifier %}{{ file.name }}{% if useExt %}.{{ file.ext }}{% endif %}{% endset %}
+ {{accessModifier}} static let {{identifier|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{resourceType}}(name: "{{file.name}}", ext: {% if file.ext %}"{{file.ext}}"{% else %}nil{% endif %}, relativePath: "{{file.path if param.preservePath}}", mimeType: "{{file.mimeType}}")
+{% endmacro %}
+{% macro dirBlock directory parent %}
+ {% set fullDir %}{{parent}}{{directory.name}}/{% endset %}
+ /// {{ fullDir }}
+ {{accessModifier}} enum {{directory.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% for file in directory.files %}
+ {% filter indent:2 %}{% call fileBlock file %}{% endfilter %}
+ {% endfor %}
+ {% for dir in directory.directories %}
+ {% filter indent:2 %}{% call dirBlock dir fullDir %}{% endfilter %}
+ {% endfor %}
+ }
+{% endmacro %}
+// swiftlint:disable explicit_type_interface identifier_name
+// swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces
+{{accessModifier}} enum {{enumName}} {
+ {% if groups.count > 1 or param.forceFileNameEnum %}
+ {% for group in groups %}
+ {{accessModifier}} enum {{group.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call groupBlock group %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call groupBlock groups.first %}
+ {% endif %}
+}
+// swiftlint:enable explicit_type_interface identifier_name
+// swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces
+
+// MARK: - Implementation Details
+
+{{accessModifier}} struct {{resourceType}} {
+ {{accessModifier}} let name: String
+ {{accessModifier}} let ext: String?
+ {{accessModifier}} let relativePath: String
+ {{accessModifier}} let mimeType: String
+
+ {{accessModifier}} var url: URL {
+ return url(locale: nil)
+ }
+
+ {{accessModifier}} func url(locale: Locale?) -> URL {
+ let bundle = {{param.bundle|default:"BundleToken.bundle"}}
+ let url = bundle.url(
+ forResource: name,
+ withExtension: ext,
+ subdirectory: relativePath,
+ localization: locale?.identifier
+ )
+ guard let result = url else {
+ let file = name + (ext.flatMap { ".\($0)" } ?? "")
+ fatalError("Could not locate file named \(file)")
+ }
+ return result
+ }
+
+ {{accessModifier}} var path: String {
+ return path(locale: nil)
+ }
+
+ {{accessModifier}} func path(locale: Locale?) -> String {
+ return url(locale: locale).path
+ }
+}
+{% if not param.bundle %}
+
+// swiftlint:disable convenience_type explicit_type_interface
+private final class BundleToken {
+ static let bundle: Bundle = {
+ #if SWIFT_PACKAGE
+ return Bundle.module
+ #else
+ return Bundle(for: BundleToken.self)
+ #endif
+ }()
+}
+// swiftlint:enable convenience_type explicit_type_interface
+{% endif %}
+{% else %}
+// No files found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/fonts/swift4.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/fonts/swift4.stencil
new file mode 100644
index 0000000..744d6a4
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/fonts/swift4.stencil
@@ -0,0 +1,110 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if families %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+{% set fontType %}{{param.fontTypeName|default:"FontConvertible"}}{% endset %}
+#if os(macOS)
+ import AppKit.NSFont
+#elseif os(iOS) || os(tvOS) || os(watchOS)
+ import UIKit.UIFont
+#endif
+
+// Deprecated typealiases
+@available(*, deprecated, renamed: "{{fontType}}.Font", message: "This typealias will be removed in SwiftGen 7.0")
+{{accessModifier}} typealias {{param.fontAliasName|default:"Font"}} = {{fontType}}.Font
+
+// swiftlint:disable superfluous_disable_command
+// swiftlint:disable file_length
+// swiftlint:disable implicit_return
+
+// MARK: - Fonts
+
+// swiftlint:disable identifier_name line_length type_body_length
+{% macro transformPath path %}{% filter removeNewlines %}
+ {% if param.preservePath %}
+ {{path}}
+ {% else %}
+ {{path|basename}}
+ {% endif %}
+{% endfilter %}{% endmacro %}
+{{accessModifier}} enum {{param.enumName|default:"FontFamily"}} {
+ {% for family in families %}
+ {{accessModifier}} enum {{family.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% for font in family.fonts %}
+ {{accessModifier}} static let {{font.style|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{fontType}}(name: "{{font.name}}", family: "{{family.name}}", path: "{% call transformPath font.path %}")
+ {% endfor %}
+ {{accessModifier}} static let all: [{{fontType}}] = [{% for font in family.fonts %}{{font.style|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{{ ", " if not forloop.last }}{% endfor %}]
+ }
+ {% endfor %}
+ {{accessModifier}} static let allCustomFonts: [{{fontType}}] = [{% for family in families %}{{family.name|swiftIdentifier:"pretty"|escapeReservedKeywords}}.all{{ ", " if not forloop.last }}{% endfor %}].flatMap { $0 }
+ {{accessModifier}} static func registerAllCustomFonts() {
+ allCustomFonts.forEach { $0.register() }
+ }
+}
+// swiftlint:enable identifier_name line_length type_body_length
+
+// MARK: - Implementation Details
+
+{{accessModifier}} struct {{fontType}} {
+ {{accessModifier}} let name: String
+ {{accessModifier}} let family: String
+ {{accessModifier}} let path: String
+
+ #if os(macOS)
+ {{accessModifier}} typealias Font = NSFont
+ #elseif os(iOS) || os(tvOS) || os(watchOS)
+ {{accessModifier}} typealias Font = UIFont
+ #endif
+
+ {{accessModifier}} func font(size: CGFloat) -> Font! {
+ return Font(font: self, size: size)
+ }
+
+ {{accessModifier}} func register() {
+ // swiftlint:disable:next conditional_returns_on_newline
+ guard let url = url else { return }
+ CTFontManagerRegisterFontsForURL(url as CFURL, .process, nil)
+ }
+
+ fileprivate var url: URL? {
+ {% if param.lookupFunction %}
+ return {{param.lookupFunction}}(name, family, path)
+ {% else %}
+ return {{param.bundle|default:"BundleToken.bundle"}}.url(forResource: path, withExtension: nil)
+ {% endif %}
+ }
+}
+
+{{accessModifier}} extension {{fontType}}.Font {
+ convenience init?(font: {{fontType}}, size: CGFloat) {
+ #if os(iOS) || os(tvOS) || os(watchOS)
+ if !UIFont.fontNames(forFamilyName: font.family).contains(font.name) {
+ font.register()
+ }
+ #elseif os(macOS)
+ if let url = font.url, CTFontManagerGetScopeForURL(url as CFURL) == .none {
+ font.register()
+ }
+ #endif
+
+ self.init(name: font.name, size: size)
+ }
+}
+{% if not param.bundle and not param.lookupFunction %}
+
+// swiftlint:disable convenience_type
+private final class BundleToken {
+ static let bundle: Bundle = {
+ #if SWIFT_PACKAGE
+ return Bundle.module
+ #else
+ return Bundle(for: BundleToken.self)
+ #endif
+ }()
+}
+// swiftlint:enable convenience_type
+{% endif %}
+{% else %}
+// No fonts found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/fonts/swift5.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/fonts/swift5.stencil
new file mode 100644
index 0000000..5a268b5
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/fonts/swift5.stencil
@@ -0,0 +1,113 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if families %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+{% set fontType %}{{param.fontTypeName|default:"FontConvertible"}}{% endset %}
+#if os(macOS)
+ import AppKit.NSFont
+#elseif os(iOS) || os(tvOS) || os(watchOS)
+ import UIKit.UIFont
+#endif
+
+// Deprecated typealiases
+@available(*, deprecated, renamed: "{{fontType}}.Font", message: "This typealias will be removed in SwiftGen 7.0")
+{{accessModifier}} typealias {{param.fontAliasName|default:"Font"}} = {{fontType}}.Font
+
+// swiftlint:disable superfluous_disable_command
+// swiftlint:disable file_length
+
+// MARK: - Fonts
+
+// swiftlint:disable identifier_name line_length type_body_length
+{% macro transformPath path %}{% filter removeNewlines %}
+ {% if param.preservePath %}
+ {{path}}
+ {% else %}
+ {{path|basename}}
+ {% endif %}
+{% endfilter %}{% endmacro %}
+{{accessModifier}} enum {{param.enumName|default:"FontFamily"}} {
+ {% for family in families %}
+ {{accessModifier}} enum {{family.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% for font in family.fonts %}
+ {{accessModifier}} static let {{font.style|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{fontType}}(name: "{{font.name}}", family: "{{family.name}}", path: "{% call transformPath font.path %}")
+ {% endfor %}
+ {{accessModifier}} static let all: [{{fontType}}] = [{% for font in family.fonts %}{{font.style|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{{ ", " if not forloop.last }}{% endfor %}]
+ }
+ {% endfor %}
+ {{accessModifier}} static let allCustomFonts: [{{fontType}}] = [{% for family in families %}{{family.name|swiftIdentifier:"pretty"|escapeReservedKeywords}}.all{{ ", " if not forloop.last }}{% endfor %}].flatMap { $0 }
+ {{accessModifier}} static func registerAllCustomFonts() {
+ allCustomFonts.forEach { $0.register() }
+ }
+}
+// swiftlint:enable identifier_name line_length type_body_length
+
+// MARK: - Implementation Details
+
+{{accessModifier}} struct {{fontType}} {
+ {{accessModifier}} let name: String
+ {{accessModifier}} let family: String
+ {{accessModifier}} let path: String
+
+ #if os(macOS)
+ {{accessModifier}} typealias Font = NSFont
+ #elseif os(iOS) || os(tvOS) || os(watchOS)
+ {{accessModifier}} typealias Font = UIFont
+ #endif
+
+ {{accessModifier}} func font(size: CGFloat) -> Font {
+ guard let font = Font(font: self, size: size) else {
+ fatalError("Unable to initialize font '\(name)' (\(family))")
+ }
+ return font
+ }
+
+ {{accessModifier}} func register() {
+ // swiftlint:disable:next conditional_returns_on_newline
+ guard let url = url else { return }
+ CTFontManagerRegisterFontsForURL(url as CFURL, .process, nil)
+ }
+
+ fileprivate var url: URL? {
+ // swiftlint:disable:next implicit_return
+ {% if param.lookupFunction %}
+ return {{param.lookupFunction}}(name, family, path)
+ {% else %}
+ return {{param.bundle|default:"BundleToken.bundle"}}.url(forResource: path, withExtension: nil)
+ {% endif %}
+ }
+}
+
+{{accessModifier}} extension {{fontType}}.Font {
+ convenience init?(font: {{fontType}}, size: CGFloat) {
+ #if os(iOS) || os(tvOS) || os(watchOS)
+ if !UIFont.fontNames(forFamilyName: font.family).contains(font.name) {
+ font.register()
+ }
+ #elseif os(macOS)
+ if let url = font.url, CTFontManagerGetScopeForURL(url as CFURL) == .none {
+ font.register()
+ }
+ #endif
+
+ self.init(name: font.name, size: size)
+ }
+}
+{% if not param.bundle and not param.lookupFunction %}
+
+// swiftlint:disable convenience_type
+private final class BundleToken {
+ static let bundle: Bundle = {
+ #if SWIFT_PACKAGE
+ return Bundle.module
+ #else
+ return Bundle(for: BundleToken.self)
+ #endif
+ }()
+}
+// swiftlint:enable convenience_type
+{% endif %}
+{% else %}
+// No fonts found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/ib/scenes-swift4.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/ib/scenes-swift4.stencil
new file mode 100644
index 0000000..9ad52ff
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/ib/scenes-swift4.stencil
@@ -0,0 +1,157 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if platform and storyboards %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+{% set isAppKit %}{% if platform == "macOS" %}true{% endif %}{% endset %}
+{% set prefix %}{% if isAppKit %}NS{% else %}UI{% endif %}{% endset %}
+{% set controller %}{% if isAppKit %}Controller{% else %}ViewController{% endif %}{% endset %}
+// swiftlint:disable sorted_imports
+import Foundation
+{% for module in modules where module != env.PRODUCT_MODULE_NAME and module != param.module %}
+import {{module}}
+{% endfor %}
+
+// swiftlint:disable superfluous_disable_command
+// swiftlint:disable file_length implicit_return
+
+// MARK: - Storyboard Scenes
+
+// swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name
+{% macro moduleName item %}{% filter removeNewlines %}
+ {% if item.moduleIsPlaceholder %}
+ {{ env.PRODUCT_MODULE_NAME|default:param.module }}
+ {% else %}
+ {{ item.module }}
+ {% endif %}
+{% endfilter %}{% endmacro %}
+{% macro className item %}{% filter removeNewlines %}
+ {% set module %}{% call moduleName item %}{% endset %}
+ {% if module and ( not param.ignoreTargetModule or module != env.PRODUCT_MODULE_NAME and module != param.module ) %}
+ {{module}}.
+ {% endif %}
+ {{item.type}}
+{% endfilter %}{% endmacro %}
+{{accessModifier}} enum {{param.enumName|default:"StoryboardScene"}} {
+ {% for storyboard in storyboards %}
+ {% set storyboardName %}{{storyboard.name|swiftIdentifier:"pretty"|escapeReservedKeywords}}{% endset %}
+ {{accessModifier}} enum {{storyboardName}}: StoryboardType {
+ {{accessModifier}} static let storyboardName = "{{storyboard.name}}"
+ {% if storyboard.initialScene %}
+
+ {% set sceneClass %}{% call className storyboard.initialScene %}{% endset %}
+ {{accessModifier}} static let initialScene = InitialSceneType<{{sceneClass}}>(storyboard: {{storyboardName}}.self)
+ {% endif %}
+ {% for scene in storyboard.scenes %}
+
+ {% set sceneID %}{{scene.identifier|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{% endset %}
+ {% set sceneClass %}{% call className scene %}{% endset %}
+ {{accessModifier}} static let {{sceneID}} = SceneType<{{sceneClass}}>(storyboard: {{storyboardName}}.self, identifier: "{{scene.identifier}}")
+ {% endfor %}
+ }
+ {% endfor %}
+}
+// swiftlint:enable explicit_type_interface identifier_name line_length type_body_length type_name
+
+// MARK: - Implementation Details
+
+{{accessModifier}} protocol StoryboardType {
+ static var storyboardName: String { get }
+}
+
+{{accessModifier}} extension StoryboardType {
+ static var storyboard: {{prefix}}Storyboard {
+ let name = {% if isAppKit %}NSStoryboard.Name({% endif %}self.storyboardName{% if isAppKit %}){% endif %}
+ {% if param.lookupFunction %}
+ return {{param.lookupFunction}}(name)
+ {% else %}
+ return {{prefix}}Storyboard(name: name, bundle: {{param.bundle|default:"BundleToken.bundle"}})
+ {% endif %}
+ }
+}
+
+{{accessModifier}} struct SceneType {
+ {{accessModifier}} let storyboard: StoryboardType.Type
+ {{accessModifier}} let identifier: String
+
+ {{accessModifier}} func instantiate() -> T {
+ let identifier = {% if isAppKit %}NSStoryboard.SceneIdentifier({% endif %}self.identifier{% if isAppKit %}){% endif %}
+ guard let controller = storyboard.storyboard.instantiate{{controller}}(withIdentifier: identifier) as? T else {
+ fatalError("{{controller}} '\(identifier)' is not of the expected class \(T.self).")
+ }
+ return controller
+ }
+
+ {% if isAppKit %}
+ @available(macOS 10.15, *)
+ {{accessModifier}} func instantiate(creator block: @escaping (NSCoder) -> T?) -> T where T: NSViewController {
+ return storyboard.storyboard.instantiate{{controller}}(identifier: identifier, creator: block)
+ }
+
+ @available(macOS 10.15, *)
+ {{accessModifier}} func instantiate(creator block: @escaping (NSCoder) -> T?) -> T where T: NSWindowController {
+ return storyboard.storyboard.instantiate{{controller}}(identifier: identifier, creator: block)
+ }
+ {% else %}
+ @available(iOS 13.0, tvOS 13.0, *)
+ {{accessModifier}} func instantiate(creator block: @escaping (NSCoder) -> T?) -> T {
+ return storyboard.storyboard.instantiate{{controller}}(identifier: identifier, creator: block)
+ }
+ {% endif %}
+}
+
+{{accessModifier}} struct InitialSceneType {
+ {{accessModifier}} let storyboard: StoryboardType.Type
+
+ {{accessModifier}} func instantiate() -> T {
+ guard let controller = storyboard.storyboard.instantiateInitial{{controller}}() as? T else {
+ fatalError("{{controller}} is not of the expected class \(T.self).")
+ }
+ return controller
+ }
+
+ {% if isAppKit %}
+ @available(macOS 10.15, *)
+ {{accessModifier}} func instantiate(creator block: @escaping (NSCoder) -> T?) -> T where T: NSViewController {
+ guard let controller = storyboard.storyboard.instantiateInitial{{controller}}(creator: block) else {
+ fatalError("Storyboard \(storyboard.storyboardName) does not have an initial scene.")
+ }
+ return controller
+ }
+
+ @available(macOS 10.15, *)
+ {{accessModifier}} func instantiate(creator block: @escaping (NSCoder) -> T?) -> T where T: NSWindowController {
+ guard let controller = storyboard.storyboard.instantiateInitial{{controller}}(creator: block) else {
+ fatalError("Storyboard \(storyboard.storyboardName) does not have an initial scene.")
+ }
+ return controller
+ }
+ {% else %}
+ @available(iOS 13.0, tvOS 13.0, *)
+ {{accessModifier}} func instantiate(creator block: @escaping (NSCoder) -> T?) -> T {
+ guard let controller = storyboard.storyboard.instantiateInitial{{controller}}(creator: block) else {
+ fatalError("Storyboard \(storyboard.storyboardName) does not have an initial scene.")
+ }
+ return controller
+ }
+ {% endif %}
+}
+{% if not param.bundle and not param.lookupFunction %}
+
+// swiftlint:disable convenience_type
+private final class BundleToken {
+ static let bundle: Bundle = {
+ #if SWIFT_PACKAGE
+ return Bundle.module
+ #else
+ return Bundle(for: BundleToken.self)
+ #endif
+ }()
+}
+// swiftlint:enable convenience_type
+{% endif %}
+{% elif storyboards %}
+// Mixed AppKit and UIKit storyboard files found, please invoke swiftgen with these separately
+{% else %}
+// No storyboard found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/ib/scenes-swift5.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/ib/scenes-swift5.stencil
new file mode 100644
index 0000000..5f29f8b
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/ib/scenes-swift5.stencil
@@ -0,0 +1,159 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if platform and storyboards %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+{% set isAppKit %}{% if platform == "macOS" %}true{% endif %}{% endset %}
+{% set prefix %}{% if isAppKit %}NS{% else %}UI{% endif %}{% endset %}
+{% set controller %}{% if isAppKit %}Controller{% else %}ViewController{% endif %}{% endset %}
+// swiftlint:disable sorted_imports
+import Foundation
+{% for module in modules where module != env.PRODUCT_MODULE_NAME and module != param.module %}
+import {{module}}
+{% endfor %}
+
+// swiftlint:disable superfluous_disable_command
+// swiftlint:disable file_length implicit_return
+
+// MARK: - Storyboard Scenes
+
+// swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name
+{% macro moduleName item %}{% filter removeNewlines %}
+ {% if item.moduleIsPlaceholder %}
+ {{ env.PRODUCT_MODULE_NAME|default:param.module }}
+ {% else %}
+ {{ item.module }}
+ {% endif %}
+{% endfilter %}{% endmacro %}
+{% macro className item %}{% filter removeNewlines %}
+ {% set module %}{% call moduleName item %}{% endset %}
+ {% if module and ( not param.ignoreTargetModule or module != env.PRODUCT_MODULE_NAME and module != param.module ) %}
+ {{module}}.
+ {% endif %}
+ {{item.type}}
+{% endfilter %}{% endmacro %}
+{{accessModifier}} enum {{param.enumName|default:"StoryboardScene"}} {
+ {% for storyboard in storyboards %}
+ {% set storyboardName %}{{storyboard.name|swiftIdentifier:"pretty"|escapeReservedKeywords}}{% endset %}
+ {{accessModifier}} enum {{storyboardName}}: StoryboardType {
+ {{accessModifier}} static let storyboardName = "{{storyboard.name}}"
+ {% if storyboard.initialScene %}
+
+ {% set sceneClass %}{% call className storyboard.initialScene %}{% endset %}
+ {{accessModifier}} static let initialScene = InitialSceneType<{{sceneClass}}>(storyboard: {{storyboardName}}.self)
+ {% endif %}
+ {% for scene in storyboard.scenes %}
+
+ {% set sceneID %}{{scene.identifier|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{% endset %}
+ {% set sceneClass %}{% call className scene %}{% endset %}
+ {{accessModifier}} static let {{sceneID}} = SceneType<{{sceneClass}}>(storyboard: {{storyboardName}}.self, identifier: "{{scene.identifier}}")
+ {% endfor %}
+ }
+ {% endfor %}
+}
+// swiftlint:enable explicit_type_interface identifier_name line_length type_body_length type_name
+
+// MARK: - Implementation Details
+
+{{accessModifier}} protocol StoryboardType {
+ static var storyboardName: String { get }
+}
+
+{{accessModifier}} extension StoryboardType {
+ static var storyboard: {{prefix}}Storyboard {
+ let name = {% if isAppKit %}NSStoryboard.Name({% endif %}self.storyboardName{% if isAppKit %}){% endif %}
+ {% if param.lookupFunction %}
+ return {{param.lookupFunction}}(name)
+ {% else %}
+ return {{prefix}}Storyboard(name: name, bundle: {{param.bundle|default:"BundleToken.bundle"}})
+ {% endif %}
+ }
+}
+
+{{accessModifier}} struct SceneType {
+ {{accessModifier}} let storyboard: StoryboardType.Type
+ {{accessModifier}} let identifier: String
+
+ {{accessModifier}} func instantiate() -> T {
+ let identifier = {% if isAppKit %}NSStoryboard.SceneIdentifier({% endif %}self.identifier{% if isAppKit %}){% endif %}
+ guard let controller = storyboard.storyboard.instantiate{{controller}}(withIdentifier: identifier) as? T else {
+ fatalError("{{controller}} '\(identifier)' is not of the expected class \(T.self).")
+ }
+ return controller
+ }
+
+ {% if isAppKit %}
+ @available(macOS 10.15, *)
+ {{accessModifier}} func instantiate(creator block: @escaping (NSCoder) -> T?) -> T where T: NSViewController {
+ let identifier = NSStoryboard.SceneIdentifier(self.identifier)
+ return storyboard.storyboard.instantiate{{controller}}(identifier: identifier, creator: block)
+ }
+
+ @available(macOS 10.15, *)
+ {{accessModifier}} func instantiate(creator block: @escaping (NSCoder) -> T?) -> T where T: NSWindowController {
+ let identifier = NSStoryboard.SceneIdentifier(self.identifier)
+ return storyboard.storyboard.instantiate{{controller}}(identifier: identifier, creator: block)
+ }
+ {% else %}
+ @available(iOS 13.0, tvOS 13.0, *)
+ {{accessModifier}} func instantiate(creator block: @escaping (NSCoder) -> T?) -> T {
+ return storyboard.storyboard.instantiate{{controller}}(identifier: identifier, creator: block)
+ }
+ {% endif %}
+}
+
+{{accessModifier}} struct InitialSceneType {
+ {{accessModifier}} let storyboard: StoryboardType.Type
+
+ {{accessModifier}} func instantiate() -> T {
+ guard let controller = storyboard.storyboard.instantiateInitial{{controller}}() as? T else {
+ fatalError("{{controller}} is not of the expected class \(T.self).")
+ }
+ return controller
+ }
+
+ {% if isAppKit %}
+ @available(macOS 10.15, *)
+ {{accessModifier}} func instantiate(creator block: @escaping (NSCoder) -> T?) -> T where T: NSViewController {
+ guard let controller = storyboard.storyboard.instantiateInitial{{controller}}(creator: block) else {
+ fatalError("Storyboard \(storyboard.storyboardName) does not have an initial scene.")
+ }
+ return controller
+ }
+
+ @available(macOS 10.15, *)
+ {{accessModifier}} func instantiate(creator block: @escaping (NSCoder) -> T?) -> T where T: NSWindowController {
+ guard let controller = storyboard.storyboard.instantiateInitial{{controller}}(creator: block) else {
+ fatalError("Storyboard \(storyboard.storyboardName) does not have an initial scene.")
+ }
+ return controller
+ }
+ {% else %}
+ @available(iOS 13.0, tvOS 13.0, *)
+ {{accessModifier}} func instantiate(creator block: @escaping (NSCoder) -> T?) -> T {
+ guard let controller = storyboard.storyboard.instantiateInitial{{controller}}(creator: block) else {
+ fatalError("Storyboard \(storyboard.storyboardName) does not have an initial scene.")
+ }
+ return controller
+ }
+ {% endif %}
+}
+{% if not param.bundle and not param.lookupFunction %}
+
+// swiftlint:disable convenience_type
+private final class BundleToken {
+ static let bundle: Bundle = {
+ #if SWIFT_PACKAGE
+ return Bundle.module
+ #else
+ return Bundle(for: BundleToken.self)
+ #endif
+ }()
+}
+// swiftlint:enable convenience_type
+{% endif %}
+{% elif storyboards %}
+// Mixed AppKit and UIKit storyboard files found, please invoke swiftgen with these separately
+{% else %}
+// No storyboard found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/ib/segues-swift4.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/ib/segues-swift4.stencil
new file mode 100644
index 0000000..476d546
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/ib/segues-swift4.stencil
@@ -0,0 +1,60 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if platform and storyboards %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+{% set isAppKit %}{% if platform == "macOS" %}true{% endif %}{% endset %}
+// swiftlint:disable sorted_imports
+import Foundation
+{% for module in modules where module != env.PRODUCT_MODULE_NAME and module != param.module %}
+import {{module}}
+{% endfor %}
+
+// swiftlint:disable superfluous_disable_command
+// swiftlint:disable file_length
+
+// MARK: - Storyboard Segues
+
+// swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name
+{{accessModifier}} enum {{param.enumName|default:"StoryboardSegue"}} {
+ {% for storyboard in storyboards where storyboard.segues %}
+ {{accessModifier}} enum {{storyboard.name|swiftIdentifier:"pretty"|escapeReservedKeywords}}: String, SegueType {
+ {% for segue in storyboard.segues %}
+ {% set segueID %}{{segue.identifier|swiftIdentifier:"pretty"|lowerFirstWord}}{% endset %}
+ case {{segueID|escapeReservedKeywords}}{% if segueID != segue.identifier %} = "{{segue.identifier}}"{% endif %}
+ {% endfor %}
+ }
+ {% endfor %}
+}
+// swiftlint:enable explicit_type_interface identifier_name line_length type_body_length type_name
+
+// MARK: - Implementation Details
+
+{{accessModifier}} protocol SegueType: RawRepresentable {}
+
+{{accessModifier}} extension {% if isAppKit %}NSSeguePerforming{% else %}UIViewController{% endif %} {
+ func perform(segue: S, sender: Any? = nil) where S.RawValue == String {
+ let identifier = {% if isAppKit %}NSStoryboardSegue.Identifier({% endif %}segue.rawValue{% if isAppKit %}){% endif %}
+ performSegue{% if isAppKit %}?{% endif %}(withIdentifier: identifier, sender: sender)
+ }
+}
+
+{{accessModifier}} extension SegueType where RawValue == String {
+ init?(_ segue: {% if isAppKit %}NS{% else %}UI{% endif %}StoryboardSegue) {
+ {% if isAppKit %}
+ #if swift(>=4.2)
+ guard let identifier = segue.identifier else { return nil }
+ #else
+ guard let identifier = segue.identifier?.rawValue else { return nil }
+ #endif
+ {% else %}
+ guard let identifier = segue.identifier else { return nil }
+ {% endif %}
+ self.init(rawValue: identifier)
+ }
+}
+{% elif storyboards %}
+// Mixed AppKit and UIKit storyboard files found, please invoke swiftgen with these separately
+{% else %}
+// No storyboard found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/ib/segues-swift5.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/ib/segues-swift5.stencil
new file mode 100644
index 0000000..476d546
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/ib/segues-swift5.stencil
@@ -0,0 +1,60 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if platform and storyboards %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+{% set isAppKit %}{% if platform == "macOS" %}true{% endif %}{% endset %}
+// swiftlint:disable sorted_imports
+import Foundation
+{% for module in modules where module != env.PRODUCT_MODULE_NAME and module != param.module %}
+import {{module}}
+{% endfor %}
+
+// swiftlint:disable superfluous_disable_command
+// swiftlint:disable file_length
+
+// MARK: - Storyboard Segues
+
+// swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name
+{{accessModifier}} enum {{param.enumName|default:"StoryboardSegue"}} {
+ {% for storyboard in storyboards where storyboard.segues %}
+ {{accessModifier}} enum {{storyboard.name|swiftIdentifier:"pretty"|escapeReservedKeywords}}: String, SegueType {
+ {% for segue in storyboard.segues %}
+ {% set segueID %}{{segue.identifier|swiftIdentifier:"pretty"|lowerFirstWord}}{% endset %}
+ case {{segueID|escapeReservedKeywords}}{% if segueID != segue.identifier %} = "{{segue.identifier}}"{% endif %}
+ {% endfor %}
+ }
+ {% endfor %}
+}
+// swiftlint:enable explicit_type_interface identifier_name line_length type_body_length type_name
+
+// MARK: - Implementation Details
+
+{{accessModifier}} protocol SegueType: RawRepresentable {}
+
+{{accessModifier}} extension {% if isAppKit %}NSSeguePerforming{% else %}UIViewController{% endif %} {
+ func perform(segue: S, sender: Any? = nil) where S.RawValue == String {
+ let identifier = {% if isAppKit %}NSStoryboardSegue.Identifier({% endif %}segue.rawValue{% if isAppKit %}){% endif %}
+ performSegue{% if isAppKit %}?{% endif %}(withIdentifier: identifier, sender: sender)
+ }
+}
+
+{{accessModifier}} extension SegueType where RawValue == String {
+ init?(_ segue: {% if isAppKit %}NS{% else %}UI{% endif %}StoryboardSegue) {
+ {% if isAppKit %}
+ #if swift(>=4.2)
+ guard let identifier = segue.identifier else { return nil }
+ #else
+ guard let identifier = segue.identifier?.rawValue else { return nil }
+ #endif
+ {% else %}
+ guard let identifier = segue.identifier else { return nil }
+ {% endif %}
+ self.init(rawValue: identifier)
+ }
+}
+{% elif storyboards %}
+// Mixed AppKit and UIKit storyboard files found, please invoke swiftgen with these separately
+{% else %}
+// No storyboard found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/json/inline-swift4.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/json/inline-swift4.stencil
new file mode 100644
index 0000000..62ca48d
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/json/inline-swift4.stencil
@@ -0,0 +1,82 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if files %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+import Foundation
+
+// swiftlint:disable superfluous_disable_command
+// swiftlint:disable file_length
+
+// MARK: - JSON Files
+{% macro fileBlock file %}
+ {% call documentBlock file file.document %}
+{% endmacro %}
+{% macro documentBlock file document %}
+ {% set rootType %}{% call typeBlock document.metadata %}{% endset %}
+ {% if document.metadata.type == "Array" %}
+ {{accessModifier}} static let items: {{rootType}} = {% call valueBlock document.data document.metadata %}
+ {% elif document.metadata.type == "Dictionary" %}
+ {% for key,value in document.metadata.properties %}
+ {{accessModifier}} {% call propertyBlock key value document.data %}
+ {% endfor %}
+ {% else %}
+ {{accessModifier}} static let value: {{rootType}} = {% call valueBlock document.data document.metadata %}
+ {% endif %}
+{% endmacro %}
+{% macro typeBlock metadata %}{% filter removeNewlines:"leading" %}
+ {% if metadata.type == "Array" %}
+ [{% call typeBlock metadata.element %}]
+ {% elif metadata.type == "Dictionary" %}
+ [String: Any]
+ {% elif metadata.type == "Optional" %}
+ Any?
+ {% else %}
+ {{metadata.type}}
+ {% endif %}
+{% endfilter %}{% endmacro %}
+{% macro propertyBlock key metadata data %}{% filter removeNewlines:"leading" %}
+ {% set propertyName %}{{key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{% endset %}
+ {% set propertyType %}{% call typeBlock metadata %}{% endset %}
+ static let {{propertyName}}: {{propertyType}} = {% call valueBlock data[key] metadata %}
+{% endfilter %}{% endmacro %}
+{% macro valueBlock value metadata %}{% filter removeNewlines:"leading" %}
+ {% if metadata.type == "String" %}
+ "{{ value }}"
+ {% elif metadata.type == "Optional" %}
+ nil
+ {% elif metadata.type == "Array" and value %}
+ [{% for value in value %}
+ {% call valueBlock value metadata.element.items[forloop.counter0]|default:metadata.element %}
+ {{ ", " if not forloop.last }}
+ {% endfor %}]
+ {% elif metadata.type == "Dictionary" %}
+ [{% for key,value in value %}
+ "{{key}}": {% call valueBlock value metadata.properties[key] %}
+ {{ ", " if not forloop.last }}
+ {% empty %}
+ :
+ {% endfor %}]
+ {% elif metadata.type == "Bool" %}
+ {% if value %}true{% else %}false{% endif %}
+ {% else %}
+ {{ value }}
+ {% endif %}
+{% endfilter %}{% endmacro %}
+
+// swiftlint:disable identifier_name line_length number_separator type_body_length
+{{accessModifier}} enum {{param.enumName|default:"JSONFiles"}} {
+ {% if files.count > 1 or param.forceFileNameEnum %}
+ {% for file in files %}
+ {{accessModifier}} enum {{file.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call fileBlock file %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call fileBlock files.first %}
+ {% endif %}
+}
+// swiftlint:enable identifier_name line_length number_separator type_body_length
+{% else %}
+// No files found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/json/inline-swift5.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/json/inline-swift5.stencil
new file mode 100644
index 0000000..62ca48d
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/json/inline-swift5.stencil
@@ -0,0 +1,82 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if files %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+import Foundation
+
+// swiftlint:disable superfluous_disable_command
+// swiftlint:disable file_length
+
+// MARK: - JSON Files
+{% macro fileBlock file %}
+ {% call documentBlock file file.document %}
+{% endmacro %}
+{% macro documentBlock file document %}
+ {% set rootType %}{% call typeBlock document.metadata %}{% endset %}
+ {% if document.metadata.type == "Array" %}
+ {{accessModifier}} static let items: {{rootType}} = {% call valueBlock document.data document.metadata %}
+ {% elif document.metadata.type == "Dictionary" %}
+ {% for key,value in document.metadata.properties %}
+ {{accessModifier}} {% call propertyBlock key value document.data %}
+ {% endfor %}
+ {% else %}
+ {{accessModifier}} static let value: {{rootType}} = {% call valueBlock document.data document.metadata %}
+ {% endif %}
+{% endmacro %}
+{% macro typeBlock metadata %}{% filter removeNewlines:"leading" %}
+ {% if metadata.type == "Array" %}
+ [{% call typeBlock metadata.element %}]
+ {% elif metadata.type == "Dictionary" %}
+ [String: Any]
+ {% elif metadata.type == "Optional" %}
+ Any?
+ {% else %}
+ {{metadata.type}}
+ {% endif %}
+{% endfilter %}{% endmacro %}
+{% macro propertyBlock key metadata data %}{% filter removeNewlines:"leading" %}
+ {% set propertyName %}{{key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{% endset %}
+ {% set propertyType %}{% call typeBlock metadata %}{% endset %}
+ static let {{propertyName}}: {{propertyType}} = {% call valueBlock data[key] metadata %}
+{% endfilter %}{% endmacro %}
+{% macro valueBlock value metadata %}{% filter removeNewlines:"leading" %}
+ {% if metadata.type == "String" %}
+ "{{ value }}"
+ {% elif metadata.type == "Optional" %}
+ nil
+ {% elif metadata.type == "Array" and value %}
+ [{% for value in value %}
+ {% call valueBlock value metadata.element.items[forloop.counter0]|default:metadata.element %}
+ {{ ", " if not forloop.last }}
+ {% endfor %}]
+ {% elif metadata.type == "Dictionary" %}
+ [{% for key,value in value %}
+ "{{key}}": {% call valueBlock value metadata.properties[key] %}
+ {{ ", " if not forloop.last }}
+ {% empty %}
+ :
+ {% endfor %}]
+ {% elif metadata.type == "Bool" %}
+ {% if value %}true{% else %}false{% endif %}
+ {% else %}
+ {{ value }}
+ {% endif %}
+{% endfilter %}{% endmacro %}
+
+// swiftlint:disable identifier_name line_length number_separator type_body_length
+{{accessModifier}} enum {{param.enumName|default:"JSONFiles"}} {
+ {% if files.count > 1 or param.forceFileNameEnum %}
+ {% for file in files %}
+ {{accessModifier}} enum {{file.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call fileBlock file %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call fileBlock files.first %}
+ {% endif %}
+}
+// swiftlint:enable identifier_name line_length number_separator type_body_length
+{% else %}
+// No files found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/json/runtime-swift4.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/json/runtime-swift4.stencil
new file mode 100644
index 0000000..c2466c7
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/json/runtime-swift4.stencil
@@ -0,0 +1,112 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if files %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+import Foundation
+
+// swiftlint:disable superfluous_disable_command
+// swiftlint:disable file_length
+
+// MARK: - JSON Files
+{% macro fileBlock file %}
+ {% call documentBlock file file.document %}
+{% endmacro %}
+{% macro documentBlock file document %}
+ {% set rootType %}{% call typeBlock document.metadata %}{% endset %}
+ {% if document.metadata.type == "Array" %}
+ {{accessModifier}} static let items: {{rootType}} = objectFromJSON(at: "{% call transformPath file.path %}")
+ {% elif document.metadata.type == "Dictionary" %}
+ private static let _document = JSONDocument(path: "{% call transformPath file.path %}")
+
+ {% for key,value in document.metadata.properties %}
+ {{accessModifier}} {% call propertyBlock key value %}
+ {% endfor %}
+ {% else %}
+ {{accessModifier}} static let value: {{rootType}} = objectFromJSON(at: "{% call transformPath file.path %}")
+ {% endif %}
+{% endmacro %}
+{% macro typeBlock metadata %}{% filter removeNewlines:"leading" %}
+ {% if metadata.type == "Array" %}
+ [{% call typeBlock metadata.element %}]
+ {% elif metadata.type == "Dictionary" %}
+ [String: Any]
+ {% elif metadata.type == "Optional" %}
+ Any?
+ {% else %}
+ {{metadata.type}}
+ {% endif %}
+{% endfilter %}{% endmacro %}
+{% macro propertyBlock key metadata %}{% filter removeNewlines:"leading" %}
+ {% set propertyName %}{{key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{% endset %}
+ {% set propertyType %}{% call typeBlock metadata %}{% endset %}
+ static let {{propertyName}}: {{propertyType}} = _document["{{key}}"]
+{% endfilter %}{% endmacro %}
+{% macro transformPath path %}{% filter removeNewlines %}
+ {% if param.preservePath %}
+ {{path}}
+ {% else %}
+ {{path|basename}}
+ {% endif %}
+{% endfilter %}{% endmacro %}
+
+// swiftlint:disable identifier_name line_length type_body_length
+{{accessModifier}} enum {{param.enumName|default:"JSONFiles"}} {
+ {% if files.count > 1 or param.forceFileNameEnum %}
+ {% for file in files %}
+ {{accessModifier}} enum {{file.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call fileBlock file %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call fileBlock files.first %}
+ {% endif %}
+}
+// swiftlint:enable identifier_name line_length type_body_length
+
+// MARK: - Implementation Details
+
+private func objectFromJSON(at path: String) -> T {
+ {% if param.lookupFunction %}
+ guard let url = {{param.lookupFunction}}(path),
+ {% else %}
+ guard let url = {{param.bundle|default:"BundleToken.bundle"}}.url(forResource: path, withExtension: nil),
+ {% endif %}
+ let json = try? JSONSerialization.jsonObject(with: Data(contentsOf: url), options: []),
+ let result = json as? T else {
+ fatalError("Unable to load JSON at path: \(path)")
+ }
+ return result
+}
+
+private struct JSONDocument {
+ let data: [String: Any]
+
+ init(path: String) {
+ self.data = objectFromJSON(at: path)
+ }
+
+ subscript(key: String) -> T {
+ guard let result = data[key] as? T else {
+ fatalError("Property '\(key)' is not of type \(T.self)")
+ }
+ return result
+ }
+}
+{% if not param.bundle and not param.lookupFunction %}
+
+// swiftlint:disable convenience_type
+private final class BundleToken {
+ static let bundle: Bundle = {
+ #if SWIFT_PACKAGE
+ return Bundle.module
+ #else
+ return Bundle(for: BundleToken.self)
+ #endif
+ }()
+}
+// swiftlint:enable convenience_type
+{% endif %}
+{% else %}
+// No files found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/json/runtime-swift5.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/json/runtime-swift5.stencil
new file mode 100644
index 0000000..c2466c7
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/json/runtime-swift5.stencil
@@ -0,0 +1,112 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if files %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+import Foundation
+
+// swiftlint:disable superfluous_disable_command
+// swiftlint:disable file_length
+
+// MARK: - JSON Files
+{% macro fileBlock file %}
+ {% call documentBlock file file.document %}
+{% endmacro %}
+{% macro documentBlock file document %}
+ {% set rootType %}{% call typeBlock document.metadata %}{% endset %}
+ {% if document.metadata.type == "Array" %}
+ {{accessModifier}} static let items: {{rootType}} = objectFromJSON(at: "{% call transformPath file.path %}")
+ {% elif document.metadata.type == "Dictionary" %}
+ private static let _document = JSONDocument(path: "{% call transformPath file.path %}")
+
+ {% for key,value in document.metadata.properties %}
+ {{accessModifier}} {% call propertyBlock key value %}
+ {% endfor %}
+ {% else %}
+ {{accessModifier}} static let value: {{rootType}} = objectFromJSON(at: "{% call transformPath file.path %}")
+ {% endif %}
+{% endmacro %}
+{% macro typeBlock metadata %}{% filter removeNewlines:"leading" %}
+ {% if metadata.type == "Array" %}
+ [{% call typeBlock metadata.element %}]
+ {% elif metadata.type == "Dictionary" %}
+ [String: Any]
+ {% elif metadata.type == "Optional" %}
+ Any?
+ {% else %}
+ {{metadata.type}}
+ {% endif %}
+{% endfilter %}{% endmacro %}
+{% macro propertyBlock key metadata %}{% filter removeNewlines:"leading" %}
+ {% set propertyName %}{{key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{% endset %}
+ {% set propertyType %}{% call typeBlock metadata %}{% endset %}
+ static let {{propertyName}}: {{propertyType}} = _document["{{key}}"]
+{% endfilter %}{% endmacro %}
+{% macro transformPath path %}{% filter removeNewlines %}
+ {% if param.preservePath %}
+ {{path}}
+ {% else %}
+ {{path|basename}}
+ {% endif %}
+{% endfilter %}{% endmacro %}
+
+// swiftlint:disable identifier_name line_length type_body_length
+{{accessModifier}} enum {{param.enumName|default:"JSONFiles"}} {
+ {% if files.count > 1 or param.forceFileNameEnum %}
+ {% for file in files %}
+ {{accessModifier}} enum {{file.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call fileBlock file %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call fileBlock files.first %}
+ {% endif %}
+}
+// swiftlint:enable identifier_name line_length type_body_length
+
+// MARK: - Implementation Details
+
+private func objectFromJSON(at path: String) -> T {
+ {% if param.lookupFunction %}
+ guard let url = {{param.lookupFunction}}(path),
+ {% else %}
+ guard let url = {{param.bundle|default:"BundleToken.bundle"}}.url(forResource: path, withExtension: nil),
+ {% endif %}
+ let json = try? JSONSerialization.jsonObject(with: Data(contentsOf: url), options: []),
+ let result = json as? T else {
+ fatalError("Unable to load JSON at path: \(path)")
+ }
+ return result
+}
+
+private struct JSONDocument {
+ let data: [String: Any]
+
+ init(path: String) {
+ self.data = objectFromJSON(at: path)
+ }
+
+ subscript(key: String) -> T {
+ guard let result = data[key] as? T else {
+ fatalError("Property '\(key)' is not of type \(T.self)")
+ }
+ return result
+ }
+}
+{% if not param.bundle and not param.lookupFunction %}
+
+// swiftlint:disable convenience_type
+private final class BundleToken {
+ static let bundle: Bundle = {
+ #if SWIFT_PACKAGE
+ return Bundle.module
+ #else
+ return Bundle(for: BundleToken.self)
+ #endif
+ }()
+}
+// swiftlint:enable convenience_type
+{% endif %}
+{% else %}
+// No files found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/plist/inline-swift4.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/plist/inline-swift4.stencil
new file mode 100644
index 0000000..c8e8831
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/plist/inline-swift4.stencil
@@ -0,0 +1,82 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if files %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+import Foundation
+
+// swiftlint:disable superfluous_disable_command
+// swiftlint:disable file_length
+
+// MARK: - Plist Files
+{% macro fileBlock file %}
+ {% call documentBlock file file.document %}
+{% endmacro %}
+{% macro documentBlock file document %}
+ {% set rootType %}{% call typeBlock document.metadata %}{% endset %}
+ {% if document.metadata.type == "Array" %}
+ {{accessModifier}} static let items: {{rootType}} = {% call valueBlock document.data document.metadata %}
+ {% elif document.metadata.type == "Dictionary" %}
+ {% for key,value in document.metadata.properties %}
+ {{accessModifier}} {% call propertyBlock key value document.data %}
+ {% endfor %}
+ {% else %}
+ {{accessModifier}} static let value: {{rootType}} = {% call valueBlock document.data document.metadata %}
+ {% endif %}
+{% endmacro %}
+{% macro typeBlock metadata %}{% filter removeNewlines:"leading" %}
+ {% if metadata.type == "Array" %}
+ [{% call typeBlock metadata.element %}]
+ {% elif metadata.type == "Dictionary" %}
+ [String: Any]
+ {% else %}
+ {{metadata.type}}
+ {% endif %}
+{% endfilter %}{% endmacro %}
+{% macro propertyBlock key metadata data %}{% filter removeNewlines:"leading" %}
+ {% set propertyName %}{{key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{% endset %}
+ {% set propertyType %}{% call typeBlock metadata %}{% endset %}
+ static let {{propertyName}}: {{propertyType}} = {% call valueBlock data[key] metadata %}
+{% endfilter %}{% endmacro %}
+{% macro valueBlock value metadata %}{% filter removeNewlines:"leading" %}
+ {% if metadata.type == "String" %}
+ "{{ value }}"
+ {% elif metadata.type == "Date" %}
+ Date(timeIntervalSinceReferenceDate: {{ value.timeIntervalSinceReferenceDate }})
+ {% elif metadata.type == "Optional" %}
+ nil
+ {% elif metadata.type == "Array" and value %}
+ [{% for value in value %}
+ {% call valueBlock value metadata.element.items[forloop.counter0]|default:metadata.element %}
+ {{ ", " if not forloop.last }}
+ {% endfor %}]
+ {% elif metadata.type == "Dictionary" %}
+ [{% for key,value in value %}
+ "{{key}}": {% call valueBlock value metadata.properties[key] %}
+ {{ ", " if not forloop.last }}
+ {% empty %}
+ :
+ {% endfor %}]
+ {% elif metadata.type == "Bool" %}
+ {% if value %}true{% else %}false{% endif %}
+ {% else %}
+ {{ value }}
+ {% endif %}
+{% endfilter %}{% endmacro %}
+
+// swiftlint:disable identifier_name line_length number_separator type_body_length
+{{accessModifier}} enum {{param.enumName|default:"PlistFiles"}} {
+ {% if files.count > 1 or param.forceFileNameEnum %}
+ {% for file in files %}
+ {{accessModifier}} enum {{file.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call fileBlock file %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call fileBlock files.first %}
+ {% endif %}
+}
+// swiftlint:enable identifier_name line_length number_separator type_body_length
+{% else %}
+// No files found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/plist/inline-swift5.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/plist/inline-swift5.stencil
new file mode 100644
index 0000000..c8e8831
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/plist/inline-swift5.stencil
@@ -0,0 +1,82 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if files %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+import Foundation
+
+// swiftlint:disable superfluous_disable_command
+// swiftlint:disable file_length
+
+// MARK: - Plist Files
+{% macro fileBlock file %}
+ {% call documentBlock file file.document %}
+{% endmacro %}
+{% macro documentBlock file document %}
+ {% set rootType %}{% call typeBlock document.metadata %}{% endset %}
+ {% if document.metadata.type == "Array" %}
+ {{accessModifier}} static let items: {{rootType}} = {% call valueBlock document.data document.metadata %}
+ {% elif document.metadata.type == "Dictionary" %}
+ {% for key,value in document.metadata.properties %}
+ {{accessModifier}} {% call propertyBlock key value document.data %}
+ {% endfor %}
+ {% else %}
+ {{accessModifier}} static let value: {{rootType}} = {% call valueBlock document.data document.metadata %}
+ {% endif %}
+{% endmacro %}
+{% macro typeBlock metadata %}{% filter removeNewlines:"leading" %}
+ {% if metadata.type == "Array" %}
+ [{% call typeBlock metadata.element %}]
+ {% elif metadata.type == "Dictionary" %}
+ [String: Any]
+ {% else %}
+ {{metadata.type}}
+ {% endif %}
+{% endfilter %}{% endmacro %}
+{% macro propertyBlock key metadata data %}{% filter removeNewlines:"leading" %}
+ {% set propertyName %}{{key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{% endset %}
+ {% set propertyType %}{% call typeBlock metadata %}{% endset %}
+ static let {{propertyName}}: {{propertyType}} = {% call valueBlock data[key] metadata %}
+{% endfilter %}{% endmacro %}
+{% macro valueBlock value metadata %}{% filter removeNewlines:"leading" %}
+ {% if metadata.type == "String" %}
+ "{{ value }}"
+ {% elif metadata.type == "Date" %}
+ Date(timeIntervalSinceReferenceDate: {{ value.timeIntervalSinceReferenceDate }})
+ {% elif metadata.type == "Optional" %}
+ nil
+ {% elif metadata.type == "Array" and value %}
+ [{% for value in value %}
+ {% call valueBlock value metadata.element.items[forloop.counter0]|default:metadata.element %}
+ {{ ", " if not forloop.last }}
+ {% endfor %}]
+ {% elif metadata.type == "Dictionary" %}
+ [{% for key,value in value %}
+ "{{key}}": {% call valueBlock value metadata.properties[key] %}
+ {{ ", " if not forloop.last }}
+ {% empty %}
+ :
+ {% endfor %}]
+ {% elif metadata.type == "Bool" %}
+ {% if value %}true{% else %}false{% endif %}
+ {% else %}
+ {{ value }}
+ {% endif %}
+{% endfilter %}{% endmacro %}
+
+// swiftlint:disable identifier_name line_length number_separator type_body_length
+{{accessModifier}} enum {{param.enumName|default:"PlistFiles"}} {
+ {% if files.count > 1 or param.forceFileNameEnum %}
+ {% for file in files %}
+ {{accessModifier}} enum {{file.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call fileBlock file %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call fileBlock files.first %}
+ {% endif %}
+}
+// swiftlint:enable identifier_name line_length number_separator type_body_length
+{% else %}
+// No files found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/plist/runtime-swift4.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/plist/runtime-swift4.stencil
new file mode 100644
index 0000000..a498a8f
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/plist/runtime-swift4.stencil
@@ -0,0 +1,117 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if files %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+import Foundation
+
+// swiftlint:disable superfluous_disable_command
+// swiftlint:disable file_length
+
+// MARK: - Plist Files
+{% macro fileBlock file %}
+ {% call documentBlock file file.document %}
+{% endmacro %}
+{% macro documentBlock file document %}
+ {% set rootType %}{% call typeBlock document.metadata %}{% endset %}
+ {% if document.metadata.type == "Array" %}
+ {{accessModifier}} static let items: {{rootType}} = arrayFromPlist(at: "{% call transformPath file.path %}")
+ {% elif document.metadata.type == "Dictionary" %}
+ private static let _document = PlistDocument(path: "{% call transformPath file.path %}")
+
+ {% for key,value in document.metadata.properties %}
+ {{accessModifier}} {% call propertyBlock key value %}
+ {% endfor %}
+ {% else %}
+ // Unsupported root type `{{rootType}}`
+ {% endif %}
+{% endmacro %}
+{% macro typeBlock metadata %}{% filter removeNewlines:"leading" %}
+ {% if metadata.type == "Array" %}
+ [{% call typeBlock metadata.element %}]
+ {% elif metadata.type == "Dictionary" %}
+ [String: Any]
+ {% else %}
+ {{metadata.type}}
+ {% endif %}
+{% endfilter %}{% endmacro %}
+{% macro propertyBlock key metadata %}{% filter removeNewlines:"leading" %}
+ {% set propertyName %}{{key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{% endset %}
+ {% set propertyType %}{% call typeBlock metadata %}{% endset %}
+ static let {{propertyName}}: {{propertyType}} = _document["{{key}}"]
+{% endfilter %}{% endmacro %}
+{% macro transformPath path %}{% filter removeNewlines %}
+ {% if param.preservePath %}
+ {{path}}
+ {% else %}
+ {{path|basename}}
+ {% endif %}
+{% endfilter %}{% endmacro %}
+
+// swiftlint:disable identifier_name line_length type_body_length
+{{accessModifier}} enum {{param.enumName|default:"PlistFiles"}} {
+ {% if files.count > 1 or param.forceFileNameEnum %}
+ {% for file in files %}
+ {{accessModifier}} enum {{file.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call fileBlock file %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call fileBlock files.first %}
+ {% endif %}
+}
+// swiftlint:enable identifier_name line_length type_body_length
+
+// MARK: - Implementation Details
+
+private func arrayFromPlist(at path: String) -> [T] {
+ {% if param.lookupFunction %}
+ guard let url = {{param.lookupFunction}}(path),
+ {% else %}
+ guard let url = {{param.bundle|default:"BundleToken.bundle"}}.url(forResource: path, withExtension: nil),
+ {% endif %}
+ let data = NSArray(contentsOf: url) as? [T] else {
+ fatalError("Unable to load PLIST at path: \(path)")
+ }
+ return data
+}
+
+private struct PlistDocument {
+ let data: [String: Any]
+
+ init(path: String) {
+ {% if param.lookupFunction %}
+ guard let url = {{param.lookupFunction}}(path),
+ {% else %}
+ guard let url = {{param.bundle|default:"BundleToken.bundle"}}.url(forResource: path, withExtension: nil),
+ {% endif %}
+ let data = NSDictionary(contentsOf: url) as? [String: Any] else {
+ fatalError("Unable to load PLIST at path: \(path)")
+ }
+ self.data = data
+ }
+
+ subscript(key: String) -> T {
+ guard let result = data[key] as? T else {
+ fatalError("Property '\(key)' is not of type \(T.self)")
+ }
+ return result
+ }
+}
+{% if not param.bundle and not param.lookupFunction %}
+
+// swiftlint:disable convenience_type
+private final class BundleToken {
+ static let bundle: Bundle = {
+ #if SWIFT_PACKAGE
+ return Bundle.module
+ #else
+ return Bundle(for: BundleToken.self)
+ #endif
+ }()
+}
+// swiftlint:enable convenience_type
+{% endif %}
+{% else %}
+// No files found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/plist/runtime-swift5.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/plist/runtime-swift5.stencil
new file mode 100644
index 0000000..a498a8f
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/plist/runtime-swift5.stencil
@@ -0,0 +1,117 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if files %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+import Foundation
+
+// swiftlint:disable superfluous_disable_command
+// swiftlint:disable file_length
+
+// MARK: - Plist Files
+{% macro fileBlock file %}
+ {% call documentBlock file file.document %}
+{% endmacro %}
+{% macro documentBlock file document %}
+ {% set rootType %}{% call typeBlock document.metadata %}{% endset %}
+ {% if document.metadata.type == "Array" %}
+ {{accessModifier}} static let items: {{rootType}} = arrayFromPlist(at: "{% call transformPath file.path %}")
+ {% elif document.metadata.type == "Dictionary" %}
+ private static let _document = PlistDocument(path: "{% call transformPath file.path %}")
+
+ {% for key,value in document.metadata.properties %}
+ {{accessModifier}} {% call propertyBlock key value %}
+ {% endfor %}
+ {% else %}
+ // Unsupported root type `{{rootType}}`
+ {% endif %}
+{% endmacro %}
+{% macro typeBlock metadata %}{% filter removeNewlines:"leading" %}
+ {% if metadata.type == "Array" %}
+ [{% call typeBlock metadata.element %}]
+ {% elif metadata.type == "Dictionary" %}
+ [String: Any]
+ {% else %}
+ {{metadata.type}}
+ {% endif %}
+{% endfilter %}{% endmacro %}
+{% macro propertyBlock key metadata %}{% filter removeNewlines:"leading" %}
+ {% set propertyName %}{{key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{% endset %}
+ {% set propertyType %}{% call typeBlock metadata %}{% endset %}
+ static let {{propertyName}}: {{propertyType}} = _document["{{key}}"]
+{% endfilter %}{% endmacro %}
+{% macro transformPath path %}{% filter removeNewlines %}
+ {% if param.preservePath %}
+ {{path}}
+ {% else %}
+ {{path|basename}}
+ {% endif %}
+{% endfilter %}{% endmacro %}
+
+// swiftlint:disable identifier_name line_length type_body_length
+{{accessModifier}} enum {{param.enumName|default:"PlistFiles"}} {
+ {% if files.count > 1 or param.forceFileNameEnum %}
+ {% for file in files %}
+ {{accessModifier}} enum {{file.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call fileBlock file %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call fileBlock files.first %}
+ {% endif %}
+}
+// swiftlint:enable identifier_name line_length type_body_length
+
+// MARK: - Implementation Details
+
+private func arrayFromPlist(at path: String) -> [T] {
+ {% if param.lookupFunction %}
+ guard let url = {{param.lookupFunction}}(path),
+ {% else %}
+ guard let url = {{param.bundle|default:"BundleToken.bundle"}}.url(forResource: path, withExtension: nil),
+ {% endif %}
+ let data = NSArray(contentsOf: url) as? [T] else {
+ fatalError("Unable to load PLIST at path: \(path)")
+ }
+ return data
+}
+
+private struct PlistDocument {
+ let data: [String: Any]
+
+ init(path: String) {
+ {% if param.lookupFunction %}
+ guard let url = {{param.lookupFunction}}(path),
+ {% else %}
+ guard let url = {{param.bundle|default:"BundleToken.bundle"}}.url(forResource: path, withExtension: nil),
+ {% endif %}
+ let data = NSDictionary(contentsOf: url) as? [String: Any] else {
+ fatalError("Unable to load PLIST at path: \(path)")
+ }
+ self.data = data
+ }
+
+ subscript(key: String) -> T {
+ guard let result = data[key] as? T else {
+ fatalError("Property '\(key)' is not of type \(T.self)")
+ }
+ return result
+ }
+}
+{% if not param.bundle and not param.lookupFunction %}
+
+// swiftlint:disable convenience_type
+private final class BundleToken {
+ static let bundle: Bundle = {
+ #if SWIFT_PACKAGE
+ return Bundle.module
+ #else
+ return Bundle(for: BundleToken.self)
+ #endif
+ }()
+}
+// swiftlint:enable convenience_type
+{% endif %}
+{% else %}
+// No files found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/strings/flat-swift4.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/strings/flat-swift4.stencil
new file mode 100644
index 0000000..5bb4a12
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/strings/flat-swift4.stencil
@@ -0,0 +1,99 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if tables.count > 0 %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+import Foundation
+
+// swiftlint:disable superfluous_disable_command file_length implicit_return
+
+// MARK: - Strings
+
+{% macro parametersBlock types %}{% filter removeNewlines:"leading" %}
+ {% for type in types %}
+ {% if type == "String" %}
+ _ p{{forloop.counter}}: Any
+ {% else %}
+ _ p{{forloop.counter}}: {{type}}
+ {% endif %}
+ {{ ", " if not forloop.last }}
+ {% endfor %}
+{% endfilter %}{% endmacro %}
+{% macro argumentsBlock types %}{% filter removeNewlines:"leading" %}
+ {% for type in types %}
+ {% if type == "String" %}
+ String(describing: p{{forloop.counter}})
+ {% elif type == "UnsafeRawPointer" %}
+ Int(bitPattern: p{{forloop.counter}})
+ {% else %}
+ p{{forloop.counter}}
+ {% endif %}
+ {{ ", " if not forloop.last }}
+ {% endfor %}
+{% endfilter %}{% endmacro %}
+{% macro recursiveBlock table item %}
+ {% for string in item.strings %}
+ {% if not param.noComments %}
+ {% for line in string.translation|split:"\n" %}
+ /// {{line}}
+ {% endfor %}
+ {% endif %}
+ {% if string.types %}
+ {{accessModifier}} static func {{string.key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}({% call parametersBlock string.types %}) -> String {
+ return {{enumName}}.tr("{{table}}", "{{string.key}}", {% call argumentsBlock string.types %})
+ }
+ {% elif param.lookupFunction %}
+ {# custom localization function is mostly used for in-app lang selection, so we want the loc to be recomputed at each call for those (hence the computed var) #}
+ {{accessModifier}} static var {{string.key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}: String { return {{enumName}}.tr("{{table}}", "{{string.key}}") }
+ {% else %}
+ {{accessModifier}} static let {{string.key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{enumName}}.tr("{{table}}", "{{string.key}}")
+ {% endif %}
+ {% endfor %}
+ {% for child in item.children %}
+ {% call recursiveBlock table child %}
+ {% endfor %}
+{% endmacro %}
+// swiftlint:disable function_parameter_count identifier_name line_length type_body_length
+{% set enumName %}{{param.enumName|default:"L10n"}}{% endset %}
+{{accessModifier}} enum {{enumName}} {
+ {% if tables.count > 1 or param.forceFileNameEnum %}
+ {% for table in tables %}
+ {{accessModifier}} enum {{table.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call recursiveBlock table.name table.levels %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call recursiveBlock tables.first.name tables.first.levels %}
+ {% endif %}
+}
+// swiftlint:enable function_parameter_count identifier_name line_length type_body_length
+
+// MARK: - Implementation Details
+
+extension {{enumName}} {
+ private static func tr(_ table: String, _ key: String, _ args: CVarArg...) -> String {
+ {% if param.lookupFunction %}
+ let format = {{ param.lookupFunction }}(key, table)
+ {% else %}
+ let format = {{param.bundle|default:"BundleToken.bundle"}}.localizedString(forKey: key, value: nil, table: table)
+ {% endif %}
+ return String(format: format, locale: Locale.current, arguments: args)
+ }
+}
+{% if not param.bundle and not param.lookupFunction %}
+
+// swiftlint:disable convenience_type
+private final class BundleToken {
+ static let bundle: Bundle = {
+ #if SWIFT_PACKAGE
+ return Bundle.module
+ #else
+ return Bundle(for: BundleToken.self)
+ #endif
+ }()
+}
+// swiftlint:enable convenience_type
+{% endif %}
+{% else %}
+// No string found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/strings/flat-swift5.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/strings/flat-swift5.stencil
new file mode 100644
index 0000000..5bb4a12
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/strings/flat-swift5.stencil
@@ -0,0 +1,99 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if tables.count > 0 %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+import Foundation
+
+// swiftlint:disable superfluous_disable_command file_length implicit_return
+
+// MARK: - Strings
+
+{% macro parametersBlock types %}{% filter removeNewlines:"leading" %}
+ {% for type in types %}
+ {% if type == "String" %}
+ _ p{{forloop.counter}}: Any
+ {% else %}
+ _ p{{forloop.counter}}: {{type}}
+ {% endif %}
+ {{ ", " if not forloop.last }}
+ {% endfor %}
+{% endfilter %}{% endmacro %}
+{% macro argumentsBlock types %}{% filter removeNewlines:"leading" %}
+ {% for type in types %}
+ {% if type == "String" %}
+ String(describing: p{{forloop.counter}})
+ {% elif type == "UnsafeRawPointer" %}
+ Int(bitPattern: p{{forloop.counter}})
+ {% else %}
+ p{{forloop.counter}}
+ {% endif %}
+ {{ ", " if not forloop.last }}
+ {% endfor %}
+{% endfilter %}{% endmacro %}
+{% macro recursiveBlock table item %}
+ {% for string in item.strings %}
+ {% if not param.noComments %}
+ {% for line in string.translation|split:"\n" %}
+ /// {{line}}
+ {% endfor %}
+ {% endif %}
+ {% if string.types %}
+ {{accessModifier}} static func {{string.key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}({% call parametersBlock string.types %}) -> String {
+ return {{enumName}}.tr("{{table}}", "{{string.key}}", {% call argumentsBlock string.types %})
+ }
+ {% elif param.lookupFunction %}
+ {# custom localization function is mostly used for in-app lang selection, so we want the loc to be recomputed at each call for those (hence the computed var) #}
+ {{accessModifier}} static var {{string.key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}: String { return {{enumName}}.tr("{{table}}", "{{string.key}}") }
+ {% else %}
+ {{accessModifier}} static let {{string.key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{enumName}}.tr("{{table}}", "{{string.key}}")
+ {% endif %}
+ {% endfor %}
+ {% for child in item.children %}
+ {% call recursiveBlock table child %}
+ {% endfor %}
+{% endmacro %}
+// swiftlint:disable function_parameter_count identifier_name line_length type_body_length
+{% set enumName %}{{param.enumName|default:"L10n"}}{% endset %}
+{{accessModifier}} enum {{enumName}} {
+ {% if tables.count > 1 or param.forceFileNameEnum %}
+ {% for table in tables %}
+ {{accessModifier}} enum {{table.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call recursiveBlock table.name table.levels %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call recursiveBlock tables.first.name tables.first.levels %}
+ {% endif %}
+}
+// swiftlint:enable function_parameter_count identifier_name line_length type_body_length
+
+// MARK: - Implementation Details
+
+extension {{enumName}} {
+ private static func tr(_ table: String, _ key: String, _ args: CVarArg...) -> String {
+ {% if param.lookupFunction %}
+ let format = {{ param.lookupFunction }}(key, table)
+ {% else %}
+ let format = {{param.bundle|default:"BundleToken.bundle"}}.localizedString(forKey: key, value: nil, table: table)
+ {% endif %}
+ return String(format: format, locale: Locale.current, arguments: args)
+ }
+}
+{% if not param.bundle and not param.lookupFunction %}
+
+// swiftlint:disable convenience_type
+private final class BundleToken {
+ static let bundle: Bundle = {
+ #if SWIFT_PACKAGE
+ return Bundle.module
+ #else
+ return Bundle(for: BundleToken.self)
+ #endif
+ }()
+}
+// swiftlint:enable convenience_type
+{% endif %}
+{% else %}
+// No string found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/strings/objc-h.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/strings/objc-h.stencil
new file mode 100644
index 0000000..7c50291
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/strings/objc-h.stencil
@@ -0,0 +1,68 @@
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if tables.count > 0 %}
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+{% macro parametersBlock types %}{% filter removeNewlines:"leading" %}
+ {% for type in types %}
+ ({% call paramTranslate type %})p{{ forloop.counter }}{{ " :" if not forloop.last }}
+ {% endfor %}
+{% endfilter %}{% endmacro %}
+{% macro argumentsBlock types %}{% filter removeNewlines:"leading" %}
+ {% for type in types %}
+ p{{forloop.counter}}{{ ", " if not forloop.last }}
+ {% endfor %}
+{% endfilter %}{% endmacro %}
+{% macro paramTranslate swiftType %}
+ {% if swiftType == "Any" %}
+ id
+ {% elif swiftType == "CChar" %}
+ char
+ {% elif swiftType == "Float" %}
+ float
+ {% elif swiftType == "Int" %}
+ NSInteger
+ {% elif swiftType == "String" %}
+ id
+ {% elif swiftType == "UnsafePointer" %}
+ char*
+ {% elif swiftType == "UnsafeRawPointer" %}
+ void*
+ {% else %}
+ objc-h.stencil is missing '{{swiftType}}'
+ {% endif %}
+{% endmacro %}
+{% macro emitOneMethod table item %}
+{% for string in item.strings %}
+{% if not param.noComments %}
+{% for line in string.translation|split:"\n" %}
+/// {{line}}
+{% endfor %}
+{% endif %}
+{% if string.types %}
+ {% if string.types.count == 1 %}
++ (NSString*){{string.key|swiftIdentifier:"pretty"|lowerFirstWord}}WithValue:{% call parametersBlock string.types %};
+ {% else %}
++ (NSString*){{string.key|swiftIdentifier:"pretty"|lowerFirstWord}}WithValues:{% call parametersBlock string.types %};
+ {% endif %}
+{% else %}
++ (NSString*){{string.key|swiftIdentifier:"pretty"|lowerFirstWord}};
+{% endif %}
+{% endfor %}
+{% for child in item.children %}
+{% call emitOneMethod table child %}
+{% endfor %}
+{% endmacro %}
+{% for table in tables %}
+@interface {{ table.name }} : NSObject
+ {% call emitOneMethod table.name table.levels %}
+@end
+
+{% endfor %}
+
+NS_ASSUME_NONNULL_END
+{% else %}
+// No strings found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/strings/objc-m.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/strings/objc-m.stencil
new file mode 100644
index 0000000..1f154b5
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/strings/objc-m.stencil
@@ -0,0 +1,90 @@
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if tables.count > 0 %}
+#import "{{ param.headerName|default:"Localizable.h" }}"
+{% if not param.bundle %}
+
+@interface BundleToken : NSObject
+@end
+
+@implementation BundleToken
+@end
+{% endif %}
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wformat-security"
+
+static NSString* tr(NSString *tableName, NSString *key, ...) {
+ NSBundle *bundle = {{param.bundle|default:"[NSBundle bundleForClass:BundleToken.class]"}};
+ NSString *format = [bundle localizedStringForKey:key value:nil table:tableName];
+ NSLocale *locale = [NSLocale currentLocale];
+
+ va_list args;
+ va_start(args, key);
+ NSString *result = [[NSString alloc] initWithFormat:format locale:locale arguments:args];
+ va_end(args);
+
+ return result;
+};
+#pragma clang diagnostic pop
+
+{% macro parametersBlock types %}{% filter removeNewlines:"leading" %}
+ {% for type in types %}
+ ({% call paramTranslate type %})p{{ forloop.counter }}{{ " :" if not forloop.last }}
+ {% endfor %}
+{% endfilter %}{% endmacro %}
+{% macro argumentsBlock types %}{% filter removeNewlines:"leading" %}
+ {% for type in types %}
+ p{{forloop.counter}}{{ ", " if not forloop.last }}
+ {% endfor %}
+{% endfilter %}{% endmacro %}
+{% macro paramTranslate swiftType %}
+ {% if swiftType == "Any" %}
+ id
+ {% elif swiftType == "CChar" %}
+ char
+ {% elif swiftType == "Float" %}
+ float
+ {% elif swiftType == "Int" %}
+ NSInteger
+ {% elif swiftType == "String" %}
+ id
+ {% elif swiftType == "UnsafePointer" %}
+ char*
+ {% elif swiftType == "UnsafeRawPointer" %}
+ void*
+ {% else %}
+ objc-m.stencil is missing '{{swiftType}}'
+ {% endif %}
+{% endmacro %}
+{% macro tableContents table item %}
+ {% for string in item.strings %}
+ {% if string.types %}
+ {% if string.types.count == 1 %}
++ (NSString*){{string.key|swiftIdentifier:"pretty"|lowerFirstWord}}WithValue:{% call parametersBlock string.types %}
+ {% else %}
++ (NSString*){{string.key|swiftIdentifier:"pretty"|lowerFirstWord}}WithValues:{% call parametersBlock string.types %}
+ {% endif %}
+{
+ return tr(@"{{table}}", @"{{string.key}}", {% call argumentsBlock string.types %});
+}
+{% else %}
++ (NSString*){{string.key|swiftIdentifier:"pretty"|lowerFirstWord}} {
+ return tr(@"{{table}}", @"{{string.key}}");
+}
+ {% endif %}
+ {% endfor %}
+ {% for child in item.children %}
+ {% call tableContents table child %}
+ {% endfor %}
+{% endmacro %}
+{% for table in tables %}
+ {% set tableName %}{{table.name|default:"Localized"}}{% endset %}
+@implementation {{ tableName }} : NSObject
+ {% call tableContents table.name table.levels %}
+@end
+
+{% endfor %}
+{% else %}
+// No strings found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/strings/structured-swift4.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/strings/structured-swift4.stencil
new file mode 100644
index 0000000..f809bc2
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/strings/structured-swift4.stencil
@@ -0,0 +1,104 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if tables.count > 0 %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+import Foundation
+
+// swiftlint:disable superfluous_disable_command file_length implicit_return
+
+// MARK: - Strings
+
+{% macro parametersBlock types %}{% filter removeNewlines:"leading" %}
+ {% for type in types %}
+ {% if type == "String" %}
+ _ p{{forloop.counter}}: Any
+ {% else %}
+ _ p{{forloop.counter}}: {{type}}
+ {% endif %}
+ {{ ", " if not forloop.last }}
+ {% endfor %}
+{% endfilter %}{% endmacro %}
+{% macro argumentsBlock types %}{% filter removeNewlines:"leading" %}
+ {% for type in types %}
+ {% if type == "String" %}
+ String(describing: p{{forloop.counter}})
+ {% elif type == "UnsafeRawPointer" %}
+ Int(bitPattern: p{{forloop.counter}})
+ {% else %}
+ p{{forloop.counter}}
+ {% endif %}
+ {{ ", " if not forloop.last }}
+ {% endfor %}
+{% endfilter %}{% endmacro %}
+{% macro recursiveBlock table item %}
+ {% for string in item.strings %}
+ {% if not param.noComments %}
+ {% for line in string.translation|split:"\n" %}
+ /// {{line}}
+ {% endfor %}
+ {% endif %}
+ {% if string.types %}
+ {{accessModifier}} static func {{string.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}({% call parametersBlock string.types %}) -> String {
+ return {{enumName}}.tr("{{table}}", "{{string.key}}", {% call argumentsBlock string.types %})
+ }
+ {% elif param.lookupFunction %}
+ {# custom localization function is mostly used for in-app lang selection, so we want the loc to be recomputed at each call for those (hence the computed var) #}
+ {{accessModifier}} static var {{string.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}: String { return {{enumName}}.tr("{{table}}", "{{string.key}}") }
+ {% else %}
+ {{accessModifier}} static let {{string.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{enumName}}.tr("{{table}}", "{{string.key}}")
+ {% endif %}
+ {% endfor %}
+ {% for child in item.children %}
+
+ {{accessModifier}} enum {{child.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call recursiveBlock table child %}{% endfilter %}
+ }
+ {% endfor %}
+{% endmacro %}
+// swiftlint:disable explicit_type_interface function_parameter_count identifier_name line_length
+// swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces
+{% set enumName %}{{param.enumName|default:"L10n"}}{% endset %}
+{{accessModifier}} enum {{enumName}} {
+ {% if tables.count > 1 or param.forceFileNameEnum %}
+ {% for table in tables %}
+ {{accessModifier}} enum {{table.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call recursiveBlock table.name table.levels %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call recursiveBlock tables.first.name tables.first.levels %}
+ {% endif %}
+}
+// swiftlint:enable explicit_type_interface function_parameter_count identifier_name line_length
+// swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces
+
+// MARK: - Implementation Details
+
+extension {{enumName}} {
+ private static func tr(_ table: String, _ key: String, _ args: CVarArg...) -> String {
+ {% if param.lookupFunction %}
+ let format = {{ param.lookupFunction }}(key, table)
+ {% else %}
+ let format = {{param.bundle|default:"BundleToken.bundle"}}.localizedString(forKey: key, value: nil, table: table)
+ {% endif %}
+ return String(format: format, locale: Locale.current, arguments: args)
+ }
+}
+{% if not param.bundle and not param.lookupFunction %}
+
+// swiftlint:disable convenience_type
+private final class BundleToken {
+ static let bundle: Bundle = {
+ #if SWIFT_PACKAGE
+ return Bundle.module
+ #else
+ return Bundle(for: BundleToken.self)
+ #endif
+ }()
+}
+// swiftlint:enable convenience_type
+{% endif %}
+{% else %}
+// No string found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/strings/structured-swift5.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/strings/structured-swift5.stencil
new file mode 100644
index 0000000..f809bc2
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/strings/structured-swift5.stencil
@@ -0,0 +1,104 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if tables.count > 0 %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+import Foundation
+
+// swiftlint:disable superfluous_disable_command file_length implicit_return
+
+// MARK: - Strings
+
+{% macro parametersBlock types %}{% filter removeNewlines:"leading" %}
+ {% for type in types %}
+ {% if type == "String" %}
+ _ p{{forloop.counter}}: Any
+ {% else %}
+ _ p{{forloop.counter}}: {{type}}
+ {% endif %}
+ {{ ", " if not forloop.last }}
+ {% endfor %}
+{% endfilter %}{% endmacro %}
+{% macro argumentsBlock types %}{% filter removeNewlines:"leading" %}
+ {% for type in types %}
+ {% if type == "String" %}
+ String(describing: p{{forloop.counter}})
+ {% elif type == "UnsafeRawPointer" %}
+ Int(bitPattern: p{{forloop.counter}})
+ {% else %}
+ p{{forloop.counter}}
+ {% endif %}
+ {{ ", " if not forloop.last }}
+ {% endfor %}
+{% endfilter %}{% endmacro %}
+{% macro recursiveBlock table item %}
+ {% for string in item.strings %}
+ {% if not param.noComments %}
+ {% for line in string.translation|split:"\n" %}
+ /// {{line}}
+ {% endfor %}
+ {% endif %}
+ {% if string.types %}
+ {{accessModifier}} static func {{string.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}({% call parametersBlock string.types %}) -> String {
+ return {{enumName}}.tr("{{table}}", "{{string.key}}", {% call argumentsBlock string.types %})
+ }
+ {% elif param.lookupFunction %}
+ {# custom localization function is mostly used for in-app lang selection, so we want the loc to be recomputed at each call for those (hence the computed var) #}
+ {{accessModifier}} static var {{string.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}: String { return {{enumName}}.tr("{{table}}", "{{string.key}}") }
+ {% else %}
+ {{accessModifier}} static let {{string.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{enumName}}.tr("{{table}}", "{{string.key}}")
+ {% endif %}
+ {% endfor %}
+ {% for child in item.children %}
+
+ {{accessModifier}} enum {{child.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call recursiveBlock table child %}{% endfilter %}
+ }
+ {% endfor %}
+{% endmacro %}
+// swiftlint:disable explicit_type_interface function_parameter_count identifier_name line_length
+// swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces
+{% set enumName %}{{param.enumName|default:"L10n"}}{% endset %}
+{{accessModifier}} enum {{enumName}} {
+ {% if tables.count > 1 or param.forceFileNameEnum %}
+ {% for table in tables %}
+ {{accessModifier}} enum {{table.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call recursiveBlock table.name table.levels %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call recursiveBlock tables.first.name tables.first.levels %}
+ {% endif %}
+}
+// swiftlint:enable explicit_type_interface function_parameter_count identifier_name line_length
+// swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces
+
+// MARK: - Implementation Details
+
+extension {{enumName}} {
+ private static func tr(_ table: String, _ key: String, _ args: CVarArg...) -> String {
+ {% if param.lookupFunction %}
+ let format = {{ param.lookupFunction }}(key, table)
+ {% else %}
+ let format = {{param.bundle|default:"BundleToken.bundle"}}.localizedString(forKey: key, value: nil, table: table)
+ {% endif %}
+ return String(format: format, locale: Locale.current, arguments: args)
+ }
+}
+{% if not param.bundle and not param.lookupFunction %}
+
+// swiftlint:disable convenience_type
+private final class BundleToken {
+ static let bundle: Bundle = {
+ #if SWIFT_PACKAGE
+ return Bundle.module
+ #else
+ return Bundle(for: BundleToken.self)
+ #endif
+ }()
+}
+// swiftlint:enable convenience_type
+{% endif %}
+{% else %}
+// No string found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/xcassets/swift4.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/xcassets/swift4.stencil
new file mode 100644
index 0000000..c856593
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/xcassets/swift4.stencil
@@ -0,0 +1,329 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if catalogs %}
+{% set enumName %}{{param.enumName|default:"Asset"}}{% endset %}
+{% set arResourceGroupType %}{{param.arResourceGroupTypeName|default:"ARResourceGroupAsset"}}{% endset %}
+{% set colorType %}{{param.colorTypeName|default:"ColorAsset"}}{% endset %}
+{% set dataType %}{{param.dataTypeName|default:"DataAsset"}}{% endset %}
+{% set imageType %}{{param.imageTypeName|default:"ImageAsset"}}{% endset %}
+{% set symbolType %}{{param.symbolTypeName|default:"SymbolAsset"}}{% endset %}
+{% set forceNamespaces %}{{param.forceProvidesNamespaces|default:"false"}}{% endset %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+#if os(macOS)
+ import AppKit
+#elseif os(iOS)
+{% if resourceCount.arresourcegroup > 0 %}
+ import ARKit
+{% endif %}
+ import UIKit
+#elseif os(tvOS) || os(watchOS)
+ import UIKit
+#endif
+
+// Deprecated typealiases
+{% if resourceCount.color > 0 %}
+@available(*, deprecated, renamed: "{{colorType}}.Color", message: "This typealias will be removed in SwiftGen 7.0")
+{{accessModifier}} typealias {{param.colorAliasName|default:"AssetColorTypeAlias"}} = {{colorType}}.Color
+{% endif %}
+{% if resourceCount.image > 0 %}
+@available(*, deprecated, renamed: "{{imageType}}.Image", message: "This typealias will be removed in SwiftGen 7.0")
+{{accessModifier}} typealias {{param.imageAliasName|default:"AssetImageTypeAlias"}} = {{imageType}}.Image
+{% endif %}
+
+// swiftlint:disable superfluous_disable_command file_length implicit_return
+
+// MARK: - Asset Catalogs
+
+{% macro enumBlock assets %}
+ {% call casesBlock assets %}
+ {% if param.allValues %}
+
+ // swiftlint:disable trailing_comma
+ {% if resourceCount.arresourcegroup > 0 %}
+ {{accessModifier}} static let allResourceGroups: [{{arResourceGroupType}}] = [
+ {% filter indent:2 %}{% call allValuesBlock assets "arresourcegroup" "" %}{% endfilter %}
+ ]
+ {% endif %}
+ {% if resourceCount.color > 0 %}
+ {{accessModifier}} static let allColors: [{{colorType}}] = [
+ {% filter indent:2 %}{% call allValuesBlock assets "color" "" %}{% endfilter %}
+ ]
+ {% endif %}
+ {% if resourceCount.data > 0 %}
+ {{accessModifier}} static let allDataAssets: [{{dataType}}] = [
+ {% filter indent:2 %}{% call allValuesBlock assets "data" "" %}{% endfilter %}
+ ]
+ {% endif %}
+ {% if resourceCount.image > 0 %}
+ {{accessModifier}} static let allImages: [{{imageType}}] = [
+ {% filter indent:2 %}{% call allValuesBlock assets "image" "" %}{% endfilter %}
+ ]
+ {% endif %}
+ {% if resourceCount.symbol > 0 %}
+ {{accessModifier}} static let allSymbols: [{{symbolType}}] = [
+ {% filter indent:2 %}{% call allValuesBlock assets "symbol" "" %}{% endfilter %}
+ ]
+ {% endif %}
+ // swiftlint:enable trailing_comma
+ {% endif %}
+{% endmacro %}
+{% macro casesBlock assets %}
+ {% for asset in assets %}
+ {% if asset.type == "arresourcegroup" %}
+ {{accessModifier}} static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{arResourceGroupType}}(name: "{{asset.value}}")
+ {% elif asset.type == "color" %}
+ {{accessModifier}} static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{colorType}}(name: "{{asset.value}}")
+ {% elif asset.type == "data" %}
+ {{accessModifier}} static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{dataType}}(name: "{{asset.value}}")
+ {% elif asset.type == "image" %}
+ {{accessModifier}} static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{imageType}}(name: "{{asset.value}}")
+ {% elif asset.type == "symbol" %}
+ {{accessModifier}} static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{symbolType}}(name: "{{asset.value}}")
+ {% elif asset.items and ( forceNamespaces == "true" or asset.isNamespaced == "true" ) %}
+ {{accessModifier}} enum {{asset.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call casesBlock asset.items %}{% endfilter %}
+ }
+ {% elif asset.items %}
+ {% call casesBlock asset.items %}
+ {% endif %}
+ {% endfor %}
+{% endmacro %}
+{% macro allValuesBlock assets filter prefix %}
+ {% for asset in assets %}
+ {% if asset.type == filter %}
+ {{prefix}}{{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}},
+ {% elif asset.items and ( forceNamespaces == "true" or asset.isNamespaced == "true" ) %}
+ {% set prefix2 %}{{prefix}}{{asset.name|swiftIdentifier:"pretty"|escapeReservedKeywords}}.{% endset %}
+ {% call allValuesBlock asset.items filter prefix2 %}
+ {% elif asset.items %}
+ {% call allValuesBlock asset.items filter prefix %}
+ {% endif %}
+ {% endfor %}
+{% endmacro %}
+// swiftlint:disable identifier_name line_length nesting type_body_length type_name
+{{accessModifier}} enum {{enumName}} {
+ {% if catalogs.count > 1 or param.forceFileNameEnum %}
+ {% for catalog in catalogs %}
+ {{accessModifier}} enum {{catalog.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call enumBlock catalog.assets %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call enumBlock catalogs.first.assets %}
+ {% endif %}
+}
+// swiftlint:enable identifier_name line_length nesting type_body_length type_name
+
+// MARK: - Implementation Details
+{% if resourceCount.arresourcegroup > 0 %}
+
+{{accessModifier}} struct {{arResourceGroupType}} {
+ {{accessModifier}} fileprivate(set) var name: String
+
+ #if os(iOS)
+ @available(iOS 11.3, *)
+ {{accessModifier}} var referenceImages: Set {
+ return ARReferenceImage.referenceImages(in: self)
+ }
+
+ @available(iOS 12.0, *)
+ {{accessModifier}} var referenceObjects: Set {
+ return ARReferenceObject.referenceObjects(in: self)
+ }
+ #endif
+}
+
+#if os(iOS)
+@available(iOS 11.3, *)
+{{accessModifier}} extension ARReferenceImage {
+ static func referenceImages(in asset: {{arResourceGroupType}}) -> Set {
+ let bundle = {{param.bundle|default:"BundleToken.bundle"}}
+ return referenceImages(inGroupNamed: asset.name, bundle: bundle) ?? Set()
+ }
+}
+
+@available(iOS 12.0, *)
+{{accessModifier}} extension ARReferenceObject {
+ static func referenceObjects(in asset: {{arResourceGroupType}}) -> Set {
+ let bundle = {{param.bundle|default:"BundleToken.bundle"}}
+ return referenceObjects(inGroupNamed: asset.name, bundle: bundle) ?? Set()
+ }
+}
+#endif
+{% endif %}
+{% if resourceCount.color > 0 %}
+
+{{accessModifier}} final class {{colorType}} {
+ {{accessModifier}} fileprivate(set) var name: String
+
+ #if os(macOS)
+ {{accessModifier}} typealias Color = NSColor
+ #elseif os(iOS) || os(tvOS) || os(watchOS)
+ {{accessModifier}} typealias Color = UIColor
+ #endif
+
+ @available(iOS 11.0, tvOS 11.0, watchOS 4.0, macOS 10.13, *)
+ {{accessModifier}} private(set) lazy var color: Color = Color(asset: self)
+
+ #if os(iOS) || os(tvOS)
+ @available(iOS 11.0, tvOS 11.0, *)
+ {{accessModifier}} func color(compatibleWith traitCollection: UITraitCollection) -> Color {
+ let bundle = {{param.bundle|default:"BundleToken.bundle"}}
+ guard let color = Color(named: name, in: bundle, compatibleWith: traitCollection) else {
+ fatalError("Unable to load color asset named \(name).")
+ }
+ return color
+ }
+ #endif
+
+ fileprivate init(name: String) {
+ self.name = name
+ }
+}
+
+{{accessModifier}} extension {{colorType}}.Color {
+ @available(iOS 11.0, tvOS 11.0, watchOS 4.0, macOS 10.13, *)
+ convenience init!(asset: {{colorType}}) {
+ let bundle = {{param.bundle|default:"BundleToken.bundle"}}
+ #if os(iOS) || os(tvOS)
+ self.init(named: asset.name, in: bundle, compatibleWith: nil)
+ #elseif os(macOS)
+ self.init(named: NSColor.Name(asset.name), bundle: bundle)
+ #elseif os(watchOS)
+ self.init(named: asset.name)
+ #endif
+ }
+}
+{% endif %}
+{% if resourceCount.data > 0 %}
+
+{{accessModifier}} struct {{dataType}} {
+ {{accessModifier}} fileprivate(set) var name: String
+
+ @available(iOS 9.0, tvOS 9.0, watchOS 6.0, macOS 10.11, *)
+ {{accessModifier}} var data: NSDataAsset {
+ return NSDataAsset(asset: self)
+ }
+}
+
+@available(iOS 9.0, tvOS 9.0, watchOS 6.0, macOS 10.11, *)
+{{accessModifier}} extension NSDataAsset {
+ convenience init!(asset: {{dataType}}) {
+ let bundle = {{param.bundle|default:"BundleToken.bundle"}}
+ #if os(iOS) || os(tvOS) || os(watchOS)
+ self.init(name: asset.name, bundle: bundle)
+ #elseif os(macOS)
+ self.init(name: NSDataAsset.Name(asset.name), bundle: bundle)
+ #endif
+ }
+}
+{% endif %}
+{% if resourceCount.image > 0 %}
+
+{{accessModifier}} struct {{imageType}} {
+ {{accessModifier}} fileprivate(set) var name: String
+
+ #if os(macOS)
+ {{accessModifier}} typealias Image = NSImage
+ #elseif os(iOS) || os(tvOS) || os(watchOS)
+ {{accessModifier}} typealias Image = UIImage
+ #endif
+
+ @available(iOS 8.0, tvOS 9.0, watchOS 2.0, macOS 10.7, *)
+ {{accessModifier}} var image: Image {
+ let bundle = {{param.bundle|default:"BundleToken.bundle"}}
+ #if os(iOS) || os(tvOS)
+ let image = Image(named: name, in: bundle, compatibleWith: nil)
+ #elseif os(macOS)
+ let name = NSImage.Name(self.name)
+ let image = (bundle == .main) ? NSImage(named: name) : bundle.image(forResource: name)
+ #elseif os(watchOS)
+ let image = Image(named: name)
+ #endif
+ guard let result = image else {
+ fatalError("Unable to load image asset named \(name).")
+ }
+ return result
+ }
+
+ #if os(iOS) || os(tvOS)
+ @available(iOS 8.0, tvOS 9.0, *)
+ {{accessModifier}} func image(compatibleWith traitCollection: UITraitCollection) -> Image {
+ let bundle = {{param.bundle|default:"BundleToken.bundle"}}
+ guard let result = Image(named: name, in: bundle, compatibleWith: traitCollection) else {
+ fatalError("Unable to load image asset named \(name).")
+ }
+ return result
+ }
+ #endif
+}
+
+{{accessModifier}} extension {{imageType}}.Image {
+ @available(iOS 8.0, tvOS 9.0, watchOS 2.0, *)
+ @available(macOS, deprecated,
+ message: "This initializer is unsafe on macOS, please use the {{imageType}}.image property")
+ convenience init!(asset: {{imageType}}) {
+ #if os(iOS) || os(tvOS)
+ let bundle = {{param.bundle|default:"BundleToken.bundle"}}
+ self.init(named: asset.name, in: bundle, compatibleWith: nil)
+ #elseif os(macOS)
+ self.init(named: NSImage.Name(asset.name))
+ #elseif os(watchOS)
+ self.init(named: asset.name)
+ #endif
+ }
+}
+{% endif %}
+{% if resourceCount.symbol > 0 %}
+
+{{accessModifier}} struct {{symbolType}} {
+ {{accessModifier}} fileprivate(set) var name: String
+
+ #if os(iOS) || os(tvOS) || os(watchOS)
+ @available(iOS 13.0, tvOS 13.0, watchOS 6.0, *)
+ {{accessModifier}} typealias Configuration = UIImage.SymbolConfiguration
+ {{accessModifier}} typealias Image = UIImage
+
+ @available(iOS 12.0, tvOS 12.0, watchOS 5.0, *)
+ {{accessModifier}} var image: Image {
+ let bundle = {{param.bundle|default:"BundleToken.bundle"}}
+ #if os(iOS) || os(tvOS)
+ let image = Image(named: name, in: bundle, compatibleWith: nil)
+ #elseif os(watchOS)
+ let image = Image(named: name)
+ #endif
+ guard let result = image else {
+ fatalError("Unable to load symbol asset named \(name).")
+ }
+ return result
+ }
+
+ @available(iOS 13.0, tvOS 13.0, watchOS 6.0, *)
+ {{accessModifier}} func image(with configuration: Configuration) -> Image {
+ let bundle = {{param.bundle|default:"BundleToken.bundle"}}
+ guard let result = Image(named: name, in: bundle, with: configuration) else {
+ fatalError("Unable to load symbol asset named \(name).")
+ }
+ return result
+ }
+ #endif
+}
+{% endif %}
+{% if not param.bundle %}
+
+// swiftlint:disable convenience_type
+private final class BundleToken {
+ static let bundle: Bundle = {
+ #if SWIFT_PACKAGE
+ return Bundle.module
+ #else
+ return Bundle(for: BundleToken.self)
+ #endif
+ }()
+}
+// swiftlint:enable convenience_type
+{% endif %}
+{% else %}
+// No assets found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/xcassets/swift5.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/xcassets/swift5.stencil
new file mode 100644
index 0000000..42df7be
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/xcassets/swift5.stencil
@@ -0,0 +1,337 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if catalogs %}
+{% set enumName %}{{param.enumName|default:"Asset"}}{% endset %}
+{% set arResourceGroupType %}{{param.arResourceGroupTypeName|default:"ARResourceGroupAsset"}}{% endset %}
+{% set colorType %}{{param.colorTypeName|default:"ColorAsset"}}{% endset %}
+{% set dataType %}{{param.dataTypeName|default:"DataAsset"}}{% endset %}
+{% set imageType %}{{param.imageTypeName|default:"ImageAsset"}}{% endset %}
+{% set symbolType %}{{param.symbolTypeName|default:"SymbolAsset"}}{% endset %}
+{% set forceNamespaces %}{{param.forceProvidesNamespaces|default:"false"}}{% endset %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+#if os(macOS)
+ import AppKit
+#elseif os(iOS)
+{% if resourceCount.arresourcegroup > 0 %}
+ import ARKit
+{% endif %}
+ import UIKit
+#elseif os(tvOS) || os(watchOS)
+ import UIKit
+#endif
+
+// Deprecated typealiases
+{% if resourceCount.color > 0 %}
+@available(*, deprecated, renamed: "{{colorType}}.Color", message: "This typealias will be removed in SwiftGen 7.0")
+{{accessModifier}} typealias {{param.colorAliasName|default:"AssetColorTypeAlias"}} = {{colorType}}.Color
+{% endif %}
+{% if resourceCount.image > 0 %}
+@available(*, deprecated, renamed: "{{imageType}}.Image", message: "This typealias will be removed in SwiftGen 7.0")
+{{accessModifier}} typealias {{param.imageAliasName|default:"AssetImageTypeAlias"}} = {{imageType}}.Image
+{% endif %}
+
+// swiftlint:disable superfluous_disable_command file_length implicit_return
+
+// MARK: - Asset Catalogs
+
+{% macro enumBlock assets %}
+ {% call casesBlock assets %}
+ {% if param.allValues %}
+
+ // swiftlint:disable trailing_comma
+ {% if resourceCount.arresourcegroup > 0 %}
+ {{accessModifier}} static let allResourceGroups: [{{arResourceGroupType}}] = [
+ {% filter indent:2 %}{% call allValuesBlock assets "arresourcegroup" "" %}{% endfilter %}
+ ]
+ {% endif %}
+ {% if resourceCount.color > 0 %}
+ {{accessModifier}} static let allColors: [{{colorType}}] = [
+ {% filter indent:2 %}{% call allValuesBlock assets "color" "" %}{% endfilter %}
+ ]
+ {% endif %}
+ {% if resourceCount.data > 0 %}
+ {{accessModifier}} static let allDataAssets: [{{dataType}}] = [
+ {% filter indent:2 %}{% call allValuesBlock assets "data" "" %}{% endfilter %}
+ ]
+ {% endif %}
+ {% if resourceCount.image > 0 %}
+ {{accessModifier}} static let allImages: [{{imageType}}] = [
+ {% filter indent:2 %}{% call allValuesBlock assets "image" "" %}{% endfilter %}
+ ]
+ {% endif %}
+ {% if resourceCount.symbol > 0 %}
+ {{accessModifier}} static let allSymbols: [{{symbolType}}] = [
+ {% filter indent:2 %}{% call allValuesBlock assets "symbol" "" %}{% endfilter %}
+ ]
+ {% endif %}
+ // swiftlint:enable trailing_comma
+ {% endif %}
+{% endmacro %}
+{% macro casesBlock assets %}
+ {% for asset in assets %}
+ {% if asset.type == "arresourcegroup" %}
+ {{accessModifier}} static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{arResourceGroupType}}(name: "{{asset.value}}")
+ {% elif asset.type == "color" %}
+ {{accessModifier}} static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{colorType}}(name: "{{asset.value}}")
+ {% elif asset.type == "data" %}
+ {{accessModifier}} static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{dataType}}(name: "{{asset.value}}")
+ {% elif asset.type == "image" %}
+ {{accessModifier}} static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{imageType}}(name: "{{asset.value}}")
+ {% elif asset.type == "symbol" %}
+ {{accessModifier}} static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{symbolType}}(name: "{{asset.value}}")
+ {% elif asset.items and ( forceNamespaces == "true" or asset.isNamespaced == "true" ) %}
+ {{accessModifier}} enum {{asset.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call casesBlock asset.items %}{% endfilter %}
+ }
+ {% elif asset.items %}
+ {% call casesBlock asset.items %}
+ {% endif %}
+ {% endfor %}
+{% endmacro %}
+{% macro allValuesBlock assets filter prefix %}
+ {% for asset in assets %}
+ {% if asset.type == filter %}
+ {{prefix}}{{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}},
+ {% elif asset.items and ( forceNamespaces == "true" or asset.isNamespaced == "true" ) %}
+ {% set prefix2 %}{{prefix}}{{asset.name|swiftIdentifier:"pretty"|escapeReservedKeywords}}.{% endset %}
+ {% call allValuesBlock asset.items filter prefix2 %}
+ {% elif asset.items %}
+ {% call allValuesBlock asset.items filter prefix %}
+ {% endif %}
+ {% endfor %}
+{% endmacro %}
+// swiftlint:disable identifier_name line_length nesting type_body_length type_name
+{{accessModifier}} enum {{enumName}} {
+ {% if catalogs.count > 1 or param.forceFileNameEnum %}
+ {% for catalog in catalogs %}
+ {{accessModifier}} enum {{catalog.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call enumBlock catalog.assets %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call enumBlock catalogs.first.assets %}
+ {% endif %}
+}
+// swiftlint:enable identifier_name line_length nesting type_body_length type_name
+
+// MARK: - Implementation Details
+{% if resourceCount.arresourcegroup > 0 %}
+
+{{accessModifier}} struct {{arResourceGroupType}} {
+ {{accessModifier}} fileprivate(set) var name: String
+
+ #if os(iOS)
+ @available(iOS 11.3, *)
+ {{accessModifier}} var referenceImages: Set {
+ return ARReferenceImage.referenceImages(in: self)
+ }
+
+ @available(iOS 12.0, *)
+ {{accessModifier}} var referenceObjects: Set {
+ return ARReferenceObject.referenceObjects(in: self)
+ }
+ #endif
+}
+
+#if os(iOS)
+@available(iOS 11.3, *)
+{{accessModifier}} extension ARReferenceImage {
+ static func referenceImages(in asset: {{arResourceGroupType}}) -> Set {
+ let bundle = {{param.bundle|default:"BundleToken.bundle"}}
+ return referenceImages(inGroupNamed: asset.name, bundle: bundle) ?? Set()
+ }
+}
+
+@available(iOS 12.0, *)
+{{accessModifier}} extension ARReferenceObject {
+ static func referenceObjects(in asset: {{arResourceGroupType}}) -> Set {
+ let bundle = {{param.bundle|default:"BundleToken.bundle"}}
+ return referenceObjects(inGroupNamed: asset.name, bundle: bundle) ?? Set()
+ }
+}
+#endif
+{% endif %}
+{% if resourceCount.color > 0 %}
+
+{{accessModifier}} final class {{colorType}} {
+ {{accessModifier}} fileprivate(set) var name: String
+
+ #if os(macOS)
+ {{accessModifier}} typealias Color = NSColor
+ #elseif os(iOS) || os(tvOS) || os(watchOS)
+ {{accessModifier}} typealias Color = UIColor
+ #endif
+
+ @available(iOS 11.0, tvOS 11.0, watchOS 4.0, macOS 10.13, *)
+ {{accessModifier}} private(set) lazy var color: Color = {
+ guard let color = Color(asset: self) else {
+ fatalError("Unable to load color asset named \(name).")
+ }
+ return color
+ }()
+
+ #if os(iOS) || os(tvOS)
+ @available(iOS 11.0, tvOS 11.0, *)
+ {{accessModifier}} func color(compatibleWith traitCollection: UITraitCollection) -> Color {
+ let bundle = {{param.bundle|default:"BundleToken.bundle"}}
+ guard let color = Color(named: name, in: bundle, compatibleWith: traitCollection) else {
+ fatalError("Unable to load color asset named \(name).")
+ }
+ return color
+ }
+ #endif
+
+ fileprivate init(name: String) {
+ self.name = name
+ }
+}
+
+{{accessModifier}} extension {{colorType}}.Color {
+ @available(iOS 11.0, tvOS 11.0, watchOS 4.0, macOS 10.13, *)
+ convenience init?(asset: {{colorType}}) {
+ let bundle = {{param.bundle|default:"BundleToken.bundle"}}
+ #if os(iOS) || os(tvOS)
+ self.init(named: asset.name, in: bundle, compatibleWith: nil)
+ #elseif os(macOS)
+ self.init(named: NSColor.Name(asset.name), bundle: bundle)
+ #elseif os(watchOS)
+ self.init(named: asset.name)
+ #endif
+ }
+}
+{% endif %}
+{% if resourceCount.data > 0 %}
+
+{{accessModifier}} struct {{dataType}} {
+ {{accessModifier}} fileprivate(set) var name: String
+
+ @available(iOS 9.0, tvOS 9.0, watchOS 6.0, macOS 10.11, *)
+ {{accessModifier}} var data: NSDataAsset {
+ guard let data = NSDataAsset(asset: self) else {
+ fatalError("Unable to load data asset named \(name).")
+ }
+ return data
+ }
+}
+
+@available(iOS 9.0, tvOS 9.0, watchOS 6.0, macOS 10.11, *)
+{{accessModifier}} extension NSDataAsset {
+ convenience init?(asset: {{dataType}}) {
+ let bundle = {{param.bundle|default:"BundleToken.bundle"}}
+ #if os(iOS) || os(tvOS) || os(watchOS)
+ self.init(name: asset.name, bundle: bundle)
+ #elseif os(macOS)
+ self.init(name: NSDataAsset.Name(asset.name), bundle: bundle)
+ #endif
+ }
+}
+{% endif %}
+{% if resourceCount.image > 0 %}
+
+{{accessModifier}} struct {{imageType}} {
+ {{accessModifier}} fileprivate(set) var name: String
+
+ #if os(macOS)
+ {{accessModifier}} typealias Image = NSImage
+ #elseif os(iOS) || os(tvOS) || os(watchOS)
+ {{accessModifier}} typealias Image = UIImage
+ #endif
+
+ @available(iOS 8.0, tvOS 9.0, watchOS 2.0, macOS 10.7, *)
+ {{accessModifier}} var image: Image {
+ let bundle = {{param.bundle|default:"BundleToken.bundle"}}
+ #if os(iOS) || os(tvOS)
+ let image = Image(named: name, in: bundle, compatibleWith: nil)
+ #elseif os(macOS)
+ let name = NSImage.Name(self.name)
+ let image = (bundle == .main) ? NSImage(named: name) : bundle.image(forResource: name)
+ #elseif os(watchOS)
+ let image = Image(named: name)
+ #endif
+ guard let result = image else {
+ fatalError("Unable to load image asset named \(name).")
+ }
+ return result
+ }
+
+ #if os(iOS) || os(tvOS)
+ @available(iOS 8.0, tvOS 9.0, *)
+ {{accessModifier}} func image(compatibleWith traitCollection: UITraitCollection) -> Image {
+ let bundle = {{param.bundle|default:"BundleToken.bundle"}}
+ guard let result = Image(named: name, in: bundle, compatibleWith: traitCollection) else {
+ fatalError("Unable to load image asset named \(name).")
+ }
+ return result
+ }
+ #endif
+}
+
+{{accessModifier}} extension {{imageType}}.Image {
+ @available(iOS 8.0, tvOS 9.0, watchOS 2.0, *)
+ @available(macOS, deprecated,
+ message: "This initializer is unsafe on macOS, please use the {{imageType}}.image property")
+ convenience init?(asset: {{imageType}}) {
+ #if os(iOS) || os(tvOS)
+ let bundle = {{param.bundle|default:"BundleToken.bundle"}}
+ self.init(named: asset.name, in: bundle, compatibleWith: nil)
+ #elseif os(macOS)
+ self.init(named: NSImage.Name(asset.name))
+ #elseif os(watchOS)
+ self.init(named: asset.name)
+ #endif
+ }
+}
+{% endif %}
+{% if resourceCount.symbol > 0 %}
+
+{{accessModifier}} struct {{symbolType}} {
+ {{accessModifier}} fileprivate(set) var name: String
+
+ #if os(iOS) || os(tvOS) || os(watchOS)
+ @available(iOS 13.0, tvOS 13.0, watchOS 6.0, *)
+ {{accessModifier}} typealias Configuration = UIImage.SymbolConfiguration
+ {{accessModifier}} typealias Image = UIImage
+
+ @available(iOS 12.0, tvOS 12.0, watchOS 5.0, *)
+ {{accessModifier}} var image: Image {
+ let bundle = {{param.bundle|default:"BundleToken.bundle"}}
+ #if os(iOS) || os(tvOS)
+ let image = Image(named: name, in: bundle, compatibleWith: nil)
+ #elseif os(watchOS)
+ let image = Image(named: name)
+ #endif
+ guard let result = image else {
+ fatalError("Unable to load symbol asset named \(name).")
+ }
+ return result
+ }
+
+ @available(iOS 13.0, tvOS 13.0, watchOS 6.0, *)
+ {{accessModifier}} func image(with configuration: Configuration) -> Image {
+ let bundle = {{param.bundle|default:"BundleToken.bundle"}}
+ guard let result = Image(named: name, in: bundle, with: configuration) else {
+ fatalError("Unable to load symbol asset named \(name).")
+ }
+ return result
+ }
+ #endif
+}
+{% endif %}
+{% if not param.bundle %}
+
+// swiftlint:disable convenience_type
+private final class BundleToken {
+ static let bundle: Bundle = {
+ #if SWIFT_PACKAGE
+ return Bundle.module
+ #else
+ return Bundle(for: BundleToken.self)
+ #endif
+ }()
+}
+// swiftlint:enable convenience_type
+{% endif %}
+{% else %}
+// No assets found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/yaml/inline-swift4.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/yaml/inline-swift4.stencil
new file mode 100644
index 0000000..9cc2aa3
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/yaml/inline-swift4.stencil
@@ -0,0 +1,92 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if files %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+{% set documentPrefix %}{{param.documentName|default:"Document"}}{% endset %}
+import Foundation
+
+// swiftlint:disable superfluous_disable_command
+// swiftlint:disable file_length
+
+// MARK: - YAML Files
+{% macro fileBlock file %}
+ {% if file.documents.count > 1 %}
+ {% for document in file.documents %}
+ {% set documentName %}{{documentPrefix}}{{forloop.counter}}{% endset %}
+ {{accessModifier}} enum {{documentName|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call documentBlock file document %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call documentBlock file file.documents.first %}
+ {% endif %}
+{% endmacro %}
+{% macro documentBlock file document %}
+ {% set rootType %}{% call typeBlock document.metadata %}{% endset %}
+ {% if document.metadata.type == "Array" %}
+ {{accessModifier}} static let items: {{rootType}} = {% call valueBlock document.data document.metadata %}
+ {% elif document.metadata.type == "Dictionary" %}
+ {% for key,value in document.metadata.properties %}
+ {{accessModifier}} {% call propertyBlock key value document.data %}
+ {% endfor %}
+ {% else %}
+ {{accessModifier}} static let value: {{rootType}} = {% call valueBlock document.data document.metadata %}
+ {% endif %}
+{% endmacro %}
+{% macro typeBlock metadata %}{% filter removeNewlines:"leading" %}
+ {% if metadata.type == "Array" %}
+ [{% call typeBlock metadata.element %}]
+ {% elif metadata.type == "Dictionary" %}
+ [String: Any]
+ {% elif metadata.type == "Optional" %}
+ Any?
+ {% else %}
+ {{metadata.type}}
+ {% endif %}
+{% endfilter %}{% endmacro %}
+{% macro propertyBlock key metadata data %}{% filter removeNewlines:"leading" %}
+ {% set propertyName %}{{key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{% endset %}
+ {% set propertyType %}{% call typeBlock metadata %}{% endset %}
+ static let {{propertyName}}: {{propertyType}} = {% call valueBlock data[key] metadata %}
+{% endfilter %}{% endmacro %}
+{% macro valueBlock value metadata %}{% filter removeNewlines:"leading" %}
+ {% if metadata.type == "String" %}
+ "{{ value }}"
+ {% elif metadata.type == "Optional" %}
+ nil
+ {% elif metadata.type == "Array" and value %}
+ [{% for value in value %}
+ {% call valueBlock value metadata.element.items[forloop.counter0]|default:metadata.element %}
+ {{ ", " if not forloop.last }}
+ {% endfor %}]
+ {% elif metadata.type == "Dictionary" %}
+ [{% for key,value in value %}
+ "{{key}}": {% call valueBlock value metadata.properties[key] %}
+ {{ ", " if not forloop.last }}
+ {% empty %}
+ :
+ {% endfor %}]
+ {% elif metadata.type == "Bool" %}
+ {% if value %}true{% else %}false{% endif %}
+ {% else %}
+ {{ value }}
+ {% endif %}
+{% endfilter %}{% endmacro %}
+
+// swiftlint:disable identifier_name line_length number_separator type_body_length
+{{accessModifier}} enum {{param.enumName|default:"YAMLFiles"}} {
+ {% if files.count > 1 or param.forceFileNameEnum %}
+ {% for file in files %}
+ {{accessModifier}} enum {{file.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call fileBlock file %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call fileBlock files.first %}
+ {% endif %}
+}
+// swiftlint:enable identifier_name line_length number_separator type_body_length
+{% else %}
+// No files found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/yaml/inline-swift5.stencil b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/yaml/inline-swift5.stencil
new file mode 100644
index 0000000..9cc2aa3
--- /dev/null
+++ b/Monal/.swiftgen/bin/SwiftGen_SwiftGenCLI.bundle/Contents/Resources/templates/yaml/inline-swift5.stencil
@@ -0,0 +1,92 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if files %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+{% set documentPrefix %}{{param.documentName|default:"Document"}}{% endset %}
+import Foundation
+
+// swiftlint:disable superfluous_disable_command
+// swiftlint:disable file_length
+
+// MARK: - YAML Files
+{% macro fileBlock file %}
+ {% if file.documents.count > 1 %}
+ {% for document in file.documents %}
+ {% set documentName %}{{documentPrefix}}{{forloop.counter}}{% endset %}
+ {{accessModifier}} enum {{documentName|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call documentBlock file document %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call documentBlock file file.documents.first %}
+ {% endif %}
+{% endmacro %}
+{% macro documentBlock file document %}
+ {% set rootType %}{% call typeBlock document.metadata %}{% endset %}
+ {% if document.metadata.type == "Array" %}
+ {{accessModifier}} static let items: {{rootType}} = {% call valueBlock document.data document.metadata %}
+ {% elif document.metadata.type == "Dictionary" %}
+ {% for key,value in document.metadata.properties %}
+ {{accessModifier}} {% call propertyBlock key value document.data %}
+ {% endfor %}
+ {% else %}
+ {{accessModifier}} static let value: {{rootType}} = {% call valueBlock document.data document.metadata %}
+ {% endif %}
+{% endmacro %}
+{% macro typeBlock metadata %}{% filter removeNewlines:"leading" %}
+ {% if metadata.type == "Array" %}
+ [{% call typeBlock metadata.element %}]
+ {% elif metadata.type == "Dictionary" %}
+ [String: Any]
+ {% elif metadata.type == "Optional" %}
+ Any?
+ {% else %}
+ {{metadata.type}}
+ {% endif %}
+{% endfilter %}{% endmacro %}
+{% macro propertyBlock key metadata data %}{% filter removeNewlines:"leading" %}
+ {% set propertyName %}{{key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{% endset %}
+ {% set propertyType %}{% call typeBlock metadata %}{% endset %}
+ static let {{propertyName}}: {{propertyType}} = {% call valueBlock data[key] metadata %}
+{% endfilter %}{% endmacro %}
+{% macro valueBlock value metadata %}{% filter removeNewlines:"leading" %}
+ {% if metadata.type == "String" %}
+ "{{ value }}"
+ {% elif metadata.type == "Optional" %}
+ nil
+ {% elif metadata.type == "Array" and value %}
+ [{% for value in value %}
+ {% call valueBlock value metadata.element.items[forloop.counter0]|default:metadata.element %}
+ {{ ", " if not forloop.last }}
+ {% endfor %}]
+ {% elif metadata.type == "Dictionary" %}
+ [{% for key,value in value %}
+ "{{key}}": {% call valueBlock value metadata.properties[key] %}
+ {{ ", " if not forloop.last }}
+ {% empty %}
+ :
+ {% endfor %}]
+ {% elif metadata.type == "Bool" %}
+ {% if value %}true{% else %}false{% endif %}
+ {% else %}
+ {{ value }}
+ {% endif %}
+{% endfilter %}{% endmacro %}
+
+// swiftlint:disable identifier_name line_length number_separator type_body_length
+{{accessModifier}} enum {{param.enumName|default:"YAMLFiles"}} {
+ {% if files.count > 1 or param.forceFileNameEnum %}
+ {% for file in files %}
+ {{accessModifier}} enum {{file.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call fileBlock file %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call fileBlock files.first %}
+ {% endif %}
+}
+// swiftlint:enable identifier_name line_length number_separator type_body_length
+{% else %}
+// No files found
+{% endif %}
diff --git a/Monal/.swiftgen/bin/swiftgen b/Monal/.swiftgen/bin/swiftgen
new file mode 100755
index 0000000..1bc2b87
Binary files /dev/null and b/Monal/.swiftgen/bin/swiftgen differ
diff --git a/Monal/.swiftgen/templates/fonts.stencil b/Monal/.swiftgen/templates/fonts.stencil
new file mode 100644
index 0000000..c6148bf
--- /dev/null
+++ b/Monal/.swiftgen/templates/fonts.stencil
@@ -0,0 +1,29 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if families %}
+import SwiftUI
+{% for family in families %}
+{% set identifierName %}{{family.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}{% endset %}
+{% set styleTypeName %}{{family.name|swiftIdentifier:"pretty"|escapeReservedKeywords}}Style{% endset %}
+
+extension Font {
+ public static func {{identifierName}}(_ style: {{styleTypeName}}, fixedSize: CGFloat) -> Font {
+ return Font.custom(style.rawValue, fixedSize: fixedSize)
+ }
+
+ public static func {{identifierName}}(_ style: {{styleTypeName}}, size: CGFloat, relativeTo textStyle: TextStyle = .body) -> Font {
+ return Font.custom(style.rawValue, size: size, relativeTo: textStyle)
+ }
+
+ public enum {{styleTypeName}}: String {
+ {% for font in family.fonts %}
+ case {{font.style|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = "{{font.name}}"
+ {% endfor %}
+ }
+}
+{% endfor %}
+{% else %}
+// No fonts found
+{% endif %}
+// swiftlint:enable all
diff --git a/Monal/.swiftgen/templates/strings.stencil b/Monal/.swiftgen/templates/strings.stencil
new file mode 100644
index 0000000..daeeea4
--- /dev/null
+++ b/Monal/.swiftgen/templates/strings.stencil
@@ -0,0 +1,85 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if tables.count > 0 %}
+{% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
+import Foundation
+
+// swiftlint:disable superfluous_disable_command file_length implicit_return
+
+// MARK: - Strings
+
+{% macro parametersBlock types %}{% filter removeNewlines:"leading" %}
+ {% for type in types %}
+ {% if type == "String" %}
+ _ p{{forloop.counter}}: Any
+ {% else %}
+ _ p{{forloop.counter}}: {{type}}
+ {% endif %}
+ {{ ", " if not forloop.last }}
+ {% endfor %}
+{% endfilter %}{% endmacro %}
+{% macro argumentsBlock types %}{% filter removeNewlines:"leading" %}
+ {% for type in types %}
+ {% if type == "String" %}
+ String(describing: p{{forloop.counter}})
+ {% elif type == "UnsafeRawPointer" %}
+ Int(bitPattern: p{{forloop.counter}})
+ {% else %}
+ p{{forloop.counter}}
+ {% endif %}
+ {{ ", " if not forloop.last }}
+ {% endfor %}
+{% endfilter %}{% endmacro %}
+{% macro recursiveBlock table item %}
+ {% for string in item.strings %}
+ {% if not param.noComments %}
+ {% for line in string.translation|split:"\n" %}
+ /// {{line}}
+ {% endfor %}
+ {% endif %}
+ {% if string.types %}
+ {{accessModifier}} static func {{string.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}({% call parametersBlock string.types %}) -> String {
+ {{enumName}}.tr("{{table}}", "{{string.key}}", {% call argumentsBlock string.types %})
+ }
+ {% else %}
+ {{accessModifier}} static var {{string.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}: String { {{enumName}}.tr("{{table}}", "{{string.key}}") }
+ {% endif %}
+ {% endfor %}
+ {% for child in item.children %}
+
+ {{accessModifier}} enum {{child.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call recursiveBlock table child %}{% endfilter %}
+ }
+ {% endfor %}
+{% endmacro %}
+// swiftlint:disable explicit_type_interface function_parameter_count identifier_name line_length
+// swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces
+{% set enumName %}{{param.enumName|default:"L10n"}}{% endset %}
+{{accessModifier}} enum {{enumName}} {
+ {% if tables.count > 1 or param.forceFileNameEnum %}
+ {% for table in tables %}
+ {{accessModifier}} enum {{table.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call recursiveBlock table.name table.levels %}{% endfilter %}
+ }
+ {% endfor %}
+ {% else %}
+ {% call recursiveBlock tables.first.name tables.first.levels %}
+ {% endif %}
+}
+// swiftlint:enable explicit_type_interface function_parameter_count identifier_name line_length
+// swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces
+
+// MARK: - Implementation Details
+import Localize_Swift
+extension {{enumName}} {
+ static func tr(_ table: String, _ key: String, _ args: CVarArg...) -> String {
+ let selectedLanguage = Localize.currentLanguage()
+ guard let path = Bundle.main.path(forResource: selectedLanguage, ofType: "lproj"),
+ let bundle = Bundle(path: path) else { return "Setup language error" }
+ return NSLocalizedString(key, tableName: table, bundle: bundle, comment: "")
+ }
+}
+
+{% endif %}
+// swiftlint: enable all
diff --git a/Monal/.swiftgen/templates/xcassets.stencil b/Monal/.swiftgen/templates/xcassets.stencil
new file mode 100644
index 0000000..b6283e7
--- /dev/null
+++ b/Monal/.swiftgen/templates/xcassets.stencil
@@ -0,0 +1,48 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if catalogs %}
+import SwiftUI
+{% macro casesBlock assets %}
+ {% for asset in assets %}
+ {% if asset.items and asset.isNamespaced == "true" %}
+ public enum {{asset.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call casesBlock asset.items %}{% endfilter %}
+ }
+ {% elif asset.items %}
+ {% call casesBlock asset.items %}
+ {% elif asset.type == "color" %}
+ public static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = Color("{{asset.value}}")
+ {% elif asset.type == "image" %}
+ public static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = Image("{{asset.value}}")
+ {% endif %}
+ {% endfor %}
+{% endmacro %}
+{% for catalog in catalogs %}
+{% if catalog.name == "Colors" %}
+
+extension Color {
+ {% for catalog in catalogs %}
+ {% if catalog.name == "Colors" %}
+ {% call casesBlock catalog.assets %}
+ {% endif %}
+ {% endfor %}
+}
+{% endif %}
+{% endfor %}
+{% for catalog in catalogs %}
+{% if catalog.name == "Images" %}
+
+extension Image {
+ {% for catalog in catalogs %}
+ {% if catalog.name == "Images" %}
+ {% call casesBlock catalog.assets %}
+ {% endif %}
+ {% endfor %}
+}
+{% endif %}
+{% endfor %}
+{% else %}
+// No assets found
+{% endif %}
+// swiftlint: enable all
diff --git a/Monal/.swiftgen/templates/xcassets_strings.stencil b/Monal/.swiftgen/templates/xcassets_strings.stencil
new file mode 100644
index 0000000..a5540bc
--- /dev/null
+++ b/Monal/.swiftgen/templates/xcassets_strings.stencil
@@ -0,0 +1,36 @@
+// swiftlint:disable all
+// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
+
+{% if catalogs %}
+import Foundation
+
+typealias AssetStrings = String
+{% macro casesBlock assets %}
+ {% for asset in assets %}
+ {% if asset.items and asset.isNamespaced == "true" %}
+ public enum {{asset.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
+ {% filter indent:2 %}{% call casesBlock asset.items %}{% endfilter %}
+ }
+ {% elif asset.items %}
+ {% call casesBlock asset.items %}
+ {% elif asset.type == "image" %}
+ public static let {{asset.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = String("{{asset.value}}")
+ {% endif %}
+ {% endfor %}
+{% endmacro %}
+{% for catalog in catalogs %}
+{% if catalog.name == "Images" %}
+
+extension String {
+ {% for catalog in catalogs %}
+ {% if catalog.name == "Images" %}
+ {% call casesBlock catalog.assets %}
+ {% endif %}
+ {% endfor %}
+}
+{% endif %}
+{% endfor %}
+{% else %}
+// No assets found
+{% endif %}
+// swiftlint: enable all
diff --git a/Monal/Monal.xcodeproj/project.pbxproj b/Monal/Monal.xcodeproj/project.pbxproj
index 246319f..c84a404 100644
--- a/Monal/Monal.xcodeproj/project.pbxproj
+++ b/Monal/Monal.xcodeproj/project.pbxproj
@@ -1414,6 +1414,7 @@
isa = PBXGroup;
children = (
7E995F202CEAC5D2005B30EE /* AnotherIMApp.swift */,
+ EA534340732BF66B533E4C0B /* Generated */,
7ED6F01A2CECC43D0035B3B7 /* Resources */,
7E8D7AE42CECD037009AD3DF /* Views */,
7E8D7AE52CECD05C009AD3DF /* XMPP */,
@@ -1605,6 +1606,13 @@
name = Frameworks;
sourceTree = "";
};
+ EA534340732BF66B533E4C0B /* Generated */ = {
+ isa = PBXGroup;
+ children = (
+ );
+ path = Generated;
+ sourceTree = "";
+ };
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
@@ -1746,6 +1754,7 @@
isa = PBXNativeTarget;
buildConfigurationList = 7E995F172CEAC4BA005B30EE /* Build configuration list for PBXNativeTarget "another.im" */;
buildPhases = (
+ 7E8D7AE72CECD2CC009AD3DF /* swiftgen */,
7E8D7AE62CECD182009AD3DF /* swiftlint */,
A9E041FD8051B08903221D89 /* [CP] Check Pods Manifest.lock */,
7E995F022CEAC4B8005B30EE /* Sources */,
@@ -2055,6 +2064,24 @@
shellPath = /bin/sh;
shellScript = "# Type a script or drag a script file from your workspace to insert its path.\nswiftlint\n";
};
+ 7E8D7AE72CECD2CC009AD3DF /* swiftgen */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ );
+ name = swiftgen;
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "# Type a script or drag a script file from your workspace to insert its path.\n./.swiftgen/bin/swiftgen\n";
+ };
8FC0217E357D67979CAFB523 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
diff --git a/Monal/another.im/Generated/.gitignore b/Monal/another.im/Generated/.gitignore
new file mode 100644
index 0000000..c96a04f
--- /dev/null
+++ b/Monal/another.im/Generated/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
\ No newline at end of file
diff --git a/Monal/swiftgen.yml b/Monal/swiftgen.yml
new file mode 100644
index 0000000..df364d5
--- /dev/null
+++ b/Monal/swiftgen.yml
@@ -0,0 +1,27 @@
+---
+output_dir: another.im/Generated
+input_dir: another.im/Resources
+
+xcassets:
+ - inputs: Assets/Images.xcassets
+ outputs:
+ - templatePath: .swiftgen/templates/xcassets.stencil
+ params:
+ forceProvidesNamespaces: true
+ enumName: Image
+ output: Images+Generated.swift
+ - inputs: Assets/Colors.xcassets
+ outputs:
+ - templatePath: .swiftgen/templates/xcassets.stencil
+ params:
+ forceProvidesNamespaces: true
+ enumName: Color
+ output: Colors+Generated.swift
+
+strings:
+ inputs: Strings/Localizable.strings
+ outputs:
+ # - templatePath: .templates/strings.stencil
+ - templateName: structured-swift5
+
+ output: Strings+Generated.swift