Support for Xcode 27 on CI (#6217)

* Run the tests on iOS 27.0

Bump the required simulator OS in the preview, UI and Compound tests, and the CI tool's default OS, from 26.5 to 27.0. Test devices stay the same.

iOS 27 writes transcoded videos 146 bytes larger, so update the expected sizes in MediaUploadingPreprocessorTests.

* Build and test on CI with Xcode 27

Select Xcode 27 in ci_common.sh and move every macOS workflow to the xcode-27 runner image, as macos-26 doesn't include Xcode 27. The Compound workflow now also creates its simulator on the iOS 27.0 runtime.

The xcode-27 runners are slower, so give the unit, Enterprise, Compound and snapshot recording jobs longer timeouts.

* Fix the preview snapshot layout on iOS 27

On iOS 27 the hosting controller applies the window's safe area when rendering, but the snapshot size comes from sizeThatFits, which ignores it. Component previews were shifted down and clipped at the bottom. Disable the hosting controller's safe area regions for these snapshots so the measured and rendered layouts match.

swift-snapshot-testing also renders into a window without a scene, and on iOS 27 a navigation stack in such a window reserves space for a large title it never shows, leaving a gap below the navigation bar. Attach the render window to the app's scene until swift-snapshot-testing handles it.

The invite users and add rooms screens sized their selected items row from a measured width stored in state, which is zero on the first layout pass, so snapshots could draw the row empty. Use containerRelativeFrame instead. The add rooms search previews now also wait for their results, and the search previews that show a clear button get a small precision tolerance, as it renders inconsistently in snapshots.

* Re-record the preview snapshots on iOS 27.0

Recorded on an iPhone SE (3rd generation) simulator running iOS 27.0 with Xcode 27.0 (27A266a). The changes come from iOS 27 rendering: text anti-aliasing, hyphenation and line breaking, navigation bars and toggles that now render in snapshots, lazy stacks that were blank on iOS 26, and pseudo-language locale formatting.

* Fix the UI tests on iOS 27

iOS 27 no longer exposes accessibility identifiers on SwiftUI menu items, so the space exploration test now finds them by label within the menu. On iPad, the start chat search field keeps focus after submitting and can swallow the next tap, so retry the tap if the create room screen doesn't appear.

* Re-record the UI test snapshots on iOS 27.0

Recorded on iPhone 17 and iPad (A16) simulators running iOS 27.0 with Xcode 27.0. The changes come from iOS 27 styling, like the keyboard height and glass borders. This also removes the iPad app lock setup snapshots, which have been orphaned since those tests stopped running on iPad.

* Fix the accessibility tests crashing on iOS 27

The accessibility tests' previews wrapper kept its ImageRenderer alive across the awaits that follow the render. On iOS 27, releasing it at that point tears down its view graph outside of a SwiftUI update, which hits an assertion and crashes the app. Release the renderer as soon as the image has been rendered.

* Keep the accessibility tests' image renderers alive on iOS 27

Releasing the ImageRenderer straight away wasn't enough: on iOS 27, releasing one that rendered a preview crashes SwiftUI whichever context it happens in. Keep the renderers alive instead. Each test launches a fresh app, so they only live for the one test.

* Share the UI tests' app settings with their mock user session

Since the user session flow reads its settings from UserSettings, the UI tests' mock user session was wrapping a fresh volatile AppSettings instead of the one the tests configure. The flags that skip onboarding weren't picked up, so every user session UI test got stuck on the notifications permission screen.

* Re-record the Compound snapshots on iOS 27.0

Apply the same safe area fix as the app's preview tests, so size-that-fits snapshots aren't clipped on iOS 27, and re-record the snapshots on an iPhone SE (3rd generation) simulator running iOS 27.0 in English (US).

* Fix a race reading the keyboard in the accessibility tests

On iOS 27 the QR code login screen's keyboard can be dismissing between checking that it exists and reading its frame, which fails the test. Snapshot it in a single query instead.
This commit is contained in:
Mauro
2026-09-29 17:02:48 +02:00
committed by GitHub
parent 90425460f9
commit b1ed870474
2404 changed files with 4824 additions and 4809 deletions
+1 -1
View File
@@ -11,7 +11,7 @@ permissions: {}
jobs:
tests:
name: Tests
runs-on: macos-26
runs-on: xcode-27
timeout-minutes: 150
concurrency:
@@ -13,7 +13,7 @@ permissions: {}
# Patch bumps are handled by the release script.
jobs:
automatic-calendar-version:
runs-on: macos-26
runs-on: xcode-27
timeout-minutes: 15
# Skip in forks
+6 -6
View File
@@ -20,8 +20,8 @@ permissions: {}
jobs:
tests:
runs-on: macos-26
timeout-minutes: 15
runs-on: xcode-27
timeout-minutes: 25
concurrency:
# When running on develop, use the sha to allow all runs of this workflow to run concurrently.
@@ -34,8 +34,8 @@ jobs:
with:
persist-credentials: false
- name: Configure Xcode 26
run: sudo xcode-select -s /Applications/Xcode_26.5.app
- name: Configure Xcode 27
run: sudo xcode-select -s /Applications/Xcode_27.app
- name: Install sourcery
run: brew install sourcery
@@ -45,11 +45,11 @@ jobs:
run: sourcery --config Tools/Sourcery/PreviewTestsConfig.yml
- name: Create simulator
run: xcrun simctl create "Snapshots" "iPhone SE (3rd generation)" "com.apple.CoreSimulator.SimRuntime.iOS-26-5"
run: xcrun simctl create "Snapshots" "iPhone SE (3rd generation)" "com.apple.CoreSimulator.SimRuntime.iOS-27-0"
- name: Run tests
working-directory: compound-ios
run: set -o pipefail && xcodebuild test -scheme 'Compound' -sdk iphonesimulator -destination 'platform=iOS Simulator,name=Snapshots,OS=26.5' -skipPackagePluginValidation -resultBundlePath Logs/CompoundTests.xcresult | xcbeautify --renderer github-actions
run: set -o pipefail && xcodebuild test -scheme 'Compound' -sdk iphonesimulator -destination 'platform=iOS Simulator,name=Snapshots,OS=27.0' -skipPackagePluginValidation -resultBundlePath Logs/CompoundTests.xcresult | xcbeautify --renderer github-actions
- name: Zip artifacts
if: failure() # We only care about artefacts if the tests fail
+1 -1
View File
@@ -11,7 +11,7 @@ permissions: {}
jobs:
integration_tests:
name: Integration Tests
runs-on: macos-26
runs-on: xcode-27
timeout-minutes: 45
concurrency:
+2 -2
View File
@@ -10,8 +10,8 @@ permissions: {}
jobs:
record-snapshots:
name: Record Preview Snapshots
runs-on: macos-26
timeout-minutes: 45
runs-on: xcode-27
timeout-minutes: 60
if: >
github.event.label.name == 'record-snapshots' &&
+1 -1
View File
@@ -11,7 +11,7 @@ permissions: {}
jobs:
update-project:
name: Update Xcode project
runs-on: macos-26
runs-on: xcode-27
timeout-minutes: 20
permissions:
contents: write
+1 -1
View File
@@ -9,7 +9,7 @@ permissions: {}
jobs:
open-translations-pr:
runs-on: macos-26
runs-on: xcode-27
timeout-minutes: 15
# Skip in forks
+1 -1
View File
@@ -15,7 +15,7 @@ permissions: {}
jobs:
tests:
name: Tests
runs-on: macos-26
runs-on: xcode-27
timeout-minutes: 90
strategy:
fail-fast: false
+2 -2
View File
@@ -13,8 +13,8 @@ permissions: {}
jobs:
tests:
name: Tests (Enterprise)
runs-on: macos-26
timeout-minutes: 45
runs-on: xcode-27
timeout-minutes: 60
# Skip in forks
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }}
+2 -2
View File
@@ -13,8 +13,8 @@ permissions: {}
jobs:
tests:
name: Tests
runs-on: macos-26
timeout-minutes: 60
runs-on: xcode-27
timeout-minutes: 80
concurrency:
# Only allow a single run of this workflow on each branch, automatically cancelling older runs.
@@ -54,7 +54,8 @@ final class AccessibilityTests: XCTestCase {
// Alows us to log the name of the preview that is being tested
XCTContext.runActivity(named: name) { _ in
// Previews that focus a text field bring up the system keyboard, which we can't fix.
let keyboardFrame = app.keyboards.firstMatch.exists ? app.keyboards.firstMatch.frame : .null
// Snapshot the keyboard in one query so one that's dismissing can't fail the test between checking and reading it.
let keyboardFrame = (try? app.keyboards.firstMatch.snapshot().frame) ?? .null
do {
// We have removed `textClipped` and `contrast` for now
+1 -1
View File
@@ -97,7 +97,7 @@ If you make changes to the UI you may cause existing UI and Preview test snapsho
To run the preview tests:
1. Use an iPhone SE (3rd generation) simulator running iOS 26.5.
1. Use an iPhone SE (3rd generation) simulator running iOS 27.0.
2. On that simulator, go to Settings -> General -> Language & Region and select United States as the region, with English (US) as the only preferred language. This is a one time setup, as long as you keep using the same simulator.
3. Select the `PreviewTests` scheme and run the tests.
@@ -114,6 +114,9 @@ struct PreviewsWrapperView: View {
private(set) var isDone = false
/// On iOS 27, releasing an ImageRenderer that rendered a preview crashes SwiftUI, so keep them alive for the app's lifetime.
@ObservationIgnored private var imageRenderers = [AnyObject]()
var previewName: String {
"\(name)-\(currentPreview.displayName ?? String(currentIndex))"
}
@@ -136,6 +139,7 @@ struct PreviewsWrapperView: View {
// Render an image of the view in order to trigger the preference updates to occur.
let imageRenderer = ImageRenderer(content: preferenceReadingView)
_ = imageRenderer.uiImage
imageRenderers.append(imageRenderer)
switch fulfillmentSource {
case .publisher(let publisher):
@@ -346,10 +346,6 @@ enum A11yIdentifiers {
struct SpaceScreen {
let moreMenu = "space_screen-more_menu"
let createRoom = "space_screen-create_room"
let addExistingRooms = "space_screen-add_existing_rooms"
let viewMembers = "space_screen-view_members"
let settings = "space_screen-settings"
}
struct SpaceAddRoomsScreen {
@@ -12,8 +12,6 @@ import SwiftUI
struct InviteUsersScreen: View {
@ObservedObject var context: InviteUsersScreenViewModel.Context
@State private var formWidth = CGFloat.zero
var showTopSection: Bool {
!context.viewState.selectedUsers.isEmpty || context.viewState.isSearching
}
@@ -50,7 +48,7 @@ struct InviteUsersScreen: View {
VStack(spacing: 16) {
selectedUsersSection
.textCase(.none)
.frame(width: formWidth)
.containerRelativeFrame(.horizontal)
if context.viewState.isSearching {
ProgressView()
@@ -67,7 +65,6 @@ struct InviteUsersScreen: View {
usersSection
}
}
.readWidth($formWidth)
}
private var noResultsContent: some View {
@@ -177,13 +174,14 @@ struct InviteUsersScreen_Previews: PreviewProvider, TestablePreview {
.previewDisplayName("Searching")
.snapshotPreferences(expect: searchingViewModel.context.$viewState.map {
$0.usersSection.type == .searchResult && !$0.usersSection.users.isEmpty
})
}, precision: 0.999) // The search field's clear button renders inconsistently in snapshots.
ElementNavigationStack {
InviteUsersScreen(context: selectedViewModel.context)
}
.previewDisplayName("Selected")
.snapshotPreferences(expect: selectedViewModel.context.$viewState.map { !$0.selectedUsers.isEmpty })
.snapshotPreferences(expect: selectedViewModel.context.$viewState.map { !$0.selectedUsers.isEmpty },
precision: 0.999) // The search field's clear button renders inconsistently in snapshots.
ElementNavigationStack {
InviteUsersScreen(context: confirmSelectedViewModel.context)
@@ -218,7 +218,8 @@ struct RoomMembersListScreen_Previews: PreviewProvider, TestablePreview {
RoomMembersListScreen(context: emptyBannedViewModel.context)
.onAppear { emptyBannedViewModel.context.searchQuery = "Dan" }
}
.snapshotPreferences(expect: emptyBannedViewModel.context.$viewState.map(\.shouldShowEmptyState))
.snapshotPreferences(expect: emptyBannedViewModel.context.$viewState.map(\.shouldShowEmptyState),
precision: 0.999) // The search field's clear button renders inconsistently in snapshots.
.previewDisplayName("Empty Search")
}
@@ -11,8 +11,6 @@ import SwiftUI
struct SpaceAddRoomsScreen: View {
@Bindable var context: SpaceAddRoomsScreenViewModel.Context
@State private var formWidth = CGFloat.zero
var showTopSection: Bool {
!context.viewState.selectedRooms.isEmpty
}
@@ -32,7 +30,7 @@ struct SpaceAddRoomsScreen: View {
if showTopSection {
selectedRoomsSection
.textCase(.none)
.frame(width: formWidth)
.containerRelativeFrame(.horizontal)
.padding(.bottom, -8)
}
}
@@ -51,7 +49,6 @@ struct SpaceAddRoomsScreen: View {
.compoundSearchField()
.disableAutocorrection(true)
.onChange(of: context.searchQuery) { context.send(viewAction: .searchQueryChanged) }
.readWidth($formWidth)
}
@ScaledMetric private var selectedRoomCellWidth: CGFloat = 80
@@ -177,11 +174,17 @@ struct SpaceAddRoomsScreen_Previews: PreviewProvider, TestablePreview {
SpaceAddRoomsScreen(context: searchingViewModel.context)
}
.previewDisplayName("Searching")
.snapshotPreferences(expect: searchingViewModel.context.observe(\.viewState.roomsSection).map {
$0.type == .searchResults && !$0.rooms.isEmpty
}, precision: 0.999) // The search field's clear button renders inconsistently in snapshots.
ElementNavigationStack {
SpaceAddRoomsScreen(context: selectedViewModel.context)
}
.previewDisplayName("Selected")
.snapshotPreferences(expect: selectedViewModel.context.observe(\.viewState.roomsSection).map {
$0.type == .searchResults && !$0.rooms.isEmpty
}, precision: 0.999) // The search field's clear button renders inconsistently in snapshots.
}
static func makeViewModel(searchQuery: String? = nil, hasSelection: Bool = false) -> SpaceAddRoomsScreenViewModel {
@@ -128,13 +128,11 @@ struct SpaceScreen: View {
Section {
Button { context.send(viewAction: .createChildRoom) } label: {
Label(L10n.actionCreateRoom, icon: \.plus)
.accessibilityIdentifier(A11yIdentifiers.spaceScreen.createRoom)
}
Button { context.send(viewAction: .addExistingRooms) } label: {
Label(L10n.actionAddExistingRooms, icon: \.room)
}
.accessibilityIdentifier(A11yIdentifiers.spaceScreen.addExistingRooms)
if !context.viewState.rooms.isEmpty {
Button { context.send(viewAction: .manageChildren) } label: {
@@ -149,7 +147,6 @@ struct SpaceScreen: View {
Button { context.send(viewAction: .displayMembers(roomProxy: roomProxy)) } label: {
Label(L10n.screenSpaceMenuActionMembers, icon: \.user)
}
.accessibilityIdentifier(A11yIdentifiers.spaceScreen.viewMembers)
}
if let permalink = context.viewState.permalink {
@@ -163,7 +160,6 @@ struct SpaceScreen: View {
Button { context.send(viewAction: .spaceSettings(roomProxy: roomProxy)) } label: {
Label(L10n.commonSettings, icon: \.settings)
}
.accessibilityIdentifier(A11yIdentifiers.spaceScreen.settings)
}
}
@@ -634,7 +634,8 @@ class MockScreen: Identifiable {
let timelineControllerFactory = TimelineControllerFactoryMock(.init(timelineController: timelineController))
let userSession = UserSessionMock(.init(clientProxy: clientProxy))
let userSession = UserSessionMock(.init(clientProxy: clientProxy,
userSettings: UserSettings(appSettings: appSettings, accountSettings: .init())))
let flowCoordinator = UserSessionFlowCoordinator(isNewLogin: false,
navigationRootCoordinator: navigationRootCoordinator,
appLockService: AppLockService(keychainController: KeychainControllerMock(),
@@ -825,7 +826,7 @@ class MockScreen: Identifiable {
navigationRootCoordinator.setSheetCoordinator(navigationStackCoordinator)
return PlaceholderScreenCoordinator(hideBrandChrome: false)
case .autoUpdatingTimeline:
let userSettings = UserSettings.volatile()
let userSettings = UserSettings(appSettings: appSettings, accountSettings: .init())
appSettings.hasRunIdentityConfirmationOnboarding = true
appSettings.hasRunNotificationPermissionsOnboarding = true
appSettings.analyticsConsentState = .optedOut
+47 -3
View File
@@ -19,7 +19,7 @@ struct PreviewTests {
}
private let simulatorDevice: String? = "iPhone14,6" // iPhone SE 3rd Generation
private let requiredOSVersion = (major: 26, minor: 5)
private let requiredOSVersion = (major: 27, minor: 0)
/// The key is the name we will give to the snapshot
/// The value is the actual device that will be used to render the preview
private let snapshotDevices: [SnapshotDevice] = [.init(name: "iPhone", device: "iPhone 17"),
@@ -216,6 +216,8 @@ private extension Snapshotting where Value: SwiftUI.View, Format == UIImage {
controller = UIHostingController(rootView: view)
} else {
let hostingController = UIHostingController(rootView: view)
// iOS 27 applies the window's safe area when rendering, which sizeThatFits ignores, clipping the content.
hostingController.safeAreaRegions = []
let maxSize = CGSize.zero
config.size = hostingController.sizeThatFits(in: maxSize)
@@ -223,15 +225,57 @@ private extension Snapshotting where Value: SwiftUI.View, Format == UIImage {
controller = hostingController
}
let sceneAttachingController = SceneAttachingViewController(child: controller)
return snapshotView(config: config,
drawHierarchyInKeyWindow: drawHierarchyInKeyWindow,
traits: traits,
view: controller.view,
viewController: controller)
view: sceneAttachingController.view,
viewController: sceneAttachingController)
}
}
}
/// Temporary workaround: swift-snapshot-testing doesn't manage which scene its render window belongs to, and on iOS 27 a
/// navigation stack in a window without a scene reserves space for a large title it never shows. Drop this once
/// swift-snapshot-testing handles its window's scene.
private final class SceneAttachingViewController: UIViewController {
private let child: UIViewController
init(child: UIViewController) {
self.child = child
super.init(nibName: nil, bundle: nil)
}
@available(*, unavailable)
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func loadView() {
view = SceneAttachingView()
}
override func viewDidLoad() {
super.viewDidLoad()
addChild(child)
child.view.frame = view.bounds
child.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
view.addSubview(child.view)
child.didMove(toParent: self)
}
}
private final class SceneAttachingView: UIView {
override func didMoveToWindow() {
super.didMoveToWindow()
guard let window, window.windowScene == nil else { return }
window.windowScene = UIApplication.shared.connectedScenes.compactMap { $0 as? UIWindowScene }.first
}
}
private extension Diffing where Value == UIImage {
static func prefireImage(preferences: SnapshotPreferences, scale: CGFloat?) -> Diffing {
lazy var originalDiffing = Diffing.image(precision: preferences.precision, perceptualPrecision: preferences.perceptualPrecision, scale: scale)
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9909a8761a5fe1af72a6aca159c2b1cb0caf086a8130437eddfe21b8a655eab7
size 138955
oid sha256:9042bbf8c898fd43502424ecb5e9538caf567ba5d5d9fcad4a53b9f81520bdb3
size 138930
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3f63fc1b09ec77b4abd3d828fbaccf1653310724d9778c1d9d84469b4237893f
size 164948
oid sha256:9040b0c4ebb0f4667501a5799a108371d6fcf3e3fd7dd51f379ff2c1dc797ff3
size 164971
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:bcb011ac05151a5f14c14b1f636add337e76735cdea3ee43b5b4839d808e6075
size 93477
oid sha256:f6d4de7dc66461755ea57c01e8ef692ddcb15ad273f987488ee7defd9a3461ea
size 93454
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7a672b63344f405ef6bada278f8fec875a47ffd844fdd8dd86e5855da83d09a4
size 133102
oid sha256:84410fdc030340c73cd6b36ab20fd076404a190d0f6ddc88907baaa7150ec308
size 133134
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:56e04212685761c32b5fa58f35f28cc2ba9e5d4a077af3f7374a9cd6223bba74
size 195083
oid sha256:e111f4b224c95ed46793397fc85255c643ab9e5b756e780969688a4bb054f5a5
size 202383
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:10a35d2b36c6515e5b3f6f982b560d2e3d5949ee168b678b1b28663d7fb84866
size 234864
oid sha256:d0d0e990c82095a72d5fd9c97f06eff8758eed8d9930816c76fc9dd829efd533
size 240413
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0727ef553dcdd695436b11d8f167d035636678dddeaf55326b23ed88060b0ec3
size 136037
oid sha256:05466f983bd61e9db4f9b6e691e752c76a7406ea0c8aafe4a04bae91b467df05
size 137995
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6c07e4d01f73e0fd802e1fccffefe5c306404804a0e0263c81908979942c4fc9
size 162433
oid sha256:b993e5b5e34a5de05271f26a549cd7765f779962060bfa5ae0a372c2b58b9aa7
size 166072
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:57f9ffbc41c5ee11df4a2618536734c25049779e3fca86c8f99d049c36a8474c
size 516298
oid sha256:c0ba90ff4bf337741e71896423345d4f971ff0ec59999df1ff0143b20b77ccc3
size 516386
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a6a9a686f43264ec3e845c3782a506ffc06da9236612872d9bb195bda9b77ade
size 542511
oid sha256:872384f73e08191574011047ee6e24cc086564a567013d3d194eeeffc2223310
size 542787
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:81bb926727a62f7024856c1e3ff9c3eac5729f3707c3e1602485c52d860417eb
size 320348
oid sha256:a2739083c2b53ef6f5cceccb3b9869bebfc409c02b922079da86dcb75eeeb43d
size 320148
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:23b357076fb10e70420c6c7c926f05a6cf611a0470fbf1eb99d116d80fbe4040
size 331311
oid sha256:20c62f79784ee8bbb22c702945ba587da3b70a46bd6293c1b53f05547d76145d
size 331304
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b49d4024578cec27ea128542980aee7476f15a65dfb791f3cbde86bd226c4718
size 509263
oid sha256:7d3859173af84b3e87bca0903694ee3fd78b1c764436621de1a0fd069a7d4f27
size 509285
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:10fddf5aa36306ff2d8457d3328f352beced32ddc5cc2d1a78f0005baed95977
size 529727
oid sha256:14ca1c86e3e50e967d2be2222b6cd4d1cccca8efd9e3acc2c82769cae7216552
size 529999
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f5a797526c962e555ff5d9dd6962956c41d871dd79ed6f5f361aef1d92cec0f4
size 316360
oid sha256:342c0c6160ec610fa5bda39c209a9d4e9ef4a99bc1853797d98ae66694e661cd
size 316195
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e86d49f9d39106c258e917831e3b09fa454d02f961bd36f5375fc3b1f54bd172
size 332533
oid sha256:14705cfcbf7f908563a2f64859b798c3cceae8b0e7b2aecf57d7ab9b0fdbfeac
size 332522
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:07bb58a75410b0c6e4d84cd65d3192c370c49102708a61534d04d6e9d4e0f03b
size 97463
oid sha256:1c730049c64e794a398302fe8db8ef82632fb6a46921615859020a4b58f00866
size 98279
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3b6cd5413e3e8c46d9f2d092ac24e0a25dd17422194b6edff76de1707981a720
size 103993
oid sha256:75255f590c72b015874a7d43d2a218a8c995d4cd3cf288d347a3131a1c563905
size 104773
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:52fb798303b223db2d198e9291ab79f4862c360cc5a70931dce029bd50d6dfbc
size 50857
oid sha256:6834d6191827bbeb3a7951f47b148788e60731a1eb7de00d659873fb4adb5085
size 51198
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:acdd9fc6cd336da6b4e3a95eb58479128e7838f658127bace38914efd715ddba
size 65560
oid sha256:540b444ff5c2fcaf3bb9a03b07b175d8e6aed22fb46856b8eea54486ff8d7ff9
size 66130
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d6563fb06a56c6a1dc0b21ab03e9b4673652fbe5f937e1491820684081c09646
size 114640
oid sha256:73ce769441339f07f4cb64057c1a9c5e85fd7814df327b37087d6b6b493bb48b
size 114626
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ea485204458022538fd5022aa041b058e3d3ce508cf1e0085d0feda0bc9feb97
size 123128
oid sha256:63851cda03a3c0d3f70b4c7ec748f8b8a42bd75d38ebc5a994dc48bbab14abd7
size 123013
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9d1f81da13faa600035bccb951adf1d81ed9e2dc5e21cdc782a4fc623243e0dc
size 70283
oid sha256:a5db1bc429e77525b0455d4c6487316edcf7081267d1e5cb54499161f0264f27
size 70761
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9333374fd5b3affc6bdff106669b66b468b22b6705c157fe0569c308bb850c04
size 77149
oid sha256:5b1a64115f8c6df7a78c2c8870c0031840709cb58018a88a2439beb9376c42b2
size 77673
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2dca9ed5f2e5fe872b14ca4b80a75ca3639691424cec998a984452f5edc58beb
size 115003
oid sha256:e5b3e54204930c47dd4efa0dd0997470bba625fcaf679cb1f5108204c66148ae
size 114978
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:19a50e49aba3847ab76e11d82fa48856b4366484a158d50d0e9eb062700ce6a2
size 123576
oid sha256:83d3ce563445109ff77b718de9fa706bac41b246ac3ffafd5d6dafab44ad16f5
size 123460
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9d1f81da13faa600035bccb951adf1d81ed9e2dc5e21cdc782a4fc623243e0dc
size 70283
oid sha256:794ab60fd9a1e69ecb85ea990cca1b8ffbd207d2efc05b810c2f24c49be6f3ec
size 70801
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9333374fd5b3affc6bdff106669b66b468b22b6705c157fe0569c308bb850c04
size 77149
oid sha256:63397a077770951990bb75517eaff394fedcd1e9f64cf5d0944dcc1258a749c2
size 77544
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a48b4a79b308b4311811a6c2db08336c39b39cca28a4a777b286acfa903f4564
size 99115
oid sha256:88e2ea9f9c6e55250bc5599aea3831622e7d3001387ab85b08e853e298caf8c1
size 98968
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d32e5b5824b7aecba339562faaf270e0aa5045b22c69340196f82809f6c919f0
size 112113
oid sha256:d66497bd553ee051938253fadf25c1f414e4c408c27f6b945758773e40419c22
size 112122
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:52aeb701e2e2f41cb72bdc22b192fefd47a29a9ac7eb9992a6b552eac9026836
size 57359
oid sha256:c51b8dcfb821f700a4350d694505e80e8ea24ba80eb4a92ca5e6f7842f1d174e
size 57422
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a87d77ef9453c18412441ac6d5f40bd3d6d8d472ec59bbb15c27ad3529e7ebc0
size 73192
oid sha256:7c2da5f9dcdc9f1ed044990c8d00f96690f4a35de42425951451159705cb9e3f
size 73203
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:26576f487909d88a3e88e2ba223a6d482b312ceba82ad06bde7d2e78adacf238
size 107086
oid sha256:156dc76b21753a55aa233a087cbaf6792ffac47ea6c12cb696a6a4929885ad8d
size 107181
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:75169fa608f0b4c7c485896e82d5747a520367e446b55caefed4b2130fed1683
size 121979
oid sha256:0c539af7b19decb571f660de96ad495d081477eaf7fb7db1a858547b1785b888
size 122101
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:96c1c392937e44579156674382ce385fcdf1a82f635318d0a039d7013b032982
size 64601
oid sha256:d0eec0954473c20dc4b7443971a5f61cd74a026e5dc5b244de4a2d2b47425366
size 64584
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:288dcbb4b734703b48ac937fce19da64af0173bf9e986126f2df9b5c469fe238
size 80967
oid sha256:73d71db03718cde2af290fbaedfb250f1c0773a5168723c892c33de209c8406b
size 80965
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d95bdca9a6ab64f4c369b0bef060f7e75bfdd67836006e5610755f28cda1ffa5
size 100681
oid sha256:0e81da81c09bd76ba131d7f5ffcd1ba15eb3bf7988403d339529dc91cdfe9f8b
size 100514
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:18f9e46a8875e7ec8b1ec4e32dec074aadd40e19e6e3f656a9d99c9fe3871051
size 120830
oid sha256:457a388ee5d232038ab15dd83e67060cec8f8a92db2a597946352df73571b849
size 120639
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0ffbfa4ea83444c58471168c4841f2b941713bcf00ce45cbff0435c390f25ac6
size 56915
oid sha256:54c7c0fd89b000eb954904d99e8a6f01e3666e400cf6c9a792ad5da32873c41e
size 59261
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7dc96cfc8bc5344810b6446ee240b98027ac9332b2f0ef30beb1726cecec12bc
size 78544
oid sha256:0be6253c5dfa8642c3b57e1a1350f5b98f4022c35db0157002fc15df48dcd6c7
size 81107
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6101594d263238d8f0c4de48c84d5a108e46adf822a7cd01714aaf5aa871ee64
size 101030
oid sha256:96ea56cc5b6fad55768b568d4034e0773d7bff650dfe3a65d1b7f647545ef76a
size 100892
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2ca7aa0befd49db4758f4f6b1ee32547029c5d9161f9c492ede90a2fe1689261
size 121145
oid sha256:8150176b8f17e9582a954d2fee8ec8180a311a4cc1fdcaabff3ece41b32cccda
size 120982
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7b811d1857349674a5c60162cd460944b9ac7b81f847a8b715868d37fd8f8edb
size 57244
oid sha256:47d2d8f341788ec914e51918f4e675ac8bddc088b2fed2b93b16ed5b41a6c428
size 59570
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:38b64b56c18db8dcaeb09e31d22f6631b2f86c5337a7b67741ff9010281609b6
size 78818
oid sha256:419f402f312c40c3f4c296b800a1c4b1ca15e546f560df0c6f2e49e5f1e4a0ca
size 81387
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:bb3672a143e3f0201d12b74b8ec4701e6b4f20d37ba5c88e94577e6c80b54064
size 92018
oid sha256:7c18be17e38d064eb45c2ebd330ca28fca60575ec38a72b48cd708eca40fb39e
size 91851
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:28b43a83ddef02cc64071fb8f6b79388034a9bc82b4d0606d886d8d3f8587286
size 96034
oid sha256:e6e535c530755d81f19801b736479b426ebeb87c5e551daef45be0ff62e684d1
size 95910
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7e24f459f20fc9bffb06c3b17bac6ae780d39831e135efe8f23875d6af337f05
size 47760
oid sha256:d6234b0aaf98d6d3272be98f0c0c855830302a902f28cce1a0cb11c2ef63c023
size 50253
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f7882b84da9c8355c98bf3dd17cb92343cdcfcd53502c50ac43efea0f85daa02
size 50893
oid sha256:e48d5b97f624b76f92236b348e0e515a852fb626cc2cf17a55dfd9d894bc3574
size 53727
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:387d1abe490ca63cfdd88e56448416f249187a4698a6b804fab4e73a93875ef8
size 90578
oid sha256:1ed9caaf2ec7e1abcc3dfc0d083215f9fa20c161a84975c19a2f7c13977f2bdf
size 90528
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:99f092209160569fafa469582c4f85399f85ecf40bb76d77ac86d240ceddd757
size 95836
oid sha256:e51dcbe2b1a7a10fe636a2a33d7d82cfa66be04e21fcf0dcba0b5a07f8a9092a
size 95740
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2f6cc3d01d6a864399cbe3e0aceb4fb2bcad6fcbba65e5e9d4a366880791f493
size 46313
oid sha256:ca42eecb8ef47b089ed143213decbbb9bf65c2bd73bcdc0aa79326076988d317
size 48944
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:54285a867ef5a01bce6799dbec2dd2ef7691827487447bf0151a5bb4548f56ac
size 50694
oid sha256:b29745197b4fdbe39478838589bf3643075050414c5b821b8582a41030813f2b
size 53553
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8f1f0fb80f66172f1c0520d1fabc779ccb4e1c0a113f390f50f4beb15303af1a
size 95170
oid sha256:17195d665cb962662e2d696219c32cbf0ebf0ee896893428183fc7ef2dbfd9ae
size 96879
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e8233f462c57de3a8aceaf4208022395a3e25e1e0b1415855eb21509442238d9
size 99148
oid sha256:4d30b62ec35e98ebc6dc880e3dd3bca9ac7a24c9ffb62221a87428f810ae0b7d
size 101294
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:90a50a2d8bfb3f1857c22a9186129150a4d70ec0b5e4c3830f9731565bb8f541
size 47530
oid sha256:a9d16fe8d044fa34548e6421c79304b6d867c941f6774b8ff81b6dd535178d03
size 48980
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:78f6f3e2773984959d25c7547dc0b138b432ec21f1b5ed8eddcd499ad9fe52d6
size 54608
oid sha256:12059c9d85360a8f2885c5865b3aea5cfa3e2b2d2aaeea24ed7f89bf4d1cc111
size 56563
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:09aad74b063cdeaa4f2e857529e8c30101d941023214fc20cb7206f27177a503
size 88402
oid sha256:3bc68808d9861fd1183ac89f107a9ad47f759b6997c0fa701d927e96a7ea8b11
size 89555
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5810762290fa7d9902d448cbc973592b9c333e6b0d4b4162b6b1a78ae2c023b2
size 90181
oid sha256:f9afdb05cf1abb279fbc18c0fe56a8011e16ff74ab775c2aed5fb18bbedc622c
size 91422
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7c32757d28a440712f057744bd146625d1e42594779865474ff4579788ebfe80
size 42033
oid sha256:def4404dcfe518966d3f673c7435fcf7089131ce17535cc8b82c913939d3808e
size 42997
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3d6e5c8e9a40e96301c525a677332d4079722ff0502eda89ee291fc7f6a87465
size 46132
oid sha256:1a313266a0896f935bbf24895a37033ad430db0dffbd13687ef4c0fc24018be9
size 47106
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9df6abf3219fb7549876a69ec97831f709c91ecb1526fc57a6b888d7af0601b7
size 91137
oid sha256:280affc6d4a19d6e4b9c54aff0750541918443b418ea7d1472d40eddf028a6c3
size 93201
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7bf02df7113f65146397bb10330d5bfc7afcfd7e1e9cd8a4e56c5d333b5f5c11
size 95204
oid sha256:7780e8a7906871fda90d692e64d04c752a0c79f52cf8d33559926e6d1e9d55d4
size 97240
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6ea6a941c3909b723d6dc50594bc530556a3fdc48bdcb5d4fa8c85eac610a975
size 44013
oid sha256:ed985bc0bcbd3ea73672c6836bc97576075363a147456e80021d6fc546207da8
size 45631
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:48d66aa0a3742b41a29f1700388bc6becc47527e58663fc61e70261e092a0991
size 50401
oid sha256:a28805f8cb8ff7b277773b5c6b572b5823a397b172fd6f7f15ec6f5ecaa11315
size 52044
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0bcfa1e1f77fc35269ee882d463331ceb5ce019c0dec109ae1961b9c773fe986
size 93745
oid sha256:98eaadecf9d3c5179efbe0bcf08a178e210ca1aa9cd8d8bef6bf5c1ac1d75a02
size 93724
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0bcfa1e1f77fc35269ee882d463331ceb5ce019c0dec109ae1961b9c773fe986
size 93745
oid sha256:98eaadecf9d3c5179efbe0bcf08a178e210ca1aa9cd8d8bef6bf5c1ac1d75a02
size 93724
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5414dec5fbc645530c830d3ca32eccb77cc4a5dc68c121f9cd5c51f91373d52c
size 49799
oid sha256:5ae06f926f4ec00f83171f28dd4f51c6162cb2be3a1ada7726cb92163b90ec8f
size 49859
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5414dec5fbc645530c830d3ca32eccb77cc4a5dc68c121f9cd5c51f91373d52c
size 49799
oid sha256:5ae06f926f4ec00f83171f28dd4f51c6162cb2be3a1ada7726cb92163b90ec8f
size 49859
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6e886ebea8e0e0ab79958aa5bcaf1101af1c916150aa728886f03bf3f0bea58f
size 111906
oid sha256:7286434e5dea1290355ceacae61d8af23caa89854d996f6025c0c639c1c2c165
size 111941
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:cce420a1bf18097771b42b374bf9d011f18db22482d3dcb16b770d0129d6ad08
size 119864
oid sha256:676b2e128f2ef53c66522fb7b0ee14aa62395b5d933a581cb52377a5ee2e8ade
size 119855
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5623f04ea957e1d462859af2791d716f87c246659c098b41c8063b99c3f01f03
size 67805
oid sha256:200b7584d04766925f7fb2d7cc3e05cc00e0ccdb9d0def43efd3a769509a81ce
size 67827
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:871644f48f5c95dbce0d9c89295175000746973527fd03beeb3881a7779eb7bb
size 77853
oid sha256:f0e3bcf18fcc0f2fbfcbff4cd71d618ead4fe242559e65fecc75bf95813e5aef
size 77882
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9a7e5143fe93477b1be06499cb574e0fe6818b691cd10a54dfa6bbd455c8dd38
size 101108
oid sha256:cd0aa62db27af5785ba622e242fc8866723938b64df1e6f616be52a2c09d406f
size 100985
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0978fd892a5b8dabb7ee6f8960148ebfbffe09209e63bd2378321937a17d55bf
size 102697
oid sha256:20ab34822fb1e57beec12409e2aa8683e7c45ae98a1e195802e67d316788756b
size 102547
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:338de4a0a0a244773841e9eac8913f5a5fe756311fb21c4584a50fddc62c996f
size 57168
oid sha256:23fcce26fd4aa2f5a24e4f638ac6adc146d337200e50eb3d55a9af770f967659
size 57369
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b5ed925b951f62affc939c73ab610988eece3a052ad0ec1d61747344fbb1295e
size 58415
oid sha256:0dd27181a9b0237dc723b560f5dc7608745d5a2dba639b23e72d165f297d3bb7
size 58673
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6c5bc8947311387b5d98aa8f0b12e512ff8122ea87b1f627b4fbf72afa6faba6
size 145869
oid sha256:093719486a1c97ada04065c9ab68761170575752646e8f068748e27cc73d0d1b
size 145715
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:00b1a70b1b5348fdc89d436310a2ba9ed1798bacdc84bd0735274f9b5c92103c
size 182160
oid sha256:2b9e483794d8163b57203c9c57c6f654b4d8b689978167e782d55342aa6d479a
size 181858
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ebe24f47d767a142072d2e3a4f6d2dfa21d7118012e58f3439051df66187f7d9
size 96624
oid sha256:2081f8132e2dc1383c9efa8d95e02497a2366b7112fb93d7ea5a2449a523a2d4
size 97075
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:73c73c0a8fc25beb47c4a226d864b18e830255d8df8f137bb18b8dbb399c74b7
size 143439
oid sha256:130cdcd352d0db187e8b57aef42c61f032a73731ae3847111625ab64286016db
size 143997

Some files were not shown because too many files have changed in this diff Show More